Pertemuan 06 - Dashboard Analytics Sederhana

Pertemuan 06 - Dashboard Analytics Sederhana

Membersihkan data penjualan lintas tahun lalu merangkainya menjadi dashboard analytics yang kaya dengan tren time series, perbandingan tahun, dan heatmap musiman.

Tujuan Praktikum

Setelah menyelesaikan praktikum ini, mahasiswa mampu:

  1. Membersihkan dataset penjualan mentah lintas tahun sebagai sumber dashboard (review Pertemuan 03).
  2. Menghitung KPI dan agregasi time series (per bulan dan per tahun).
  3. Menata banyak panel grafik dalam satu gambar menggunakan plt.subplot_mosaic.
  4. Membangun dashboard kaya: KPI cards, tren bulanan, perbandingan antar-tahun, produk terlaris, proporsi kategori, dan heatmap musiman.
  5. Menyimpan dashboard sebagai satu file gambar.

Persiapan

Kebutuhan praktikum:

text
- 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:

python
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:

python
# 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:

text
Data Mentah → Pembersihan → Agregasi → Visualisasi → DASHBOARD

Dua hal membuat dashboard ini "kaya":

  1. Data lintas tahun (2023–2025). Karena rentangnya panjang, kita bisa menampilkan time series: tren penjualan bulanan, pertumbuhan antar-tahun, dan pola musiman.
  2. 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:

python
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:

text
Sebelum: (1324, 6)
Sesudah: (1199, 6) | kosong: 0 | duplikat: 0

Tambahkan kolom turunan yang dibutuhkan untuk analisis waktu:

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

python
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:

text
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:

python
# 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:

text
tahun
2023    2133200000
2024    3178200000
2025    4698600000
Name: total, dtype: int64
Terlihat penjualan tumbuh tiap tahun. to_period("M") mengelompokkan tanggal menjadi bulanan, dan pivot_table menyusun 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:

python
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:

python
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:

python
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()
Contoh dashboard penjualan lintas tahun

Penjelasan teknik baru:

  • kpi_card(...)ax.axis("off") mematikan sumbu, Rectangle membuat kotak berwarna, ax.text menulis angka besar dan labelnya.
  • axd["trend"].axvline(...) — garis vertikal pembatas tiap tahun pada grafik tren.
  • wedgeprops=dict(width=0.45) pada pie — 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

python
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:

  1. Setelah dibersihkan, df.shape menghasilkan (1199, ...), tanpa nilai kosong dan tanpa duplikat.
  2. Dashboard menampilkan enam jenis panel: empat KPI card, tren bulanan, bar per tahun, produk teratas, donut kategori, dan heatmap.
  3. KPI: Total Penjualan ≈ Rp 10,01 miliar, 1199 transaksi, 6517 unit.
  4. Penjualan per tahun meningkat: 2023 < 2024 < 2025.
  5. File dashboard_penjualan.png berhasil tersimpan.

Verifikasi nilai:

python
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:

  1. Minimal lima panel berbeda dalam satu gambar memakai subplot_mosaic.
  2. Wajib menyertakan minimal satu grafik time series (tren bulanan atau heatmap tahun × bulan).
  3. 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["..."])).
  4. Beri judul dashboard, rapikan tata letak, dan simpan sebagai file PNG.
  5. 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.