Statistics for Analytics — Practice Questions¶
Consolidation exercises covering all statistics topics: central tendency, spread, probability, distributions, and hypothesis testing.
Level 1 — Conceptual¶
Q1.1 — You have daily revenue data. The mean is £48,500 and the median is £32,000. What does this tell you about the distribution? Which measure would you report to the CEO, and why?
Q1.2 — A support team handles 15 tickets per hour on average. Use the Poisson distribution to estimate: - The expected number of hours where fewer than 10 tickets arrive - The probability of getting more than 25 tickets in a single hour
Q1.3 — An email campaign is sent to 5,000 users with a historical open rate of 22%. What is the expected number of opens? What is the probability of fewer than 1,000 opens?
Q1.4 — Two products have the same average return rate (8%). Product A has std = 2%, Product B has std = 9%. Which would you choose if you want predictable, stable returns? Express your reasoning using the coefficient of variation.
Level 2 — Computation¶
Q2.1 — Confidence interval
A sample of 50 orders has mean £189 and std £62. Construct a 95% confidence interval for the true mean order value. Interpret it in plain English for a non-technical manager.
Show answer
import numpy as np
from scipy import stats
n, mean, std = 50, 189, 62
sem = std / np.sqrt(n)
ci = stats.t.interval(0.95, df=n-1, loc=mean, scale=sem)
print(f"95% CI: £{ci[0]:.2f} to £{ci[1]:.2f}")
# 95% CI: £171.37 to £206.63
# Plain English: "We are 95% confident that the true average order value
# for all customers is between £171 and £207."
Q2.2 — Two-sample t-test
Weekend orders have mean £215 (n=120, std=£88). Weekday orders have mean £192 (n=380, std=£71). Is the difference statistically significant at the 5% level?
Show answer
from scipy import stats
import numpy as np
# Using t-test with known means and stds (manual approach)
n1, m1, s1 = 120, 215, 88
n2, m2, s2 = 380, 192, 71
# Welch t-test formula
se = np.sqrt(s1**2/n1 + s2**2/n2)
t_stat = (m1 - m2) / se
df = (s1**2/n1 + s2**2/n2)**2 / ((s1**2/n1)**2/(n1-1) + (s2**2/n2)**2/(n2-1))
p_value = 2 * stats.t.sf(abs(t_stat), df)
print(f"t = {t_stat:.3f}, p = {p_value:.4f}")
print(f"Significant: {p_value < 0.05}")
# Yes, significant — weekend orders are genuinely higher value
Q2.3 — A/B test analysis
A new checkout flow (B) was shown to 800 users, of whom 104 completed a purchase (13%). The old flow (A) was shown to 800 users, 88 of whom completed (11%). Is B significantly better?
Show answer
from scipy.stats import chi2_contingency
import numpy as np
table = np.array([
[88, 800 - 88], # A: conversions, non-conversions
[104, 800 - 104], # B: conversions, non-conversions
])
chi2, p, dof, expected = chi2_contingency(table)
print(f"p-value: {p:.4f}")
print(f"Significant: {p < 0.05}")
# Lift
rate_a, rate_b = 88/800, 104/800
lift = rate_b - rate_a
print(f"Absolute lift: {lift:.1%}")
print(f"Relative lift: {lift/rate_a:.1%}")
Level 3 — Scenario Questions¶
Q3.1 — The confused stakeholder
A marketing director says: "Our A/B test was significant (p = 0.01), so we know the new landing page improves conversions by 15%." List three things wrong with this statement and provide the correct interpretation.
Show answer
Wrong: "We know" — p = 0.01 means we have strong evidence, not certainty. There's still a 1% chance of a false positive.
Wrong: "The new page improves conversions" — we can only say there's an observed difference. We should check that the test was properly randomised, ran long enough, and has no confounders.
Wrong: "by 15%" — the 15% is a point estimate. We should also report the confidence interval (e.g., 8-22% lift at 95% CI). If the CI is wide, the estimate is imprecise.
Correct interpretation: "Our A/B test found a statistically significant improvement (p = 0.01) with an observed 15% relative lift in conversion (95% CI: 8%-22%). Assuming the test was properly designed and run, we have strong evidence to roll out the new landing page, while monitoring actual conversion post-launch."
Q3.2 — Seasonality confounder
You compare revenue in December to November and find a 35% increase. A colleague concludes "our new email campaign drove 35% revenue growth." What statistical issues does this ignore?
Show answer
-
Seasonality: December is always higher due to holiday shopping. You'd need to compare December 2024 to December 2023 (year-over-year), not to November 2024.
-
No control group: If the email campaign reached all customers, there's no way to separate the campaign effect from the seasonal effect.
-
Correlation ≠ causation: Even if you ran the email campaign and revenue grew, revenue might have grown without it.
Correct approach: - Run an A/B test: send emails to 50% of customers, not to the other 50% - Compare the two groups' December revenue - Control for customer segment and historical purchase frequency
Statistics Reference Card¶
from scipy import stats
import numpy as np
# ── Descriptive stats ───────────────────────────────
data = df["total"].dropna()
mean, median = data.mean(), data.median()
std, var = data.std(), data.var()
skew = data.skew()
cv = std / mean # coefficient of variation
# ── Confidence interval ─────────────────────────────
ci = stats.t.interval(0.95, df=len(data)-1, loc=mean, scale=stats.sem(data))
# ── One-sample t-test (is mean = target?) ───────────
t_stat, p = stats.ttest_1samp(data, popmean=200)
# ── Two-sample t-test (are two groups different?) ───
t_stat, p = stats.ttest_ind(group_a, group_b, equal_var=False)
# ── Chi-square test (proportions) ───────────────────
chi2, p, dof, expected = stats.chi2_contingency(contingency_table)
# ── Correlation ─────────────────────────────────────
r, p = stats.pearsonr(x, y)
r_sp, p_sp = stats.spearmanr(x, y)
# ── Normality test ───────────────────────────────────
stat, p = stats.shapiro(data.sample(min(1000, len(data))))