Kerangka lima langkah dari chapter Konsep Hipotesis Statistik tidak berubah: rumuskan H0 dan H1, tetapkan α sebelum melihat data, hitung statistik uji, hitung p-value, ambil keputusan. Yang berubah pada chapter ini adalah pelaksana langkah ketiga dan keempat — scipy.stats menghitung statistik uji beserta p-value-nya dalam satu panggilan fungsi, lengkap dengan distribusi rujukan yang tepat. Langkah pertama, kedua, dan kelima tetap milik analis: fungsi tidak tahu apa klaim yang diuji dan seberapa besar risiko yang disanggupi. Seluruh contoh section teori dijalankan ulang di sini — data dan angkanya sama, sehingga yang tersisa hanyalah membandingkan kepraktisan alatnya.

Peta Fungsi Uji #

Lima uji inti Section Pengujian Hipotesis punya padanan satu fungsi di scipy.stats:

PertanyaanFungsiContoh di chapter teori
Mean satu sampel beda dari klaim?ttest_1sampZ-Test dan T-Test
Mean dua kelompok independen beda?ttest_indZ-Test dan T-Test
Dua variabel kategorik berkaitan?chi2_contingencyChi-Square Test
Tiga mean atau lebih beda?f_onewayANOVA
Dua variabel numerik berkorelasi?pearsonrKorelasi

Satu kebiasaan baru yang perlu dikenali sejak awal: fungsi-fungsi modern SciPy tidak mengembalikan tuple polos, melainkan objek hasil — TtestResult, PearsonRResult — yang menyimpan statistik uji pada atribut .statistic dan p-value pada .pvalue. Objek hasil itu tetap bisa di-unpack seperti tuple, jadi kode lama gaya t, p = ttest_1samp(...) tetap sah; gaya atribut hanya lebih eksplisit tentang isi tiap nilai.

ttest_1samp: Satu Sampel terhadap Klaim μ = 80 #

Kasus pertama chapter Z-Test dan T-Test: kepala sekolah mengklaim rata-rata nilai μ = 80, sampel 16 siswa diambil, dan uji dua arah dijalankan pada α = 0.05. Data 16 nilai berikut sengaja dipilih pada chapter teori sehingga x̄ = 83 dan s = 8 eksak — kita konfirmasikan dulu keduanya, karena ttest_1samp menerima data mentah dan menghitung statistiknya sendiri di dalam.

python
import numpy as np
from scipy.stats import ttest_1samp

nilai = [69, 73, 74, 75, 79, 80, 81, 82, 83, 84,
         86, 89, 90, 92, 95, 96]

print(f"mean sampel = {np.mean(nilai):.1f}  s = {np.std(nilai, ddof=1):.1f}")

hasil = ttest_1samp(nilai, popmean=80)
print(f"t = {hasil.statistic:.4f}  p = {hasil.pvalue:.4f}")

t_stat, p_value = hasil   # unpacking gaya tuple juga sah
print(f"t = {t_stat:.4f}  p = {p_value:.4f}")

Output yang Dihasilkan:

text
mean sampel = 83.0  s = 8.0
t = 1.5000  p = 0.1544
t = 1.5000  p = 0.1544

Hasilnya identik dengan lima langkah manual: t = (83 − 80)/(8/√16) = 1.5000 dengan df = 15, dan p-value dua arah 0.1544 — baris kedua dan ketiga keluaran sama karena keduanya mengakses hasil yang sama, sekali lewat atribut dan sekali lewat unpacking. Perhatikan parameter ddof=1 pada np.std — numpy memakai pembagi n secara bawaan, sedangkan simpangan baku sampel memakai n − 1; tanpa ddof=1, s akan terbaca 7.75 dan verifikasi awal tidak cocok. Keputusan akhirnya tetap langkah kelima milik kita: karena 0.1544 ≥ 0.05, kita gagal menolak H0 — selisih tiga poin masih berada dalam rentang fluktuasi sampling yang wajar, persis kesimpulan chapter teori.

ttest_ind: Dua Kelas, Pooled dan Welch #

Kasus kedua membandingkan kelas A dan kelas B — sepuluh siswa per kelas dengan mean 82 berbanding 78. Default ttest_ind adalah equal_var=True: penyebutnya memakai variance gabungan (pooled) sebagaimana rumus manual chapter teori, sehingga hasilnya diharapkan cocok. Parameter equal_var=False mengaktifkan uji Welch yang tidak mensyaratkan varians kedua kelompok sama.

python
from scipy.stats import ttest_ind

kelas_a = [73, 76, 76, 79, 82, 82, 85, 88, 88, 91]
kelas_b = [69, 72, 72, 75, 78, 78, 81, 84, 84, 87]

pooled = ttest_ind(kelas_a, kelas_b)                  # default: varians disamakan
welch = ttest_ind(kelas_a, kelas_b, equal_var=False)  # Welch: tanpa syarat itu

print(f"pooled : t = {pooled.statistic:.4f}  p = {pooled.pvalue:.4f}  df = {pooled.df:.0f}")
print(f"welch  : t = {welch.statistic:.4f}  p = {welch.pvalue:.4f}  df = {welch.df:.2f}")

Output yang Dihasilkan:

text
pooled : t = 1.4907  p = 0.1534  df = 18
welch  : t = 1.4907  p = 0.1534  df = 18.00

Angka pooled — t = 1.4907 dengan df = 18 dan p = 0.1534 — persis perhitungan variance gabungan chapter teori, dan keputusannya gagal menolak H0. Kejutannya justru pada baris Welch: keduanya identik pada data ini. Penyebabnya terbaca dari desain data — kedua kelas memiliki s = 6 dan n = 10 yang sama, sehingga taksiran df Welch jatuh tepat pada 18 dan penyebutnya berimpit dengan pooled. Pada data nyata yang sebaran kedua kelompoknya berbeda jauh, kedua baris ini akan berbeda dan Welch menjadi pilihan yang lebih aman; kebetulan yang rapi pada contoh kita tidak boleh disimpulkan sebagai aturan umum.

chi2_contingency: Yates Aktif secara Default #

Tabel silang gender dan moda transportasi — 100 responden dengan hitungan [[30, 20], [20, 30]] — diuji kemandiriannya dengan chi2_contingency. Satu detail perilaku fungsi ini wajib diketahui: untuk tabel 2×2, koreksi kontinuitas Yates aktif secara default. Chapter Chi-Square Test menghitung manualnya tanpa koreksi, sehingga kita jalankan keduanya.

python
from scipy.stats import chi2_contingency

tabel = [[30, 20], [20, 30]]

yates = chi2_contingency(tabel)                  # default: koreksi Yates aktif
tanpa = chi2_contingency(tabel, correction=False)

print(f"koreksi Yates : chi2 = {yates.statistic:.4f}  p = {yates.pvalue:.4f}")
print(f"tanpa koreksi : chi2 = {tanpa.statistic:.4f}  p = {tanpa.pvalue:.4f}")
print(f"df = {tanpa.dof}  expected tiap sel = {[float(e) for e in tanpa.expected_freq.ravel()]}")

Output yang Dihasilkan:

text
koreksi Yates : chi2 = 3.2400  p = 0.0719
tanpa koreksi : chi2 = 4.0000  p = 0.0455
df = 1  expected tiap sel = [25.0, 25.0, 25.0, 25.0]

Versi tanpa koreksi menghasilkan χ² = 4.0000 dan p = 0.0455 — persis hitungan manual chapter teori, dengan expected 25 per sel yang memenuhi syarat chi-square (minimal 5). Versi default dengan Yates memberi χ² = 3.2400 dan p = 0.0719. Konsekuensinya nyata: pada α = 0.05, versi tanpa koreksi menolak H0 sedangkan versi berkoreksi gagal menolak. Ini bukan galat SciPy — koreksi Yates memang dirancang konservatif untuk tabel 2×2 dengan sampel kecil, dan chapter teori sudah membahasnya sebagai peringatan yang lebih luas: bila p-value berdekatan dengan α, keputusan sensitif terhadap detail metode, sehingga laporan yang jujur mencatat statistik, df, p-value, dan pilihan koreksi apa adanya.

f_oneway dan pearsonr: ANOVA serta Korelasi #

Dua uji terakhir dikerjakan dalam satu blok. ANOVA tiga metode belajar dari chapter ANOVA membandingkan lima siswa per metode; korelasi Pearson memakai data enam siswa yang sama dengan chapter Korelasi dan Simple Linear Regression.

python
from scipy.stats import f_oneway, pearsonr

metode_a = [75, 78, 80, 82, 85]
metode_b = [82, 85, 87, 89, 92]
metode_c = [70, 74, 78, 80, 84]

anova = f_oneway(metode_a, metode_b, metode_c)
print(f"ANOVA    : F = {anova.statistic:.4f}  p = {anova.pvalue:.4f}")

jam = [2, 3, 4, 5, 6, 7]
nilai = [65, 70, 75, 82, 86, 91]
korelasi = pearsonr(jam, nilai)
print(f"korelasi : r = {korelasi.statistic:.4f}  p = {korelasi.pvalue:.7f}")

Output yang Dihasilkan:

text
ANOVA    : F = 6.5670  p = 0.0118
korelasi : r = 0.9981  p = 0.0000057

ANOVA menghasilkan F = 6.5670 dengan p = 0.0118 — identik dengan tabel ANOVA yang dulu disusun manual dari SS_between, SS_within, hingga rasio F. Karena 0.0118 < 0.05, H0 “ketiga mean sama” ditolak; interpretasinya berhenti di “minimal satu metode berbeda”, dan menindaklanjuti pasangan mana yang berbeda menuntut uji post-hoc — bahasan chapter ANOVA yang berada di luar fungsi satu baris ini. Korelasi Pearson menghasilkan r = 0.9981 dengan p = 0.0000057, angka yang sama dengan uji-t korelasi pada chapter Korelasi: hubungan linear positif yang sangat kuat pada enam observasi, nyaris mustahil muncul bila korelasi populasi sebenarnya nol.

Pola seluruh chapter ini konsisten: data dan parameter masuk, objek hasil keluar, lalu keputusan diambil dengan membandingkan p-value terhadap α yang sudah ditetapkan di muka. Pertanyaan berikutnya bukan lagi “apakah berbeda” melainkan “berapa nilai yang diperkirakan” — menjawabnya membutuhkan model, bukan uji. Chapter penutup section ini membangun model itu: regresi linear dari standard library hingga statsmodels, semuanya dijalankan pada data enam siswa yang sudah berkali-kali menjadi rekan kita. Rujukan lengkap seluruh fungsi uji tersedia di dokumentasi scipy.stats , dan kerangka konseptualnya dibahas di Penn State STAT 500 .