Analisis Lengkap

Tahapan deskriptif, inferensial, dan robust pada satu data nyata.

Daftar isi

Topik ini mengerjakan tahap inti proyek, yaitu analisis lengkap atas berkas data-tidur.csv yang sudah disiapkan pada tahap perancangan modul ini. Analisisnya berjalan tiga tahap, mulai dari deskripsi angka dan gambar, dilanjutkan pengujian hipotesis beserta interval kepercayaan (confidence interval), lalu pemeriksaan robust yang menilai ketahanan kesimpulan terhadap pilihan statistik. Pada akhir topik, ketiga tahap digabungkan menjadi satu pembacaan yang jujur, termasuk ketika buktinya ternyata tipis.

Tiga tahap pada data yang sama#

Analisis yang andal tidak melompat langsung ke p-value. Data diperiksa berlapis karena setiap lapisan menjawab pertanyaan yang berbeda, dan lapisan berikutnya selalu bertumpu pada temuan lapisan sebelumnya. Tahap deskriptif menjawab apa yang tampak pada data ini, tahap inferensial menjawab apakah pola itu selaras dengan hipotesis, dan tahap robust menjawab apakah kesimpulannya bertahan bila pilihan statistik diubah.

Urutan tiga tahap itu bersifat berurutan karena keluaran satu tahap menjadi masukan keputusan tahap berikutnya, sebagaimana dirangkum diagram berikut.

Tahap 1: Deskriptifangka ringkas danboxplot berdampinganTahap 2: Inferensialuji Mann-Whitney U daninterval bootstrapTahap 3: Robustperiksa ulang denganmedian tanpa asumsikesimpulan diperiksa ulang
Alur tiga tahap analisis pada berkas data yang sama

Seluruh tahap membaca berkas data-tidur.csv yang sama persis, sehingga setiap perbedaan angka antartahap pasti berasal dari perbedaan metode, bukan perbedaan data. Kebiasaan ini sekaligus menjadi pengaman kesalahan, karena angka yang sama dihitung lebih dari satu kali melalui jalan yang berbeda. Apabila dua jalan menghasilkan cerita yang bertolak belakang, perbedaan itu sendiri menjadi temuan yang wajib dijelaskan.

Tahap deskriptif: angka ringkas dan boxplot#

Tahap pertama meringkas setiap kelompok dengan ukuran pemusatan dan ukuran sebaran, kemudian menggambar kedua kelompok berdampingan dalam satu boxplot. Ukuran pemusatan yang dilaporkan mencakup rata-rata (mean) dan median, sedangkan ukuran sebarannya mencakup simpangan baku (standard deviation) dan jarak antarkuartil (IQR, interquartile range). Pasangan rata-rata dan median pada keluaran yang sama memungkinkan pemeriksaan simetri secara cepat.

python ringkasan-deskriptif.py
import matplotlib.pyplot as plt
import numpy as np

data = np.genfromtxt("data-tidur.csv", delimiter=",", names=True,
                     dtype=None, encoding="utf-8")
pagi = data["durasi_jam"][data["kelompok"] == "pagi"]
malam = data["durasi_jam"][data["kelompok"] == "malam"]

for nama, kelompok in (("pagi ", pagi), ("malam", malam)):
    q1, q3 = np.percentile(kelompok, [25, 75])
    print(f"Kelas {nama}: n = {kelompok.size}, rata-rata = {kelompok.mean():.2f} jam, "
          f"median = {np.median(kelompok):.2f} jam")
    print(f"             simpangan baku = {kelompok.std(ddof=1):.2f} jam, "
          f"IQR = {q3 - q1:.2f} jam")

fig, ax = plt.subplots(figsize=(7, 4), constrained_layout=True)
ax.boxplot([pagi, malam], tick_labels=["Kelas pagi", "Kelas malam"])
ax.set_title("Durasi tidur mahasiswa kelas pagi dan kelas malam")
ax.set_ylabel("Durasi tidur (jam)")
ax.grid(True, axis="y", alpha=0.3)
fig.savefig("boxplot-tidur.png", dpi=110)
print("Gambar tersimpan sebagai boxplot-tidur.png")
text Keluaran
Kelas pagi : n = 30, rata-rata = 7.12 jam, median = 7.20 jam
             simpangan baku = 0.93 jam, IQR = 1.12 jam
Kelas malam: n = 30, rata-rata = 7.60 jam, median = 7.70 jam
             simpangan baku = 1.05 jam, IQR = 1.38 jam
Gambar tersimpan sebagai boxplot-tidur.png

Boxplot durasi tidur kelas pagi dan kelas malam dengan dua pencilan sebagai titik terpisah
Boxplot durasi tidur kelas pagi dan kelas malam dengan dua pencilan sebagai titik terpisah

Kedua kelompok terbaca lengkap berisi 30 pengamatan. Rata-rata dan median hampir berimpit pada masing-masing kelompok, yaitu 7.12 berbanding 7.20 jam pada kelas pagi dan 7.60 berbanding 7.70 jam pada kelas malam, sehingga pemusatan datanya relatif simetris. Kelas malam tampak memiliki durasi tidur yang lebih lama sekaligus sebaran yang lebih renggang, terlihat dari simpangan baku 1.05 berbanding 0.93 jam serta IQR 1.38 berbanding 1.12 jam. Pada boxplot, pencilan (outlier) muncul sebagai titik terpisah pada kedua kelompok, tepat pada nilai 9.8 dan 4.6 jam yang ditanam sejak tahap perancangan. Kemunculan pencilan ini menjadi alarm pertama bahwa analisis berbasis rata-rata perlu diuji ketahanannya.

Memilih uji dari bentuk sebaran#

Tahap inferensial dimulai dari satu keputusan, yaitu memilih uji yang cocok dengan bentuk sebaran data. Kandidatnya adalah uji t Welch yang bekerja pada rata-rata dan variansi, atau uji Mann-Whitney U yang bekerja pada peringkat nilai. Keputusannya dibuat berdasarkan dua indikator yang sudah dikenal pada modul ini, yaitu kemiringan sebaran dan pencacahan pencilan dengan aturan IQR.

python pemeriksaan-bentuk.py
import numpy as np
from scipy import stats

data = np.genfromtxt("data-tidur.csv", delimiter=",", names=True,
                     dtype=None, encoding="utf-8")
pagi = data["durasi_jam"][data["kelompok"] == "pagi"]
malam = data["durasi_jam"][data["kelompok"] == "malam"]

for nama, kelompok in (("pagi ", pagi), ("malam", malam)):
    q1, q3 = np.percentile(kelompok, [25, 75])
    iqr = q3 - q1
    pencilan = kelompok[(kelompok < q1 - 1.5 * iqr) | (kelompok > q3 + 1.5 * iqr)]
    print(f"Kelas {nama}: kemiringan = {stats.skew(kelompok):.2f}, "
          f"pencilan aturan IQR = {pencilan.size} nilai")
text Keluaran
Kelas pagi : kemiringan = 0.25, pencilan aturan IQR = 1 nilai
Kelas malam: kemiringan = -0.36, pencilan aturan IQR = 1 nilai

Kemiringan kedua kelompok tergolong ringan, yaitu 0.25 pada kelas pagi dan -0.36 pada kelas malam, tetapi aturan IQR menandai satu pencilan pada setiap kelompok. Pencilan inilah pertimbangan utamanya. Satu nilai ekstrem menggeser rata-rata dan menggelembungkan simpangan baku sekaligus, sehingga uji yang bertumpu pada kedua besaran itu menjadi rapuh pada sampel sekecil 30. Uji Mann-Whitney U yang hanya membaca peringkat nilai dipilih karena posisi pencilan pada peringkat hampir tidak mengubah hasilnya. Sementara itu, interval kepercayaannya dibangun dengan bootstrap, yaitu metode pensampelan ulang yang bebas dari asumsi bentuk distribusi. Pengujiannya tetap dua arah agar selaras dengan hipotesis alternatif H1 H_1 yang tidak menentukan arah.

Tahap inferensial: uji Mann-Whitney U dan interval bootstrap#

Pengujian sekarang dijalankan pada data yang sama, lengkap dengan dua pelengkap yang membuat keputusannya dapat ditimbang. Pelengkap pertama adalah besaran efek (effect size) berupa Cohen’s d, yaitu selisih rata-rata dua kelompok yang dibagi simpangan baku gabungan (pooled standard deviation) sp s_p keduanya.

d=xˉmalam−xˉpagisp d = \frac{\bar{x}_{\text{malam}} - \bar{x}_{\text{pagi}}}{s_p}

Pelengkap kedua adalah interval kepercayaan 95% untuk selisih median yang dibangun dari sepuluh ribu resample bootstrap dengan seed 43. Seed resample ini berbeda dari seed data karena tugasnya berbeda, yaitu mengatur pengambilan resample, bukan pembangkitan data.

python uji-inferensial.py
import numpy as np
from scipy import stats

data = np.genfromtxt("data-tidur.csv", delimiter=",", names=True,
                     dtype=None, encoding="utf-8")
pagi = data["durasi_jam"][data["kelompok"] == "pagi"]
malam = data["durasi_jam"][data["kelompok"] == "malam"]

u_stat, p_value = stats.mannwhitneyu(malam, pagi, alternative="two-sided")
print(f"Statistik U Mann-Whitney : {u_stat:.1f}")
print(f"p-value                  : {p_value:.4f}")

sp = np.sqrt(((pagi.size - 1) * pagi.std(ddof=1) ** 2
              + (malam.size - 1) * malam.std(ddof=1) ** 2)
             / (pagi.size + malam.size - 2))
d_cohen = (malam.mean() - pagi.mean()) / sp
print(f"Cohen's d                : {d_cohen:.2f}")

rng = np.random.default_rng(43)
banyak_resample = 10000
selisih = (np.median(malam[rng.integers(malam.size, size=(banyak_resample, malam.size))], axis=1)
           - np.median(pagi[rng.integers(pagi.size, size=(banyak_resample, pagi.size))], axis=1))
bawah, atas = np.percentile(selisih, [2.5, 97.5])
print(f"Selisih median sampel    : {np.median(malam) - np.median(pagi):.2f} jam")
print(f"Interval bootstrap 95%   : [{bawah:.2f}, {atas:.2f}] jam")
text Keluaran
Statistik U Mann-Whitney : 584.0
p-value                  : 0.0482
Cohen's d                : 0.49
Selisih median sampel    : 0.50 jam
Interval bootstrap 95%   : [-0.20, 1.05] jam

Statistik U sebesar 584.0 berada jauh di atas nilai harapannya di bawah hipotesis nol (null hypothesis), yaitu n1n2/2=450 n_1 n_2 / 2 = 450 , sehingga nilai kelas malam cenderung menempati peringkat lebih tinggi. p-value yang dihasilkan adalah 0.0482, artinya hipotesis nol ditolak pada taraf signifikansi 0.05, tetapi melewati ambang hanya dengan selisih yang tipis. Cohen’s d sebesar 0.49 menempatkan beda ini pada kategori kecil hingga sedang, jauh dari kesan dramatis. Selisih median sampel 0.50 jam disertai interval bootstrap dari -0.20 hingga 1.05 jam yang masih memuat nol, sehingga arah selisih belum dapat ditegakkan secara meyakinkan dari data ini.

Tahap robust dan pembacaan gabungan#

Tahap terakhir menguji ulang kesimpulan dengan statistik yang tidak bergantung pada asumsi bentuk sebaran. Selisih median dibandingkan langsung dengan selisih rata-rata, kemudian interval bootstrap 95% untuk selisih rata-rata dibangun dengan seed 44. Apabila kedua ukuran menghasilkan cerita yang sama, kesimpulan tidak terikat pada satu pilihan statistik tertentu.

python tahap-robust.py
import numpy as np

data = np.genfromtxt("data-tidur.csv", delimiter=",", names=True,
                     dtype=None, encoding="utf-8")
pagi = data["durasi_jam"][data["kelompok"] == "pagi"]
malam = data["durasi_jam"][data["kelompok"] == "malam"]

rng = np.random.default_rng(44)
banyak_resample = 10000
selisih_rata = (malam[rng.integers(malam.size, size=(banyak_resample, malam.size))].mean(axis=1)
                - pagi[rng.integers(pagi.size, size=(banyak_resample, pagi.size))].mean(axis=1))
bawah, atas = np.percentile(selisih_rata, [2.5, 97.5])

print(f"Selisih rata-rata sampel : {malam.mean() - pagi.mean():.2f} jam")
print(f"Selisih median sampel    : {np.median(malam) - np.median(pagi):.2f} jam")
print(f"Interval bootstrap 95% selisih rata-rata: [{bawah:.2f}, {atas:.2f}] jam")
text Keluaran
Selisih rata-rata sampel : 0.48 jam
Selisih median sampel    : 0.50 jam
Interval bootstrap 95% selisih rata-rata: [-0.02, 0.97] jam

Selisih median 0.50 jam dan selisih rata-rata 0.48 jam hampir sama, sehingga kesimpulan tidak berubah ketika statistiknya berganti dari yang peka pencilan menuju yang kebal pencilan. Interval untuk selisih rata-rata, yaitu -0.02 hingga 0.97 jam, juga nyaris menyentuh nol pada batas bawahnya. Kini ketiga bukti dapat dibaca bersama, yaitu p-value 0.0482 yang memberi sinyal signifikansi tipis, Cohen’s d 0.49 yang menilai efeknya kecil hingga sedang, dan dua interval bootstrap yang sama-sama memuat nol. Kesimpulan yang jujur berbunyi: data memberi indikasi kelas malam tidur sekitar setengah jam lebih lama, tetapi buktinya belum kokoh, sehingga keputusan besar sebaiknya menunggu data tambahan.

Kesalahan umum#

  1. Uji dicoba berganti-ganti sampai p-value-nya menyentuh ambang, misalnya mencoba uji t setelah Mann-Whitney gagal signifikan. Praktik ini menaikkan peluang positif palsu karena keputusannya mengikuti kebetulan data. Perbaikannya adalah menetapkan uji dari pemeriksaan bentuk sebaran sebelum p-value dihitung, lalu melaporkan alasannya.
  2. Bootstrap dijalankan dengan terlalu sedikit resample sehingga batas intervalnya berubah-ubah antareksekusi. Perbaikannya adalah menggunakan resample berjumlah ribuan dan seed tetap agar angkanya stabil.
  3. p-value Mann-Whitney dibaca sebagai bukti selisih median tertentu. Uji ini menilai kecenderungan peringkat, bukan selisih median secara langsung. Perbaikannya adalah melaporkan selisih median bersama interval bootstrap-nya sebagai bukti yang berdiri sendiri.

Ringkasan#

  • Analisis berjalan tiga tahap pada satu berkas data yang sama, yaitu deskriptif, inferensial, dan robust.
  • Kemiringan ringan dengan satu pencilan per kelompok mengarahkan pilihan pada uji Mann-Whitney U yang bekerja pada peringkat.
  • p-value 0.0482 tipis di bawah ambang 0.05, Cohen’s d 0.49 tergolong kecil hingga sedang, dan kedua interval bootstrap memuat nol.
  • Kesimpulan proyek berhenti pada tingkat indikasi arah, bukan kepastian, karena buktinya tipis.

Referensi#