Tujuan Praktikum
Setelah menyelesaikan praktikum ini, mahasiswa mampu:
- Membersihkan dataset penjualan mentah lintas tahun sebagai sumber dashboard (review Pertemuan 03).
- Menghitung KPI dan agregasi time series (per bulan dan per tahun).
-
Menata banyak panel grafik dalam satu gambar menggunakan
plt.subplot_mosaic. - Membangun dashboard kaya: KPI cards, tren bulanan, perbandingan antar-tahun, produk terlaris, proporsi kategori, dan heatmap musiman.
- Menyimpan dashboard sebagai satu file gambar.
Persiapan
Kebutuhan praktikum:
- Akun Google
- Google Colab
- Koneksi internet
- Dataset penjualan_kotor_latihan.csv (data MENTAH lintas tahun 2023-2025, dibagikan dosen)
Buat notebook Pertemuan06_NamaAnda.ipynb, lalu impor
library:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
Dataset kali ini berukuran besar (lebih dari seribu baris, lintas tahun), jadi tidak diketik melainkan diunggah. Pilih salah satu cara:
# Opsi A - unggah dari komputer
from google.colab import files
uploaded = files.upload() # pilih penjualan_kotor_latihan.csv
# Opsi B - baca langsung dari tautan dosen
# df = pd.read_csv("URL_DATASET")
Konsep Singkat
Dashboard adalah satu tampilan yang merangkum banyak grafik dan angka penting agar pengambil keputusan memperoleh gambaran utuh secara sekilas. Inilah puncak dari alur yang sudah kita pelajari:
Data Mentah → Pembersihan → Agregasi → Visualisasi → DASHBOARD
Dua hal membuat dashboard ini "kaya":
- Data lintas tahun (2023–2025). Karena rentangnya panjang, kita bisa menampilkan time series: tren penjualan bulanan, pertumbuhan antar-tahun, dan pola musiman.
-
Banyak panel dalam satu gambar. Untuk menata
panel dengan ukuran berbeda secara rapi, kita pakai
plt.subplot_mosaic— cara modern yang setiap panelnya diberi nama sehingga mudah diatur.
Praktikum ini menggabungkan semua keterampilan sebelumnya:
pembersihan (P03),
groupby (P02), serta
Matplotlib & Seaborn (P04–P05). Konsep yang
benar-benar baru hanya subplot_mosaic dan
heatmap.
Langkah 1 - Memuat dan Membersihkan Data
Data mentah harus dibersihkan dulu (teknik dari Pertemuan 03). Berikut versi ringkasnya dalam satu cell:
df = pd.read_csv("penjualan_kotor_latihan.csv")
print("Sebelum:", df.shape)
# tabel referensi produk
peta_harga = {"Laptop":8500000,"Monitor":2000000,"Printer":1500000,"Speaker":750000,
"Router":600000,"Mouse":150000,"Keyboard":250000,"Webcam":350000,
"Headset":450000,"Flashdisk":100000}
peta_kat = {"Laptop":"Elektronik","Monitor":"Elektronik","Printer":"Elektronik","Speaker":"Elektronik",
"Router":"Elektronik","Mouse":"Aksesoris","Keyboard":"Aksesoris","Webcam":"Aksesoris",
"Headset":"Aksesoris","Flashdisk":"Aksesoris"}
# 1) standardisasi teks 2) buang produk kosong 3) isi kategori & harga
df["produk"] = df["produk"].str.strip().str.title()
df["kategori"] = df["kategori"].str.strip().str.title()
df = df.dropna(subset=["produk"])
df["kategori"] = df["kategori"].fillna(df["produk"].map(peta_kat))
df["harga"] = df["harga"].fillna(df["produk"].map(peta_harga))
# 4) buang qty kosong & tidak valid 5) konversi tipe 6) buang duplikat
df = df.dropna(subset=["qty"])
df = df[df["qty"] > 0]
df["qty"] = df["qty"].astype(int)
df["harga"] = df["harga"].astype(int)
df["tanggal"] = pd.to_datetime(df["tanggal"], format="mixed", dayfirst=True)
df = df.drop_duplicates()
print("Sesudah:", df.shape, "| kosong:", df.isna().sum().sum(), "| duplikat:", df.duplicated().sum())
Output:
Sebelum: (1324, 6)
Sesudah: (1199, 6) | kosong: 0 | duplikat: 0
Tambahkan kolom turunan yang dibutuhkan untuk analisis waktu:
df["total"] = df["qty"] * df["harga"]
df["tahun"] = df["tanggal"].dt.year
df["bulan"] = df["tanggal"].dt.month
Langkah 2 - Menghitung KPI dan Agregasi
KPI (angka ringkasan)
total_penjualan = df["total"].sum()
jml_transaksi = len(df)
total_barang = df["qty"].sum()
rata_transaksi = df["total"].mean()
produk_terlaris = df.groupby("produk")["qty"].sum().idxmax()
kategori_top = df.groupby("kategori")["total"].sum().idxmax()
print(f"Total penjualan : Rp {total_penjualan:,}")
print(f"Transaksi : {jml_transaksi}")
print(f"Total barang : {total_barang} unit")
print(f"Produk terlaris : {produk_terlaris}")
Output:
Total penjualan : Rp 10,010,000,000
Transaksi : 1199
Total barang : 6517 unit
Produk terlaris : Headset
Agregasi untuk Grafik
Di sinilah data lintas tahun berperan. Kita siapkan lima ringkasan:
# tren penjualan per BULAN (time series)
bulanan = df.groupby(df["tanggal"].dt.to_period("M"))["total"].sum()
bulanan.index = bulanan.index.to_timestamp() # period -> tanggal agar bisa diplot
# penjualan per TAHUN
per_tahun = df.groupby("tahun")["total"].sum()
# 5 produk penyumbang penjualan terbesar
top5 = df.groupby("produk")["total"].sum().sort_values(ascending=False).head(5)
# penjualan per kategori
kat = df.groupby("kategori")["total"].sum()
# tabel silang TAHUN x BULAN untuk heatmap
pivot = df.pivot_table(index="tahun", columns="bulan", values="total", aggfunc="sum")
print(per_tahun)
Output:
tahun
2023 2133200000
2024 3178200000
2025 4698600000
Name: total, dtype: int64
Terlihat penjualan tumbuh tiap tahun.to_period("M")mengelompokkan tanggal menjadi bulanan, danpivot_tablemenyusun tahun sebagai baris dan bulan sebagai kolom — bahan utama heatmap.
Langkah 3 - Menata Layout dengan subplot_mosaic
plt.subplot_mosaic membuat tata letak dari
"denah" sederhana: setiap kotak diberi nama, dan nama
yang sama akan digabung menjadi satu panel lebar.
Berikut denah dashboard kita:
denah = [
["k1", "k2", "k3", "k4"], # baris KPI cards
["trend", "trend", "trend", "trend"], # tren bulanan (lebar penuh)
["tahun", "top", "top", "kategori"], # tiga grafik pendukung
["heat", "heat", "heat", "heat"], # heatmap (lebar penuh)
]
fig, axd = plt.subplot_mosaic(denah, figsize=(16, 17))
plt.show() # jalankan untuk melihat kerangka kosongnya dulu
Hasil axd adalah dictionary: panel diakses
lewat namanya, misalnya axd["trend"] atau
axd["heat"]. Ini jauh lebih mudah dibaca
daripada ax[1, 0].
Langkah 4 - Mengisi Dashboard
Sekarang isi tiap panel. Grafiknya sudah dikenal dari pertemuan sebelumnya; kita hanya mengarahkannya ke panel yang tepat. Mulai dengan satu fungsi bantu untuk KPI card:
sns.set_theme(style="whitegrid")
BLU, ORG, GRN, UNG = "#4C8BF5", "#F5A623", "#34A853", "#9C27B0"
def kpi_card(ax, label, nilai, warna):
ax.axis("off")
ax.add_patch(plt.Rectangle((0.02, 0.1), 0.96, 0.8, transform=ax.transAxes,
facecolor=warna, alpha=0.12, edgecolor=warna, lw=2))
ax.text(0.5, 0.62, nilai, ha="center", fontsize=22, fontweight="bold", color=warna)
ax.text(0.5, 0.28, label, ha="center", fontsize=12, color="#444")
Lalu rangkai seluruh dashboard:
fig, axd = plt.subplot_mosaic(denah, figsize=(16, 17))
fig.suptitle("Dashboard Penjualan Toko Elektronik (2023-2025)", fontsize=22, fontweight="bold")
# --- baris KPI ---
kpi_card(axd["k1"], "Total Penjualan", f"Rp {total_penjualan/1e9:.2f} M", BLU)
kpi_card(axd["k2"], "Jumlah Transaksi", f"{jml_transaksi:,}", GRN)
kpi_card(axd["k3"], "Total Barang", f"{total_barang:,} unit", ORG)
kpi_card(axd["k4"], "Rata-rata/Transaksi", f"Rp {rata_transaksi/1e6:.1f} jt", UNG)
# --- tren bulanan (hero) ---
axd["trend"].plot(bulanan.index, bulanan.values/1e6, marker="o", color=BLU, lw=2)
axd["trend"].set_title("Tren Total Penjualan Bulanan (2023-2025)", fontweight="bold")
axd["trend"].set_ylabel("Penjualan (Juta Rp)")
for thn in (2024, 2025): # garis pembatas tahun
axd["trend"].axvline(pd.Timestamp(year=thn, month=1, day=1), color="grey", ls="--", alpha=0.5)
# --- penjualan per tahun ---
axd["tahun"].bar(per_tahun.index.astype(str), per_tahun.values/1e6, color=GRN)
axd["tahun"].set_title("Penjualan per Tahun")
axd["tahun"].set_ylabel("Juta Rp")
# --- 5 produk teratas (horizontal) ---
axd["top"].barh(top5.index[::-1], (top5.values/1e6)[::-1], color=BLU)
axd["top"].set_title("5 Produk Penyumbang Penjualan Terbesar")
axd["top"].set_xlabel("Juta Rp")
# --- proporsi kategori (donut) ---
axd["kategori"].pie(kat.values, labels=kat.index, autopct="%1.1f%%",
colors=[ORG, BLU], startangle=90, wedgeprops=dict(width=0.45))
axd["kategori"].set_title("Proporsi per Kategori")
# --- heatmap musiman (tahun x bulan) ---
sns.heatmap(pivot/1e6, annot=True, fmt=".0f", cmap="Blues",
ax=axd["heat"], cbar_kws={"label": "Juta Rp"})
axd["heat"].set_title("Heatmap Penjualan: Tahun x Bulan (Juta Rp)", fontweight="bold")
axd["heat"].set_xlabel("Bulan"); axd["heat"].set_ylabel("Tahun")
plt.tight_layout(rect=[0, 0, 1, 0.97])
plt.show()
Penjelasan teknik baru:
-
kpi_card(...)—ax.axis("off")mematikan sumbu,Rectanglemembuat kotak berwarna,ax.textmenulis angka besar dan labelnya. -
axd["trend"].axvline(...)— garis vertikal pembatas tiap tahun pada grafik tren. -
wedgeprops=dict(width=0.45)padapie— membuat lubang di tengah sehingga menjadi donut chart. -
sns.heatmap(pivot, annot=True, fmt=".0f", cmap="Blues")— mengubah tabel silang menjadi peta warna; sel makin gelap berarti penjualan makin besar. Heatmap memperlihatkan pola musiman (mis. lonjakan akhir tahun) dan pertumbuhan antar-tahun sekaligus.
Langkah 5 - Menyimpan Dashboard
fig.savefig("dashboard_penjualan.png", dpi=110, bbox_inches="tight")
print("Dashboard tersimpan sebagai dashboard_penjualan.png")
fig.savefig(...)menyimpan seluruh figure.-
bbox_inches="tight"memangkas ruang kosong di tepi.
Referensi Fungsi Penting
Tata Letak dan Panel
| Perintah | Fungsi |
|---|---|
plt.subplot_mosaic(denah, figsize=...) |
Membuat banyak panel dari denah bernama |
axd["nama"] |
Mengakses panel berdasarkan nama |
fig.suptitle("...") |
Judul untuk seluruh dashboard |
ax.axis("off") |
Mematikan sumbu (untuk KPI card / panel teks) |
ax.add_patch(plt.Rectangle(...)) |
Menggambar kotak berwarna |
fig.savefig("...",
bbox_inches="tight")
|
Menyimpan seluruh dashboard |
Agregasi Time Series
| Perintah | Fungsi |
|---|---|
df["tanggal"].dt.to_period("M")
|
Mengelompokkan tanggal menjadi bulanan |
df["tanggal"].dt.year /
.dt.month
|
Mengambil tahun / bulan |
df.pivot_table(index, columns, values, aggfunc)
|
Tabel silang untuk heatmap |
sns.heatmap(data, annot=True, cmap=...) |
Peta warna dari tabel silang |
Pengujian
Pastikan hasil praktikum sesuai berikut:
-
Setelah dibersihkan,
df.shapemenghasilkan(1199, ...), tanpa nilai kosong dan tanpa duplikat. - Dashboard menampilkan enam jenis panel: empat KPI card, tren bulanan, bar per tahun, produk teratas, donut kategori, dan heatmap.
- KPI: Total Penjualan ≈ Rp 10,01 miliar, 1199 transaksi, 6517 unit.
- Penjualan per tahun meningkat: 2023 < 2024 < 2025.
-
File
dashboard_penjualan.pngberhasil tersimpan.
Verifikasi nilai:
assert df.isna().sum().sum() == 0 and df.duplicated().sum() == 0
assert jml_transaksi == 1199
assert per_tahun.is_monotonic_increasing # penjualan naik tiap tahun
print("Dashboard valid.")
Troubleshooting
| Masalah | Penyebab | Solusi |
|---|---|---|
KeyError: 'trend' saat akses
axd
|
Nama panel tidak ada di denah |
Samakan nama di denah dengan yang dipakai
|
Heatmap error / ada NaN |
pivot_table punya sel kosong (bulan tanpa data)
|
Pakai data lintas tahun yang lengkap, atau
pivot.fillna(0)
|
to_period / .dt error |
Kolom tanggal belum bertipe tanggal |
pd.to_datetime(df["tanggal"],
format="mixed", dayfirst=True)
|
| Panel berdesakan | Kanvas kurang besar |
Perbesar figsize dan pakai
plt.tight_layout()
|
| Judul besar tertimpa | Tidak ada ruang untuk suptitle |
plt.tight_layout(rect=[0, 0, 1, 0.97]) |
| KPI card masih bergaris sumbu | Lupa mematikan sumbu | ax.axis("off") |
Tugas Praktikum
Bangun dashboard penjualan versi sendiri (format PDF) dari dataset yang sudah dibersihkan, dengan ketentuan:
-
Minimal lima panel berbeda dalam satu gambar
memakai
subplot_mosaic. - Wajib menyertakan minimal satu grafik time series (tren bulanan atau heatmap tahun × bulan).
-
Tambahkan satu panel/KPI baru yang belum
dicontohkan, misalnya: rata-rata penjualan per bulan, jumlah
transaksi per tahun, atau tren khusus kategori Elektronik (
sns.lineplot(..., ax=axd["..."])). - Beri judul dashboard, rapikan tata letak, dan simpan sebagai file PNG.
- Tulis 3 insight singkat yang dapat dibaca dari dashboard (mis. soal pertumbuhan atau musiman).
Tips: ekspor notebook ke PDF melalui menu File → Print → Save as PDF.
Kesimpulan
Pada pertemuan ini mahasiswa merangkai seluruh keterampilan
menjadi sebuah dashboard analytics yang utuh:
mulai dari membersihkan data mentah lintas tahun, menghitung KPI,
melakukan agregasi time series, hingga menata banyak
panel dengan plt.subplot_mosaic. Dashboard ini
memperlihatkan apa yang tidak terlihat dari satu grafik tunggal —
pertumbuhan penjualan antar-tahun, pola musiman lewat heatmap, dan
kontribusi tiap produk serta kategori secara bersamaan. Inilah
bentuk nyata dari alur Data → Informasi → Keputusan, dan menjadi
bekal untuk praktik analisis data menyeluruh pada pertemuan
berikutnya sebelum UTS.