Perubahan pada orang yang sama sering menjadi pertanyaan analisis yang paling langsung, misalnya apakah durasi tidur naik setelah program olahraga berjalan. Topik ini membahas uji t berpasangan (paired t-test) untuk rancangan sebelum dan sesudah, pengujian yang dilakukan pada selisih per pasangan, serta alasan rancangan ini lebih unggul daripada uji dua sampel bebas pada data yang sama. Contoh menggunakan data durasi tidur 10 peserta yang dibangkitkan dengan benih (seed) tetap sehingga seluruh keluaran dapat direproduksi.
Rancangan sebelum dan sesudah#
Rancangan berpasangan mengukur subjek yang sama dua kali, yaitu sebelum dan sesudah perlakuan. Setiap peserta menjadi pengendali bagi dirinya sendiri, sehingga perbedaan bawaan seperti kebiasaan atau kondisi awal tidak ikut mencampuri perbandingan. Struktur pasangan inilah yang membedakan data ini dari dua kelompok bebas, misalnya dua kelas yang berbeda.
Data contohnya berupa durasi tidur 10 peserta sebelum dan sesudah program olahraga delapan minggu. Durasi tidur dipilih karena mudah diukur ulang pada orang yang sama dan pengaruh olahraga terhadapnya lazim dikaji dengan rancangan berulang. Program berikut membangkitkan datanya, merangkum selisih per peserta, lalu menggambarkan garis yang menghubungkan dua pengukuran setiap peserta.
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# Durasi tidur 10 peserta sebelum dan sesudah program olahraga 8 minggu
rng_awal = np.random.default_rng(42)
rng_efek = np.random.default_rng(43)
sebelum = np.round(rng_awal.normal(6.4, 1.1, size=10), 1)
sesudah = np.round(sebelum + rng_efek.normal(0.6, 0.35, size=10), 1)
selisih = sesudah - sebelum
# Uji t berpasangan dan uji t satu sampel pada selisih
berpasangan = stats.ttest_rel(sesudah, sebelum)
satu_sampel = stats.ttest_1samp(selisih, 0.0)
print(f"rata-rata sebelum = {sebelum.mean():.2f} jam, rata-rata sesudah = {sesudah.mean():.2f} jam")
print(f"rata-rata selisih = {selisih.mean():.2f} jam")
print(f"sd sebelum = {sebelum.std(ddof=1):.4f}, sd sesudah = {sesudah.std(ddof=1):.4f}, sd selisih = {selisih.std(ddof=1):.4f}")
print(f"ttest_rel : t = {berpasangan.statistic:.4f}, p-value = {berpasangan.pvalue:.4f}")
print(f"ttest_1samp selisih: t = {satu_sampel.statistic:.4f}, p-value = {satu_sampel.pvalue:.4f}")
fig, ax = plt.subplots(figsize=(7, 4), constrained_layout=True)
pasangan_x = np.array([0, 1])
for tidur_sebelum, tidur_sesudah in zip(sebelum, sesudah):
ax.plot(pasangan_x, [tidur_sebelum, tidur_sesudah], color="grey", linewidth=1, marker="o", markersize=4)
ax.set_xticks(pasangan_x, labels=["Sebelum", "Sesudah"])
ax.set_ylabel("Durasi tidur (jam)")
ax.set_title("Durasi tidur per peserta sebelum dan sesudah program olahraga")
fig.savefig("uji-berpasangan-tidur.png", dpi=110)rata-rata sebelum = 6.04 jam, rata-rata sesudah = 6.60 jam
rata-rata selisih = 0.56 jam
sd sebelum = 0.9958, sd sesudah = 1.0360, sd selisih = 0.3340
ttest_rel : t = 5.3020, p-value = 0.0005
ttest_1samp selisih: t = 5.3020, p-value = 0.0005
Rata-rata durasi tidur naik dari 6.04 jam menjadi 6.60 jam, sedangkan selisih per peserta berkisar dari -0.1 hingga 1.0 jam. Simpangan baku (standard deviation) selisih hanya 0.3340 jam, jauh lebih kecil daripada simpangan baku masing-masing kolom yang berada di sekitar 1.0 jam. Gambar memperlihatkan penyebabnya, yaitu garis-garis yang hampir sejajar. Urutan peserta tidak berubah setelah program berjalan, sehingga peserta yang sebelumnya tidur lama tetap berada di atas peserta yang sebelumnya tidur pendek. Hanya satu peserta yang durasinya turun, dan penurunannya hanya 0.1 jam.
Uji pada selisih per pasangan#
Uji t berpasangan tidak menguji dua kolom secara terpisah, melainkan bekerja pada selisih setiap pasangan. Hipotesis nol (null hypothesis) yang diuji menyatakan rata-rata selisih sama dengan nol, sehingga prosedurnya persis uji t satu sampel yang diterapkan pada kolom selisih. Statistik ujinya dituliskan sebagai berikut.
Keluaran program sebelumnya memperlihatkan bukti kesetaraan itu secara langsung. Fungsi ttest_rel menghasilkan t = 5.3020 dengan p-value 0.0005, dan angkanya identik dengan ttest_1samp pada kolom selisih terhadap 0. Dengan 10 pasang data, derajat kebebasan (degrees of freedom) berupa , jauh lebih kecil daripada 18 pada uji dua sampel bebas. Kerugian derajat kebebasan tersebut terbayar oleh simpangan baku selisih yang kecil, sehingga statistik ujinya justru membesar.
Arah pengurangan perlu ditetapkan sekali dan dipakai konsisten karena penukaran arah hanya membalik tanda statistik uji tanpa mengubah keputusannya. Kolom selisih juga menjadi bahan laporan yang informatif, misalnya rata-rata tambahan tidur sebesar 0.56 jam disertai interval kepercayaannya. Pelaporan efek dengan satuan asli data semacam ini lebih bermakna daripada sekadar menyebut signifikannya.
Perbandingan dengan dua sampel bebas#
Dampak struktur pasangan paling terlihat ketika data yang sama dianalisis dengan cara yang keliru. Program berikut menguji data tidur yang sama dua kali, pertama dengan uji berpasangan lalu dengan uji dua sampel bebas yang memperlakukan dua kolom sebagai dua kelompok orang yang berbeda. Kedua keluaran diletakkan berdampingan agar perbedaan keputusannya langsung terlihat.
import numpy as np
from scipy import stats
# Data yang sama dengan contoh sebelumnya
rng_awal = np.random.default_rng(42)
rng_efek = np.random.default_rng(43)
sebelum = np.round(rng_awal.normal(6.4, 1.1, size=10), 1)
sesudah = np.round(sebelum + rng_efek.normal(0.6, 0.35, size=10), 1)
# Data yang sama dianalisis dengan dua rancangan berbeda
berpasangan = stats.ttest_rel(sesudah, sebelum)
bebas = stats.ttest_ind(sesudah, sebelum, equal_var=False)
print(f"Uji berpasangan : t = {berpasangan.statistic:.4f}, p-value = {berpasangan.pvalue:.4f}")
print(f"Uji dua sampel bebas: t = {bebas.statistic:.4f}, p-value = {bebas.pvalue:.4f}")Uji berpasangan : t = 5.3020, p-value = 0.0005
Uji dua sampel bebas: t = 1.2324, p-value = 0.2337p-value berpasangan 0.0005 menyatakan efek program sangat signifikan, sedangkan p-value dua sampel bebas 0.2337 tidak menunjukkan bukti efek. Penyebab perbedaannya ada pada penyebut statistik uji. Uji dua sampel bebas memasukkan variansi (variance) antarindividu yang besar ke dalam standard error, yaitu perbedaan kebiasaan tidur bawaan antarpeserta. Uji berpasangan menghapus variansi tersebut melalui pengurangan per pasangan.
Kesimpulan yang berlawanan dari data yang persis sama menunjukkan bahwa pemilihan uji bukan perkara kecil. Aturannya sederhana, yaitu menyusun data sebagai pasangan sejak perancangan dan menguji selisihnya. Prinsip yang sama berlaku untuk rancangan berpasangan lain, misalnya dua subjek yang dicocokkan berdasarkan usia dan kondisi awal, karena yang diuji tetap selisih di dalam setiap pasangan.
Kesalahan umum#
Kesalahan pertama adalah memasangkan data berdasarkan urutan nilai setelah masing-masing kolom diurutkan sendiri. Pengurutan menghancurkan hubungan antarpengukuran yang menjadi inti rancangan, sehingga hasilnya tidak lagi menggambarkan perubahan pada subjek yang sama. Pasangan harus mengikuti identitas subjek, bukan urutan nilainya.
Kesalahan kedua adalah memakai uji berpasangan untuk dua kelompok yang anggotanya memang berbeda, misalnya dua kelas yang tidak pernah diukur dua kali, karena tidak ada selisih yang bermakna di antara keduanya. Kesalahan ketiga adalah mengabaikan pencilan pada kolom selisih. Satu peserta dengan perubahan ekstrem dapat menguasai rata-rata selisih pada sampel kecil, sehingga sumber nilai tersebut perlu diperiksa sebelum keputusan dilaporkan.
Ringkasan#
- Uji t berpasangan menguji rata-rata selisih per pasangan terhadap 0, sehingga bentuknya sama dengan uji t satu sampel pada kolom selisih.
- Fungsi
ttest_relpada data berpasangan menghasilkan angka yang identik denganttest_1sampterhadap selisihnya. - Pengurangan per pasangan menghapus variansi antarindividu, sehingga p-value berpasangan jauh lebih kecil daripada uji dua sampel bebas pada data yang sama.
- Pasangan ditentukan oleh identitas subjek sejak perancangan, bukan oleh urutan nilai setelah data terkumpul.
Referensi#
- scipy.stats.ttest_rel — SciPy — Dokumentasi uji t untuk dua sampel yang saling terkait.
- scipy.stats.ttest_1samp — SciPy — Dokumentasi uji t satu sampel yang menjadi bentuk dasar uji pada selisih.
- OpenIntro Statistics — OpenIntro — Buku pengantar statistika dengan pembahasan data berpasangan dan uji t berpasangan.