Lompat ke konten
nalar

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.

Unduh lab.ipynb

Lab Minggu 1 — Pengantar KDD & Eksplorasi Data Awal

Tujuan lab:

  1. Memastikan lingkungan Python/Jupyter siap.
  2. Memuat dataset pelanggan "mentah" dan mengenali tipe atributnya.
  3. 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.

[1]
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

[2]
df = pelanggan_kotor()
print(df.shape)
df.head(10)
[3]
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.

[4]
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:

[5]
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

[6]
df.describe().T

Perhatikan umur: nilai min dan max tidak masuk akal → ada noise. Bandingkan mean vs median total_belanja:

[7]
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

[8]
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()
[9]
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

[10]
(df.isna().mean() * 100).round(1).sort_values(ascending=False)

5b. Inkonsistensi penulisan kategori

[11]
df["kota"].value_counts(dropna=False)
[12]
df["gender"].value_counts()

5c. Duplikat

[13]
print("Baris duplikat:", df.duplicated().sum())
df[df.duplicated(keep=False)].sort_values("id_pelanggan").head(6)

6. Hubungan antar atribut (sekilas)

[14]
df.select_dtypes("number").corr().round(2)

✍️ Coba sendiri

  1. Berapa persen pelanggan tinggal di Jakarta (setelah semua variasi penulisan disatukan)?
  2. Hitung median pendapatan per tingkat member. Apakah member platinum berpendapatan lebih tinggi?
  3. Buat histogram frekuensi_beli. Distribusi apa yang terlihat?
  4. Tulis 3 masalah kualitas data yang kamu temukan dan usulan penanganannya (akan dikerjakan di Minggu 2).
[15]
# 1.
kota_bersih = df["kota"].str.strip().str.title()
# lanjutkan di sini ...
[16]
# 2.
[17]
# 3.

Jawaban no. 4:

  • ...

Selanjutnya

Kerjakan kuis.md dan exercise.py, lalu jalankan python check.py 1 dari folder utama.