What is the Normal Distribution?
The normal distribution (also called Gaussian distribution or bell curve) is a probability distribution that describes how data values are spread around the mean.
Key Characteristics
Shape: Symmetric bell curve
- Peak at mean: Most data clusters around the center (mean)
- Symmetric: Left and right sides are mirror images
- Tails: Fewer values at extremes (far from mean)
Mathematical Properties:
- Mean = Median = Mode (all at the center)
- Defined by two parameters: μ (mean, center) and σ (standard deviation, spread)
- Total area under curve = 1 (100% probability)
Visual Representation
Frequency
│
│ ╱‾‾‾╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│____╱_____________╲____
μ (mean)
←────σ────→
68% of data within μ ± σ
95% of data within μ ± 2σ
99.7% of data within μ ± 3σ
Why Normal Distribution Matters
1. Natural Phenomena Follow Normal Distribution
- Heights of adult men: μ = 170cm, σ = 10cm (bell curve)
- IQ scores: μ = 100, σ = 15 (by design)
- Blood pressure readings, shoe sizes, birth weights
2. Central Limit Theorem
- Average of ANY distribution (even non-normal) → Normal distribution (with large enough sample)
- This makes normal distribution fundamental to statistics
3. Statistical Tests Assume Normality
- T-tests, ANOVA, linear regression all assume normal distribution
- Confidence intervals, p-values rely on normality
4. Quality Control
- Manufacturing tolerances (part dimensions cluster around target)
- Process control charts (detect deviations from normal behavior)
Real Example: Flipkart Delivery Times
Data: 10,000 deliveries in Mumbai
Mean (μ): 32 minutes
Standard Deviation (σ): 6 minutes
Distribution: Approximately normal (bell curve)
Interpretation:
- Most deliveries: 26-38 minutes (μ ± σ)
- 68% of deliveries: 26-38 minutes
- 95% of deliveries: 20-44 minutes (μ ± 2σ)
- 99.7% of deliveries: 14-50 minutes (μ ± 3σ)
Business Application: Set delivery promise based on percentiles
- Promise "30-40 minutes" (covers ~68% of cases)
- For 95% reliability, promise "20-45 minutes" (μ ± 2σ)
Imagine throwing darts at a bullseye. Most darts land near center (mean), fewer land far from center (tails). If you're consistent (low SD), darts cluster tightly (narrow bell curve). If you're inconsistent (high SD), darts scatter widely (wide bell curve). Normal distribution describes this natural clustering pattern.
The 68-95-99.7 Rule (Empirical Rule)
For any normally distributed data, a fixed percentage of values falls within each standard deviation range from the mean.
The Rule
68% of data
├─────────────────────┤
┌──────────────────┐
│ │
│ ╱‾╲ │
│ ╱ ╲ │ 95% of data
│ ╱ ╲ │
│ ╱ ╲ │
─────┼───╱─────────╲────┼───── 99.7% of data
│ ╱ ╲ │
│ ╱ ╲ │
─────┴──────────────────┴─────
μ-3σ μ-2σ μ μ+2σ μ+3σ
- 68% of data within 1 SD (μ ± σ)
- 95% of data within 2 SD (μ ± 2σ)
- 99.7% of data within 3 SD (μ ± 3σ)
Practical Applications
Example 1: Student Test Scores
Data:
Mean (μ): 75 points
Standard Deviation (σ): 10 points
Distribution: Normal
Apply 68-95-99.7 Rule:
1 SD from mean (68% of students):
75 ± 10 = [65, 85] points
→ 68% of students score between 65-85
→ 34% score 65-75, 34% score 75-85
2 SD from mean (95% of students):
75 ± 20 = [55, 95] points
→ 95% of students score between 55-95
→ Only 5% score outside this range (2.5% below 55, 2.5% above 95)
3 SD from mean (99.7% of students):
75 ± 30 = [45, 105] points
→ 99.7% of students score between 45-105
→ Only 0.3% are outliers (0.15% below 45, 0.15% above 105)
Grading Application:
- A grade: Top 2.5% (> μ + 2σ = 95+ points)
- B grade: 84th to 97.5th percentile (85-95 points)
- C grade: 16th to 84th percentile (65-85 points)
- D grade: Bottom 2.5-16% (55-65 points)
- F grade: Bottom 2.5% (< 55 points)
Example 2: Zomato Order Preparation Time
Data:
Mean (μ): 20 minutes
Standard Deviation (σ): 4 minutes
Distribution: Approximately normal
Quality Control Thresholds:
Within 1 SD (68% of orders):
20 ± 4 = [16, 24] minutes
→ Normal range (no alerts)
Within 2 SD (95% of orders):
20 ± 8 = [12, 28] minutes
→ Alert if order takes >28 minutes (only 2.5% should exceed this)
Beyond 3 SD (0.3% of orders):
> 20 + 12 = 32 minutes
→ Critical alert (investigate — very unusual delay)
Anomaly Detection: Orders >32 min are 3 SD above mean (top 0.15%) → Likely issue (restaurant delay, traffic, driver problem)
Example 3: Website Load Time SLA
Data:
Mean (μ): 1.5 seconds
Standard Deviation (σ): 0.3 seconds
Distribution: Normal
SLA Target: "95% of pages load in less than 2 seconds"
Check if Target is Met:
95% of data within μ ± 2σ
Upper bound: 1.5 + 2(0.3) = 1.5 + 0.6 = 2.1 seconds
→ 95% of pages load in [0.9, 2.1] seconds
→ SLA target is 2.0 seconds
→ FAILED SLA (95th percentile is 2.1s, not 2.0s)
Action: Optimize to reduce mean OR standard deviation
- Reduce mean: 1.5s → 1.35s (then 95% < 1.95s ✓)
- Reduce SD: 0.3s → 0.25s (then 95% = 2.0s ✓)
⚠️ CheckpointQuiz error: Missing or invalid options array
Standard Normal Distribution and Z-Scores
Standard Normal Distribution
Definition: Normal distribution with mean = 0, standard deviation = 1.
Notation: Z ~ N(0, 1)
Why it matters: Any normal distribution can be standardized (converted to Z) for easy probability calculations.
Standard Normal (Z)
╱‾╲
╱ ╲
╱ ╲
╱ ╲
___╱_________╲___
-3 -2 -1 0 1 2 3
↑
Mean = 0
SD = 1
Z-Score (Standardization)
Z-score = Number of standard deviations a value is from the mean.
Formula:
Z = (X - μ) / σ
Where:
- X = observed value
- μ = mean
- σ = standard deviation
Interpretation:
- Z = 0 → Value equals mean
- Z = +1 → Value is 1 SD above mean
- Z = -2 → Value is 2 SD below mean
- Z = +3 → Value is 3 SD above mean (top 0.15%, very unusual)
Using Z-Scores: Real Examples
Example 1: Student Performance Comparison
Context: Compare students from different exams (different means and SDs).
Student A:
Test 1 score: 85
Class mean (μ): 75
Class SD (σ): 10
Z = (85 - 75) / 10 = 1.0
→ Student A scored 1 SD above mean (84th percentile)
Student B:
Test 2 score: 78
Class mean (μ): 70
Class SD (σ): 5
Z = (78 - 70) / 5 = 1.6
→ Student B scored 1.6 SD above mean (95th percentile)
Conclusion: Student B performed BETTER relative to their class (Z = 1.6 > 1.0), even though raw score (78) is lower than Student A (85).
Example 2: Flipkart Fraud Detection
Context: Detect unusual order amounts (potential fraud).
Customer Order History:
Mean order value (μ): ₹1,200
SD (σ): ₹400
Distribution: Normal
New Order: ₹4,500
Calculate Z-Score:
Z = (4500 - 1200) / 400 = 8.25
Interpretation:
- Order is 8.25 SD above mean (extremely unusual)
- Probability: P(Z > 8.25) < 0.0001% (virtually impossible by chance)
- Action: Flag for fraud review (likely compromised account or data entry error)
Threshold for Alerts:
- Z > 3: Unusual, investigate (top 0.15%)
- Z > 4: Very unusual, high priority alert (top 0.003%)
- Z > 5: Almost certainly fraud/error (top 0.00003%)
Example 3: Swiggy Delivery Time Percentile
Context: Customer asks "What percentile is my 25-minute delivery?"
Data:
Mean (μ): 32 minutes
SD (σ): 6 minutes
Distribution: Normal
Calculate Z-Score:
Z = (25 - 32) / 6 = -1.17
→ Delivery is 1.17 SD below mean (faster than average)
Find Percentile (using Z-table):
P(Z < -1.17) = 0.121 = 12.1%
Interpretation: Only 12% of deliveries are faster than 25 minutes
→ Customer is in top 12% (faster than 88% of deliveries)
Z-Table (Standard Normal Table)
Purpose: Convert Z-score to probability (percentile).
Common Z-Scores:
| Z-Score | Percentile | Interpretation | |---------|------------|----------------| | -3.0 | 0.15% | Bottom 0.15% (extremely low) | | -2.0 | 2.5% | Bottom 2.5% (unusually low) | | -1.0 | 16% | Bottom 16% (below average) | | 0.0 | 50% | Median (exactly average) | | +1.0 | 84% | Top 16% (above average) | | +2.0 | 97.5% | Top 2.5% (unusually high) | | +3.0 | 99.85% | Top 0.15% (extremely high) |
How to Use:
- Calculate Z-score: Z = (X - μ) / σ
- Look up Z in table → Get percentile
- Interpret: "Value is in Xth percentile" (higher/lower than X% of data)
Quick Rule: If |Z| > 2 (absolute value > 2), the value is unusual (outside 95% of data). If |Z| > 3, it's very unusual (outside 99.7% of data) — flag for investigation.
How to Check if Data is Normally Distributed
Many statistical tests assume normality. Here's how to check if your data follows a normal distribution.
Method 1: Visual Inspection (Histogram)
Create a histogram and check for bell curve shape.
Python Example:
import pandas as pd
import matplotlib.pyplot as plt
# Sample data: Delivery times
data = pd.Series([28, 30, 31, 32, 32, 33, 34, 34, 35, 36, ...])
# Histogram
plt.hist(data, bins=30, edgecolor='black', alpha=0.7)
plt.xlabel('Delivery Time (minutes)')
plt.ylabel('Frequency')
plt.title('Delivery Time Distribution')
plt.show()What to Look For:
- ✓ Symmetric bell shape (normal)
- ✗ Right skew (long tail on right — use median, not mean)
- ✗ Left skew (long tail on left — not normal)
- ✗ Bimodal (two peaks — two separate populations)
- ✗ Uniform (flat — all values equally likely, not normal)
Method 2: Q-Q Plot (Quantile-Quantile Plot)
Compare your data's quantiles to theoretical normal distribution quantiles.
Python Example:
import scipy.stats as stats
# Q-Q plot
stats.probplot(data, dist="norm", plot=plt)
plt.title('Q-Q Plot')
plt.show()Interpretation:
- ✓ Points fall on straight line: Data is normally distributed
- ✗ Points deviate from line: Data is not normal
- S-curve: Heavy tails (more outliers than normal)
- Inverted S: Light tails (fewer outliers than normal)
Method 3: Shapiro-Wilk Test (Statistical Test)
Formal hypothesis test for normality.
Python Example:
from scipy.stats import shapiro
stat, p_value = shapiro(data)
print(f"Shapiro-Wilk statistic: {stat:.4f}")
print(f"P-value: {p_value:.4f}")
if p_value > 0.05:
print("Data is normally distributed (fail to reject H₀)")
else:
print("Data is NOT normally distributed (reject H₀)")Interpretation:
- p > 0.05: Data is consistent with normal distribution (assume normality)
- p ≤ 0.05: Data is NOT normally distributed (use non-parametric tests)
Note: Shapiro-Wilk is sensitive to large samples (n > 5,000 often rejects normality even for "normal-ish" data). For large samples, rely more on visual inspection.
Method 4: Skewness and Kurtosis
Check symmetry (skewness) and tail heaviness (kurtosis).
Python Example:
from scipy.stats import skew, kurtosis
skewness = skew(data)
kurt = kurtosis(data)
print(f"Skewness: {skewness:.2f}")
print(f"Kurtosis: {kurt:.2f}")
# Normal distribution: skewness ≈ 0, kurtosis ≈ 0Interpretation:
Skewness:
- ≈ 0: Symmetric (normal)
- > 0: Right-skewed (long right tail)
- < 0: Left-skewed (long left tail)
- |skew| > 1: Highly skewed (not normal)
Kurtosis (excess kurtosis):
- ≈ 0: Normal tails (mesokurtic)
- > 0: Heavy tails (leptokurtic — more outliers)
- < 0: Light tails (platykurtic — fewer outliers)
- |kurt| > 3: Very different from normal
When Data is NOT Normal
Options:
1. Transform Data (make it more normal):
- Log transformation: For right-skewed data (income, order values)
- Square root: For moderate right skew
- Box-Cox: Automated optimal transformation
import numpy as np
# Log transformation
data_log = np.log(data + 1) # +1 to handle zeros
# Check if transformed data is more normal
stats.probplot(data_log, dist="norm", plot=plt)2. Use Non-Parametric Tests (don't assume normality):
- Mann-Whitney U (instead of t-test)
- Kruskal-Wallis (instead of ANOVA)
- Spearman correlation (instead of Pearson)
3. Use Percentiles (instead of mean ± SD):
- Report median (P50), IQR (P25-P75), P95, P99
- Percentiles work for ANY distribution
4. Central Limit Theorem (for large samples):
- Even if data is not normal, the MEAN of samples is approximately normal (for n > 30)
- Allows t-tests on non-normal data if sample size is large
Real-World Applications of Normal Distribution
Application 1: A/B Test Sample Size Calculation
Context: Planning A/B test for Flipkart homepage redesign.
Assumptions:
- Current conversion: 2.5%
- Want to detect 10% relative lift (2.5% → 2.75%)
- Significance: α = 0.05, Power: 80%
Normal Distribution Used: Sample proportions are approximately normally distributed (by CLT).
Formula (simplified):
n = 2 × (Zα/2 + Zβ)² × p(1-p) / (p₁-p₀)²
Where:
- Zα/2 = 1.96 (for α = 0.05, two-tailed)
- Zβ = 0.84 (for power = 80%)
- p = 0.025 (baseline conversion)
- p₁-p₀ = 0.0025 (absolute difference)
n ≈ 62,000 per group (124,000 total)
Action: Run test with 62K users per variant to reliably detect 10% lift.
Application 2: Quality Control (Manufacturing)
Context: Electronics factory produces resistors (target: 100 ohms).
Data:
Mean (μ): 100.2 ohms
SD (σ): 1.5 ohms
Distribution: Normal
Tolerance: 100 ± 5 ohms (95-105 ohms)
Calculate Defect Rate:
Lower limit: 95 ohms = μ - 3.47σ (Z = -3.47)
Upper limit: 105 ohms = μ + 3.20σ (Z = +3.20)
P(outside tolerance) ≈ 0.07% (very low defect rate)
Control Chart: Monitor daily mean and SD. Alert if:
- Mean shifts (μ ≠ 100 ohms → recalibrate machine)
- SD increases (σ > 1.5 ohms → machine wearing out)
Application 3: Risk Management (Finance)
Context: Portfolio returns normally distributed.
Data:
Mean annual return (μ): 12%
SD (σ): 15% (volatility)
Distribution: Normal
Risk Metrics:
Value at Risk (VaR) — Maximum loss at 95% confidence:
95% VaR = μ - 1.645σ
= 12% - 1.645(15%)
= 12% - 24.7%
= -12.7%
Interpretation: 95% confident you won't lose more than 12.7% in a year
(5% chance of worse loss)
Expected Shortfall — Average loss in worst 5% scenarios:
ES = μ - 2.06σ (for normal distribution)
= 12% - 2.06(15%)
= -18.9%
Interpretation: IF you hit the worst 5% of outcomes, expect ~19% loss
Application 4: Grading on a Curve
Context: Professor wants to assign letter grades based on normal distribution.
Data:
Class scores: Mean = 72, SD = 10
Distribution: Approximately normal
Target: A (10%), B (20%), C (40%), D (20%), F (10%)
Grading Cutoffs (using Z-scores):
A: Top 10% → Z ≥ 1.28 → Score ≥ 72 + 1.28(10) = 85
B: 70-90th percentile → Z = 0.52 to 1.28 → Score = 77-84
C: 30-70th percentile → Z = -0.52 to 0.52 → Score = 67-76
D: 10-30th percentile → Z = -1.28 to -0.52 → Score = 59-66
F: Bottom 10% → Z < -1.28 → Score < 59
Result: Consistent grading regardless of exam difficulty (normalized to class performance).
⚠️ FinalQuiz error: Missing or invalid questions array
⚠️ SummarySection error: Missing or invalid items array
Received: {"hasItems":false,"isArray":false}