Algoritma C4.5 dan Decision Tree: Hitung Entropy dan Gain Manual
Blog/Tips & Trik/Algoritma C4.5 dan Decision Tree: Hitung Entropy dan Gain Manual

Algoritma C4.5 dan Decision Tree: Hitung Entropy dan Gain Manual

BimaBima
·9 September 2025·12 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Algoritma C4.5 membangun decision tree dengan memilih atribut yang punya gain ratio tertinggi di setiap simpul. Hitungannya tiga tahap: entropy buat ngukur ketidakpastian, information gain buat ngukur pengurangan ketidakpastian setelah data dipecah, lalu gain ratio buat menghukum atribut yang punya terlalu banyak nilai unik. C4.5 adalah pengembangan dari ID3 yang dibuat Ross Quinlan.

Algoritma C4.5 membangun decision tree dengan cara milih atribut yang punya gain ratio tertinggi di tiap simpul. Hitungannya tiga tahap: entropy, information gain, lalu gain ratio.

C4.5 dibuat Ross Quinlan sebagai penerus ID3. Bedanya bukan cuma di rumus pemilihan atribut, tapi juga kemampuan nangani angka kontinu, nilai kosong, dan pemangkasan pohon.

Di bawah ini aku hitung semuanya pakai tangan, pakai data 12 pengajuan kredit UMKM. Angkanya sengaja kecil biar kamu bisa ngikutin tanpa kalkulator ilmiah.

Apa itu algoritma C4.5?

Algoritma C4.5 adalah metode klasifikasi yang menghasilkan pohon keputusan dari data berlabel. Tiap simpul pohon berisi pertanyaan tentang satu atribut, tiap cabang jawaban dari pertanyaan itu, dan tiap daun berisi kelas hasil prediksi. Kelebihannya, hasilnya bisa dibaca sebagai aturan jika-maka tanpa perlu ngerti matematikanya.

Buat kamu yang lagi milih metode buat proyek, C4.5 masuk kelompok klasifikasi. Kelompok metode yang lain aku bahas di metode data mining.

Rumus entropy, information gain, dan gain ratio

Tiga rumus ini yang dipakai berulang di tiap simpul.

Entropy ngukur seberapa campur aduk isi sebuah kumpulan data. Nilainya 0 kalau semua baris punya label sama, dan 1 kalau labelnya terbagi rata dua kelas.

Entropy(S) = -p1 * log2(p1) - p2 * log2(p2)

Information gain ngukur berapa banyak ketidakpastian yang hilang setelah data dipecah pakai satu atribut.

Gain(S, A) = Entropy(S) - jumlah( (|Sv| / |S|) * Entropy(Sv) )

Split information ngukur seberapa banyak dan seberapa merata atribut itu mecah data.

SplitInfo(S, A) = -jumlah( (|Sv| / |S|) * log2(|Sv| / |S|) )

Gain ratio hasil bagi dua angka terakhir. Ini yang dipakai C4.5 buat milih pemenang.

GainRatio(S, A) = Gain(S, A) / SplitInfo(S, A)

Data latihan: 12 pengajuan kredit UMKM

Dataset latihan ngulikdata bernama kredit_umkm berisi 12 pengajuan dengan tiga atribut dan satu label. Label yang diprediksi: status kredit setelah 12 bulan.

Nolama_usahacatatan_keuanganjaminanstatus
1kurang dari 2 tahunnggakadamacet
2kurang dari 2 tahunnggaknggakmacet
3kurang dari 2 tahunnggaknggakmacet
4kurang dari 2 tahunyanggaklancar
52 sampai 5 tahunyaadalancar
62 sampai 5 tahunyaadalancar
72 sampai 5 tahunyaadalancar
82 sampai 5 tahunyaadalancar
9lebih dari 5 tahunyaadalancar
10lebih dari 5 tahunnggaknggaklancar
11lebih dari 5 tahunnggaknggaklancar
12lebih dari 5 tahunyanggakmacet

Total 12 baris: 8 lancar dan 4 macet.

Langkah 1: hitung entropy seluruh data

Proporsinya 8/12 lancar dan 4/12 macet.

p(lancar) = 8/12 = 0,6667
p(macet)  = 4/12 = 0,3333

Entropy(S) = -0,6667 * log2(0,6667) - 0,3333 * log2(0,3333)
           = -0,6667 * (-0,5850) - 0,3333 * (-1,5850)
           = 0,3900 + 0,5283
           = 0,9183

Angka 0,9183 ini titik awal. Semua atribut bakal dinilai dari seberapa banyak mereka nurunin angka tersebut.

Langkah 2: hitung gain tiap atribut

Atribut lama_usaha

Tiga nilai, masing-masing 4 baris.

kurang dari 2 tahun (4 baris): 1 lancar, 3 macet
  Entropy = -0,25*log2(0,25) - 0,75*log2(0,75)
          = 0,5000 + 0,3113 = 0,8113

2 sampai 5 tahun (4 baris): 4 lancar, 0 macet
  Entropy = 0 (semua labelnya sama)

lebih dari 5 tahun (4 baris): 3 lancar, 1 macet
  Entropy = 0,8113

Entropy gabungan = (4/12)*0,8113 + (4/12)*0 + (4/12)*0,8113
                 = 0,2704 + 0 + 0,2704 = 0,5409

Gain = 0,9183 - 0,5409 = 0,3774

Atribut catatan_keuangan

ya (7 baris): 6 lancar, 1 macet  -> Entropy = 0,5917
nggak (5 baris): 2 lancar, 3 macet -> Entropy = 0,9710

Entropy gabungan = (7/12)*0,5917 + (5/12)*0,9710
                 = 0,3452 + 0,4046 = 0,7498

Gain = 0,9183 - 0,7498 = 0,1685

Atribut jaminan

ada (6 baris): 5 lancar, 1 macet -> Entropy = 0,6500
nggak (6 baris): 3 lancar, 3 macet -> Entropy = 1,0000

Entropy gabungan = 0,5*0,6500 + 0,5*1,0000 = 0,8250

Gain = 0,9183 - 0,8250 = 0,0933

Langkah 3: ubah gain jadi gain ratio

Di sinilah C4.5 beda dari ID3. Gain dibagi split information dulu sebelum dibandingkan.

SplitInfo(lama_usaha) = -3 * (4/12) * log2(4/12) = 1,5850
SplitInfo(catatan)    = -(7/12)*log2(7/12) - (5/12)*log2(5/12) = 0,9799
SplitInfo(jaminan)    = -(6/12)*log2(6/12) - (6/12)*log2(6/12) = 1,0000
AtributGainSplitInfoGain Ratio
lama_usaha0,37741,58500,2381
catatan_keuangan0,16850,97990,1719
jaminan0,09331,00000,0933

Perhatiin jaraknya. Pakai information gain, lama_usaha unggul lebih dari dua kali lipat dari catatan_keuangan. Pakai gain ratio, jaraknya nyusut jadi 0,2381 lawan 0,1719, gara-gara lama_usaha punya tiga nilai sementara catatan cuma dua.

Pemenangnya tetap lama_usaha, jadi dia jadi simpul akar.

Langkah 4: lanjutkan ke tiap cabang

Cabang 2 sampai 5 tahun udah murni, semuanya lancar. Cabang itu jadi daun, selesai.

Cabang kurang dari 2 tahun berisi baris 1 sampai 4 dengan entropy 0,8113. Dipecah pakai catatan_keuangan: nilai ya berisi baris 4 (lancar), nilai nggak berisi baris 1, 2, 3 (semuanya macet). Dua-duanya murni, gain-nya penuh 0,8113. Selesai juga.

Cabang lebih dari 5 tahun berisi baris 9 sampai 12 dengan entropy 0,8113. Dipecah pakai catatan_keuangan: nilai nggak berisi baris 10 dan 11 yang dua-duanya lancar, nilai ya berisi baris 9 dan 12 yang masih campur. Baris 9 dan 12 dipisah lagi pakai jaminan, dan langsung murni.

Pohon jadinya:

lama_usaha?
|- 2 sampai 5 tahun  -> LANCAR
|- kurang dari 2 tahun
|   |- catatan_keuangan = ya    -> LANCAR
|   |- catatan_keuangan = nggak -> MACET
|- lebih dari 5 tahun
    |- catatan_keuangan = nggak -> LANCAR
    |- catatan_keuangan = ya
        |- jaminan = ada   -> LANCAR
        |- jaminan = nggak -> MACET

Aturan keempat kelihatan aneh: usaha lama tanpa catatan keuangan kok diprediksi lancar. Itu tanda pohon kekecilan datanya. Cabang tersebut cuma ditopang 2 baris, jadi aturannya belum tentu berlaku di data baru. Di C4.5 beneran, cabang kayak gini yang bakal kena pemangkasan.

Hitung entropy di spreadsheet

Kalau kamu mau ngecek hitungan tanpa Python, spreadsheet cukup. Taruh jumlah kelas positif di B2 dan negatif di C2.

=IFERROR(-B2/(B2+C2)*LOG(B2/(B2+C2),2) - C2/(B2+C2)*LOG(C2/(B2+C2),2), 0)

IFERROR dipasang buat nangani kelompok murni, karena log dari nol bikin error. Buat ngitung jumlah baris per kombinasi atribut, COUNTIFS paling cepat.

Kode Python untuk decision tree

Sekarang bandingin hasil hitung tangan tadi sama library.

import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_text

data = pd.DataFrame({
    "lama_usaha": ["<2","<2","<2","<2","2-5","2-5","2-5","2-5",">5",">5",">5",">5"],
    "catatan":    ["nggak","nggak","nggak","ya","ya","ya","ya","ya","ya","nggak","nggak","ya"],
    "jaminan":    ["ada","nggak","nggak","nggak","ada","ada","ada","ada","ada","nggak","nggak","nggak"],
    "status":     ["macet","macet","macet","lancar","lancar","lancar",
                   "lancar","lancar","lancar","lancar","lancar","macet"]
})

X = pd.get_dummies(data.drop(columns="status"))
y = data["status"]

model = DecisionTreeClassifier(criterion="entropy", random_state=42)
model.fit(X, y)

print(export_text(model, feature_names=list(X.columns)))

Satu hal yang harus kamu tau: DecisionTreeClassifier di scikit-learn memakai varian CART, bukan C4.5. Dia nggak ngitung gain ratio dan cabangnya selalu dua per simpul. Pilihan criterion="entropy" cuma nyamain rumus ketidakpastiannya. Rinciannya ada di dokumentasi scikit-learn.

Jadi kalau skripsimu nulis "algoritma C4.5" tapi kodenya pakai scikit-learn, sebutkan bedanya di bab metodologi. Penguji yang teliti bakal nanya.

Kesalahan umum waktu ngitung C4.5 manual

  1. Pakai log basis 10. Entropy pakai basis 2. Di spreadsheet tulis LOG(nilai;2), bukan LOG(nilai).
  2. Lupa bobot proporsi. Entropy tiap cabang harus dikali jumlah baris cabang dibagi total baris sebelum dijumlahkan.
  3. Ngitung gain doang terus ngaku pakai C4.5. Tanpa gain ratio, itu ID3.
  4. Masukin kolom id sebagai atribut. Kolom unik selalu menang di information gain dan bikin pohon nggak berguna. Ini persis alasan gain ratio dibikin.
  5. Nggak bersihin data dulu. Kategori yang ditulis beda bikin cabang pecah palsu. Cek dulu kualitas data sebelum ngitung.

FAQ

Apa bedanya ID3 dan C4.5?

ID3 milih atribut pakai information gain, C4.5 pakai gain ratio. C4.5 juga bisa nangani atribut angka kontinu, nilai yang hilang, dan punya tahap pemangkasan pohon. ID3 nggak punya ketiganya.

Kenapa entropy dihitung pakai log basis 2?

Basis 2 bikin satuannya jadi bit, dan satu bit mewakili satu pertanyaan ya atau nggak. Data yang terbagi rata dua kelas punya entropy persis 1 bit.

Kapan gain ratio lebih baik dari information gain?

Waktu ada atribut dengan banyak nilai unik. Information gain selalu kasih nilai besar ke kolom kayak id_transaksi, karena tiap kelompoknya otomatis murni. Gain ratio motong nilai atribut semacam itu.

Apakah scikit-learn punya implementasi C4.5?

Nggak persis. DecisionTreeClassifier memakai varian CART, jadi dia nggak menghitung gain ratio dan cabangnya selalu dua per simpul.

Berapa data minimal buat decision tree yang masuk akal?

Buat latihan manual, 10 sampai 15 baris cukup. Buat model yang dipakai beneran, usahakan tiap daun punya minimal 20 sampai 30 baris biar aturannya nggak kebetulan.

Penutup

Tiga hal yang perlu nempel. Entropy ngukur campur aduknya data, gain ngukur pengurangannya setelah dipecah, gain ratio nghukum atribut yang terlalu banyak nilai.

Coba ulang hitungannya pakai data kamu sendiri, minimal 12 baris, tiga atribut. Hitung tangan dulu, baru bandingin sama Python.

Lanjut baca: KDD vs CRISP-DM vs SEMMA buat nyusun alur proyeknya dari awal sampai dipakai orang.

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