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.

python
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:

text
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.000000

Mari kita telaah kode di atas baris per baris:

  1. Baris 5-10 (data_dict = {...} dan pd.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.
  2. Baris 15 (df = pd.read_csv("rumah.csv")): fungsi read_csv membaca berkas CSV di folder yang sama dengan skrip, memisahkan baris pertama sebagai nama kolom, dan menebak tipe data setiap kolom.
  3. Baris 18 (df.head()): method head() mengembalikan lima baris pertama — cukup untuk mengintip format data tanpa mencetak seluruh tabel. Ketika data berisi jutaan baris, print(df) mentah akan membanjiri terminal.
  4. Baris 22 (df.info()): ringkasan struktur mencetak jumlah baris, jumlah kolom, jumlah nilai terisi per kolom (non-null), dan tipe data. Kolom bertipe object adalah teks, sementara int64 dan float64 adalah angka. Di sinilah kita mendeteksi kolom yang nilainya tidak lengkap.
  5. 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.

python
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:

text
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]: 350

Mari kita telaah kode di atas baris per baris:

  1. Baris 7 (df[df["harga"] > 400]): ekspresi df["harga"] > 400 menghasilkan kolom boolean; kurung siku ganda di luar menyuruh DataFrame mempertahankan baris yang bernilai True. Dari 8 baris, 5 rumah lolos penyaringan.
  2. 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.
  3. 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.
  4. Baris 22 (df.groupby("kamar")["harga"].mean()): groupby mengelompokkan baris menurut nilai kolom kamar, memilih kolom harga pada tiap kelompok, lalu menghitung rata-ratanya. Hasilnya memperlihatkan tren yang masuk akal: harga rata-rata naik seiring jumlah kamar.
  5. Baris 28-29 (df[["luas", "kamar", "jarak_pusat"]].to_numpy()): pemilihan beberapa kolom sekaligus memakai list di dalam kurung siku, dan to_numpy() mengubah tabel terpilih menjadi ndarray — inilah jembatan resmi menuju model. Fitur X berbentuk (8, 3) dan target y berbentuk (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:

OperasiContohKegunaan 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"] = hitungandf["harga"] / df["luas"]Rekayasa fitur (feature engineering)
df.groupby(...)[...].mean()rata-rata per kelompokAnalisis tren dan validasi asumsi data
df[["a", "b"]].to_numpy()matriks fitur XMenyerahkan 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.