Anomaly Detection Fundamentals
Point vs Contextual vs Collective Anomalies
Read aloud is unavailable in this browser.
The Three Pillars of Anomaly Classification
The distinction between point, contextual, and collective anomalies is not merely academic taxonomy—it is a fundamental architectural decision that shapes every aspect of an anomaly detection system. Selecting the wrong paradigm leads to either missed anomalies (false negatives) or overwhelming false alarms (false positives).
In this comprehensive exploration, we dissect each anomaly type with unprecedented depth:
- Mathematical formalizations that provide rigorous foundations
- Algorithm mappings that connect theory to implementation
- Real-world case studies that demonstrate practical application
- Detection pipelines that operationalize the concepts
By the end of this page, you will possess the diagnostic expertise to correctly classify anomaly types in novel problem domains and select detection strategies with confidence.
This page builds directly on the anomaly typology established in Page 0. Ensure you have a solid understanding of the tripartite taxonomy before proceeding.
Point Anomalies: The Global Deviation Paradigm
Point anomalies represent the most intuitive form of outlier detection: identifying individual instances that deviate globally and unconditionally from the expected data distribution. Let us formalize this concept with mathematical rigor.
Formal Mathematical Framework:
Let $\mathcal{X} \subseteq \mathbb{R}^d$ be our feature space and let $P(X)$ denote the probability distribution from which normal data is generated. The anomaly detection task can be formulated as density level set estimation:
$$A_{\tau} = {x \in \mathcal{X} : P(x) \leq \tau}$$
where $A_{\tau}$ is the anomaly set and $\tau > 0$ is the probability threshold. Points falling within $A_{\tau}$ are classified as anomalies.
Equivalent Formulations:
1. Distance-Based Formulation
For an instance $x$ and a reference set $D_{ref}$, define the anomaly score as:
$$s_{dist}(x) = \frac{1}{k} \sum_{i=1}^{k} d(x, nn_i(x))$$
where $nn_i(x)$ denotes the $i$-th nearest neighbor of $x$ in $D_{ref}$ and $d(\cdot, \cdot)$ is a distance metric (typically Euclidean). An instance is anomalous if $s_{dist}(x) > \theta$.
2. Density-Based Formulation
Using kernel density estimation:
$$\hat{f}(x) = \frac{1}{n \cdot h^d} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right)$$
where $K$ is a kernel function (e.g., Gaussian) and $h$ is the bandwidth. An instance is anomalous if $\hat{f}(x) < \tau$.
3. Reconstruction-Based Formulation
For autoencoder-based detection:
$$s_{recon}(x) = |x - D(E(x))|^2$$
where $E$ is the encoder, $D$ is the decoder. High reconstruction error indicates anomaly.
Distance-based and density-based formulations are intimately connected: high density corresponds to low distance to neighbors, and vice versa. In the limit, k-NN distance estimation converges to density estimation. This equivalence justifies the practical interchangeability of these approaches for point anomaly detection.
Geometric Interpretation:
Point anomalies occupy distinctive regions in feature space:
1. Extremal Regions Points lying at the statistical tails of individual feature distributions:
- Values beyond $\mu \pm 3\sigma$ under Gaussian assumptions
- Values beyond the interquartile range fences: $Q_1 - 1.5 \times IQR$ or $Q_3 + 1.5 \times IQR$
2. Sparse Regions Points inhabiting low-density areas of the joint distribution:
- Unusual feature combinations that are individually plausible
- "Holes" in the data manifold where instances rarely appear
3. Disconnected Regions Points not belonging to any natural cluster:
- Isolated instances with no nearby neighbors
- Singleton clusters that fail to meet minimum size requirements
| Algorithm | Core Principle | Time Complexity | Best For |
|---|---|---|---|
| Z-Score | Standard deviations from mean | O(n) | Univariate, Gaussian data |
| IQR Method | Distance from quartiles | O(n log n) | Univariate, robust to outliers |
| k-NN Distance | Average distance to k neighbors | O(n² d) | Moderate dimensions, any distribution |
| LOF | Local density ratio | O(n² d) | Varying density clusters |
| Isolation Forest | Random partitioning depth | O(n log n) | High dimensions, efficient |
| One-Class SVM | Support vector boundary | O(n² - n³) | Complex boundaries, kernel methods |
| Autoencoders | Reconstruction error | O(n × epochs) | High dimensions, deep learning |
Case Study: Manufacturing Quality Control
Consider a precision manufacturing facility producing ball bearings with target diameter 10.00mm ± 0.05mm.
Dataset: 100,000 measurements from automated inspection system Features: Diameter (mm), Roundness deviation (μm), Surface roughness (Ra)
Point Anomaly Detection Pipeline:
-
Univariate Screening: Apply IQR method to each feature independently
- Diameter: Flag if < 9.90mm or > 10.10mm
- Roundness: Flag if deviation > 5μm
- Surface roughness: Flag if Ra > 0.8μm
-
Multivariate Screening: Apply Isolation Forest to all features jointly
- Catches unusual combinations even within individual ranges
- Example: Diameter at 10.09mm AND roughness at 0.79μm together is suspicious
-
Ensemble Decision: Aggregate scores from both methods
- Items flagged by either method → manual inspection
- Items flagged by both methods → automatic rejection
Results: Point anomaly framework detected 1.2% anomaly rate, with 94% of detected anomalies confirmed as genuine defects upon manual inspection.
Contextual Anomalies: The Conditional Deviation Paradigm
Contextual anomaly detection introduces a fundamental shift: instead of asking "Is this value unusual?", we ask "Is this value unusual given the context in which it occurs?"
Formal Mathematical Framework:
Let each data instance be represented as $x = (c, b)$ where:
- $c \in \mathcal{C}$ represents contextual attributes
- $b \in \mathcal{B}$ represents behavioral attributes
A contextual anomaly is defined by the conditional probability:
$$P(b | c) < \tau$$
Equivalently, using the anomaly score formulation:
$$s_{context}(x) = -\log P(b | c)$$
High scores indicate contextual anomalies.
The Key Insight: The same behavioral value $b$ can have vastly different probabilities depending on context $c$:
$$P(b | c_1) \gg \tau \text{ (normal)}$$ $$P(b | c_2) \ll \tau \text{ (anomalous)}$$
Context Types and Formalizations:
1. Temporal Context
Context is defined by time-related attributes: $c = (t, t_{hour}, t_{day}, t_{month}, \ldots)$
Example model: Predict expected behavior given temporal features, then detect deviations
$$\hat{b}t = f(t, t{hour}, t_{day}, t_{month}; \theta)$$ $$s(x_t) = |b_t - \hat{b}_t|$$
2. Spatial Context
Context is defined by location: $c = (latitude, longitude, region)$
$$P(b | location) = \text{(location-specific distribution)}$$
3. Peer Group Context
Context is defined by entity characteristics: $c = (user_type, account_age, segment)$
$$P(b | peer_group) = \text{(peer-specific baseline)}$$
The most challenging aspect of contextual anomaly detection is context selection: determining which attributes should serve as contextual vs. behavioral. This is fundamentally a domain modeling decision that requires subject matter expertise. Incorrect context selection leads to either missed anomalies or excessive false positives.
Algorithmic Approaches for Contextual Anomalies:
Approach 1: Segmentation + Point Anomaly Detection
Partition data by context, then apply point anomaly detection within each partition:
for each context_value c in unique(contexts):
subset = data[data.context == c]
anomalies_c = point_anomaly_detector.fit_predict(subset.behavior)
Limitation: Requires sufficient data within each context partition.
Approach 2: Residual Analysis
Build a predictive model for behavior given context, then detect anomalies in residuals:
$$r = b - \mathbb{E}[b | c] = b - f(c; \theta)$$
Apply point anomaly detection to residuals $r$. Large residuals indicate contextual anomalies.
Advantage: Handles continuous context variables naturally.
Approach 3: Conditional Density Estimation
Directly estimate $P(b | c)$ using:
- Mixture density networks
- Conditional VAEs
- Gaussian Process regression with likelihood estimation
Advantage: Provides proper probabilistic scoring.
Approach 4: Attention-Based Neural Networks
Use attention mechanisms to dynamically weight context:
$$h = \text{Attention}(\text{Query}=b, \text{Key}=c, \text{Value}=c)$$
Anomaly score derived from decoder reconstruction or discriminator output.
Case Study: Credit Card Fraud Detection
Credit card fraud detection is the canonical contextual anomaly detection problem.
Dataset: 10 million transactions with behavioral and contextual features
Behavioral Attributes:
- Transaction amount
- Merchant category code (MCC)
- Card-present vs card-not-present
- Transaction velocity (transactions per hour)
Contextual Attributes:
- Time of day, day of week
- Customer's historical spending patterns
- Geographic location relative to home address
- Device fingerprint
Detection Architecture:
Layer 1: Peer Group Baselining
- Cluster customers by spending profile (low, medium, high spenders)
- Establish per-cluster behavioral baselines
- A $500 transaction is normal for high spenders, anomalous for low spenders
Layer 2: Temporal Pattern Modeling
- Build per-customer temporal models using LSTM
- Predict expected transaction characteristics for current time
- Deviation from prediction = anomaly signal
Layer 3: Geographic Context
- Track customer's typical locations
- Transaction far from usual locations + other risk factors = elevated risk
- Example: Card used in two countries within 2 hours = impossible travel anomaly
Fusion and Decision:
- Combine signals using gradient boosting
- Output: fraud probability score
- Threshold tuned for business requirements (false positive cost vs fraud loss)
Results: Contextual approach achieved 95% detection rate at 1:1000 false positive ratio, compared to 78% detection for context-blind point anomaly methods.
| Algorithm | Context Handling | Model Type | Best For |
|---|---|---|---|
| STL Decomposition | Temporal (seasonal) | Statistical | Univariate time series |
| ARIMA Residuals | Temporal (autoregressive) | Statistical | Stationary time series |
| Contextual LOF | Explicit segmentation | Density-based | Discrete context values |
| LSTM-AE | Learned temporal embedding | Deep learning | Complex temporal patterns |
| Conditional VAE | Conditional generation | Deep learning | Any context type |
| Prophet + Residuals | Temporal + holidays | Additive model | Business time series |
| Graph Neural Networks | Relational context | Deep learning | Network/graph data |
Collective Anomalies: The Pattern Deviation Paradigm
Collective anomaly detection represents the most sophisticated challenge: identifying anomalies that exist only at the aggregate level, where individual components are unremarkable but their combination or sequence is anomalous.
Formal Mathematical Framework:
Let $S = (x_1, x_2, \ldots, x_m)$ be an ordered sequence or set of $m$ related data instances. $S$ is a collective anomaly if:
Condition 1 (Non-atomic): $$\forall x_i \in S: P(x_i) \geq \tau_p \text{ (no individual is a point anomaly)}$$
Condition 2 (Collective abnormality): $$P(S) < \tau_c \text{ (the collective pattern is anomalous)}$$
The probability of the collective $P(S)$ depends on the modeling assumptions:
For Markov Sequences: $$P(S) = P(x_1) \prod_{i=2}^{m} P(x_i | x_{i-1})$$
For Independent Instances with Aggregate Properties: $$P(S) = P(\text{aggregate}(S)) = P(\text{mean}(S), \text{var}(S), \text{pattern}(S))$$
For Graph-Structured Data: $$P(S) = P(G_S) \text{ where } G_S \text{ is the induced subgraph}$$
Collective anomalies exhibit emergence: a property of the whole that cannot be predicted from the parts. Just as consciousness emerges from neurons or traffic jams emerge from individual drivers, collective anomalies emerge from the relationships and patterns among instances. This emergence is both what makes them difficult to detect and what makes them scientifically fascinating.
Categories of Collective Anomalies:
1. Sequence Anomalies
In ordered data (time series, event logs, DNA sequences), the anomaly lies in the sequential pattern:
Markov Chain Violation: $$P(x_t | x_{t-1}) \ll \text{expected transition probability}$$
Motif Anomaly: A subsequence $(x_i, \ldots, x_j)$ that either:
- Appears where it shouldn't (anomalous occurrence)
- Fails to appear where expected (anomalous absence)
- Appears in distorted form (anomalous transformation)
Length Anomaly: A pattern that extends for unusually long or short duration
2. Graph Anomalies
In relational data (social networks, transaction networks, molecular structures):
Subgraph Anomaly: A collection of nodes and edges forming an unusual community structure
Dense Subgraph: A group of nodes with unusually high internal connectivity (potential fraud ring, bot network)
Bridge Anomaly: A node or edge that unusually connects otherwise separate communities
3. Aggregate Anomalies
In grouped data (batches, sessions, transactions):
Distribution Anomaly: A batch whose distributional properties differ from historical batches
Composition Anomaly: A shopping cart with an unusual combination of items (individually normal items, collectively suspicious)
Algorithmic Approaches for Collective Anomalies:
Approach 1: Sequence Modeling
Train models to predict normal sequences, then detect anomalous sequences by their low likelihood:
$$s(S) = -\log P_{model}(S) = -\sum_{i} \log P(x_i | x_{<i})$$
Models: HMMs, LSTMs, Transformers, n-gram models
Approach 2: Subsequence Discord Discovery
Find the subsequence most dissimilar to all other subsequences:
$$discord = \arg\max_{S_i} \min_{j eq i} dist(S_i, S_j)$$
The discord is the most anomalous subsequence.
Approach 3: Pattern Mining + Negation
Mine frequent patterns from normal data, then detect absence or violation of patterns:
$$s(S) = \sum_{p \in \text{ExpectedPatterns}} \mathbb{1}[p otin S]$$
Sequences missing many expected patterns are anomalous.
Approach 4: Graph-Based Detection
For graph-structured data:
- Compute anomaly scores for subgraphs using spectral properties
- Detect communities with unusual density or connectivity
- Identify bridges between communities as potential information brokers
Algorithms: OddBall, Autopart, Graph Convolutional Networks
Case Study: Intrusion Detection in Enterprise Networks
Network intrusion detection is the canonical collective anomaly domain, where attacks manifest as anomalous patterns of individually legitimate-looking network events.
Dataset: 1 billion network flow records across 6 months
Challenge: Individual packets or connections often look legitimate; the attack pattern emerges from their combination.
Collective Anomaly Examples:
Attack Type: Port Scanning
- Individual Event: Single SYN packet to port 22 (SSH)
- Collective Pattern: Same source sends SYN to 1000 different destination ports on same host
- Detection: Abnormal entropy in destination port distribution per source-destination pair
Attack Type: Data Exfiltration
- Individual Event: Small outbound HTTP request (legitimate API call)
- Collective Pattern: Thousands of small requests to unusual external endpoint, total volume = sensitive database size
- Detection: Aggregate outbound volume to rare destinations exceeds threshold
Attack Type: Lateral Movement
- Individual Event: Legitimate RDP connection between authorized systems
- Collective Pattern: Chain of connections: Entry Point → Server A → Server B → Crown Jewel Database
- Detection: Graph traversal from perimeter to high-value assets with unusual path
Detection Architecture:
Layer 1: Flow Aggregation
- Aggregate flows into sessions, sessions into user activities
- Compute aggregate features: volume, entropy, unique destinations, timing patterns
Layer 2: Sequence Modeling
- Model normal sequences of user actions using LSTM
- Detect sequences with high perplexity (low predicted probability)
Layer 3: Graph Analysis
- Build communication graph
- Detect unusual subgraphs using community detection + novelty scoring
- Track information flow paths
Layer 4: Correlation
- Correlate anomalies across layers
- Isolated anomaly in one layer = low confidence
- Correlated anomalies across layers = high confidence alert
Results: Collective approach detected advanced persistent threats (APTs) that evaded point-based NetFlow analysis, with median detection latency of 4 hours compared to 14 days for signature-based systems.
| Algorithm | Data Type | Core Mechanism | Best For |
|---|---|---|---|
| HMM Likelihood | Sequences | Emission/transition probability | Discrete states, known structure |
| LSTM Autoencoder | Sequences | Reconstruction error on sequences | Complex temporal patterns |
| Transformer + Likelihood | Sequences | Attention-based sequence modeling | Long-range dependencies |
| Discord Discovery | Time series | Subsequence dissimilarity | Univariate anomalous motifs |
| Graph Neural Networks | Graphs | Node/subgraph embedding anomaly | Relational data |
| Dense Subgraph Detection | Graphs | Unusual connectivity patterns | Fraud rings, bot networks |
| Association Rule Violation | Transactions | Unexpected co-occurrence | Market basket, access patterns |
Comparative Decision Framework
Given a new anomaly detection problem, how do you determine which paradigm applies? This decision framework provides systematic guidance.
Decision Tree for Anomaly Type Classification:
START: Examine your data structure
├── Do instances have inherent relationships (order, graph edges)?
│ ├── NO → Point or Contextual Anomaly
│ │ ├── Does "normal" depend on context (time, location, user)?
│ │ │ ├── YES → CONTEXTUAL ANOMALY
│ │ │ └── NO → POINT ANOMALY
│ │
│ └── YES → Potentially Collective Anomaly
│ ├── Can individual instances be anomalous?
│ │ ├── YES → Could be Point AND Collective
│ │ │ └── Consider hybrid detection
│ │ └── NO → COLLECTIVE ANOMALY
│ │ └── Anomaly only visible in patterns
Key Diagnostic Questions:
-
"Can I evaluate each instance independently?"
- Yes → Point anomaly framework applicable
- No → Contextual or Collective required
-
"Does the same value mean different things in different situations?"
- Yes → Contextual anomaly framework required
- No → Point anomaly may suffice
-
"Are individually normal instances forming suspicious patterns?"
- Yes → Collective anomaly framework required
- No → Focus on point or contextual
-
"What does the domain expert consider anomalous?"
- Extreme values → Point
- Unusual behavior for the situation → Contextual
- Unusual patterns or sequences → Collective
- •Data is i.i.d. (independent and identically distributed)
- •Anomalies are extreme values or unusual combinations
- •No temporal, spatial, or relational structure
- •Domain experts identify anomalies by looking at single records
- •Detection: Distance-based, density-based, or isolation methods
- •Clear context attributes exist (time, location, user type)
- •Normal behavior varies systematically with context
- •Same numerical value can be normal or anomalous
- •Domain experts say 'it depends on...' when evaluating records
- •Detection: Residual analysis, conditional models, segmentation
- •Data has inherent ordering (time series, sequences) or graph structure (networks)
- •Individual instances appear normal when examined in isolation
- •Anomaly only visible when examining patterns, trends, or relationships
- •Domain experts identify anomalies by looking at sequences or groups
- •Detection: Sequence models, graph methods, pattern mining, aggregate statistics
Hybrid and Multi-Type Detection Systems
Real-world anomaly detection systems rarely face pure instances of a single anomaly type. Production systems must handle multiple types simultaneously, requiring ensemble architectures that combine specialized detectors.
The Multi-Type Reality:
Consider an e-commerce platform's fraud detection system. It must simultaneously detect:
- Point Anomalies: A single $50,000 purchase (extreme value regardless of context)
- Contextual Anomalies: A $500 purchase at 3 AM from a typically daytime shopper
- Collective Anomalies: A sequence of 20 small purchases to 20 different addresses in rapid succession
A detector optimized for only one type will miss the others. The solution is ensemble architecture.
Ensemble Architecture Pattern:
┌─────────────────────────────────────────────────────────┐
│ Raw Data Stream │
└─────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Point │ │ Contextual │ │ Collective │
│ Detector │ │ Detector │ │ Detector │
│ │ │ │ │ │
│ - Isolation │ │ - Residual │ │ - Sequence │
│ Forest │ │ Analysis │ │ LSTM │
│ - LOF │ │ - Cond. VAE │ │ - Graph NN │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
└───────────────┼───────────────┘
│
▼
┌───────────────────────┐
│ Score Aggregation │
│ (Fusion Layer) │
│ │
│ - Max pooling │
│ - Weighted average │
│ - Meta-classifier │
└───────────────────────┘
│
▼
┌───────────────────────┐
│ Anomaly Score / │
│ Alert Decision │
└───────────────────────┘
Score Aggregation Strategies:
1. Max Pooling $$s_{final}(x) = \max(s_{point}(x), s_{context}(x), s_{collective}(x))$$
Alert if any detector fires strongly. High recall, potentially lower precision.
2. Weighted Average $$s_{final}(x) = w_p \cdot s_{point} + w_c \cdot s_{context} + w_{col} \cdot s_{collective}$$
Weights learned from labeled validation data or set by domain expertise.
3. Meta-Classifier Train a second-stage classifier on the scores from first-stage detectors: $$s_{final} = f_{meta}(s_{point}, s_{context}, s_{collective})$$
Can learn complex interactions between detector outputs.
4. Threshold Voting $$\text{alert} = \mathbb{1}\left[\sum_i \mathbb{1}[s_i > \theta_i] \geq k\right]$$
Alert if at least $k$ detectors exceed their individual thresholds.
Practical Implementation Considerations:
-
Score Normalization: Different detectors produce scores on different scales. Normalize to [0, 1] or to z-scores before aggregation.
-
Detector Correlation: If detectors are highly correlated, their combined information is less than it appears. Diverse detectors are more valuable.
-
Type-Specific Thresholds: Each anomaly type may require different sensitivity levels based on business impact.
-
Explainability: When an alert fires, identify which detector(s) triggered it for interpretable explanations.
Multi-type detection implements defense in depth against diverse threats. An adversary who learns to evade point anomaly detection may still be caught by collective pattern analysis. An attack that appears contextually normal may still produce extreme values. Layered detection increases the attacker's cost and reduces breach probability.
Evaluation Considerations by Anomaly Type
Evaluation methodology must align with the anomaly type being detected. Standard point-level metrics can be misleading when applied to contextual or collective anomalies.
Point Anomaly Evaluation:
Standard instance-level metrics apply:
- Precision: $\frac{TP}{TP + FP}$
- Recall: $\frac{TP}{TP + FN}$
- F1-Score: $\frac{2 \cdot Precision \cdot Recall}{Precision + Recall}$
- ROC-AUC: Area under Receiver Operating Characteristic curve
- PR-AUC: Area under Precision-Recall curve (preferred for imbalanced data)
Contextual Anomaly Evaluation:
Stratified evaluation by context is essential:
- Compute metrics within each context stratum
- Report context-specific performance variations
- Aggregate with appropriate weighting (by context frequency or importance)
Example: If fraud patterns differ by customer segment, report precision/recall for each segment separately, then compute weighted average.
Collective Anomaly Evaluation:
Instance-level metrics are inappropriate. Use segment/pattern-level metrics:
Segment-Level Metrics:
- A detected anomalous sequence counts as 1 TP (not N TPs for N instances)
- False alarms: Count as sequences, not individual points
Overlap Metrics:
- Ground truth anomaly spans [t₁, t₂]
- Detected anomaly spans [t₃, t₄]
- Overlap coefficient: $\frac{|[t_1, t_2] \cap [t_3, t_4]|}{|[t_1, t_2] \cup [t_3, t_4]|}$
Detection Latency: For time-sensitive applications, measure time from anomaly onset to detection: $$\text{Latency} = t_{detected} - t_{anomaly_start}$$
| Anomaly Type | Appropriate Metrics | Pitfalls to Avoid |
|---|---|---|
| Point | PR-AUC, ROC-AUC, F1 at threshold | Class imbalance bias in accuracy |
| Contextual | Context-stratified PR-AUC, coverage | Aggregating across contexts naively |
| Collective | Segment-level precision/recall, overlap IoU | Using point-level metrics on sequences |
Summary: Mastering the Tripartite Framework
This deep dive has equipped you with comprehensive understanding of the three fundamental anomaly paradigms and their practical implications.
- •Point Anomalies: Global deviations detectable without context; distance/density-based algorithms excel
- •Contextual Anomalies: Context-dependent deviations; residual analysis and conditional modeling required
- •Collective Anomalies: Pattern-level deviations in related instances; sequence/graph modeling essential
- •Decision Framework: Systematic questions to classify anomaly types in new problems
- •Ensemble Architecture: Production systems require multi-type detection with intelligent score fusion
- •Evaluation Alignment: Metrics must match anomaly type to provide meaningful performance assessment
Path Forward:
With the tripartite framework mastered, we now turn to the question of supervision: How do we train anomaly detectors when anomalies are rare, unknown, or evolving? The next page explores the spectrum from supervised to unsupervised anomaly detection, examining when each approach is appropriate and how to navigate the practical challenges of each paradigm.
You have achieved deep mastery of the three fundamental anomaly types. You can now mathematically formalize each type, select appropriate algorithms, design ensemble systems, and apply correct evaluation methodologies. This expertise forms the backbone of professional anomaly detection system design.
KEEP LEARNING
There’s more to understand.
You’re reading the introduction. Create a free account to read the complete lesson, save notes and keep track of your progress.