Model deep learning hanya mengenal array angka, sedangkan data nyata datang sebagai tabel berisi teks, angka, dan nilai yang tidak lengkap. Pandas mengisi celah tersebut dengan struktur DataFrame: tabel berlabel kolom yang lengkap dengan alat baca CSV, penyaringan, dan agregasi. Dalam praktiknya, hampir setiap proyek deep learning dimulai dari pembersihan data di pandas sebelum berakhir sebagai array NumPy di dalam model. Chapter ini menyoroti pola yang paling sering dipakai: membaca data, memeriksa ringkasan, menyaring baris, meringkas per kelompok, dan mengonversi hasilnya menjadi array.
DataFrame: Tabel Bernama Kolom #
DataFrame menyimpan data dalam bentuk baris dan kolom, mirip seperti lembar kerja. Setiap kolom memiliki nama dan satu tipe data, dan setiap baris memiliki label indeks. Kita akan memakai dataset harga rumah fiktif dengan lima kolom: nama pemilik, luas dalam meter persegi, jumlah kamar, jarak ke pusat kota dalam kilometer, dan harga dalam juta rupiah. Dataset lengkap tersimpan pada berkas rumah.csv di dalam bundle chapter ini.
Membaca dan Memeriksa Data #
Tiga pemeriksaan pertama yang lazim dilakukan pada data baru adalah head() untuk mengintip isi, info() untuk memeriksa tipe kolom dan data yang tidak lengkap, serta describe() untuk statistik setiap kolom angka. Berkas eksplorasi-dataframe.py menjalankan ketiganya, diawali pembuatan DataFrame kecil dari dictionary.
import pandas as pd
# DataFrame dari dictionary: kunci menjadi nama kolom
data_dict = {
"pemilik": ["Budi", "Siti"],
"luas": [60, 90],
"harga": [350, 520],
}
df_kecil = pd.DataFrame(data_dict)
print("DataFrame dari dict:")
print(df_kecil)
# Membaca tabel CSV ke dalam DataFrame
df = pd.read_csv("rumah.csv")
print("\nlima baris pertama (head):")
print(df.head())
print("\nringkasan struktur (info):")
df.info()
print("\nstatistik deskriptif (describe):")
print(df.describe())Output yang Dihasilkan:
DataFrame dari dict:
pemilik luas harga
0 Budi 60 350
1 Siti 90 520
lima baris pertama (head):
pemilik luas kamar jarak_pusat harga
0 Budi 60 2 8.0 350
1 Siti 90 3 5.0 520
2 Ani 45 1 12.0 280
3 Rudi 120 4 3.0 780
4 Dewi 75 3 6.5 460
ringkasan struktur (info):
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8 entries, 0 to 7
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 pemilik 8 non-null object
1 luas 8 non-null int64
2 kamar 8 non-null int64
3 jarak_pusat 8 non-null float64
4 harga 8 non-null int64
dtypes: float64(1), int64(3), object(1)
memory usage: 452.0+ bytes
statistik deskriptif (describe):
luas kamar jarak_pusat harga
count 8.000000 8.000000 8.000000 8.000000
mean 79.375000 2.750000 6.375000 510.000000
std 27.181598 1.035098 3.409545 204.450483
min 45.000000 1.000000 2.500000 280.000000
25% 57.500000 2.000000 3.750000 340.000000
50% 80.000000 3.000000 5.750000 490.000000
75% 95.000000 3.250000 8.500000 615.000000
max 120.000000 4.000000 12.000000 820.000000Mari kita telaah kode di atas baris per baris:
- Baris 5-10 (
data_dict = {...}danpd.DataFrame(data_dict)): dictionary dengan nilai berupa list menjadi DataFrame — kunci menjadi nama kolom dan urutan list menjadi urutan baris. Cara ini cocok untuk data kecil yang ditulis langsung di kode. - Baris 15 (
df = pd.read_csv("rumah.csv")): fungsiread_csvmembaca berkas CSV di folder yang sama dengan skrip, memisahkan baris pertama sebagai nama kolom, dan menebak tipe data setiap kolom. - Baris 18 (
df.head()): methodhead()mengembalikan lima baris pertama — cukup untuk mengintip format data tanpa mencetak seluruh tabel. Ketika data berisi jutaan baris,print(df)mentah akan membanjiri terminal. - Baris 22 (
df.info()): ringkasan struktur mencetak jumlah baris, jumlah kolom, jumlah nilai terisi per kolom (non-null), dan tipe data. Kolom bertipeobjectadalah teks, sementaraint64danfloat64adalah angka. Di sinilah kita mendeteksi kolom yang nilainya tidak lengkap. - Baris 26 (
df.describe()): statistik deskriptif — jumlah data, rata-rata (mean), simpangan baku (std), nilai minimum, kuartil, dan nilai maksimum — membantu menemukan pencilan dan memahami skala setiap fitur sebelum menormalkan data.
Menyaring dan Meringkas #
Penyaringan baris memakai filter boolean: kita membuat kolom berisi True/False, lalu DataFrame memilih baris yang bernilai True. Berkas filter-dan-agregasi.py melanjutkan dataset rumah dengan penyaringan tunggal, penyaringan gabungan, kolom hasil hitung, agregasi groupby, dan akhirnya konversi menjadi array NumPy.
import pandas as pd
df = pd.read_csv("rumah.csv")
# Filter boolean: rumah dengan harga di atas 400 juta
mahal = df[df["harga"] > 400]
print("rumah dengan harga > 400:")
print(mahal)
# Kombinasi dua kondisi dengan operator & (dan)
luas_strategis = df[(df["luas"] >= 75) & (df["jarak_pusat"] <= 5.0)]
print("\nluas >= 75 dan jarak ke pusat kota <= 5 km:")
print(luas_strategis)
# Kolom baru hasil perhitungan: harga per meter persegi
df["harga_per_m2"] = df["harga"] / df["luas"]
print("\nharga per meter persegi:")
print(df[["pemilik", "harga_per_m2"]])
# Rata-rata harga menurut jumlah kamar
rata_kamar = df.groupby("kamar")["harga"].mean()
print("\nrata-rata harga menurut jumlah kamar:")
print(rata_kamar)
# Jembatan menuju model: DataFrame menjadi array NumPy
X = df[["luas", "kamar", "jarak_pusat"]].to_numpy()
y = df["harga"].to_numpy()
print("\nbentuk X:", X.shape, "| bentuk y:", y.shape)
print("X[0]:", X[0], "| y[0]:", y[0])Output yang Dihasilkan:
rumah dengan harga > 400:
pemilik luas kamar jarak_pusat harga
1 Siti 90 3 5.0 520
3 Rudi 120 4 3.0 780
4 Dewi 75 3 6.5 460
6 Rina 110 4 2.5 820
7 Agus 85 3 4.0 560
luas >= 75 dan jarak ke pusat kota <= 5 km:
pemilik luas kamar jarak_pusat harga
1 Siti 90 3 5.0 520
3 Rudi 120 4 3.0 780
6 Rina 110 4 2.5 820
7 Agus 85 3 4.0 560
harga per meter persegi:
pemilik harga_per_m2
0 Budi 5.833333
1 Siti 5.777778
2 Ani 6.222222
3 Rudi 6.500000
4 Dewi 6.133333
5 Joko 6.200000
6 Rina 7.454545
7 Agus 6.588235
rata-rata harga menurut jumlah kamar:
kamar
1 280.000000
2 330.000000
3 513.333333
4 800.000000
Name: harga, dtype: float64
bentuk X: (8, 3) | bentuk y: (8,)
X[0]: [60. 2. 8.] | y[0]: 350Mari kita telaah kode di atas baris per baris:
- Baris 7 (
df[df["harga"] > 400]): ekspresidf["harga"] > 400menghasilkan kolom boolean; kurung siku ganda di luar menyuruh DataFrame mempertahankan baris yang bernilaiTrue. Dari 8 baris, 5 rumah lolos penyaringan. - Baris 12 (
(df["luas"] >= 75) & (df["jarak_pusat"] <= 5.0)): dua kondisi digabung dengan operator&, dan tiap kondisi wajib dibungkus tanda kurung karena prioritas operator. Hasilnya tabel Siti, Rudi, Rina, dan Agus — rumah besar yang sekaligus dekat pusat kota. - Baris 17 (
df["harga_per_m2"] = df["harga"] / df["luas"]): pembagian dua kolom dihitung baris per baris dan hasilnya disimpan sebagai kolom baru. Operasi kolom-ke-kolom seperti ini bekerja layaknya broadcasting pada NumPy. - Baris 22 (
df.groupby("kamar")["harga"].mean()):groupbymengelompokkan baris menurut nilai kolomkamar, memilih kolomhargapada tiap kelompok, lalu menghitung rata-ratanya. Hasilnya memperlihatkan tren yang masuk akal: harga rata-rata naik seiring jumlah kamar. - Baris 28-29 (
df[["luas", "kamar", "jarak_pusat"]].to_numpy()): pemilihan beberapa kolom sekaligus memakai list di dalam kurung siku, danto_numpy()mengubah tabel terpilih menjadi ndarray — inilah jembatan resmi menuju model. FiturXberbentuk(8, 3)dan targetyberbentuk(8,), persis konvensi baris-contoh yang kita pelajari di Chapter Array dengan NumPy.
Peta Operasi untuk Pipeline Data #
Tabel berikut merangkum operasi pandas yang paling sering muncul ketika menyiapkan data latih:
| Operasi | Contoh | Kegunaan dalam pipeline data |
|---|---|---|
pd.read_csv(...) | pd.read_csv("rumah.csv") | Memuat data mentah dari berkas |
df.head() / df.info() | df.head() | Pemeriksaan awal format dan kelengkapan |
df.describe() | df.describe() | Deteksi skala fitur dan pencilan |
df[kondisi] | df[df["harga"] > 400] | Menyaring baris tidak relevan |
df["baru"] = hitungan | df["harga"] / df["luas"] | Rekayasa fitur (feature engineering) |
df.groupby(...)[...].mean() | rata-rata per kelompok | Analisis tren dan validasi asumsi data |
df[["a", "b"]].to_numpy() | matriks fitur X | Menyerahkan data ke model |
Dokumentasi resmi pandas menyediakan pengantar 10 menit di pandas.pydata.org/docs/user_guide/10min
dan panduan agregasi groupby di pandas.pydata.org/docs/user_guide/groupby
.
Setelah data tersusun rapi, langkah berikutnya sebelum melatih model adalah melihat datanya: sebaran nilai, korelasi antar fitur, dan keberadaan pencilan paling mudah ditangkap lewat grafik. Chapter berikutnya memakai matplotlib untuk memvisualisasikan data tabular dan hasil klasifikasi.