Teori IRT /
Pengenalan
Kenapa Harus Menggunakan IRT?
Pemahaman mendasar mengenai perbedaan antara teori tes klasik (CTT) dan teori respons butir
(IRT) pada platform tryout.
Classical
Test Theory (CTT)
Pendekatan penilaian klasik yang digunakan saat ini:
nilai = (jumlah bobot benar / total bobot) × 100
- Semua soal dianggap sama rata tanpa mempedulikan tingkat kesulitan.
- Menjawab benar soal yang mudah bernilai sama dengan menjawab benar soal yang sangat
rumit.
Item
Response Theory (IRT)
Pendekatan modern yang digunakan oleh UTBK / SNBT nasional:
Mengukur Kemampuan Laten Siswa (θ, Theta)
- Setiap butir soal memiliki karakteristik tersendiri (tingkat kesulitan & daya
beda).
- Jawaban benar pada soal yang sulit (jarang dijawab benar oleh peserta lain) akan
mendongkrak skor secara signifikan.
- Sebaliknya, menjawab benar soal yang sangat mudah (hampir semua peserta menjawab
benar) memberikan kontribusi skor yang kecil.
Dua Siswa dengan Jumlah Benar Sama Bisa
Mendapatkan Skor Berbeda
Ini adalah fitur khas penilaian UTBK. Apabila Siswa A berhasil menjawab soal-soal sulit
yang gagal dikerjakan oleh mayoritas cohort, maka skor akhirnya akan jauh lebih tinggi
daripada Siswa B yang hanya mampu menjawab soal-soal mudah, meskipun jumlah jawaban
benar mereka berdua sama persis.
Teori IRT /
Karakteristik
Model Matematis 2-Parameter
Logistic (2PL)
Menghitung peluang probabilitas kesuksesan siswa dalam menjawab butir soal menggunakan
formula 2PL.
Formula Logistik 2PL
Probabilitas siswa dengan kemampuan laten θ menjawab benar soal i dihitung dengan:
Pi(θ) = 1 / (1 + e−ai · (θ − bi))
Penjelasan Parameter
bi — Tingkat Kesulitan
(Difficulty)
Menentukan posisi kurva logistik secara horizontal. Nilai θ di mana peluang benar adalah 50%.
Nilai b yang besar mengindikasikan
soal yang sulit.
ai — Daya Beda
(Discrimination)
Menentukan tingkat kemiringan (slope) kurva logistik. Semakin besar nilai a, semakin tajam soal membedakan siswa
berkemampuan tinggi vs rendah. Nilai negatif menunjukkan soal buruk.
θ — Kemampuan Laten (Ability)
Kecerdasan atau tingkat pemahaman laten siswa yang diestimasi. Skala berkisar antara
−3.0 hingga +3.0, di mana 0 merupakan rata-rata populasi cohort
tryout.
Kenapa Memilih Model 2PL?
Berikut perbandingan model 1PL, 2PL, dan 3PL untuk menentukan kelayakan sistem pada bimbel
Triton Denpasar:
| Model |
Parameter yang Digunakan |
Jumlah Peserta Minim |
Kelayakan untuk Ujian Bimbel |
| 1PL (Rasch) |
b (kesulitan) saja |
Sangat Sedikit (< 30) |
Kurang akurat karena menganggap semua soal
memiliki daya beda yang sama. |
|
2PL (Dipakai)
|
a (daya beda) & b (kesulitan) |
Min 50 Peserta |
Sangat Cocok & Stabil. Titik
seimbang realistis untuk tryout cohort bimbel berskala menengah. |
| 3PL |
a, b, & c (faktor tebakan acak) |
Sangat Banyak (> 500) |
Estimasi parameter tebakan c tidak stabil jika
data peserta terlalu sedikit. |
Teori IRT / Siklus
Hitung
Dua Tahap Perhitungan IRT
Sistem melakukan proses matematika terpisah untuk kalibrasi item ujian dan estimasi
kemampuan siswa.
1
Tahap 1: Kalibrasi Item (Parameter
Estimasi)
Dari matriks biner berukuran [peserta × soal] yang berisi data 0/1
(salah/benar), sistem akan menghitung parameter a_i dan
b_i untuk tiap butir soal.
- Metode: Marginal Maximum Likelihood Estimation (MMLE).
- Algoritma: Expectation-Maximization (EM).
- Alasan Layanan Terpisah: Proses komputasi iteratif ini berat
dan membutuhkan library Python matang (seperti
girth atau
scipy), sehingga diletakkan di microservice terpisah.
2
Tahap 2: Estimasi Kemampuan Siswa (θ)
Setelah karakteristik soal (a & b) diketahui melalui Tahap 1, sistem akan
menghitung nilai θ masing-masing siswa berdasarkan pola kombinasi
jawabannya.
- Metode: Expected A Posteriori (EAP) dengan prior distribusi
normal baku N(0,1).
- Keunggulan EAP: Stabil. Metode pencarian Maximum Likelihood
(MLE) standar akan gagal (divergen ke ±takterhingga) jika siswa menjawab benar
semua atau salah semua. EAP memberikan hasil yang wajar dan aman di semua
kondisi ekstrem.
Teori IRT / Hasil
Skor
Konversi Nilai θ ke Skala 0–1000
Bagaimana sistem mengubah nilai kemampuan logit (θ) menjadi skor numerik yang mudah dibaca
oleh siswa dan guru.
Formula Pemetaan Linear Tetap (Default)
Secara default, nilai logit θ berada dalam rentang [-3, +3]. Skor linear dibatasi (clamped)
pada batas minimum 0 dan maksimum 1000 menggunakan formula:
// Formula Konversi
skor = round( clamp( (θ + 3) / 6 , 0, 1 ) × 1000 )
Contoh Pemetaan:
- θ = −3.000 atau di bawahnya → Skor = 0
- θ = 0.000 (Rata-rata populasi) → Skor = 500
- θ = +3.000 atau di atasnya → Skor = 1000
Formula Alternatif (Standardisasi Cohort)
Apabila ingin menggunakan metode standardisasi mirip dengan UTBK asli agar rata-rata skor
populasi berada di nilai 500 dan standar deviasi 167:
skor = round( clamp( 500 + (θ − mean_θ) / sd_θ × 167 , 0, 1000 ) )
Integrasi Teknis
/ Arsitektur
Arsitektur Layanan Perhitungan IRT
Skema komunikasi tingkat tinggi antara Frontend, Gateway, Microservices Level (SD/SMP/SMA),
dan Layanan irt-service.
Diagram Alur Data
(Batch, dipicu oleh Admin Soal)
Admin-Soal UI ──► API Gateway ──► Level Service (SD/SMP/SMA)
[Tombol] │ jawaban.routes.ts
│ 1. Baca semua jawaban tryout dari DB
│ 2. Bangun matriks 0/1 [siswa × soal]
▼
irt-service (Python, Port: 4008) ◄── STATELESS
│ Kalibrasi 2PL + Estimasi θ (EAP)
▼
Level Service ◄────────────────────── { success: true, items: [...], students: [...] }
│ 3. Simpan theta & skor_irt ke tabel `hasil`
▼
Leaderboard & Laporan Siswa memakai skor_irt
Mengapa Layanan Python Dibuat
Stateless?
Layanan irt-service bertindak layaknya kalkulator murni. Layanan ini
tidak memiliki koneksi ke database Postgres. Seluruh data jawaban diambil oleh Level
Service Node.js, dibungkus dalam bentuk matriks, dikirim ke Python, dan hasil
kalkulasinya disimpan kembali ke DB oleh Node.js. Hal ini mempermudah unit testing,
modularitas, dan skalabilitas.
Integrasi Teknis
/ API & DB
Kontrak API & Perubahan Skema
Database
Dokumentasi payload request/response API dan perintah modifikasi database SQL.
Kontrak API Endpoint
POST /calibrate
Dipanggil oleh backend Node.js ke irt-service (port 4008).
Payload Request:
{
"responses": [
[1, 0, 1, 1, 0], // Siswa 1
[0, 0, 1, 0, 1], // Siswa 2
[1, 1, 1, 0, 0] // Siswa 3 (baris = siswa, kolom = urutan soal)
],
"student_ids": ["uuid-siswa-1", "uuid-siswa-2", "uuid-siswa-3"],
"item_ids": ["uuid-soal-1", "uuid-soal-2", "uuid-soal-3", "uuid-soal-4", "uuid-soal-5"]
}
Payload Response:
{
"success": true,
"items": [
{ "id": "uuid-soal-1", "a": 1.24, "b": -0.35 },
{ "id": "uuid-soal-2", "a": 0.85, "b": 1.12 }
],
"students": [
{ "id": "uuid-siswa-1", "theta": 0.87, "score": 645 },
{ "id": "uuid-siswa-2", "theta": -1.20, "score": 300 }
],
"meta": {
"model": "2PL",
"ability_method": "EAP",
"n_students": 3,
"n_items": 5
}
}
Perubahan Skema Database (PostgreSQL)
Modifikasi skema SQL pada layanan SD, SMP, dan SMA. Diterapkan di schema.sql
masing-masing service:
-- 1. Tambahkan toggle IRT pada tabel tryout
ALTER TABLE tryouts ADD COLUMN IF NOT EXISTS is_irt_enabled BOOLEAN NOT NULL DEFAULT false;
-- 2. Tambahkan kolom hasil IRT pada tabel hasil
ALTER TABLE hasil ADD COLUMN IF NOT EXISTS theta NUMERIC(6,3); -- Kemampuan Laten (theta)
ALTER TABLE hasil ADD COLUMN IF NOT EXISTS skor_irt INTEGER; -- Skor terkonversi (0-1000)
ALTER TABLE hasil ADD COLUMN IF NOT EXISTS irt_dihitung_at TIMESTAMPTZ; -- Log waktu kalkulasi batch
Integrasi Teknis
/ Alur Kode
Alur Proses Perhitungan Batch
Langkah demi langkah penanganan logic kalkulasi pada endpoint
POST /tryouts/:id/hitung-irt di backend.
Tahapan Eksekusi Endpoint
1
Validasi Toggle Status
Pastikan status
tryouts.is_irt_enabled = true. Jika toggle bernilai false, segera
tolak request dan kembalikan kode error 400 Bad Request.
2
Tarik Data Ujian Siswa
Ambil semua catatan dari tabel sesi_tryout
yang berstatus selesai beserta relasi detail jawaban
untuk tryout tersebut.
3
Minimal Jumlah Peserta (Guard minimal 50)
Jika jumlah peserta yang selesai < 50, batalkan proses
dan kirim error response 400 dengan kode
IRT_INSUFFICIENT. Skor ujian akan otomatis kembali menggunakan
kalkulasi klasik 0–100.
4
Konstruksi Matriks Respons 0/1
Muat data soal menggunakan helper
loadSoalForScoring(). Kecualikan jenis soal Essay
dari matriks. Lakukan pencocokan jawaban (grading). Nilai bernilai
1 jika hasil pencocokan benar mutlak, dan bernilai 0
jika salah atau tidak dijawab sama sekali.
5
Mengirim Payload ke irt-service
Kirim payload JSON berisi matriks respons, ID siswa, dan
ID soal ke URL POST /calibrate layanan irt-service.
6
Menyimpan Hasil ke Database
Setelah respons sukses diterima, jalankan query transaksi
SQL untuk memperbarui kolom theta, skor_irt, dan
irt_dihitung_at pada tabel hasil.
Integrasi Teknis
/ Keamanan
Penanganan Kasus Khusus &
Batasan Sistem
Daftar skenario kegagalan, batasan operasional, dan toleransi sistem kalkulasi IRT.
Strategi Penanganan Masalah
| Skenario Lapangan |
Dampak Sistem |
Solusi & Penanganan |
| Jumlah Peserta < 50 |
Gagal Menghitung IRT |
Sistem membatalkan proses batch, menampilkan
pesan pemberitahuan yang jelas kepada admin, dan mempertahankan skor klasik
(0-100). |
| Ada Siswa Benar Semua / Salah Semua
|
Estimasi Bias Biasa terjadi |
Pemilihan algoritma EAP (Expected A
Posteriori) menjamin pencarian nilai θ tetap stabil dan tidak
divergen/error. |
| Soal Menjawab Benar Semua Cohort /
Salah Semua |
Variansi Soal 0 |
Layanan irt-service memproteksi agar
tidak terjadi pembagian dengan angka nol. Soal bermasalah diberi nilai daya
beda a rendah/di-skip. |
| Terdapat Soal Jenis Essay |
Bukan data biner |
Sistem secara otomatis menyaring dan
mengecualikan jenis soal Essay dari matriks input IRT. |
Layanan irt-service
Down / Mati |
API Timeout / Connection Refused |
Membatalkan seluruh transaksi database
(rollback), mengembalikan pesan error detail pada sisi admin, dan tidak
mengubah kolom hasil. |
Penting Untuk Kredibilitas Akademik:
Hasil dari pengolahan ini merupakan estimasi matematika 2PL berdasarkan cohort dari
peserta tryout bimbel setempat, bukan merupakan hasil resmi bersertifikasi nasional
UTBK. Disarankan agar guru tetap memantau distribusi daya beda soal (a) guna
meninjau kualitas pembuatan soal tryout.