Menguasai Exploratory Data Analysis: merangkum statistik, mengukur korelasi, dan menggali insight awal dari data — dilengkapi praktik EDA lengkap yang menjadi dasar sebelum masuk ke modeling

Setelah di episode 5 kita membersihkan data, pada episode ini kita berkenalan dengan data yang sudah bersih itu secara mendalam melalui Exploratory Data Analysis (EDA). EDA adalah proses menjawab pertanyaan "apa yang data ini katakan?" sebelum kita memutuskan model apa yang akan dibangun.
Mengapa EDA begitu penting? Karena model tidak bisa menebak pola yang tidak kalian lihat lebih dulu. Model yang dilatih tanpa EDA biasanya menghasilkan fitur yang salah, target yang salah, atau asumsi yang keliru. Tukang kayu mengukur kayu sebelum memotong; data scientist mengeksplorasi data sebelum memodelkan. EDA juga sering menjadi sumber insight terbaik: banyak keputusan bisnis lahir dari grafik yang tidak pernah masuk ke model sama sekali.
EDA yang baik berjalan terstruktur. Kerangka yang bisa dipakai di setiap proyek:
Mulai dari statistik ringkas seluruh kolom — pola yang langsung terlihat di sini akan menuntun eksplorasi:
import pandas as pd
df = pd.read_csv("telco_churn.csv")
print(df.shape)
print(df.dtypes.value_counts())
print(df.describe())
print(df["churn"].value_counts(normalize=True))Perhatikan dari describe(): rentang nilai yang masuk akal? ada yang bernilai negatif untuk variabel yang seharusnya positif? distribusi simetris atau miring? Setiap keanehan adalah peta menuju pertanyaan berikutnya.
Note
value_counts(normalize=True) pada kolom target memberi tahu baseline paling penting dalam proyek klasifikasi: jika hanya 18% customer churn, maka model yang selalu memprediksi "tidak churn" sudah akurat 82%. Episode 9 dan 11 akan memakai baseline ini terus-menerus.
Eksplorasi tiap variabel untuk memahami bentuknya:
import numpy as np
for col in ["tenure", "monthly_charges", "total_charges"]:
print(col)
print(" skew :", round(df[col].skew(), 3))
print(" missing:", df[col].isna().sum())
print(df["contract"].value_counts())
print(df["internet_service"].value_counts())Variabel numerik yang miring bisa membutuhkan transformasi (episode 10); variabel kategorikal dengan level langka bisa digabung. Keduanya adalah keputusan yang muncul dari EDA, bukan asumsi.
Korelasi mengukur kekuatan hubungan linier antar dua variabel. Di EDA, matriks korelasi adalah peta awal fitur terhadap target:
import numpy as np
num_cols = df.select_dtypes(include=[np.number]).columns
corr = df[num_cols].corr()
print(corr["churn"].sort_values(ascending=False))
high = np.where((abs(corr) > 0.8) & (abs(corr) < 1.0))
pairs = [(corr.index[i], corr.columns[j])
for i, j in zip(*high) if i < j]
print("pasangan sangat berkorelasi:", pairs)Fitur yang saling berkorelasi kuat (multikolinearitas) tidak selalu merusak, tetapi: (1) menambah noise pada model linier, (2) menyulitkan interpretasi koefisien, (3) membuang waktu training. Kalian bisa membuang salah satunya atau menggabungkannya — keputusan detailnya ada di episode 10.
Korelasi tinggi tidak berarti sebab-akibat. total_charges dan tenure sangat berkorelasi karena keduanya bertambah seiring waktu — bukan karena satu menyebabkan yang lain. Episode 16 akan membahas bagaimana cara yang benar membuktikan kausalitas (A/B testing dan causal inference).
Eksplorasi paling informatif adalah melihat hubungan tiap variabel dengan target:
print(df.groupby("contract")["churn"].mean())
print(df.groupby("payment_method")["churn"].mean())
print(df.groupby("senior_citizen")["churn"].mean())
print(df.groupby("churn")["monthly_charges"].mean())Pola yang hampir selalu muncul di dataset churn: customer bulanan churn jauh lebih tinggi daripada customer tahunan, dan pelanggan yang churn membayar monthly charges lebih tinggi. Insight semacam ini adalah cerita yang akan kalian sampaikan di episode 17.
Berikut alur EDA penuh yang menggabungkan semuanya — termasuk visualisasi sederhana yang akan diperdalam di episode 7:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("telco_churn.csv")
# 1. Gambaran umum
print("shape:", df.shape, "| target:", df["churn"].mean().round(3))
# 2. Univariat numerik
num_cols = ["tenure", "monthly_charges"]
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
for ax, col in zip(axes, num_cols):
df[col].hist(bins=40, ax=ax)
ax.set_title(col)
plt.tight_layout()
plt.show()
# 3. Univariat kategorikal
for col in ["contract", "internet_service"]:
print(df[col].value_counts(normalize=True).round(3))
# 4. Bivariat: churn per group
print(df.groupby("contract")["churn"].mean().round(3))
print(df.groupby("internet_service")["churn"].mean().round(3))
# 5. Korelasi numerik vs target
corr = df[num_cols + ["churn"]].corr()["churn"].drop("churn")
print(corr.sort_values(ascending=False))Dari output EDA ini, kalian sudah bisa menebak fitur mana yang paling menjanjikan, apakah perlu transformasi, dan cerita apa yang akan disampaikan ke stakeholder.
| Pitfall | Dampak | Solusi |
|---|---|---|
| Langsung modeling tanpa EDA | Fitur salah, asumsi keliru | Selalu eksplorasi dulu |
| Memakai correlation hanya | Kehilangan pola non-linier | Kombinasikan dengan plot & groupby |
| Mengira korelasi = kausalitas | Keputusan bisnis keliru | Uji eksperimen (episode 16) |
| EDA tanpa pertanyaan | Output tanpa arah | Mulai dari hipotesis & target |
| Tidak mencatat temuan | Insight hilang di notebook | Simpan kesimpulan per langkah |
Inti yang harus dibawa pulang:
value_counts memberi baseline dan peta awal.Di episode 7 selanjutnya kita akan membahas data visualization — Matplotlib, Seaborn, dan Plotly untuk mengubah temuan EDA menjadi cerita visual yang meyakinkan. Sampai jumpa di episode 7!