Summary and Practical Guide to Hypothesis Testing › Complete Reporting Example
Michael BrenndoerferJanuary 10, 20262 min read
Machine Learning from ScratchAll chapters Part 2 of 9Hypothesis Testing
Summary and Practical Guide to Hypothesis Testing › Complete Reporting ExampleOne section · Sections in this chapter8 / 12 ↓
Sections in this chapter12
Reading tools Definitions & inline links
Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.
Article links
Make inline references clickable
Here's an example of a complete analysis with proper reporting:
In[8]:
Codeimport numpy as np
from scipy import stats
# Research question: Does a new teaching method improve test scores?
np.random.seed(42)
control = np.random.normal(75, 12, 30) # Traditional method
treatment = np.random.normal(82, 11, 30) # New method
# 1. Descriptive statistics
print("=" * 60)
print("DESCRIPTIVE STATISTICS")
print("=" * 60)
print(
f"Control: n = {len(control)}, M = {np.mean(control):.2f}, SD = {np.std(control, ddof=1):.2f}"
)
print(
f"Treatment: n = {len(treatment)}, M = {np.mean(treatment):.2f}, SD = {np.std(treatment, ddof=1):.2f}"
)
print()
# 2. Check assumptions
print("=" * 60)
print("ASSUMPTION CHECKS")
print("=" * 60)
# Normality
_, p_norm_ctrl = stats.shapiro(control)
_, p_norm_treat = stats.shapiro(treatment)
print(
f"Shapiro-Wilk (Control): W = {stats.shapiro(control)[0]:.3f}, p = {p_norm_ctrl:.3f}"
)
print(
f"Shapiro-Wilk (Treatment): W = {stats.shapiro(treatment)[0]:.3f}, p = {p_norm_treat:.3f}"
)
print(" → Normality assumption supported (p > 0.05 for both groups)")
print()
# Equal variances
_, p_levene = stats.levene(control, treatment)
print(
f"Levene's test: F = {stats.levene(control, treatment)[0]:.3f}, p = {p_levene:.3f}"
)
print(" → Equal variances assumption supported (p > 0.05)")
print()
# 3. Conduct test
print("=" * 60)
print("HYPOTHESIS TEST")
print("=" * 60)
t_stat, p_value = stats.ttest_ind(treatment, control, equal_var=True)
df = len(control) + len(treatment) - 2
print(f"Two-sample t-test: t({df}) = {t_stat:.3f}, p = {p_value:.4f}")
print()
# 4. Effect size
mean_diff = np.mean(treatment) - np.mean(control)
pooled_std = np.sqrt(
(
(len(control) - 1) * np.var(control, ddof=1)
+ (len(treatment) - 1) * np.var(treatment, ddof=1)
)
/ (len(control) + len(treatment) - 2)
)
cohens_d = mean_diff / pooled_std
print("=" * 60)
print("EFFECT SIZE")
print("=" * 60)
print(f"Mean difference: {mean_diff:.2f} points")
print(f"Cohen's d = {cohens_d:.3f} (large effect)")
print()
# 5. Confidence interval for difference
se_diff = pooled_std * np.sqrt(1 / len(control) + 1 / len(treatment))
t_crit = stats.t.ppf(0.975, df)
ci_lower = mean_diff - t_crit * se_diff
ci_upper = mean_diff + t_crit * se_diff
print("=" * 60)
print("CONFIDENCE INTERVAL")
print("=" * 60)
print(f"95% CI for difference: [{ci_lower:.2f}, {ci_upper:.2f}]")
print()
# 6. Complete report
print("=" * 60)
print("COMPLETE REPORT (APA STYLE)")
print("=" * 60)
print(
f"Students in the new teaching method condition (M = {np.mean(treatment):.1f}, "
)
print(
f"SD = {np.std(treatment, ddof=1):.1f}) scored significantly higher than those in the "
)
print(
f"traditional method condition (M = {np.mean(control):.1f}, SD = {np.std(control, ddof=1):.1f}), "
)
print(
f"t({df}) = {t_stat:.2f}, p {'< 0.001' if p_value < 0.001 else f'= {p_value:.3f}'}, "
)
print(f"95% CI [{ci_lower:.1f}, {ci_upper:.1f}], Cohen's d = {cohens_d:.2f}.")Out[8]:
Console============================================================ DESCRIPTIVE STATISTICS ============================================================ Control: n = 30, M = 72.74, SD = 10.80 Treatment: n = 30, M = 80.67, SD = 10.24 ============================================================ ASSUMPTION CHECKS ============================================================ Shapiro-Wilk (Control): W = 0.975, p = 0.687 Shapiro-Wilk (Treatment): W = 0.984, p = 0.913 → Normality assumption supported (p > 0.05 for both groups) Levene's test: F = 0.002, p = 0.963 → Equal variances assumption supported (p > 0.05) ============================================================ HYPOTHESIS TEST ============================================================ Two-sample t-test: t(58) = 2.916, p = 0.0050 ============================================================ EFFECT SIZE ============================================================ Mean difference: 7.92 points Cohen's d = 0.753 (large effect) ============================================================ CONFIDENCE INTERVAL ============================================================ 95% CI for difference: [2.49, 13.36] ============================================================ COMPLETE REPORT (APA STYLE) ============================================================ Students in the new teaching method condition (M = 80.7, SD = 10.2) scored significantly higher than those in the traditional method condition (M = 72.7, SD = 10.8), t(58) = 2.92, p = 0.005, 95% CI [2.5, 13.4], Cohen's d = 0.75.