Menguasai inti Python data stack: NumPy untuk array & operasi vectorized, Pandas untuk DataFrame, dan kebiasaan menulis kode yang cepat serta idiomatis — lengkap dengan analisis data nyata menggunakan Pandas

Setelah di episode 3 kita membangun fondasi statistika, pada episode ini kita mempelajari bahasa kerjanya: Python data stack. NumPy dan Pandas adalah dua library yang akan menemani kalian di hampir setiap episode series ini — dan hampir semua library data science dibangun di atas keduanya.
Mengapa penting menguasai stack ini secara mendalam? Karena 80% waktu data science dihabiskan untuk memanipulasi data, bukan melatih model. Kalian yang menguasai NumPy dan Pandas akan bekerja berlipat kali lebih cepat — baik dalam kecepatan eksekusi (vectorized operations) maupun kecepatan menulis kode (idiomatis dan ringkas). Sebaliknya, yang memakai loop Python untuk semua hal akan frustrasi melihat proses lambat.
NumPy memperkenalkan ndarray — array N-dimensi dengan operasi element-wise yang berjalan di lapisan C. Ini perbedaan krusialnya: operasi vectorized dijalankan tanpa loop Python, sehingga jauh lebih cepat.
import numpy as np
import time
data = np.random.rand(1_000_000)
t0 = time.time()
result = [x * 2 + 1 for x in data] # loop Python
t_loop = time.time() - t0
t0 = time.time()
result = data * 2 + 1 # vectorized
t_vec = time.time() - t0
print(f"loop : {t_loop:.4f}s")
print(f"vectorized: {t_vec:.4f}s")Perbedaan kecepatan biasanya 10-100x — dan kodenya lebih pendek, lebih jelas, tanpa kesalahan indeks. Aturan emasnya: jika kalian menulis loop di atas data numerik, kemungkinan besar ada cara vectorized yang lebih baik.
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a.shape) # (2, 2)
print(a.T) # transpose
print(a @ a) # perkalian matriks
print(np.linalg.inv(a)) # invers matriks
arr = np.array([1, 2, 3, 10, 100])
print(np.log1p(arr)) # log transform yang aman untuk 0np.linalg, np.log1p, np.where, dan broadcasting adalah tool yang akan muncul terus di series ini — terutama di episode 5 (wrangling) dan 10 (feature engineering).
Pandas dibangun di atas NumPy dan memperkenalkan DataFrame — tabel 2D dengan index dan kolom bernama. Sebagian besar analisis data dimulai dan berakhir di sini.
import pandas as pd
df = pd.DataFrame({
"customer": ["A", "B", "C", "D", "E"],
"spend": [120, 340, 90, 500, 210],
"region": ["JKT", "BDG", "JKT", "SBY", "BDG"],
})
print(df.head(2))
print(df.describe())df.describe() memberi ringkasan statistik sekaligus — langkah pertama dari setiap EDA (diprediksi episode 6).
Tiga operasi yang akan dipakai terus-menerus:
df["spend"] # pilih kolom → Series
df[df["spend"] > 200] # filter baris
df.groupby("region")["spend"] # aggregasi per group
df.groupby("region")["spend"].agg(["mean", "sum", "count"])groupby adalah jantung analisis agregasi: pertanyaan seperti "rata-rata belanja per kota" atau "jumlah order per segmen" diekspresikan dalam satu baris.
Hampir semua operasi kolom bisa ditulis element-wise tanpa loop:
df["spend_plus_tax"] = df["spend"] * 1.11
df["segment"] = np.where(df["spend"] > 250, "high", "low")
df["log_spend"] = np.log1p(df["spend"])Perhatikan pola yang dihindari: for i, row in df.iterrows(). Itu lambat dan harus dihindari di dataset besar. Gunakan operasi kolom, apply secara bijak, atau groupby.
Sekarang kita gabungkan semuanya dalam analisis penjualan sederhana — dataset buatan tiga cabang toko:
import numpy as np
import pandas as pd
np.random.seed(7)
n = 2000
df = pd.DataFrame({
"date": pd.date_range("2026-01-01", periods=n, freq="D"),
"store": np.random.choice(["Jakarta", "Bandung", "Surabaya"], n),
"product": np.random.choice(["A", "B", "C"], n),
"qty": np.random.randint(1, 20, n),
"price": np.random.choice([50000, 75000, 100000], n),
})
df["revenue"] = df["qty"] * df["price"]
revenue_by_store = df.groupby("store")["revenue"].sum()
print(revenue_by_store.sort_values(ascending=False))
df["month"] = df["date"].dt.to_period("M")
monthly = df.groupby("month")["revenue"].sum()
print(monthly.head(3))
top_product = df.groupby("product")["qty"].sum().idxmax()
print("produk terlaris:", top_product)Analisis ini memakai hampir semua konsep episode ini: DataFrame, groupby, agg, kolom baru, dan agregasi waktu. Pola yang sama akan kalian pakai di episode 6-8 dengan dataset yang lebih rumit.
Tip
Biasakan menulis pipeline Pandas secara berantai dan berurutan, bukan dalam satu baris raksasa. Notebook yang bisa dibaca orang lain adalah bagian dari nilai seorang data scientist — episode 17 akan membahas komunikasi, dan itu dimulai dari kode yang rapi.
| Pitfall | Dampak | Solusi |
|---|---|---|
| Loop Python di atas data numerik | Lambat 10-100x | Gunakan vectorized operations |
iterrows() untuk semua transformasi | Sangat lambat di dataset besar | Operasi kolom / apply |
| Mengubah data "di tempat" saat eksplorasi | Kehilangan jejak, sulit debug | Buat kolom/salinan baru untuk setiap langkah |
Lupa axis di apply/dropna | Hasil salah tanpa error | Cek dokumentasi, gunakan nama eksplisit |
| Mengabaikan tipe data | Memori boros, agregasi salah | Gunakan dtypes, kategori untuk kolom kategorikal |
Inti yang harus dibawa pulang:
groupby + agg adalah jantung agregasi.Di episode 5 selanjutnya kita akan membahas data wrangling & cleaning — menangani missing values, outlier, dan feature engineering dasar, yang menentukan 80% keberhasilan model. Sampai jumpa di episode 5!