Train Test Split: Kenapa Angka Akurasimu Sering Bohong
Blog/Tips & Trik/Train Test Split: Kenapa Angka Akurasimu Sering Bohong

Train Test Split: Kenapa Angka Akurasimu Sering Bohong

BimaBima
·1 Oktober 2025·7 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Train test split adalah teknik membagi dataset jadi data latih dan data uji, umumnya 80:20, supaya performa model diukur di data yang belum pernah dia lihat. Tanpa pembagian ini, angka akurasi cuma ngukur seberapa hafal model sama data latihnya. Pakai stratify buat target yang timpang, dan potong berdasarkan tanggal kalau datanya berurutan waktu.

Train test split adalah cara bagi dataset jadi dua: satu bagian buat melatih model, satu bagian disimpan rapat buat menguji model di data yang belum pernah dia lihat.

Angka akurasi yang keluar tanpa pembagian ini cuma ngukur satu hal. Seberapa hafal model sama soal latihan yang udah dia kerjain.

Makanya banyak orang senang duluan waktu lihat akurasi 97 persen, terus bingung pas model yang sama dipakai ke data penjualan bulan berikutnya dan tebakannya meleset jauh.

Apa itu train test split?

Train test split adalah teknik membagi dataset jadi data latih (training set) dan data uji (test set), umumnya 80 persen berbanding 20 persen. Model belajar cuma dari data latih. Data uji dibuka di akhir buat ngukur performa di data baru, sehingga angka evaluasinya mencerminkan kondisi nyata.

Data latih itu soal latihan lengkap dengan kunci jawaban. Data uji itu ujian yang soalnya belum pernah dibuka.

Di Python, fungsi train_test_split() dari scikit-learn ngerjain pembagian ini dalam satu baris.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

print(X_train.shape, X_test.shape)

test_size=0.2 artinya 20 persen baris masuk ke data uji. Sisanya jadi data latih. Detail parameternya ada di dokumentasi resmi scikit-learn.

Kenapa akurasi tanpa split hampir selalu bohong?

Karena model dinilai pakai data yang sama persis dengan bahan belajarnya. Model yang kompleks bisa hafal tiap baris sampai akurasinya nyaris sempurna. Begitu ketemu pelanggan baru yang polanya sedikit beda, tebakannya berantakan. Gejala ini namanya overfitting.

Decision tree tanpa batas kedalaman contoh paling ekstrem. Dia bisa bikin satu cabang khusus buat satu pelanggan.

Akurasi 100 persen di data latih itu bukan kabar bagus. Itu alarm. Aku bahas gejalanya lebih lengkap di artikel overfitting dan underfitting.

Split bikin kamu punya angka pembanding. Selisih antara skor latih dan skor uji itu yang ngasih tahu model kamu kebanyakan hafalan atau nggak.

Berapa proporsi data latih dan uji yang pas?

Nggak ada angka wajib. Yang jadi pertimbangan cuma satu: data uji harus cukup banyak biar angkanya stabil, tapi data latih juga jangan sampai kelaparan. Makin besar datasetmu, makin kecil porsi uji yang kamu butuhkan.

Ukuran datasetProporsi latih : ujiCatatan
Di bawah 1.000 baris70 : 30Pertimbangkan cross validation, split tunggal terlalu goyang
1.000 sampai 100.000 baris80 : 20Setelan paling umum dan aman
Di atas 100.000 baris90 : 1010 persen udah ribuan baris, cukup buat evaluasi
Perlu tuning hyperparameter60 : 20 : 20Tambah validation set di tengah

Kalau datamu di bawah 1.000 baris, satu kali split gampang bikin kesimpulan salah. Baca cara ngakalinnya di cross validation buat data terbatas.

Apa gunanya random_state dan stratify?

random_state ngunci pengacakan supaya pembagiannya sama tiap kali kode dijalankan. Tanpa itu, akurasimu berubah tiap run dan kamu nggak bisa bandingin dua model dengan adil. stratify menjaga proporsi kelas target tetap sama di data latih dan data uji.

stratify penting banget kalau targetmu timpang. Misal cuma 8 persen pelanggan yang berhenti belanja.

X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    random_state=42,
    stratify=y
)

Tanpa stratify=y, data uji bisa kebagian cuma 3 persen kasus positif. Model kelihatan bagus padahal dia nyaris nggak pernah diuji sama kasus yang penting.

Kualitas pembagian ini bagian dari data quality yang sering kelewat.

Gimana kalau datanya punya urutan waktu?

Buat data transaksi harian, pembagian acak justru bikin model curang. Model jadi bisa belajar dari transaksi Desember lalu diuji pakai transaksi November. Di dunia nyata kamu nggak punya masa depan sebagai bahan belajar, jadi potong berdasarkan tanggal.

df = df.sort_values("tanggal")

batas = "2025-08-01"
latih = df[df["tanggal"] < batas]
uji   = df[df["tanggal"] >= batas]

print(len(latih), len(uji))

Kalau tetap mau pakai train_test_split, setel shuffle=False supaya urutannya nggak diacak. Baris terakhir otomatis jadi data uji.

Contoh kasus: prediksi pelanggan berhenti belanja di toko_berkah

Dataset latihan ngulikdata punya tabel toko_berkah berisi 4.180 pelanggan dengan 11 kolom perilaku belanja. Targetnya satu kolom: pelanggan itu masih belanja dalam 90 hari terakhir atau udah berhenti.

Proporsi yang berhenti cuma 12,4 persen. Timpang.

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

X = df.drop(columns=["churn", "customer_id"])
y = df["churn"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

print("skor latih:", model.score(X_train, y_train))
print("skor uji  :", model.score(X_test, y_test))

Hasil di dataset ngulikdata: skor latih 99,8 persen, skor uji 82,1 persen. Selisih 17,7 poin.

Kalau aku laporin angka 99,8 persen ke pemilik toko, dia bakal ambil keputusan diskon retensi berdasarkan angka fiktif. Rata-rata transaksi pelanggan toko_berkah Rp 187.000, dan salah target 500 pelanggan artinya voucher senilai belasan juta rupiah nyasar ke orang yang emang nggak mau pergi.

Setelah kedalaman pohon dibatasi jadi 8, skor latih turun ke 88,3 persen dan skor uji naik tipis ke 84,6 persen. Modelnya jadi lebih jujur dan lebih berguna.

Buat prediksi biner kayak gini, alternatif yang lebih gampang dijelaskan ke tim bisnis ada di artikel regresi logistik.

Kesalahan umum saat train test split

  1. Bersihin data sebelum split. Kalau kamu isi nilai kosong pakai rata-rata seluruh dataset, informasi dari data uji bocor ke data latih. Split dulu, baru hitung rata-rata dari data latih saja.
  2. Scaling di seluruh dataset. Sama kasusnya. fit scaler cuma di X_train, lalu transform ke X_test.
  3. Buka test set berkali-kali. Tiap kali kamu nyetel model berdasarkan skor uji, angka itu jadi makin optimistis. Pakai validation set buat eksperimen.
  4. Lupa stratify di target timpang. Akurasi 92 persen kedengeran hebat sampai kamu sadar 92 persen pelanggan emang nggak churn.
  5. Acak data time series. Angka evaluasinya bagus di notebook, jeblok di produksi.
  6. Satu baris pelanggan muncul di dua sisi. Kalau satu pelanggan punya banyak baris transaksi, split per pelanggan, bukan per baris.

Poin nomor 1 dan 2 sering disebut data leakage. Ini penyebab paling sering angka evaluasi kelihatan mustahil bagus.

Ringkasan dan langkah berikutnya

Tiga hal yang perlu kamu bawa dari sini.

Pertama, angka akurasi cuma berarti kalau diukur di data yang belum pernah dilihat model. Kedua, selisih skor latih dan skor uji itu alat diagnosa paling murah yang kamu punya. Ketiga, urutan kerjanya selalu split dulu, bersihin dan scaling belakangan.

Mau lanjut? Pahami dulu gejala yang mau kamu cegah di artikel overfitting dan underfitting, lalu naik ke cross validation kalau datamu terbatas.

Dan kalau kamu masih nyiapin data mentahnya di spreadsheet, cek dulu COUNTIFS buat ngitung proporsi kelas target sebelum masuk Python.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Pandas groupby: Agregasi Data ala Pivot di Python (2026)
Tips & Trik
20 Juli 2026•9 menit baca

Pandas groupby: Agregasi Data ala Pivot di Python (2026)

groupby ngelompokin baris berdasarkan kolom, lalu ngitung ringkasan per grup kayak total atau rata-rata. Ini pivot-nya pandas.

BimaBima
Pandas to_excel: Ekspor DataFrame ke Excel (2026)
Tips & Trik
18 Juli 2026•8 menit baca

Pandas to_excel: Ekspor DataFrame ke Excel (2026)

to_excel nyimpen DataFrame pandas jadi file Excel .xlsx. Ini cara pakainya, dari satu sheet sampai banyak sheet, plus setelan yang bikin hasilnya rapi.

BimaBima
Pandas read_excel: Baca File Excel di Python
Tips & Trik
16 Juli 2026•8 menit baca

Pandas read_excel: Baca File Excel di Python

pandas read_excel baca file Excel jadi DataFrame, bisa pilih sheet tertentu dan lompatin baris judul yang berantakan. Ini cara pakai plus parameter penting dengan contoh data toko.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore