BelajarKoding Logobelajarkoding

Platform belajar web development Indonesia. Artikel, cheat sheets, roadmap, dan code challenges untuk developer Indonesia.

Navigasi

  • Artikel
  • Cheat Sheets
  • Roadmap
  • Challenges
  • Pricing
  • Search

Produk Lain

  • JagoHermes
  • KelasClaude
  • KilatKoding
  • BelajarVibeCoding
  • JualanKoding

Support

  • Privacy Policy
  • Terms of Service
  • Email

© 2026 BelajarKoding. All rights reserved.

Galih PratamaBagian dari ekosistem Galih Pratama
belajarkoding LogobyGalih Pratama
RoadmapArtikelCheat SheetsChallengesUpgrade
belajarkoding LogobyGalih Pratama
RoadmapArtikelCheat SheetsChallengesUpgrade
belajarkoding LogobyGalih Pratama
RoadmapArtikelCheat SheetsChallengesUpgrade

Daftar Isi

Setup kerja yang rapiPython inti untuk dataKoleksi dan unpackingComprehension dan generatorFungsi, type hint, dan errorFile CSV dan JSONNumPy: array numerikMembuat arrayIndexing, slicing, dan copyOperasi vektor dan broadcastingFilter dan indeks booleanRandom yang bisa diulangPandas: tabel berlabelMemilih, menyaring, dan membuat kolomMissing value dan duplikasiGroupby, pivot, dan mergeWaktu dan eksporStatistik deskriptif dan validasiVisualisasi cepatData kategorikalChecklist sebelum modelGlossary
PythonData ScienceNumPyPandas

Python untuk Data Science Cheat Sheet

Referensi cepat Python untuk data science. NumPy, Pandas, statistik, visualisasi, data cleaning, dan workflow analisis yang bisa langsung kamu pakai.

Python11 min read2.059 kata
Silakan login atau daftar untuk membaca cheat sheet ini.

Baca Cheat Sheet Lengkap

Login atau daftar akun gratis untuk membaca cheat sheet ini.

LoginDaftar Gratis
Share:

#Setup kerja yang rapi

Data science lebih enak dikerjakan dalam virtual environment terpisah. Simpan dependency proyek di file yang jelas supaya notebook atau script kamu bisa diputar ulang di mesin lain.

bash
python -m venv .venv
source .venv/bin/activate       # Linux atau macOS
# .venv\Scripts\Activate.ps1    # PowerShell Windows
 
python -m pip install --upgrade pip
python -m pip install numpy pandas matplotlib jupyter
python -m pip freeze > requirements.txt

Jalankan notebook dari direktori proyek, bukan dari folder acak. Path relatif akan lebih mudah dipahami ketika kamu membaca ulang pekerjaan ini dua minggu lagi.

bash
jupyter lab
# atau
jupyter notebook

Struktur minimal yang cukup sehat:

text
proyek-analisis/
├── data/
│   ├── raw/
│   └── processed/
├── notebooks/
├── src/
├── requirements.txt
└── README.md

data/raw jangan ditimpa. Hasil pembersihan masuk ke data/processed, lalu kode transformasinya masuk ke src. Notebook cocok untuk eksplorasi dan penjelasan, sedangkan proses yang dipakai berulang sebaiknya pindah ke modul Python biasa.

#Python inti untuk data

#Koleksi dan unpacking

list menjaga urutan dan bisa diubah. tuple juga berurutan, tetapi tidak bisa diubah. dict menyimpan pasangan key dan value. set menyimpan nilai unik tanpa jaminan urutan.

python
nilai = [78, 92, 84, 92]
profil = {"nama": "Rani", "kota": "Bandung", "aktif": True}
kategori =





Pakai .get() saat key mungkin tidak ada. Akses data["key"] langsung akan memunculkan KeyError bila key tersebut tidak tersedia.

python
umur = profil.get("umur")
negara = profil.get("negara", "Indonesia")

#Comprehension dan generator

List comprehension pas untuk transformasi kecil yang tetap mudah dibaca. Kalau datanya besar atau hanya akan dibaca sekali, generator expression lebih hemat memori karena nilainya dihasilkan saat diminta.

python
angka = [1, 2, 3, 4, 5, 6]
kuadrat_genap = [x ** 2 for x in angka if x % 2 == 0]



Jangan memadatkan logika bisnis yang panjang ke satu comprehension. Loop biasa lebih gampang diuji dan di-debug.

#Fungsi, type hint, dan error

Type hint tidak memaksa tipe saat runtime, tetapi editor dan type checker bisa menangkap banyak kesalahan sebelum program dijalankan. Pakai raise untuk data yang tidak masuk akal, bukan membiarkan hasil salah ikut mengalir ke tahap berikutnya.

python
from collections.abc import Sequence
 
def rata_rata(data: Sequence[float]) -> float:
    if not data:
        raise ValueError("data tidak boleh kosong")
    return sum(data) / len(data)




Jangan menulis except Exception: pass. Itu menyembunyikan sumber masalah. Tangkap error yang kamu harapkan dan biarkan error lain terlihat saat pengembangan.

#File CSV dan JSON

Modul standar csv dan json cukup untuk banyak kasus kecil. Gunakan encoding="utf-8" saat bekerja dengan teks Indonesia agar karakter seperti é atau nama lokasi tidak rusak.

python
import csv
import json
from pathlib import Path
 
path_csv = Path("data/raw/penjualan.csv")
with path_csv.open("r", encoding="utf-8", newline="") 




csv.DictReader mengembalikan string. Ubah kolom numerik secara eksplisit. Jangan berharap Python menebak bahwa "125000" adalah integer.

python
for baris in baris:
    baris["harga"] = int(baris["harga"])
    baris["kuantitas"] = int(baris["kuantitas"])

#NumPy: array numerik

NumPy memakai ndarray, array N dimensi dengan tipe elemen yang umumnya sama. Untuk hitungan numerik berukuran besar, pendekatan ini lebih pas daripada loop Python per elemen. Konvensi import yang dipakai luas adalah import numpy as np.

python
import numpy as np
 
suhu = np.array([29.5, 30.1, 31.2, 30.8], dtype=np.float64)
matriks = np.array([[1, 2, 3], [4




#Membuat array

np.empty() tidak mengisi dengan nol. Isinya berasal dari memori yang belum diinisialisasi, jadi isi array itu harus kamu tulis sebelum dibaca.

python
nol = np.zeros((2, 3), dtype=np.float64)
satu = np.ones(4, dtype=np.int64)
rentang = np.arange(0, 10, 2)
titik =



Pilih np.arange() ketika kamu tahu langkahnya. Pilih np.linspace() ketika kamu perlu jumlah titik tertentu, misalnya 100 titik untuk garis plot antara dua batas.

#Indexing, slicing, dan copy

Index NumPy dimulai dari nol. Slicing array lazimnya menghasilkan view yang berbagi data dengan array asal. Ini beda dari slice pada list Python, yang membuat list baru.

python
nilai = np.array([70, 75, 80, 85, 90])
bagian = nilai[1:4]
bagian[0] = 999
print(nilai)  # [ 70 999  80  85  90]
 


Pakai .copy() ketika hasil slice akan kamu ubah secara mandiri. Bug view sering bikin data sumber ikut berubah tanpa sengaja.

#Operasi vektor dan broadcasting

Operasi NumPy berjalan per elemen. Hindari loop Python untuk aritmetika sederhana pada seluruh array.

python
harga = np.array([12000, 25000, 18000], dtype=float)
kuantitas = np.array([2, 1, 3])
subtotal = harga * kuantitas
pajak =


Broadcasting membandingkan shape dari kanan ke kiri. Dimensi bernilai 1 dapat diperluas. Contoh berikut menambahkan rata rata setiap kolom ke data yang sudah dikurangi rata ratanya.

python
X = np.array([[10.0, 100.0], [20.0, 200.0], [30.0, 300.0]])
rata = X.mean(axis=0)
X_tengah = X - rata
 
print(rata)        



axis=0 berarti agregasi sepanjang baris dan menyisakan satu nilai per kolom. axis=1 berarti agregasi sepanjang kolom dan menyisakan satu nilai per baris. Ini sumber salah hitung yang cukup sering. Cek shape sebelum lanjut.

#Filter dan indeks boolean

Boolean mask memberi cara aman untuk menyaring nilai tanpa loop eksplisit.

python
nilai = np.array([55, 72, 88, np.nan, 91])
valid = ~np.isnan(nilai)
lulus = nilai[valid & (nilai >= 70)]
 
print(lulus)  # [72. 88. 91.]

Untuk membandingkan array floating point, pakai np.isclose() atau np.allclose(). Perhitungan biner tidak selalu membuat 0.1 + 0.2 == 0.3 tepat bernilai True.

python
hasil = 0.1 + 0.2
print(np.isclose(hasil, 0.3))  # True

#Random yang bisa diulang

Gunakan np.random.default_rng(seed) alih alih mengandalkan generator global. Seed membuat eksperimen kamu dapat diulang dengan angka acak yang sama.

python
rng = np.random.default_rng(42)
sampel = rng.normal(loc=0.0, scale=1.0, size=5)
indeks = rng.choice(10, size=3, replace


normal() menghasilkan sampel dari distribusi normal. choice(..., replace=False) memilih tanpa pengulangan dan akan gagal bila ukuran sampel lebih besar dari populasi.

#Pandas: tabel berlabel

Pandas memakai Series untuk satu kolom berlabel dan DataFrame untuk tabel. Mulai dengan inspeksi, lalu ubah data sedikit demi sedikit. Membaca seluruh kolom dan langsung membuat model biasanya berakhir dengan kejutan di tengah proses.

python
import pandas as pd
 
penjualan = pd.read_csv(
    "data/raw/penjualan.csv",
    parse_dates=["tanggal"],
    dtype={"produk": "string", "kota": "string"},
)




#Memilih, menyaring, dan membuat kolom

.loc memilih berdasarkan label dan kondisi boolean. .iloc memilih berdasarkan posisi integer. Saat mengubah subset, pakai .loc supaya maksud kode jelas dan kamu tidak terkena SettingWithCopyWarning.

python
kolom = penjualan[["tanggal", "produk", "harga", "kuantitas"]].copy()
 
mask = (kolom["harga"] > 0) & (kolom["kuantitas"] > 0)
kolom 



Hindari inplace=True sebagai kebiasaan. Assignment eksplisit lebih mudah dibaca dan tidak bergantung pada perilaku method tertentu.

#Missing value dan duplikasi

Anggap missing value sebagai keputusan bisnis, bukan sekadar hal yang harus dihapus. Kolom harga hilang mungkin perlu dibuang. Kolom kota hilang mungkin perlu diberi label "Tidak diketahui" agar total transaksi tetap utuh.

python
bersih = penjualan.copy()
bersih = bersih.drop_duplicates()
bersih = bersih.dropna(subset=["harga", "kuantitas"])
bersih.loc[:, "kota"] = bersih["kota"].fillna("Tidak diketahui")
 
bersih.loc[:, 

errors="coerce" mengubah nilai yang gagal diparse menjadi missing value. Hitung jumlahnya sebelum membuang baris agar kamu tahu apakah file sumber punya format yang kacau.

#Groupby, pivot, dan merge

python
ringkasan_kota = (
    bersih.assign(total=bersih["harga"] * bersih["kuantitas"])
    .groupby("kota", as_index=False)
    .agg(
        transaksi=(













Sebelum merge, cek key unik di kedua tabel. Merge many to many yang tidak disengaja dapat melipatgandakan jumlah baris dan membuat omzet tampak naik tanpa alasan.

python
produk = pd.read_csv("data/raw/produk.csv")
assert produk["produk_id"].is_unique
 
lengkap = bersih.merge(
    produk[["produk_id", "kategori"]],
    on="produk_id",
    how="left",
    validate

Parameter validate="many_to_one" membuat Pandas menghentikan proses bila tabel kanan ternyata punya key ganda.

#Waktu dan ekspor

python
lengkap.loc[:, "bulan"] = lengkap["tanggal"].dt.to_period("M")
bulanan = lengkap.groupby("bulan", as_index=False)["total"].sum()
 
bulanan.to_csv("data/processed/omzet_bulanan.csv", index=False)

Parquet menyimpan tipe data dan biasanya lebih efisien untuk tabel analitik. Kamu perlu engine seperti pyarrow atau fastparquet untuk menulis file Parquet.

#Statistik deskriptif dan validasi

Mean mudah tertarik outlier. Median lebih tahan terhadap satu transaksi yang nilainya jauh di atas nilai umum. Python menyediakan modul statistics, tetapi untuk array dan tabel gunakan fungsi NumPy atau Pandas agar data tidak perlu bolak balik bentuk.

python
import numpy as np
 
x = np.array([100_000, 120_000, 115_000, 130_000, 5_000_000])
print(np.mean(x))
print(np.median(x))
print(np.quantile(x, [0.25, 0.5, 0.75

ddof=1 memberi standar deviasi sampel. Untuk seluruh populasi yang benar benar lengkap, gunakan ddof=0, nilai default NumPy. Jangan mencampur keduanya dalam satu laporan.

Korelasi tidak membuktikan sebab akibat. Cek juga ukuran sampel, outlier, dan apakah dua kolom punya hubungan logis sebelum menulis narasi dari angka tersebut.

python
numerik = lengkap.select_dtypes(include="number")
korelasi = numerik.corr(numeric_only=True)
print(korelasi.round(2))

#Visualisasi cepat

Plot yang baik menjawab satu pertanyaan. Tambahkan judul, label sumbu, dan satuan. Jangan gunakan grafik pai untuk puluhan kategori karena pembaca akan sulit membandingkan irisan kecil.

python
import matplotlib.pyplot as plt
 
urut = ringkasan_kota.sort_values("omzet")
fig, ax = plt.subplots(figsize=(8, 4))
ax.barh(urut["kota"], urut["omzet"], color=





Untuk melihat hubungan dua variabel dan outlier, pakai scatter plot.

python
fig, ax = plt.subplots()
ax.scatter(lengkap["kuantitas"], lengkap["total"], alpha=0.5)
ax.set_xlabel("Kuantitas")
ax.set_ylabel("Total transaksi")
ax.set_title("Kuantitas dan total transaksi")
plt.show()

#Data kategorikal

Kolom teks yang berisi kategori tidak bisa langsung masuk ke sebagian besar model numerik. Dua cara yang paling sering dipakai adalah pemetaan ordinal dan one hot encoding.

python
level = pd.Categorical(
    bersih["level"],
    categories=["pemula", "menengah", "lanjutan"],
    ordered=True,
)
kode_level = level.codes
 
one_hot = pd.get_dummies(



pd.Categorical berguna saat kategori punya urutan, misalnya level pelanggan. pd.get_dummies berguna untuk kategori tanpa urutan, misalnya nama kota. Jangan mengkode level pemula jadi 1, menengah jadi 2, dan lanjutan jadi 3 hanya karena terlihat rapi. Kalau urutannya memang ada arti, kodekan secara eksplisit. Kalau tidak, biarkan one hot menangani kategori itu.

Kategori yang jarang muncul membuat jumlah kolom one hot membengkak. Kumpulkan nilai yang muncul sedikit ke dalam label "Lainnya" sebelum encoding.

python
hitungan = bersih["kota"].value_counts()
sering = hitungan[hitungan >= 5].index
bersih.loc[:, "kota_ringkas"] = bersih["kota"].where(
    bersih["kota"].isin(sering),
    "Lainnya",
)

where mengganti nilai yang tidak memenuhi syarat dengan nilai pengganti. Baca dokumentasinya dengan teliti karena urutan argumennya bisa membingungkan saat pertama kali dipakai.

#Checklist sebelum model

  • Pastikan target tidak ikut masuk fitur. Ini disebut data leakage.
  • Pisahkan data train dan test sebelum menghitung scaling, imputasi, atau encoding.
  • Cocokkan unit. Harga rupiah dan jumlah unit jangan digabung tanpa scaling jika algoritmenya sensitif terhadap skala.
  • Simpan seed, versi package, dan aturan pembersihan data.
  • Buat assertion untuk asumsi penting, misalnya harga tidak negatif dan key dimensi unik.
python
assert lengkap["harga"].ge(0).all()
assert lengkap["kuantitas"].ge(0).all()
assert lengkap["tanggal"].notna().all()

Data science yang bisa dipercaya biasanya lahir dari pemeriksaan kecil seperti ini, bukan dari notebook penuh sel yang tidak pernah dijalankan ulang.

#Glossary

  • Array: blok data numerik berukuran tetap, biasanya dengan satu tipe elemen.
  • Broadcasting: aturan NumPy untuk menjalankan operasi pada array dengan shape yang kompatibel.
  • DataFrame: tabel dua dimensi Pandas dengan nama kolom dan index baris.
  • Data leakage: informasi dari target atau masa depan yang masuk ke fitur saat pelatihan model.
  • dtype: tipe data elemen dalam array atau kolom, misalnya float64, int64, atau string.
  • Imputasi: pengisian missing value menurut aturan yang dipilih.
  • Index boolean: array True dan False yang dipakai untuk memilih elemen atau baris.
  • Mean: jumlah nilai dibagi banyaknya nilai.
  • Median: nilai tengah setelah data diurutkan.
  • Outlier: pengamatan yang jauh dari sebagian besar data.
  • Seed: nilai awal generator acak agar hasil percobaan bisa diulang.
  • Series: satu dimensi data berlabel di Pandas.
  • Shape: ukuran tiap dimensi array, misalnya (3, 2) untuk tiga baris dan dua kolom.
  • View: objek array yang berbagi memori dengan array asal.
{
"buku"
,
"kursus"
,
"buku"
}
pertama, *tengah, terakhir = nilai
print(pertama) # 78
print(tengah) # [92, 84]
print(terakhir) # 92
print(kategori) # {'buku', 'kursus'}, urutan dapat berbeda
jumlah = sum(x ** 2 for x in angka if x % 2 == 0)
print(kuadrat_genap) # [4, 16, 36]
print(jumlah) # 56
try:
print(rata_rata([72.0, 88.0, 91.0]))
except ValueError as error:
print(f"Input salah: {error}")
as
file
:
pembaca = csv.DictReader(file)
baris = list(pembaca)
with Path("data/processed/ringkasan.json").open("w", encoding="utf-8") as file:
json.dump({"jumlah_baris": len(baris)}, file, ensure_ascii=False, indent=2)
,
5
,
6
]])
print(suhu.ndim) # 1
print(matriks.shape) # (2, 3)
print(matriks.size) # 6
print(matriks.dtype) # tipe integer, detailnya bergantung platform
np.linspace(
0.0
,
1.0
,
num
=
5
)
identitas = np.eye(3)
print(rentang) # [0 2 4 6 8]
print(titik) # [0. 0.25 0.5 0.75 1. ]
salinan
=
nilai[
1
:
4
].copy()
salinan[0] = 50
print(nilai) # tetap [ 70 999 80 85 90]
subtotal
*
0.11
print(subtotal) # [24000. 25000. 54000.]
print(pajak) # [2640. 2750. 5940.]
# [ 20. 200.]
print(X_tengah)
# [[-10. -100.]
# [ 0. 0.]
# [ 10. 100.]]
=
False
)
print(sampel)
print(indeks)
print(penjualan.shape)
print(penjualan.head())
print(penjualan.dtypes)
print(penjualan.isna().sum())
=
kolom.loc[mask].copy()
kolom.loc[:, "total"] = kolom["harga"] * kolom["kuantitas"]
jakarta = kolom.loc[penjualan["kota"].eq("Jakarta")]
baris_pertama = kolom.iloc[0]
"harga"
]
=
pd.to_numeric(bersih[
"harga"
],
errors
=
"coerce"
)
bersih = bersih.dropna(subset=["harga"])
"total"
,
"size"
),
omzet=("total", "sum"),
rata_total=("total", "mean"),
)
.sort_values("omzet", ascending=False)
)
pivot = pd.pivot_table(
bersih.assign(total=bersih["harga"] * bersih["kuantitas"]),
index="kota",
columns="produk",
values="total",
aggfunc="sum",
fill_value=0,
)
=
"many_to_one"
,
)
bulanan.to_parquet("data/processed/omzet_bulanan.parquet", index=False)
]))
print(np.std(x, ddof=1))
"#2563eb"
)
ax.set_title("Omzet per kota")
ax.set_xlabel("Rupiah")
ax.set_ylabel("Kota")
ax.ticklabel_format(style="plain", axis="x")
fig.tight_layout()
plt.show()
bersih["kota"],
prefix="kota",
dtype=int,
)