Chapter ANOVA menuntaskan satu pertanyaan dengan satu faktor: apakah tiga metode belajar menghasilkan mean nilai yang berbeda. Kelas yang sesungguhnya jarang semurni itu — hasil belajar dipengaruhi metode pengajaran sekaligus kebiasaan latihan siswa, dan pertanyaan yang paling berguna justru menyatukan keduanya: apakah metode terbaik tetap terbaik berapa pun lama siswa berlatih? Two-Way ANOVA memperluas kerangka F menjadi satu pengujian atas dua faktor: satu tabel ANOVA yang memuat tiga uji sekaligus — efek faktor pertama, efek faktor kedua, dan efek gabungan keduanya yang bernama interaksi. Chapter ini merancang desain faktorial 2×2 yang sanggup dihitung dengan tangan, menguraikan SS total menjadi empat komponen, memverifikasi seluruh tabel dengan statsmodels, lalu menutup dengan asumsi dan kelebihan desain faktorial.

Dari Satu Faktor ke Dua Faktor #

Jalur yang tampak wajar adalah analisis satu-per-satu: jalankan ANOVA untuk metode, jalankan ANOVA lain untuk durasi, laporkan dua hasil. Jalur itu membayar dua harga. Harga pertama adalah biaya — dua eksperimen terpisah menuntut dua kelompok siswa yang berbeda, sementara desain faktorial (factorial design) menggabungkan kedua pertanyaan ke dalam satu eksperimen sehingga setiap observasi menyumbang jawaban untuk keduanya. Harga kedua lebih dalam: analisis satu-per-satu tidak punya alat untuk pertanyaan ketiga — apakah keunggulan satu metode bergantung pada durasi latihan — karena setiap ANOVA satu faktor merata-ratakan faktor yang diabaikan. Pertanyaan ketiga itu justru yang paling menentukan keputusan: rekomendasi “pakai Metode B” hanya sah bila keunggulan Metode B bertahan pada semua durasi.

Kosakata desain faktorial perlu dikuasai sebelum rumusnya, karena seluruh tabel ANOVA dua faktor dibangun di atas lima istilah berikut:

  • Faktor — variabel kategori yang efeknya diuji; contoh kita punya dua: metode belajar dan durasi latihan.
  • Level — kategori pada satu faktor; metode punya 2 level (A dan B), durasi punya 2 level (pendek dan panjang).
  • Sel — kombinasi satu level tiap faktor; desain 2×2 punya 4 sel, masing-masing satu kombinasi metode × durasi.
  • Replikasi — banyaknya observasi independen pada satu sel, dilambangkan n; contoh kita memakai n = 3.
  • Desain seimbang (balanced design) — semua sel berisi banyak observasi yang sama; seluruh rumus chapter ini memanfaatkan keseimbangan itu.

Desain 2×2: Metode Belajar × Durasi Latihan #

Sekolah fiktif mengambil dua dari tiga metode pada chapter ANOVA — Metode A dan Metode B — lalu menambahkan faktor kedua: durasi latihan mandiri harian, 30 menit (pendek) atau 90 menit (panjang). Dua belas siswa dibagi secara acak ke 4 sel, masing-masing berisi 3 siswa; setelah program berjalan satu bulan, nilai ulangan matematika (skala 0-100) mereka tercatat sebagai berikut:

text
                          durasi pendek      durasi panjang
Metode A                  75, 76, 77         79, 79, 82
Metode B                  76, 77, 81         87, 90, 93

Desain ini seimbang: 2 level × 2 level × 3 replikasi = 12 observasi, seluruh sel berisi n = 3. Tiga hipotesis diuji pada α = 0.05 dengan data yang sama:

  • H0 metode: mean baris A = mean baris B — efek metode nol.
  • H0 durasi: mean kolom pendek = mean kolom panjang — efek durasi nol.
  • H0 interaksi: pola aditif — efek metode sama besar pada kedua durasi, yang sekaligus berarti efek durasi sama besar pada kedua metode.

Pembanding: Analisis Satu Faktor pada Data yang Sama #

Sebelum menguraikan dua faktor, uji dulu jalur naif pada data yang sama. Mengabaikan durasi dan menjalankan one-way ANOVA untuk metode saja menghasilkan F = 3.8571 dengan p = 0.0779 — gagal tolak H0. Mengabaikan metode dan menguji durasi saja menghasilkan F = 9.7959 dengan p = 0.0107 — tolak. Dua jalur memberi dua nada berbeda, dan keduanya sama-sama tidak menyentuh pertanyaan interaksi. Kegagalan jalur pertama bukan kebetulan; akarnya terlacak lewat identitas uraian varians:

text
SS_within ANOVA metode saja = SS_durasi + SS_interaksi + SS_galat
                             = 192 + 48 + 40 = 280
MS galat metode saja = 280 / 10 = 28.0
MS galat two-way     = 40 / 8   = 5.0

Variasi durasi (SS 192) dan interaksi (SS 48) — keduanya akan dihitung sebentar lagi — tidak hilang begitu durasi diabaikan; keduanya berpindah ke dalam galat dan membengkakkan MS galat dari 5.0 menjadi 28.0, lebih dari lima kali lipat, sehingga uji metode kehilangan ketajaman. Jalur durasi saja mengalami nasib serupa dengan galat 19.6, karena variasi metode (108) dan interaksi (48) ikut tertelan ke dalam 196. Desain faktorial memisahkan kedua sumber itu dari galat: pengujian yang sama, data yang sama, kesimpulan yang jauh lebih tajam — itulah ekonomi desain faktorial dalam angka.

Uraian Varians: SS Total Menjadi Empat #

ANOVA satu faktor membagi SS_total = SS_between + SS_within. Two-Way ANOVA membelah SS_between lebih jauh menjadi tiga bagian — efek tiap faktor ditambah interaksi — sehingga totalnya empat komponen. Dengan a = 2 level metode, b = 2 level durasi, n = 3 replikasi, dan N = abn = 12:

text
SS_total  = SS_A + SS_B + SS_AB + SS_error

SS_A     = n·b · Σ (mean baris faktor A - mean total)²     df_A     = a - 1
SS_B     = n·a · Σ (mean kolom faktor B - mean total)²     df_B     = b - 1
SS_AB    = n · Σ (mean sel - mean total)² - SS_A - SS_B    df_AB    = (a-1)(b-1)
SS_error = Σ tiap sel Σ (x - mean sel)²                    df_error = ab(n-1)

Logikanya melanjutkan chapter ANOVA: SS_A dan SS_B adalah SS_between versi tiap faktor, sedangkan SS_AB adalah sisa variasi antar sel yang tidak dijelaskan kedua efek utama — komponen tak-aditif yang baru punya nama di desain ini. SS_error kini dihitung di dalam sel, bukan di dalam kelompok, sehingga lebih sempit. Seluruhnya dihitung dari ringkasan berikut:

text
Mean sel   : A-pendek 76   A-panjang 80   B-pendek 78   B-panjang 90
Mean baris : metode A 78   metode B 84
Mean kolom : pendek 77     panjang 85
Mean total : 81

SS_A     = 3·2 × [(78 - 81)² + (84 - 81)²]   = 6 × 18  = 108
SS_B     = 3·2 × [(77 - 81)² + (85 - 81)²]   = 6 × 32  = 192
SS_sel   = 3 × [(76-81)² + (80-81)² + (78-81)² + (90-81)²]
         = 3 × (25 + 1 + 9 + 81) = 348
SS_AB    = 348 - 108 - 192 = 48
SS_error = 2 + 6 + 14 + 18 = 40
SS_total = 108 + 192 + 48 + 40 = 388

SS_error dijumlahkan dari keempat sel: deviasi (75, 76, 77) terhadap mean 76 memberi 2; (79, 79, 82) terhadap 80 memberi 6; (76, 77, 81) terhadap 78 memberi 14; (87, 90, 93) terhadap 90 memberi 18. Derajat kebebasan mengikuti rumus: df_A = 1, df_B = 1, df_AB = (2−1)(2−1) = 1, df_error = 2·2·(3−1) = 8, df_total = N − 1 = 11 — pemeriksaan cepat: 1 + 1 + 1 + 8 = 11.

Tiga Uji F dalam Satu Tabel #

Ketiga komponen diuji dengan pola yang persis sama seperti ANOVA satu faktor: F = MS_efek / MS_galat. Penyebutnya satu untuk semuanya — MS_galat = 40/8 = 5.0 dengan df = 8 — sehingga ketiga F diukur dengan penggaris yang sama; batas kritis F(1, 8) pada α = 0.05 adalah 5.3177. Tabel ANOVA lengkapnya (nilai p dibulatkan ke empat desimal):

Sumber variasiSSdfMSFp
Metode (A)108.01108.021.600.0016
Durasi (B)192.01192.038.400.0003
Interaksi (A×B)48.0148.09.600.0147
Galat40.085.0
Total388.011

Ketiga F melampaui 5.3177, ketiga H0 ditolak. Efek utama metode: mean B (84) menjulang 6 poin di atas mean A (78), p = 0.0016. Efek utama durasi: latihan panjang (85) mengungguli latihan pendek (77) dengan 8 poin, p = 0.0003. Interaksi: pola aditif ditolak dengan p = 0.0147 — efek metode tidak sama besar pada kedua durasi. Tabel sekecil ini memuat seluruh keputusan eksperimen, dan baris interaksilah yang paling menentukan cara membaca dua baris di atasnya:

Menghitung dengan Python #

statsmodels menerima data dalam format panjang (long format): satu baris per observasi dengan kolom faktor dan respons — format yang diminta formula API-nya. Blok pertama menyusun tabel data eksperimen:

python
import pandas as pd

baris = [
    ("A", "pendek",  75), ("A", "pendek",  76), ("A", "pendek",  77),
    ("A", "panjang", 79), ("A", "panjang", 79), ("A", "panjang", 82),
    ("B", "pendek",  76), ("B", "pendek",  77), ("B", "pendek",  81),
    ("B", "panjang", 87), ("B", "panjang", 90), ("B", "panjang", 93),
]
df = pd.DataFrame(baris, columns=["metode", "durasi", "nilai"])

for (metode, durasi), grup in df.groupby(["metode", "durasi"], sort=False):
    nilai = ", ".join(str(v) for v in grup["nilai"])
    print(f"Metode {metode}, durasi {durasi:7s}: {nilai}   (n = {len(grup)})")

Output yang Dihasilkan:

text
Metode A, durasi pendek : 75, 76, 77   (n = 3)
Metode A, durasi panjang: 79, 79, 82   (n = 3)
Metode B, durasi pendek : 76, 77, 81   (n = 3)
Metode B, durasi panjang: 87, 90, 93   (n = 3)

Empat baris itu adalah empat sel desain. Blok kedua memasang model dua faktor dan meminta tabel ANOVA-nya:

python
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

baris = [
    ("A", "pendek",  75), ("A", "pendek",  76), ("A", "pendek",  77),
    ("A", "panjang", 79), ("A", "panjang", 79), ("A", "panjang", 82),
    ("B", "pendek",  76), ("B", "pendek",  77), ("B", "pendek",  81),
    ("B", "panjang", 87), ("B", "panjang", 90), ("B", "panjang", 93),
]
df = pd.DataFrame(baris, columns=["metode", "durasi", "nilai"])

model = smf.ols("nilai ~ C(metode) * C(durasi)", data=df).fit()
tabel = sm.stats.anova_lm(model, typ=2)
tabel.index = ["metode", "durasi", "interaksi", "galat"]

for nama, r in tabel.iterrows():
    ss, df_efek = r["sum_sq"], int(r["df"])
    ms = ss / df_efek
    if nama == "galat":
        print(f"{nama:9s}  SS={ss:6.1f}  df={df_efek:2d}  MS={ms:6.1f}")
    else:
        print(f"{nama:9s}  SS={ss:6.1f}  df={df_efek:2d}  MS={ms:6.1f}"
              f"  F={r['F']:6.2f}  p={r['PR(>F)']:.4f}")
print(f"{'total':9s}  SS={tabel['sum_sq'].sum():6.1f}  df={int(tabel['df'].sum()):2d}")

print("Type I = Type II pada desain seimbang:",
      np.allclose(sm.stats.anova_lm(model, typ=1)["sum_sq"], tabel["sum_sq"]))

Output yang Dihasilkan:

text
metode     SS= 108.0  df= 1  MS= 108.0  F= 21.60  p=0.0016
durasi     SS= 192.0  df= 1  MS= 192.0  F= 38.40  p=0.0003
interaksi  SS=  48.0  df= 1  MS=  48.0  F=  9.60  p=0.0147
galat      SS=  40.0  df= 8  MS=   5.0
total      SS= 388.0  df=11
Type I = Type II pada desain seimbang: True

Mari kita bedah blok tersebut: rumus "nilai ~ C(metode) * C(durasi)" memakai singkatan patsy — operator * berarti C(metode) + C(durasi) + C(metode):C(durasi), dengan C() menandai kolom sebagai kategori dan tanda titik dua memilih komponen interaksi. Fungsi anova_lm(model, typ=2) merakit tabel ANOVA dari model terpasang; kolomnya dipilih dan dicetak ulang satu per satu agar barisnya tetap sempit dan pembulatannya seragam. Setiap angka identik dengan tabel yang kita susun manual: SS 108, 192, 48, 40; F 21.60, 38.40, 9.60; p 0.0016, 0.0003, 0.0147.

Asumsi dan Kelebihan Desain Faktorial #

Tiga asumsi ANOVA satu faktor berlaku utuh, dengan satu pergeseran satuan: pemeriksaan kini per sel, bukan per kelompok.

  • Normalitas di dalam tiap sel — dengan n = 3, uji formal tidak berdaya; jaminan utamanya adalah randomisasi penugasan siswa ke sel, ditambah pemeriksaan residual setelah model terpasang.
  • Homogenitas varians antar sel — MS_galat menggabungkan varians keempat sel; satu sel yang bersebar berkali lipat lebih lebar merusak gabungan itu.
  • Independensi antar observasi — nilai satu siswa tidak memengaruhi nilai siswa lain; penugasan acak tetap jaminannya.

Warisan nonparametrik tidak membantu di sini: Kruskal-Wallis menguji satu faktor dan tidak punya slot interaksi, sehingga tidak bisa menggantikan tabel dua faktor; uji peringkat untuk dua faktor dengan interaksi membutuhkan metode lanjutan yang berada di luar cakupan course ini. Bila asumsi terlanggar keras, opsi realistis adalah transformasi data atau perancangan ulang — bukan mengabaikan salah satu faktor, karena kita telah lihat ke mana variasinya berpindah.

Kelebihan desain faktorial kini terhitung pada data ini. Ekonomi: satu eksperimen 12 observasi menjawab dua pertanyaan yang menuntut dua eksperimen terpisah pada jalur klasik. Ketajaman: memisahkan SS_durasi dan SS_interaksi dari galat mengecilkan MS galat dari 28.0 menjadi 5.0. Dan yang tak tergantikan: pertanyaan interaksi hanya bisa dijawab bila kedua faktor hadir dalam satu desain — dua ANOVA terpisah tidak menyisakan jejaknya.

Baris interaksi F = 9.60 dengan p = 0.0147 adalah temuan paling penting eksperimen ini sekaligus istilah yang baru pertama kali muncul di kosakata kita. Apa sebenarnya yang diuji baris itu, bagaimana wujudnya pada grafik mean sel, dan bagaimana mengikuti efek metode pada tiap durasi satu per satu — seluruhnya materi chapter Interaksi Antar Faktor. Dokumentasi anova_lm dan formula API tersedia di statsmodels ; pendalaman desain faktorial di NIST Engineering Statistics Handbook dan Penn State STAT 500 .