You'll hear "the average is X" hundreds of times in your career. Half the time it's a useful number. Half the time it misleads - sometimes by accident, sometimes by design. This lesson is about telling the two apart.
The number we usually mean by "average"
When most people say "average", they mean the arithmetic mean - sum the values, divide by the count. It's what Excel's =AVERAGE(...) returns. The mean is honest when the data is roughly symmetric and free of outliers, and misleading the moment those conditions break.
The case study
A SaaS founder reports in the all-hands: "Our average revenue per user is ₹2,400."
You pull the data:
- 9,800 users pay ₹400–₹900 per month
- 200 enterprise customers pay ₹40,000+ per month
The mean is ₹2,400. The median - the middle user - pays ₹650.
Both numbers are correct. They describe the same data. They tell completely different stories to the board.
The three you need to know
Mean - sum / count. Pulled in the direction of outliers. Use when the data is roughly symmetric, or when you actually care about the total (revenue, sales, anything that adds up).
Median - the middle value when sorted. Robust to outliers. Use when the data is skewed (incomes, prices, durations, latency, LTV) and you want to describe the typical experience.
Mode - the most common value. Use for categorical data (most-used feature, most popular plan). Rarely useful for continuous data in DA work.
The skew test in Python
import numpy as np
import pandas as pd
from scipy import stats
# Simulated SaaS revenue per user (9,800 standard users + 200 enterprise whales)
np.random.seed(42)
standard_users = np.random.uniform(400, 900, 9800)
enterprise_whales = np.random.uniform(30000, 50000, 200)
revenue = np.concatenate([standard_users, enterprise_whales])
df = pd.DataFrame({"revenue_inr": revenue})
# 1. Summary statistics
mean_val = df["revenue_inr"].mean()
median_val = df["revenue_inr"].median()
mode_val = stats.mode(np.round(df["revenue_inr"], -2), keepdims=True).mode[0]
skew_ratio = abs(mean_val - median_val) / median_val
print(f"Mean Revenue: ₹{mean_val:,.2f}")
print(f"Median Revenue: ₹{median_val:,.2f}")
print(f"Mode (approx): ₹{mode_val:,.2f}")
print(f"Skew Ratio: {skew_ratio:.2%}")
# 2. Automated skew test rule
if skew_ratio > 0.20:
print("⚠️ Heavy skew detected! Always report Median alongside Mean in executive readouts.")
If mean and median differ by more than ~20%, the distribution is skewed enough that one number alone misleads. Show both. Let the reader decide.
Three places this bites you in DA work
- Revenue per user. Mean ARPU includes the whales. Median ARPU describes the rest. Report both. Always.
- Page load times. A few slow requests drag up the mean while the typical experience is fine. Report median + p95.
- Time-to-complete. Median onboarding is usually a few minutes. Mean is much higher because a few users never finish. Median tells the truth about typical users.
Takeaway
When someone says "on average", ask:
- Which average - mean or median?
- Are they close, or far apart?
- Which direction does the skew run, and does the choice of statistic flatter or hide it?
Half the time the speaker doesn't know. The other half, they're showing the number that supports their narrative. Either way, your job is to ask.