Uji t meminta data numerik yang cukup tertib, tetapi banyak data di lapangan berupa urutan saja atau berisi nilai ekstrem yang membuat rata-rata goyah. Topik ini membahas uji nonparametrik (nonparametric test) yang bekerja pada peringkat (rank), yaitu posisi nilai setelah data diurutkan, sehingga bentuk sebaran tidak lagi menentukan keabsahan uji. Dua uji dibahas, yaitu uji Mann-Whitney U untuk dua kelompok bebas dan uji Wilcoxon signed-rank untuk dua pengukuran berpasangan. Keduanya dibangun dari intuisi penghitungan manual dan simulasi permutasi sebelum sampai pada fungsi resminya di SciPy. Hasilnya dibandingkan dengan uji t pada data yang sama agar perbedaan jalannya terlihat.
Kapan peringkat lebih tepat#
Peringkat menggantikan nilai asli dengan posisinya setelah seluruh data digabung dan diurutkan, sehingga nilai terbesar sebesar apa pun hanya duduk di peringkat teratas. Sifat inilah yang membuat uji berbasis peringkat tahan terhadap pencilan dan ekor sebaran yang berat. Tiga kondisi membuat pendekatan ini lebih tepat daripada uji t. Pertama, datanya ordinal, misalnya skala kepuasan 1 sampai 5, sehingga jarak antarangkanya belum tentu bermakna tetapi urutannya sah. Kedua, sebarannya menceng dengan ekor panjang searah, seperti waktu reaksi atau waktu pengerjaan. Ketiga, sampel kecil dan berisi pencilan yang tidak dapat dibuang tanpa alasan yang jelas.
Uji berbasis peringkat sering disebut statistik bebas distribusi (distribution-free), karena p-value tidak menuntut asumsi tentang bentuk distribusi populasi. Kata bebas di sini tidak berarti bebas dari seluruh asumsi, karena observasi tetap harus saling bebas dan pengambilan sampelnya acak. Pada uji Mann-Whitney, penafsiran hasil juga lebih aman dinyatakan sebagai perbedaan sebaran antarkelompok, bukan semata perbedaan median, apabila bentuk sebaran kedua kelompok berbeda.
Mann-Whitney U sebagai penghitungan pasangan#
Statistik U memiliki makna yang dapat dihitung langsung dari data tanpa rumus distribusi. Untuk dua kelompok berukuran dan , U menghitung banyaknya pasangan yang nilai kelompok pertamanya lebih besar, ditambah setengah kali banyaknya pasangan yang nilainya seri (tie).
Apabila kedua kelompok berasal dari sebaran yang sama, setiap pasangan sama peluangnya menempatkan salah satu anggotanya di atas, sehingga harapan U adalah . Nilai U yang jauh dari tengah menunjukkan salah satu kelompok cenderung lebih besar. Program berikut membandingkan waktu reaksi dua metode latihan pada 30 siswa per kelompok, menghitung U dari penghitungan pasangan, memverifikasinya dengan 10.000 permutasi peringkat, lalu menjalankan mannwhitneyu beserta uji t pada data yang sama.
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# Waktu reaksi (ms) 30 siswa pada dua metode latihan, sebarannya menceng
rng = np.random.default_rng(42)
lama = np.round(rng.exponential(scale=400.0, size=30) + 120.0)
baru = np.round(rng.exponential(scale=220.0, size=30) + 120.0)
print(f"Median metode lama : {np.median(lama):.4f}")
print(f"Median metode baru : {np.median(baru):.4f}")
# U = banyaknya pasangan (nilai baru, nilai lama) dengan nilai baru lebih besar,
# ditambah setengah kali banyaknya seri
U_manual = np.sum(baru[:, None] > lama[None, :]) \
+ 0.5 * np.sum(baru[:, None] == lama[None, :])
print(f"U dari penghitungan pasangan : {U_manual:.1f}")
# Simulasi permutasi peringkat: 10.000 pengacakan label pada peringkat gabungan
gabungan = np.concatenate([lama, baru])
peringkat = stats.rankdata(gabungan)
rng_perm = np.random.default_rng(43)
acak = rng_perm.permuted(np.tile(peringkat, (10_000, 1)), axis=1)
U_sim = acak[:, :30].sum(axis=1) - 30 * 31 / 2
pusat = 30 * 30 / 2
p_perm = (np.count_nonzero(np.abs(U_sim - pusat) >= abs(U_manual - pusat)) + 1) / 10_001
print(f"p-value permutasi peringkat : {p_perm:.4f}")
# Uji formal SciPy dan pembanding uji t pada data yang sama
hasil = stats.mannwhitneyu(baru, lama, alternative="two-sided")
t = stats.ttest_ind(baru, lama)
print(f"SciPy mannwhitneyu: U = {hasil.statistic:.1f}, p-value = {hasil.pvalue:.4f}")
print(f"SciPy ttest_ind : t = {t.statistic:.4f}, p-value = {t.pvalue:.4f}")
bins = np.arange(100, 1250, 50)
fig, ax = plt.subplots(figsize=(7, 4), constrained_layout=True)
ax.hist(lama, bins=bins, alpha=0.65, color="#4c72b0", edgecolor="white", label="Metode lama")
ax.hist(baru, bins=bins, alpha=0.65, color="#55a868", edgecolor="white", label="Metode baru")
ax.set_title("Sebaran waktu reaksi dua metode latihan")
ax.set_xlabel("Waktu reaksi (ms)")
ax.set_ylabel("Frekuensi")
ax.legend()
fig.savefig("sebaran-waktu-reaksi.png", dpi=110)Median metode lama : 388.0000
Median metode baru : 207.0000
U dari penghitungan pasangan : 278.5
p-value permutasi peringkat : 0.0106
SciPy mannwhitneyu: U = 278.5, p-value = 0.0115
SciPy ttest_ind : t = -3.1483, p-value = 0.0026
Hasil ketiga jalur sejalan. U hasil penghitungan pasangan 278.5 identik dengan keluaran mannwhitneyu, dan p-value permutasi peringkat 0.0106 berdekatan dengan p-value aproksimasi normal 0.0115. Keduanya berada di bawah 0.05, sehingga metode baru dinyatakan menghasilkan waktu reaksi yang berbeda. p-value uji t 0.0026 juga menolak hipotesis nol meskipun angkanya lebih kecil, karena rata-rata memanfaatkan besaran selisih sedangkan peringkat hanya memanfaatkan urutannya.
Histogram memperlihatkan sebab visualnya, yaitu kedua sebaran menceng ke kanan dengan ekor yang lebih panjang pada metode lama. Arah perbedaan terbaca dari median, yaitu 207.0 ms pada metode baru berbanding 388.0 ms pada metode lama. Pada sebaran semacam ini, median lebih layak dilaporkan daripada rata-rata karena rata-rata bergeser mengikuti nilai-nilai ekstrem pada ekornya.
Perbandingan dengan uji t pada data yang sama#
Kedua uji menolak hipotesis nol pada data ini, tetapi jalan menuju keputusannya berbeda sepenuhnya. Uji t menghitung rata-rata setiap kelompok, menakar standard error selisihnya, lalu membaca selisih itu pada distribusi t, sehingga satu nilai ekstrem ikut menggeser rata-rata dan variansi sampel. Uji Mann-Whitney mengganti nilai dengan peringkat, sehingga ekor sepanjang apa pun hanya duduk di peringkat teratas dan pengaruhnya terbatas. Karena itu p-value keduanya tidak pernah identik, dan jarak 0.0026 berbanding 0.0115 pada contoh ini wajar.
Sampel yang lebih kecil membuat perbedaan jalur ini semakin terasa, karena satu pencilan dapat menentukan keputusan uji t seorang diri. Sebaliknya pada sampel besar dan sebaran yang kira-kira normal, kedua uji hampir selalu sepakat, dan uji t sedikit lebih berdaya karena memanfaatkan informasi besaran. Aturan praktisnya, uji berbasis peringkat dipilih ketika asumsi bentuk sebaran diragukan, dan alasannya dilaporkan bersama hasilnya.
Wilcoxon signed-rank untuk data berpasangan#
Data berpasangan memerlukan perlakuan berbeda karena dua pengukuran datang dari orang yang sama, sehingga labelnya tidak boleh diacak bebas. Uji Wilcoxon signed-rank bekerja pada selisih setiap pasangan. Setiap selisih diberikan tanda, nilai mutlaknya diberi peringkat, lalu peringkat selisih positif dijumlahkan menjadi statistik T+. Apabila perlakuan tidak berpengaruh, peringkat sisi positif dan sisi negatif kira-kira seimbang, sehingga T+ mendekati setengah jumlah seluruh peringkat.
Program berikut menguji 12 siswa yang mencoba kedua metode secara bergantian dengan waktu reaksi sebagai pengamatannya. Statistik T+ dihitung manual dari peringkat selisih, kemudian wilcoxon dan uji t berpasangan dijalankan sebagai pembanding.
import numpy as np
from scipy import stats
# Waktu reaksi 12 siswa yang mencoba dua metode secara berpasangan
rng = np.random.default_rng(42)
lama = np.round(rng.exponential(scale=300.0, size=12) + 150.0)
turun = rng.normal(35.0, 40.0, 12)
baru = np.round(lama - turun)
# Statistik T+ dihitung dari peringkat nilai mutlak selisih
selisih = lama - baru
peringkat = stats.rankdata(np.abs(selisih))
T_plus = peringkat[selisih > 0].sum()
print("Selisih (lama - baru) :", selisih.astype(int))
print(f"Jumlah peringkat selisih positif (T+) : {T_plus:.1f}")
# Uji Wilcoxon signed-rank formal dan pembanding uji t berpasangan
w = stats.wilcoxon(lama, baru)
t = stats.ttest_rel(lama, baru)
print(f"SciPy wilcoxon : W = {w.statistic:.1f}, p-value = {w.pvalue:.4f}")
print(f"SciPy ttest_rel : t = {t.statistic:.4f}, p-value = {t.pvalue:.4f}")Selisih (lama - baru) : [38 80 54 1 50 -3 70 33 28 8 84 29]
Jumlah peringkat selisih positif (T+) : 76.0
SciPy wilcoxon : W = 2.0, p-value = 0.0015
SciPy ttest_rel : t = 4.6515, p-value = 0.0007Selisihnya 11 positif dan 1 negatif, sehingga T+ bernilai 76.0 berbanding T- 2.0. SciPy melaporkan W = 2.0, yaitu sisi yang lebih kecil dari keduanya, dan p-value 0.0015 dihitung secara eksak karena sampelnya kecil tanpa ikatan. Uji t berpasangan sepakat menolak hipotesis nol dengan p-value 0.0007. Pada data yang selisihnya berisi pencilan, jarak kedua p-value dapat melebar, dan pada situasi semacam itu jalur peringkat memberi keputusan yang lebih stabil.
Kesalahan umum#
Kesalahan pertama adalah menggunakan uji Mann-Whitney U untuk data berpasangan, padahal rancangan pasangan memerlukan Wilcoxon signed-rank yang bekerja pada selisihnya. Kesalahan kedua adalah memperlakukan jalur nonparametrik sebagai pengganti diagnosis, misalnya memilihnya tanpa memeriksa bentuk data terlebih dahulu, sehingga daya uji hilang pada data yang sebenarnya layak untuk uji t. Kesalahan ketiga adalah melaporkan p-value tanpa statistik deskriptifnya, karena keputusan bahwa perbedaannya signifikan tanpa median atau rentang antarkuartil tidak memberi gambaran besaran efeknya.
Kesalahan keempat berkaitan dengan ikatan pada data. Nilai yang seri diberi peringkat rata-rata, dan koreksi ikatannya sudah diterapkan secara otomatis oleh mannwhitneyu pada aproksimasi normalnya. Apabila banyak nilai seri, misalnya pada skala ordinal dengan sedikit tingkatan, sampaikan keterbatasannya dalam laporan alih-alih menyembunyikannya.
Ringkasan#
- Uji nonparametrik bekerja pada peringkat sehingga tahan terhadap pencengengan dan pencilan, serta tepat digunakan pada data ordinal.
- Statistik U adalah banyaknya pasangan yang satu anggotanya lebih besar, bernilai 278.5 pada contoh ini dengan p-value 0.0115, berdekatan dengan permutasi peringkat 0.0106 dan uji t 0.0026.
- Wilcoxon signed-rank menjumlahkan peringkat selisih berpasangan, menghasilkan T+ = 76.0 dan p-value 0.0015 pada contoh 12 pasangan.
- Uji nonparametrik tetap menuntut kebebasan observasi, dan pemilihannya dilaporkan bersama alasannya.
Referensi#
- scipy.stats.mannwhitneyu — SciPy — Dokumentasi uji Mann-Whitney U beserta pilihan metode eksak dan aproksimasi.
- scipy.stats.wilcoxon — SciPy — Dokumentasi uji Wilcoxon signed-rank untuk data berpasangan.
- scipy.stats.rankdata — SciPy — Dokumentasi penghitungan peringkat termasuk perlakuan ikatan.
- OpenIntro Statistics — OpenIntro — Buku pengantar statistika yang membahas uji peringkat nonparametrik.