1. Review Dasar Python untuk Data Science
Data Science adalah bidang interdisipliner yang menggunakan teknik ilmiah, algoritma, dan sistem untuk mengekstraksi pengetahuan dan insight dari data. Python telah menjadi bahasa pemrograman paling populer untuk Data Science berkat ekosistem library yang sangat kaya, sintaks yang mudah dibaca, dan komunitas yang besar.
Sebelum masuk ke library Data Science, mari kita review beberapa konsep dasar Python yang sangat sering digunakan dalam analisis data. Jika Anda sudah familiar dengan Python, silakan lompat ke bagian selanjutnya.
List, Dictionary & List Comprehension
Dua tipe data yang paling sering digunakan dalam Data Science adalah list (untuk menyimpan sekumpulan data) dan dictionary (untuk data berformat key-value).
# List — kumpulan data berurutan
suhu_harian = [28.5, 31.2, 29.8, 33.1, 27.6, 30.0, 32.5]
print(f"Suhu rata-rata: {sum(suhu_harian) / len(suhu_harian):.1f}°C")
print(f"Suhu tertinggi: {max(suhu_harian)}°C")
print(f"Suhu terendah: {min(suhu_harian)}°C")
# Slicing — mengambil subset data
tiga_hari_pertama = suhu_harian[:3] # [28.5, 31.2, 29.8]
tiga_hari_terakhir = suhu_harian[-3:] # [30.0, 32.5] → tidak benar, 3 terakhir
# Dictionary — data berformat key-value
mahasiswa = {
"nama": "Budi Santoso",
"nim": "2024001",
"ipk": 3.75,
"semester": 4,
"mata_kuliah": ["Algoritma", "Statistika", "Basis Data"]
}
print(f"Nama: {mahasiswa['nama']}")
print(f"IPK: {mahasiswa['ipk']}")
print(f"Jumlah MK: {len(mahasiswa['mata_kuliah'])}")
# List Comprehension — membuat list baru secara ringkas
suhu_celsius = [28.5, 31.2, 29.8, 33.1, 27.6]
# Konversi ke Fahrenheit
suhu_fahrenheit = [c * 9/5 + 32 for c in suhu_celsius]
print(suhu_fahrenheit) # [83.3, 88.16, 85.64, 91.58, 81.68]
# Filter: ambil suhu di atas 30°C
suhu_panas = [c for c in suhu_celsius if c > 30]
print(suhu_panas) # [31.2, 33.1]
# Dictionary Comprehension
suhu_dict = {f"Hari {i+1}": s for i, s in enumerate(suhu_celsius)}
print(suhu_dict)
# {'Hari 1': 28.5, 'Hari 2': 31.2, 'Hari 3': 29.8, ...}
Function & Lambda
# Fungsi biasa
def hitung_statistik(data):
"""Menghitung mean, min, max dari data numerik."""
n = len(data)
mean = sum(data) / n
return {
"count": n,
"mean": round(mean, 2),
"min": min(data),
"max": max(data),
"range": max(data) - min(data)
}
nilai_ujian = [85, 92, 78, 95, 88, 76, 90, 83]
stats = hitung_statistik(nilai_ujian)
print(stats)
# {'count': 8, 'mean': 85.88, 'min': 76, 'max': 95, 'range': 19}
# Lambda — fungsi satu baris yang ringkas
kali_dua = lambda x: x * 2
print(kali_dua(5)) # 10
# Lambda sangat berguna dengan fungsi sorting
data_produk = [
{"nama": "Laptop", "harga": 12000000},
{"nama": "Mouse", "harga": 150000},
{"nama": "Keyboard", "harga": 850000},
{"nama": "Monitor", "harga": 4500000},
]
# Sort berdasarkan harga (termurah ke termahal)
data_sorted = sorted(data_produk, key=lambda x: x["harga"])
for p in data_sorted:
print(f" {p['nama']}: Rp {p['harga']:,}")
File I/O & CSV Parsing
import csv
# Membaca file CSV dengan modul bawaan Python
with open('data_penjualan.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
data = list(reader)
print(f"Jumlah baris: {len(data)}")
print(f"Kolom: {list(data[0].keys())}")
# Menghitung total penjualan
total = sum(float(row['harga']) * int(row['jumlah']) for row in data)
print(f"Total penjualan: Rp {total:,.0f}")
2. Jupyter Notebook
Jupyter Notebook adalah environment interaktif yang sangat populer di kalangan Data Scientist. Jupyter memungkinkan Anda menulis dan menjalankan kode Python dalam sel yang terpisah, melihat hasil secara langsung, dan mendokumentasikan analisis dengan teks (Markdown) — semuanya dalam satu dokumen interaktif.
Mengapa Jupyter Notebook?
| Keunggulan | Penjelasan |
|---|---|
| Interaktif | Jalankan kode per-sel dan lihat hasil langsung tanpa menjalankan seluruh script |
| Dokumentasi Hidup | Gabungkan kode, output, grafik, dan catatan dalam satu dokumen |
| Visualisasi Inline | Chart dan grafik muncul langsung di dalam notebook |
| Eksplorasi Data | Sangat cocok untuk analisis eksploratif — coba, lihat, modifikasi, ulangi |
| Sharing Mudah | Bisa di-share sebagai .ipynb atau di-export ke HTML/PDF |
| Kompatibilitas | Bisa menjalankan Python, R, Julia, dan bahasa lainnya |
Instalasi Jupyter
# Buat virtual environment khusus Data Science python3 -m venv ds-env source ds-env/bin/activate # Linux/Mac # ds-env\Scripts\activate # Windows # Instalasi Jupyter dan library Data Science pip install jupyter numpy pandas matplotlib seaborn scikit-learn # Jalankan Jupyter Notebook jupyter notebook # Alternatif: JupyterLab (interface lebih modern) pip install jupyterlab jupyter lab
Shortcut Jupyter yang Penting
| Shortcut | Fungsi | Mode |
|---|---|---|
Shift + Enter | Jalankan sel saat ini & pindah ke sel berikutnya | Command & Edit |
Ctrl + Enter | Jalankan sel saat ini & tetap di sel yang sama | Command & Edit |
A | Tambah sel baru di atas | Command |
B | Tambah sel baru di bawah | Command |
DD | Hapus sel saat ini | Command |
M | Ubah sel ke mode Markdown | Command |
Y | Ubah sel ke mode Code | Command |
Esc | Kembali ke Command mode | Edit |
Enter | Masuk ke Edit mode | Command |
Ctrl + Shift + P | Buka Command Palette | Command |
Jupyter memiliki dua mode: Command mode (sel berwarna biru, untuk navigasi dan manipulasi sel) dan Edit mode (sel berwarna hijau, untuk menulis kode). Tekan Esc untuk masuk Command mode dan Enter untuk masuk Edit mode.
3. NumPy: Array & Komputasi Numerik
NumPy (Numerical Python) adalah library fondasi untuk komputasi numerik di Python. NumPy menyediakan struktur data ndarray (N-dimensional array) yang jauh lebih cepat dan efisien daripada list Python biasa. Hampir semua library Data Science (Pandas, Scikit-learn, Matplotlib) dibangun di atas NumPy.
Mengapa NumPy?
| Aspek | List Python | NumPy Array |
|---|---|---|
| Kecepatan | 🟡 Lambat (loop Python) | 🟢 Sangat cepat (C backend) |
| Memori | 🔴 Boros (pointer per elemen) | 🟢 Efisien (blok memori kontigu) |
| Operasi Vektor | ❌ Perlu loop manual | ✅ Operasi langsung ke seluruh array |
| Multi-dimensi | ❌ Nested list (ribet) | ✅ N-dimensional array natif |
| Fungsi Matematika | ⚠️ Terbatas | ✅ Ribuan fungsi matematika |
Membuat NumPy Array
import numpy as np
# Membuat array dari list Python
arr1d = np.array([1, 2, 3, 4, 5])
print(f"1D Array: {arr1d}")
print(f"Tipe: {type(arr1d)}") # <class 'numpy.ndarray'>
print(f"Shape: {arr1d.shape}") # (5,)
print(f"Dimensi: {arr1d.ndim}") # 1
print(f"Tipe data: {arr1d.dtype}") # int64
# Membuat 2D array (matrix)
arr2d = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
print(f"2D Array:\n{arr2d}")
print(f"Shape: {arr2d.shape}") # (3, 3) — 3 baris, 3 kolom
# Array khusus
zeros = np.zeros((3, 4)) # 3x4 matrix berisi 0
ones = np.ones((2, 3)) # 2x3 matrix berisi 1
eye = np.eye(4) # 4x4 identity matrix
range_arr = np.arange(0, 20, 2) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
linspace = np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1.0]
# Array random
np.random.seed(42) # Untuk reproducibility
random_uniform = np.random.rand(3, 3) # Uniform [0, 1)
random_normal = np.random.randn(3, 3) # Normal (mean=0, std=1)
random_int = np.random.randint(1, 100, size=5) # Random int [1, 100)
print(f"Random integers: {random_int}")
Operasi NumPy
import numpy as np
a = np.array([10, 20, 30, 40, 50])
b = np.array([5, 4, 3, 2, 1])
# Operasi element-wise (tanpa loop!)
print(f"Penjumlahan: {a + b}") # [15 24 33 42 51]
print(f"Pengurangan: {a - b}") # [ 5 16 27 38 49]
print(f"Perkalian: {a * b}") # [50 80 90 80 50]
print(f"Pembagian: {a / b}") # [2. 5. 10. 20. 50.]
print(f"Pangkat: {a ** 2}") # [100 400 900 1600 2500]
print(f"Akar kuadrat: {np.sqrt(a)}") # [3.16 4.47 5.48 6.32 7.07]
# Statistik
data = np.random.normal(loc=170, scale=10, size=1000) # 1000 data tinggi badan
print(f"\nStatistik Tinggi Badan:")
print(f" Mean: {np.mean(data):.2f} cm")
print(f" Median: {np.median(data):.2f} cm")
print(f" Std: {np.std(data):.2f} cm")
print(f" Min: {np.min(data):.2f} cm")
print(f" Max: {np.max(data):.2f} cm")
print(f" P25: {np.percentile(data, 25):.2f} cm")
print(f" P75: {np.percentile(data, 75):.2f} cm")
# Indexing & Slicing (mirip list tapi lebih powerful)
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"Baris 0, Kolom 1: {matrix[0, 1]}") # 2
print(f"Baris terakhir: {matrix[-1, :]}") # [7 8 9]
print(f"Kolom tengah: {matrix[:, 1]}") # [2 5 8]
# Boolean indexing (filter data)
tinggi = np.array([165, 180, 155, 190, 172, 168, 175])
mask = tinggi > 170 # [False, True, False, True, True, False, True]
tinggi_tinggi = tinggi[mask]
print(f"Tinggi > 170: {tinggi_tinggi}") # [180 190 172 175]
# Reshape
arr = np.arange(12)
matrix_3x4 = arr.reshape(3, 4)
print(f"3x4 Matrix:\n{matrix_3x4}")
4. Pandas: DataFrame & Data Manipulasi
Pandas adalah library paling penting dalam Data Science dengan Python. Pandas menyediakan dua struktur data utama: Series (1D) dan DataFrame (2D) — yang memudahkan import, manipulasi, analisis, dan export data dari berbagai format (CSV, Excel, SQL, JSON, dll.).
Jika NumPy adalah mesin komputasi numerik, maka Pandas adalah Swiss Army Knife untuk analisis data tabular. Hampir semua workflow Data Science dimulai dan berakhir dengan Pandas.
Series vs DataFrame
| Struktur | Dimensi | Analogi | Contoh |
|---|---|---|---|
| Series | 1D (satu kolom) | Excel: satu kolom | Daftar suhu harian |
| DataFrame | 2D (tabel) | Excel: satu sheet | Tabel penjualan (kolom: tanggal, produk, harga) |
Membuat & Membaca Data
import pandas as pd
# Membuat DataFrame dari dictionary
data_penjualan = {
'tanggal': ['2026-01-01', '2026-01-01', '2026-01-02', '2026-01-02',
'2026-01-03', '2026-01-03', '2026-01-04', '2026-01-04'],
'produk': ['Laptop', 'Mouse', 'Laptop', 'Keyboard',
'Mouse', 'Monitor', 'Laptop', 'Keyboard'],
'harga': [12000000, 150000, 12000000, 850000,
150000, 4500000, 12000000, 850000],
'jumlah': [2, 10, 1, 5, 15, 3, 4, 8]
}
df = pd.DataFrame(data_penjualan)
print(df)
# tanggal produk harga jumlah
# 0 2026-01-01 Laptop 12000000 2
# 1 2026-01-01 Mouse 150000 10
# 2 2026-01-02 Laptop 12000000 1
# ...
# Membaca file CSV (paling umum)
# df = pd.read_csv('data.csv')
# df = pd.read_excel('data.xlsx')
# df = pd.read_json('data.json')
# Info dasar DataFrame
print(f"Shape: {df.shape}") # (8, 4) — 8 baris, 4 kolom
print(f"Kolom: {list(df.columns)}") # ['tanggal', 'produk', 'harga', 'jumlah']
print(f"\nInfo:")
print(df.info())
print(f"\nStatistik Deskriptif:")
print(df.describe())
Seleksi & Filtering
# Seleksi kolom
produk = df['produk'] # Series
subset = df[['produk', 'harga']] # DataFrame (2 kolom)
# Seleksi baris dengan loc (berdasarkan label) dan iloc (berdasarkan index)
baris_0 = df.iloc[0] # Baris pertama
baris_2_4 = df.iloc[2:5] # Baris index 2, 3, 4
# Filtering — sangat powerful!
laptop_only = df[df['produk'] == 'Laptop']
print(f"Laptop rows:\n{laptop_only}")
# Multiple filter (& = AND, | = OR)
filter_laptop_mahal = df[(df['produk'] == 'Laptop') & (df['harga'] > 10000000)]
filter_mouse_atau_keyboard = df[df['produk'].isin(['Mouse', 'Keyboard'])]
# Filter dengan string contains
nama_produk_nama_L = df[df['produk'].str.startswith('L')]
# Sorting
df_sorted = df.sort_values('harga', ascending=False)
print(f"\nDiurutkan dari termahal:\n{df_sorted.head()}")
Grouping & Aggregasi
# Tambah kolom total_transaksi
df['total_transaksi'] = df['harga'] * df['jumlah']
# Group by produk
per_produk = df.groupby('produk').agg({
'jumlah': 'sum', # Total jumlah terjual
'total_transaksi': 'sum', # Total pendapatan
'harga': 'mean' # Rata-rata harga
}).round(0)
print("Ringkasan per Produk:")
print(per_produk.sort_values('total_transaksi', ascending=False))
# Group by tanggal
per_tanggal = df.groupby('tanggal')['total_transaksi'].sum()
print(f"\nPendapatan per Tanggal:")
print(per_tanggal)
# Pivot table
pivot = df.pivot_table(
values='jumlah',
index='tanggal',
columns='produk',
aggfunc='sum',
fill_value=0
)
print(f"\nPivot Table:")
print(pivot)
5. Data Cleaning & Preprocessing
Dalam dunia nyata, data hampir tidak pernah bersih. Data scientist menghabiskan sekitar 60-80% waktu mereka untuk membersihkan dan mempersiapkan data sebelum bisa dianalisis. Proses ini disebut Data Cleaning atau Data Preprocessing.
Masalah Umum dalam Data
| Masalah | Contoh | Penanganan |
|---|---|---|
| Missing Values (NaN) | Kolom usia berisi kosong | Isi dengan mean/median/mode atau hapus baris |
| Duplikasi | Ada baris yang tercatat 2x | Hapus duplikat |
| Tipe Data Salah | Tanggal bertipe string, bukan datetime | Konversi tipe data |
| Inkonsistensi | "Jakarta", "jakarta", "JKT" | Standardisasi nilai |
| Outlier | Usia = 999 tahun | Detect dan hapus/klip outlier |
| Format Berbeda | Harga: "Rp 1.000.000" vs 1000000 | Parsing dan normalisasi |
Menangani Missing Values
import pandas as pd
import numpy as np
# Contoh DataFrame dengan missing values
df = pd.DataFrame({
'nama': ['Alice', 'Budi', 'Charlie', 'Dewi', 'Eka', 'Farhan'],
'usia': [25, np.nan, 30, 22, np.nan, 28],
'kota': ['Jakarta', 'Bandung', np.nan, 'Surabaya', 'Bandung', np.nan],
'gaji': [8000000, 6500000, 9000000, np.nan, 7000000, 7500000]
})
print("Data awal:")
print(df)
print(f"\nMissing values per kolom:")
print(df.isnull().sum())
# nama 0
# usia 2
# kota 2
# gaji 1
# Strategi 1: Hapus baris yang memiliki missing values
df_dropped = df.dropna()
print(f"\nSetelah dropna (baris lengkap): {len(df_dropped)}")
# Strategi 2: Isi missing values
df_filled = df.copy()
df_filled['usia'] = df_filled['usia'].fillna(df_filled['usia'].median())
df_filled['gaji'] = df_filled['gaji'].fillna(df_filled['gaji'].mean())
df_filled['kota'] = df_filled['kota'].fillna('Tidak Diketahui')
print(f"\nSetelah fillna:")
print(df_filled)
# Strategi 3: Forward fill (untuk data time series)
# df['nilai'] = df['nilai'].ffill() # Isi dengan nilai sebelumnya
# Strategi 4: Interpolate (untuk data numerik berurutan)
# df['suhu'] = df['suhu'].interpolate(method='linear')
Menangani Duplikasi & Tipe Data
# Deteksi duplikasi
df_dup = pd.DataFrame({
'nama': ['Alice', 'Budi', 'Alice', 'Dewi', 'Budi'],
'kota': ['Jakarta', 'Bandung', 'Jakarta', 'Surabaya', 'Bandung']
})
print(f"Jumlah duplikat: {df_dup.duplicated().sum()}")
# Hapus duplikasi
df_clean = df_dup.drop_duplicates()
print(f"Setelah hapus duplikat: {len(df_clean)} baris")
# Konversi tipe data
df_tipe = pd.DataFrame({
'tanggal': ['2026-01-15', '2026-02-20', '2026-03-10'],
'harga_str': ['1500000', '2500000', '3500000'],
'diskon_str': ['10%', '15%', '20%']
})
# Konversi string ke datetime
df_tipe['tanggal'] = pd.to_datetime(df_tipe['tanggal'])
print(f"Tipe tanggal: {df_tipe['tanggal'].dtype}") # datetime64[ns]
# Konversi string ke numeric
df_tipe['harga'] = pd.to_numeric(df_tipe['harga_str'])
# Konversi persen string ke float
df_tipe['diskon'] = df_tipe['diskon_str'].str.replace('%', '').astype(float) / 100
print(df_tipe)
# Ekstrak komponen tanggal
df_tipe['bulan'] = df_tipe['tanggal'].dt.month
df_tipe['hari_nama'] = df_tipe['tanggal'].dt.day_name()
6. Statistik Dasar
Statistik adalah fondasi dari Data Science. Memahami konsep statistik dasar sangat penting sebelum melakukan analisis data yang lebih kompleks. Di bagian ini, kita akan belajar statistik deskriptif — cara merangkum dan mendeskripsikan data menggunakan angka.
Ukuran Tendensi Sentral
| Ukuran | Formula | Kegunaan | Python |
|---|---|---|---|
| Mean (Rata-rata) | Σx / n | Rata-rata keseluruhan data | np.mean(data) |
| Median | Nilai tengah | Tidak terpengaruh outlier | np.median(data) |
| Modus | Nilai paling sering muncul | Data kategorikal | data.mode() |
Ukuran Penyebaran
| Ukuran | Penjelasan | Python |
|---|---|---|
| Range | Selisih max - min | np.ptp(data) |
| Variance | Rata-rata kuadrat deviasi dari mean | np.var(data) |
| Standard Deviation | Akar dari variance — satuan sama dengan data | np.std(data) |
| IQR | Interquartile Range (Q3 - Q1) | np.percentile(data,75) - np.percentile(data,25) |
import numpy as np
import pandas as pd
# Contoh dataset: nilai ujian 30 mahasiswa
np.random.seed(42)
nilai = np.random.normal(loc=75, scale=12, size=30).round(1)
nilai = np.clip(nilai, 0, 100) # Batasi antara 0-100
print("=== STATISTIK DESKRIPTIF ===")
print(f"Data: {nilai}")
print(f"\nUkuran Tendensi Sentral:")
print(f" Mean (Rata-rata): {np.mean(nilai):.2f}")
print(f" Median: {np.median(nilai):.2f}")
print(f" Modus: {pd.Series(nilai).mode().values[0]:.2f}")
print(f"\nUkuran Penyebaran:")
print(f" Range: {np.ptp(nilai):.2f}")
print(f" Variance: {np.var(nilai, ddof=1):.2f}")
print(f" Std Deviation: {np.std(nilai, ddof=1):.2f}")
print(f" Q1 (25%): {np.percentile(nilai, 25):.2f}")
print(f" Q3 (75%): {np.percentile(nilai, 75):.2f}")
print(f" IQR: {np.percentile(nilai, 75) - np.percentile(nilai, 25):.2f}")
# Deskripsi lengkap dengan Pandas
df_nilai = pd.DataFrame({'nilai': nilai})
print(f"\n=== DESKRIPSI PANDAS ===")
print(df_nilai.describe())
# Deteksi outlier dengan IQR method
Q1 = np.percentile(nilai, 25)
Q3 = np.percentile(nilai, 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = nilai[(nilai < lower_bound) | (nilai > upper_bound)]
print(f"\nOutlier detection (IQR method):")
print(f" Lower bound: {lower_bound:.2f}")
print(f" Upper bound: {upper_bound:.2f}")
print(f" Outliers: {outliers}")
Korelasi
# Korelasi antar variabel
np.random.seed(42)
df_corr = pd.DataFrame({
'jam_belajar': np.random.uniform(1, 10, 50).round(1),
'kehadiran': np.random.uniform(60, 100, 50).round(1),
})
# Buat nilai_ujian berkorelasi positif dengan jam_belajar
df_corr['nilai_ujian'] = (
df_corr['jam_belajar'] * 5
+ df_corr['kehadiran'] * 0.3
+ np.random.normal(0, 5, 50)
).round(1)
# Matriks korelasi
corr_matrix = df_corr.corr()
print("Matriks Korelasi:")
print(corr_matrix.round(3))
# Interpretasi korelasi:
# 0.0 - 0.3: Lemah
# 0.3 - 0.7: Sedang
# 0.7 - 1.0: Kuat
# Nilai negatif = korelasi terbalik
7. Visualisasi dengan Matplotlib
Matplotlib adalah library visualisasi paling fundamental di Python. Hampir semua library visualisasi lain (Seaborn, Plotly) dibangun di atas Matplotlib. Dengan Matplotlib, Anda bisa membuat berbagai jenis chart — dari line chart hingga heatmap — untuk memvisualisasikan data dan menemukan pola.
Jenis Chart & Kapan Menggunakannya
| Jenis Chart | Cocok untuk | Fungsi Matplotlib |
|---|---|---|
| Line Chart | Tren waktu, data berurutan | plt.plot() |
| Bar Chart | Perbandingan antar kategori | plt.bar() |
| Histogram | Distribusi data | plt.hist() |
| Scatter Plot | Hubungan antar variabel | plt.scatter() |
| Pie Chart | Komposisi proporsi | plt.pie() |
| Box Plot | Distribusi + outlier | plt.boxplot() |
| Heatmap | Matriks korelasi, intensitas | plt.imshow() |
Line Chart & Bar Chart
import matplotlib.pyplot as plt
import numpy as np
# ===== LINE CHART: Tren Penjualan Bulanan =====
bulan = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun',
'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des']
penjualan_2025 = [120, 135, 148, 130, 155, 170, 160, 180, 195, 175, 200, 210]
penjualan_2026 = [140, 155, 168, 150, 175, 190, 180, 200, 215, 195, 220, 230]
plt.figure(figsize=(12, 5))
plt.plot(bulan, penjualan_2025, 'b-o', label='2025', linewidth=2, markersize=6)
plt.plot(bulan, penjualan_2026, 'r-s', label='2026', linewidth=2, markersize=6)
plt.title('Tren Penjualan Bulanan (dalam juta Rp)', fontsize=14, fontweight='bold')
plt.xlabel('Bulan')
plt.ylabel('Penjualan (Juta Rp)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('tren_penjualan.png', dpi=150)
plt.show()
# ===== BAR CHART: Perbandingan per Kategori =====
kategori = ['Elektronik', 'Fashion', 'Makanan', 'Kesehatan', 'Olahraga']
pendapatan = [450, 380, 520, 290, 310]
warna = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7']
plt.figure(figsize=(10, 5))
bars = plt.bar(kategori, pendapatan, color=warna, edgecolor='white', linewidth=1.5)
# Tambah label di atas bar
for bar, val in zip(bars, pendapatan):
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 5,
f'{val}jt', ha='center', fontsize=10, fontweight='bold')
plt.title('Pendapatan per Kategori (Juta Rp)', fontsize=14, fontweight='bold')
plt.ylabel('Pendapatan (Juta Rp)')
plt.ylim(0, max(pendapatan) * 1.15)
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.savefig('pendapatan_kategori.png', dpi=150)
plt.show()
Histogram & Scatter Plot
# ===== HISTOGRAM: Distribusi Usia Karyawan =====
np.random.seed(42)
usia = np.random.normal(loc=35, scale=8, size=200).astype(int)
usia = np.clip(usia, 22, 60)
plt.figure(figsize=(10, 5))
plt.hist(usia, bins=15, color='#45B7D1', edgecolor='white', alpha=0.85)
plt.axvline(np.mean(usia), color='red', linestyle='--', linewidth=2,
label=f'Mean: {np.mean(usia):.1f} tahun')
plt.axvline(np.median(usia), color='green', linestyle='--', linewidth=2,
label=f'Median: {np.median(usia):.1f} tahun')
plt.title('Distribusi Usia Karyawan', fontsize=14, fontweight='bold')
plt.xlabel('Usia (tahun)')
plt.ylabel('Jumlah Karyawan')
plt.legend()
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.savefig('distribusi_usia.png', dpi=150)
plt.show()
# ===== SCATTER PLOT: Hubungan Jam Belajar vs Nilai =====
np.random.seed(42)
jam_belajar = np.random.uniform(1, 10, 50)
nilai_ujian = 40 + jam_belajar * 5 + np.random.normal(0, 8, 50)
nilai_ujian = np.clip(nilai_ujian, 0, 100)
plt.figure(figsize=(10, 6))
scatter = plt.scatter(jam_belajar, nilai_ujian, c=nilai_ujian,
cmap='RdYlGn', s=100, edgecolor='gray', alpha=0.8)
plt.colorbar(scatter, label='Nilai Ujian')
# Tambah trend line
z = np.polyfit(jam_belajar, nilai_ujian, 1)
p = np.poly1d(z)
x_line = np.linspace(1, 10, 100)
plt.plot(x_line, p(x_line), 'r--', linewidth=2, label=f'Trend: y={z[0]:.1f}x+{z[1]:.1f}')
plt.title('Hubungan Jam Belajar vs Nilai Ujian', fontsize=14, fontweight='bold')
plt.xlabel('Jam Belajar per Hari')
plt.ylabel('Nilai Ujian')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('scatter_belajar_nilai.png', dpi=150)
plt.show()
Subplots & Multi-panel Chart
# Membuat dashboard dengan 4 chart
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# Chart 1: Line
axes[0, 0].plot(bulan, penjualan_2026, 'r-o', linewidth=2)
axes[0, 0].set_title('Tren Penjualan 2026')
axes[0, 0].set_ylabel('Juta Rp')
axes[0, 0].grid(True, alpha=0.3)
# Chart 2: Bar
axes[0, 1].bar(kategori, pendapatan, color=warna)
axes[0, 1].set_title('Pendapatan per Kategori')
axes[0, 1].set_ylabel('Juta Rp')
# Chart 3: Histogram
axes[1, 0].hist(usia, bins=12, color='#45B7D1', edgecolor='white')
axes[1, 0].set_title('Distribusi Usia')
axes[1, 0].set_xlabel('Usia')
# Chart 4: Pie
axes[1, 1].pie(pendapatan, labels=kategori, autopct='%1.1f%%',
colors=warna, startangle=90)
axes[1, 1].set_title('Proporsi Pendapatan')
fig.suptitle('Dashboard Analitik', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.savefig('dashboard.png', dpi=150, bbox_inches='tight')
plt.show()
- Gunakan Seaborn (
import seaborn as sns) untuk visualisasi statistik yang lebih cantik — Seaborn dibangun di atas Matplotlib - Selalu tambahkan judul, label sumbu, dan legend pada chart
- Gunakan
plt.tight_layout()untuk menghindari label yang terpotong - Simpan chart dengan
plt.savefig('nama.png', dpi=150, bbox_inches='tight') - Pilih warna yang colorblind-friendly — gunakan colormap seperti 'viridis' atau 'RdYlGn'
8. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Python untuk Data Science: