Skip to content

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.

import numpy as np
from scipy import stats

n = 50
mean = 189
std = 62
# Your code here
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
  1. 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.

  2. No control group: If the email campaign reached all customers, there's no way to separate the campaign effect from the seasonal effect.

  3. 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))))

← Statistics for Business · Next: Interview Questions →