Pengantar KDD & Persiapan Lingkungan Analitik
Siklus Knowledge Discovery in Databases, OLTP vs OLAP, tipe atribut, statistik deskriptif, dan setup Python/Jupyter.
Notebook lab (pratinjau)
Unduh lalu jalankan di Jupyter, VS Code, atau Google Colab.
Lab Minggu 1 — Pengantar KDD & Eksplorasi Data Awal
Tujuan lab:
- Memastikan lingkungan Python/Jupyter siap.
- Memuat dataset pelanggan "mentah" dan mengenali tipe atributnya.
- Menghitung statistik deskriptif & menemukan masalah kualitas data.
Baca lesson.md dulu. Jalankan sel satu per satu (Shift+Enter).
Bagian ✍️ Coba sendiri adalah latihan di dalam notebook.
import sys
sys.path.insert(0, "..") # supaya folder common/ bisa di-import
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from common.datasets import pelanggan_kotor
pd.set_option("display.max_columns", 20)
print("Python :", sys.version.split()[0])
print("NumPy :", np.__version__)
print("Pandas :", pd.__version__)
1. Tahap KDD #1 — Selection: memuat data
df = pelanggan_kotor()
print(df.shape)
df.head(10)
df.info()
2. Mengenali tipe atribut
Pandas hanya tahu tipe penyimpanan (int, float, object/str). Tipe semantik (nominal/ordinal/interval/rasio) harus kita tentukan sendiri.
tipe_semantik = {
"id_pelanggan": "nominal (identitas)",
"umur": "rasio",
"gender": "biner simetris",
"kota": "nominal",
"pendapatan": "rasio",
"frekuensi_beli": "rasio (diskrit)",
"total_belanja": "rasio",
"member": "ordinal (silver < gold < platinum)",
}
pd.DataFrame({"dtype_pandas": df.dtypes.astype(str), "tipe_semantik": pd.Series(tipe_semantik)})
Atribut ordinal sebaiknya disimpan sebagai ordered categorical agar urutannya dipahami:
df["member"] = pd.Categorical(df["member"], categories=["silver", "gold", "platinum"], ordered=True)
print(df["member"].min(), "<", df["member"].max())
df["member"].value_counts().sort_index()
3. Statistik deskriptif
df.describe().T
Perhatikan umur: nilai min dan max tidak masuk akal → ada noise.
Bandingkan mean vs median total_belanja:
for kol in ["umur", "pendapatan", "total_belanja"]:
x = df[kol]
print(f"{kol:15s} mean={x.mean():>14,.1f} median={x.median():>14,.1f} skew={x.skew():.2f}")
4. Visualisasi distribusi & outlier
fig, axes = plt.subplots(1, 3, figsize=(14, 3.5))
for ax, kol in zip(axes, ["umur", "pendapatan", "total_belanja"]):
ax.boxplot(df[kol].dropna(), vert=False)
ax.set_title(kol)
plt.tight_layout()
plt.show()
x = df["umur"].dropna()
q1, q3 = x.quantile([0.25, 0.75])
iqr = q3 - q1
bawah, atas = q1 - 1.5 * iqr, q3 + 1.5 * iqr
print(f"Q1={q1}, Q3={q3}, IQR={iqr}, batas=[{bawah}, {atas}]")
df[(df["umur"] < bawah) | (df["umur"] > atas)][["id_pelanggan", "umur"]]
5. Masalah kualitas data
5a. Nilai hilang
(df.isna().mean() * 100).round(1).sort_values(ascending=False)
5b. Inkonsistensi penulisan kategori
df["kota"].value_counts(dropna=False)
df["gender"].value_counts()
5c. Duplikat
print("Baris duplikat:", df.duplicated().sum())
df[df.duplicated(keep=False)].sort_values("id_pelanggan").head(6)
6. Hubungan antar atribut (sekilas)
df.select_dtypes("number").corr().round(2)
✍️ Coba sendiri
- Berapa persen pelanggan tinggal di Jakarta (setelah semua variasi penulisan disatukan)?
- Hitung median
pendapatanper tingkatmember. Apakah member platinum berpendapatan lebih tinggi? - Buat histogram
frekuensi_beli. Distribusi apa yang terlihat? - Tulis 3 masalah kualitas data yang kamu temukan dan usulan penanganannya (akan dikerjakan di Minggu 2).
# 1.
kota_bersih = df["kota"].str.strip().str.title()
# lanjutkan di sini ...
# 2.
# 3.
Jawaban no. 4:
- ...
Selanjutnya
Kerjakan kuis.md dan exercise.py, lalu jalankan python check.py 1 dari folder utama.