AI & Data Science

Python untuk Data Science: Panduan Memulai

TOKEN

Panduan lengkap memulai Data Science dengan Python — dari review dasar Python, Jupyter Notebook, NumPy, Pandas, data cleaning, statistik dasar, hingga visualisasi dengan matplotlib

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).

Python — Tipe Data Dasar
# 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

Python — 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

Python — Membaca File CSV
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
InteraktifJalankan kode per-sel dan lihat hasil langsung tanpa menjalankan seluruh script
Dokumentasi HidupGabungkan kode, output, grafik, dan catatan dalam satu dokumen
Visualisasi InlineChart dan grafik muncul langsung di dalam notebook
Eksplorasi DataSangat cocok untuk analisis eksploratif — coba, lihat, modifikasi, ulangi
Sharing MudahBisa di-share sebagai .ipynb atau di-export ke HTML/PDF
KompatibilitasBisa menjalankan Python, R, Julia, dan bahasa lainnya

Instalasi Jupyter

Bash — 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 + EnterJalankan sel saat ini & pindah ke sel berikutnyaCommand & Edit
Ctrl + EnterJalankan sel saat ini & tetap di sel yang samaCommand & Edit
ATambah sel baru di atasCommand
BTambah sel baru di bawahCommand
DDHapus sel saat iniCommand
MUbah sel ke mode MarkdownCommand
YUbah sel ke mode CodeCommand
EscKembali ke Command modeEdit
EnterMasuk ke Edit modeCommand
Ctrl + Shift + PBuka Command PaletteCommand
💡 Tips

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

Python — NumPy Array Creation
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

Python — NumPy Operations
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
Series1D (satu kolom)Excel: satu kolomDaftar suhu harian
DataFrame2D (tabel)Excel: satu sheetTabel penjualan (kolom: tanggal, produk, harga)

Membuat & Membaca Data

Python — Pandas Basics
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

Python — Pandas Selection & 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

Python — GroupBy & Aggregation
# 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 kosongIsi dengan mean/median/mode atau hapus baris
DuplikasiAda baris yang tercatat 2xHapus duplikat
Tipe Data SalahTanggal bertipe string, bukan datetimeKonversi tipe data
Inkonsistensi"Jakarta", "jakarta", "JKT"Standardisasi nilai
OutlierUsia = 999 tahunDetect dan hapus/klip outlier
Format BerbedaHarga: "Rp 1.000.000" vs 1000000Parsing dan normalisasi

Menangani Missing Values

Python — Handling 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

Python — Duplicates & Type Conversion
# 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 / nRata-rata keseluruhan datanp.mean(data)
MedianNilai tengahTidak terpengaruh outliernp.median(data)
ModusNilai paling sering munculData kategorikaldata.mode()

Ukuran Penyebaran

Ukuran Penjelasan Python
RangeSelisih max - minnp.ptp(data)
VarianceRata-rata kuadrat deviasi dari meannp.var(data)
Standard DeviationAkar dari variance — satuan sama dengan datanp.std(data)
IQRInterquartile Range (Q3 - Q1)np.percentile(data,75) - np.percentile(data,25)
Python — Statistik Deskriptif
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

Python — 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 ChartTren waktu, data berurutanplt.plot()
Bar ChartPerbandingan antar kategoriplt.bar()
HistogramDistribusi dataplt.hist()
Scatter PlotHubungan antar variabelplt.scatter()
Pie ChartKomposisi proporsiplt.pie()
Box PlotDistribusi + outlierplt.boxplot()
HeatmapMatriks korelasi, intensitasplt.imshow()

Line Chart & Bar Chart

Python — Line & 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

Python — Histogram & Scatter
# ===== 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

Python — Subplots
# 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()
💡 Tips Visualisasi
  • 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:

Pertanyaan 1: Apa keunggulan utama NumPy array dibandingkan list Python biasa?

a) Lebih mudah ditulis kodenya
b) Bisa menyimpan berbagai tipe data berbeda
c) Lebih cepat dan efisien memori karena operasi vektorisasi
d) Tidak perlu import library tambahan

Pertanyaan 2: Di Jupyter Notebook, shortcut apa yang digunakan untuk menjalankan sel dan pindah ke sel berikutnya?

a) Ctrl + Enter
b) Alt + Enter
c) Shift + Enter
d) Ctrl + Shift + Enter

Pertanyaan 3: Metode Pandas apa yang digunakan untuk mengelompokkan data berdasarkan kolom tertentu dan menghitung agregasi?

a) df.sort_values()
b) df.groupby().agg()
c) df.pivot_table()
d) df.merge()

Pertanyaan 4: Jika data memiliki outlier ekstrem, ukuran tendensi sentral mana yang paling robust?

a) Mean (rata-rata)
b) Median
c) Modus
d) Range

Pertanyaan 5: Jenis chart apa yang paling cocok untuk melihat hubungan (korelasi) antara dua variabel numerik?

a) Pie Chart
b) Bar Chart
c) Histogram
d) Scatter Plot
🔍 Zoom
100%
🎨 Tema