Mode Tryout

Kombinasi scoring_mode, selection_mode, dan normalization_mode, kapan dipakai, dan trade-off-nya.

Mode Tryout

Sebuah Tryout punya tiga sumbu konfigurasi independen. Mereka menentukan bagaimana soal dipilih, bagaimana skor dihitung, dan bagaimana normalisasi dilakukan. Kombinasi ketiganya membentuk "profil" tryout — dari yang paling konservatif (mirip Excel klien) sampai yang paling modern (CAT penuh).

Tiga Sumbu Konfigurasi

flowchart TD
    T["Tryout"]
    T --> S["scoring_mode: bagaimana skor dihitung"]
    T --> E["selection_mode: bagaimana soal dipilih"]
    T --> N["normalization_mode: bagaimana skor ternormalisasi"]

    S --> S1["ctt - Classical Test Theory"]
    S --> S2["irt - Item Response Theory"]
    S --> S3["hybrid - keduanya paralel"]

    E --> E1["fixed - urut slot"]
    E --> E2["adaptive - CAT berbasis theta"]
    E --> E3["hybrid - transisi fixed ke adaptive"]

    N --> N1["static - rataan & sb manual"]
    N --> N2["dynamic - real-time dari TryoutStats"]
    N --> N3["hybrid - auto-switch berbasis sample"]

Tiga sumbu ini disimpan sebagai kolom di tabel tryouts (lihat backend/app/models/tryout.py).

1. scoring_mode — Algoritma Skor

Menentukan rumus yang dipakai untuk menghitung skor akhir siswa.

ModeRumusKapan Dipakai
ctt (default)p, Bobot, NM, NNKompatibilitas Excel klien, peserta sedikit, kalibrasi IRT belum siap
irtRasch 1PL: theta, b, SESudah ada ≥ min_calibration_sample respon per soal, ingin CAT presisi tinggi
hybridCTT + IRT dihitung paralelTransisi dari CTT ke IRT, perlu perbandingan skor keduanya

Detail rumus: lihat Variabel & Rumus.

2. selection_mode — Strategi Pemilihan Soal

Menentukan soal mana yang muncul berikutnya untuk siswa.

ModeCara KerjaButuh Kalibrasi IRT?
fixed (default)Urut sesuai slot (1, 2, 3, ...)Tidak
adaptivePilih soal dengan b terdekat ke theta siswa, maksimasi Fisher informationYa (calibrated = true)
hybridSlot < hybrid_transition_slot → fixed; setelahnya → adaptiveYa (untuk bagian adaptive)

Penting: Bahkan mode fixed tetap pilih soal per-request

"Fixed" di sini merujuk ke urutan slot yang konsisten (1, 2, 3, ...), bukan pre-render semua soal di awal sesi. Bahkan di mode fixed, app tetap menentukan per-request soal mana yang akan ditampilkan karena:

  • App perlu pilih varian level (Sedang/Mudah/Sulit) untuk personalisasi — siswa A mungkin dapat varian Mudah di slot 5, siswa B dapat varian Sedang di slot yang sama.
  • Varian bisa berupa soal AI-generated (generated_by = 'ai') yang dibuat on-demand.
  • Hindari reuse: jika user sudah pernah menjawab (slot, level) tertentu, app pilih varian lain.

Karena itu, alur integrasi Sejoli Tryout selalu memakai 1 AJAX call per soal (Pola B) — baik untuk mode fixed, adaptive, maupun hybrid. Lihat Integrasi → Sejoli Tryout dan Gap Analysis.

Detail algoritma pemilihan: lihat Modul → CAT Selection dan Alur CAT.

3. normalization_mode — Cara Hitung NN

Menentukan darimana Rataan dan SB (untuk rumus NN) berasal.

ModeSumber Rataan & SBKapan Dipakai
static (default)static_rataan (default 500.0) & static_sb (default 100.0) dari konfigurasiPeserta < min_sample_for_dynamic (default 100)
dynamicReal-time dari TryoutStats (mean & SD semua NM)Peserta ≥ 100, ingin distribusi yang merefleksikan kondisi aktual
hybridAuto-switch: static di bawah threshold, dynamic setelahnyaIngin otomatis tanpa intervensi admin

Detail: lihat Modul → Normalization dan Alur Dynamic Normalization.

Kombinasi Umum

Tiga sumbu di atas bisa dikombinasikan bebas (3 × 3 × 3 = 27 kombinasi). Praktiknya, hanya beberapa kombinasi yang masuk akal:

scoring_modeselection_modenormalization_modeDeskripsiUse Case
cttfixedstaticDefault aman — mirip Excel klien 100%Onboarding, tryout pertama, peserta < 100
cttfixeddynamicCTT + normalisasi real-timePeserta ≥ 100, distribusi aktual
irtadaptivestaticCAT penuh — skor IRT, soal adaptifSudah terkalibrasi, presisi tinggi
irtadaptivedynamicCAT penuh + normalisasi dinamisKondisi ideal, data lengkap
hybridhybridhybridTransisi mulus dari CTT ke IRTMigrasi bertahap, A/B perbandingan

Decision Tree: Pilih Mode

flowchart TD
    A["Mulai konfigurasi tryout"] --> B{"Jumlah peserta terprediksi?"}
    B -->|"Di bawah 100"| C["ctt + fixed + static"]
    B -->|"Minimal 100"| D{"Sudah punya data kalibrasi IRT?"}
    D -->|"Belum"| E["ctt + fixed + dynamic"]
    D -->|"Ya, minimal min_calibration_sample per soal"| F{"Ingin transisi mulus?"}
    F -->|"Ya"| G["hybrid + hybrid + hybrid"]
    F -->|"Langsung CAT penuh"| H["irt + adaptive + dynamic"]

    C --> Z["Mode konservatif, kompatibel Excel"]
    E --> Z2["Mode menengah, distribusi aktual"]
    G --> Z3["Mode hybrid, perbandingan skor"]
    H --> Z4["Mode modern, presisi tinggi"]

Field Konfigurasi Terkait

Selain tiga sumbu utama, beberapa field di tryouts memengaruhi perilaku mode:

FieldDefaultBerlaku SaatArti
min_sample_for_dynamic100normalization_mode = dynamic/hybridMinimum peserta sebelum dynamic aktif
static_rataan500.0normalization_mode = static/hybridRataan manual
static_sb100.0normalization_mode = static/hybridSimpangan baku manual
hybrid_transition_slotnullselection_mode = hybridSlot transisi fixed → adaptive
min_calibration_sample100scoring_mode = irt/hybridMin respon per soal untuk kalibrasi
theta_estimation_methodmlescoring_mode = irt/hybridMetode estimasi theta: mle, map, eap
fallback_to_ctt_on_errortruescoring_mode = irt/hybridAuto-fallback ke CTT kalau IRT error
ai_generation_enabledfalseSemua modeToggle AI generate varian soal

Lihat juga daftar lengkap di Variabel & Rumus.

Migrasi Antar-Mode

Salah satu prinsip desain: mode bisa diubah kapan saja tanpa downtime.

sequenceDiagram
    autonumber
    participant Admin
    participant API
    participant DB

    Admin->>API: PUT /tryout/id/normalization
    Note over Admin,API: body: { normalization_mode: dynamic }
    API->>DB: UPDATE tryouts SET normalization_mode=dynamic
    API-->>Admin: 200 OK
    Note over API: Sesi berikutnya otomatis pakai mode baru
    Note over API: Sesi yang sedang berjalan tidak terpengaruh

Aturan penting:

  • Sesi yang sedang berjalan tidak terpengaruh perubahan mode (snapshot saat mulai).
  • Sesi yang dimulai setelah perubahan akan pakai mode baru.
  • Skor yang sudah tersimpan tidak dihitung ulang otomatis — butuh trigger manual kalau perlu recompute.

Trade-off Tiap Mode

scoring_mode

CTTIRTHybrid
Kompatibilitas Excel✅ 100%❌ Berbeda skala⚠️ Sebagian
Akurasi ukur kemampuan⚠️ Sedang✅ Tinggi✅ Tinggi
Butuh kalibrasi❌ Tidak✅ Ya (≥ 100 respon/soal)✅ Ya
Cost komputasiRendahSedangTinggi (dua kali)

selection_mode

FixedAdaptiveHybrid
Personalisasi soal❌ Sama untuk semua✅ Sesuai θ siswa⚠️ Sebagian
Panjang tes efisien❌ Fix-length✅ Bisa terminasi dini (SE < 0.5)⚠️ Fix + adaptive
Butuh kalibrasi❌ Tidak✅ Ya✅ Ya (untuk bagian adaptive)
KompleksitasRendahTinggiSedang

normalization_mode

StaticDynamicHybrid
Refleksi distribusi aktual❌ Manual✅ Real-time✅ Saat cukup data
Stabilitas skor antar batch✅ Tinggi (konstan)⚠️ Bergeser per peserta⚠️ Stabil di awal, dinamis nanti
Butuh peserta minimal❌ Tidak✅ Ya (≥ 100)Auto-threshold

Default Aman

Untuk tryout baru tanpa konteks, pakai default ini:

json
{
  "scoring_mode": "ctt",
  "selection_mode": "fixed",
  "normalization_mode": "static",
  "min_sample_for_dynamic": 100,
  "static_rataan": 500.0,
  "static_sb": 100.0,
  "ai_generation_enabled": false
}

Naikkan secara bertahap setelah data kalibrasi terkumpul. Lihat Roadmap untuk timeline migrasi yang disarankan.

Bacaan Lanjutan

Last updated Jul 25, 2026