📥 Lampiran Data & Data Sheet
Seluruh modul menggunakan satu dataset penjualan retail selama 2 tahun (Juli 2024 – Juni 2026, 561 baris) yang sengaja dibuat kotor agar dapat dipakai berlatih data cleaning secara nyata. Cakupan 2 tahun memungkinkan analisis year-over-year (mis. "produk apa yang laku di bulan yang sama tahun lalu?") dan dataset ini juga mengandung pola musiman tersembunyi untuk ditemukan peserta.
Kamus Data (Data Dictionary)
| Kolom | Tipe | Deskripsi |
|---|---|---|
order_id | Teks | Nomor unik transaksi (format ORD-XXXX) |
tanggal | Tanggal | Tanggal transaksi (format seharusnya YYYY-MM-DD) |
nama_pelanggan | Teks | Nama pembeli |
kota | Teks | Kota pengiriman (Jakarta, Bandung, Surabaya, Semarang) |
produk | Teks | Nama produk yang dibeli |
kategori | Teks | Aksesoris / Elektronik / Penyimpanan |
jumlah | Angka | Kuantitas pembelian |
harga_satuan | Angka (Rp) | Harga per unit |
total | Angka (Rp) | Seharusnya = jumlah × harga_satuan |
Preview Data (15 baris pertama)
Masalah yang Sengaja Ditanam DIRTY DATA
- Duplikat: 5 baris muncul dua kali —
ORD-2031,ORD-2131,ORD-2231,ORD-2341,ORD-2451. - Penulisan kota tidak konsisten (±119 baris): huruf kapital semua (
JAKARTA), huruf kecil semua (bandung), dan huruf kecil + spasi di akhir (surabaya␣). - Format tanggal campur (±44 baris):
YYYY-MM-DD,DD/MM/YYYY, dan7 Sep 2025. - Nilai kosong:
kota6 baris (mis. ORD-2026, ORD-2091),jumlah3 baris (ORD-2061, ORD-2211, ORD-2381),harga_satuan2 baris (ORD-2121, ORD-2301),totalbeberapa baris (mis. ORD-2046, ORD-2241, ORD-2441). - Typo nama produk:
Mouse Wirelless(ORD-2088, ORD-2100),Keybord Mechanical(ORD-2082, ORD-2085). - Nilai tidak wajar: jumlah negatif pada ORD-2151 dan ORD-2401 (kemungkinan retur/salah input).
- Total salah hitung: ORD-2101 dan ORD-2281 — kolom
totaltidak sama dengan jumlah × harga_satuan (harus diaudit, bukan hanya dicek kosong).
total konsisten = jumlah × harga_satuan.1 Fundamental Data Analyst & Excel
1.1 Konsep Dasar
- Peran Data Analyst: mengubah data mentah menjadi insight untuk pengambilan keputusan.
- Alur kerja: Ask (pertanyaan bisnis) → Collect (kumpulkan data) → Clean (bersihkan) → Analyze (analisis) → Visualize (visualisasi) → Share (komunikasi insight).
- Struktur data tabular: 1 baris = 1 record/transaksi, 1 kolom = 1 variabel/atribut.
1.2 Langkah Praktik: Data Cleaning di Excel
- Buka
data_penjualan_retail.csvdi Excel → simpan sebagai.xlsx. - Blok seluruh data → Insert → Table agar rapi dan mudah difilter.
- Hapus duplikat: Data → Remove Duplicates (centang semua kolom). Excel akan melaporkan 5 baris duplikat dihapus.
- Rapikan teks kota — buat kolom bantu
kota_bersih:=PROPER(TRIM(D2))TRIMmenghapus spasi berlebih,PROPERmenyeragamkan kapitalisasi → "jakarta " menjadi "Jakarta". - Perbaiki typo produk: Ctrl+H (Find & Replace) → ganti
Mouse Wirelless→Mouse Wireless, danKeybord Mechanical→Keyboard Mechanical. - Cari sel kosong: blok data → Home → Find & Select → Go To Special → Blanks. Isi berdasarkan aturan (mis. harga_satuan Headset Gaming = 350000 dari transaksi lain).
- Hitung ulang total agar konsisten:
=G2*H2 - Seragamkan tanggal: blok kolom tanggal → Data → Text to Columns → Date (DMY/YMD) → format ulang menjadi
YYYY-MM-DD.
=PROPER(TRIM(D2)) menyeragamkan penulisan kota, dan Find & Replace membereskan typo nama produk.1.3 Langkah Praktik: Analisis Dasar
Contoh formula analisis (asumsikan data di tabel bernama Penjualan):
' Total revenue seluruh transaksi
=SUM(Penjualan[total])
' Total revenue kota Jakarta
=SUMIFS(Penjualan[total], Penjualan[kota_bersih], "Jakarta")
' Jumlah transaksi per produk
=COUNTIFS(Penjualan[produk], "Mouse Wireless")
' Rata-rata nilai transaksi kategori Elektronik
=AVERAGEIFS(Penjualan[total], Penjualan[kategori], "Elektronik")
Pivot Table: Insert → PivotTable → seret kota_bersih ke Rows, total ke Values (Sum) → terlihat kota dengan revenue tertinggi.
kota di Rows, total di Values (Sum), plus bar chart revenue per kota.2 Introduction to SQL
SELECT untuk mengambil, memfilter, dan meringkas data dari database.2.1 Konsep Dasar
- Database = kumpulan tabel; tabel = kumpulan baris & kolom (mirip sheet Excel).
- SQL (Structured Query Language) = bahasa standar untuk mengambil dan mengolah data di database.
- Tools tanpa instalasi: SQLite Online atau DB Fiddle — cukup import file CSV sebagai tabel
penjualan.
2.2 Query Dasar
-- Lihat seluruh data
SELECT * FROM penjualan;
-- Pilih kolom tertentu
SELECT order_id, produk, total FROM penjualan;
-- Filter: transaksi di Jakarta dengan total di atas 500 ribu
SELECT order_id, produk, total
FROM penjualan
WHERE kota = 'Jakarta' AND total > 500000;
-- Urutkan 5 transaksi terbesar
SELECT order_id, produk, total
FROM penjualan
ORDER BY total DESC
LIMIT 5;
2.3 Agregasi & Grouping
-- Total revenue seluruh transaksi
SELECT SUM(total) AS total_revenue FROM penjualan;
-- Revenue per kota, diurutkan dari terbesar
SELECT kota,
COUNT(*) AS jumlah_transaksi,
SUM(total) AS revenue
FROM penjualan
GROUP BY kota
ORDER BY revenue DESC;
-- Produk dengan unit terjual terbanyak
SELECT produk, SUM(jumlah) AS unit_terjual
FROM penjualan
GROUP BY produk
ORDER BY unit_terjual DESC;
-- Hanya kategori dengan revenue di atas 3 juta (HAVING)
SELECT kategori, SUM(total) AS revenue
FROM penjualan
GROUP BY kategori
HAVING SUM(total) > 3000000;
2.4 Deteksi Data Kotor dengan SQL
-- Cek order_id duplikat
SELECT order_id, COUNT(*) AS jumlah
FROM penjualan
GROUP BY order_id
HAVING COUNT(*) > 1;
-- Cek variasi penulisan kota
SELECT DISTINCT kota FROM penjualan;
-- Cek baris dengan nilai kosong
SELECT * FROM penjualan
WHERE kota IS NULL OR kota = ''
OR jumlah IS NULL OR total IS NULL;
2.5 Analisis Year-over-Year (Habit Tahun Lalu)
Karena dataset mencakup 2 tahun, kita bisa menjawab: "di bulan yang sama tahun lalu, produk apa saja yang laku?"
-- Produk yang laku di bulan Juni, dibandingkan antar tahun
SELECT strftime('%Y', tanggal) AS tahun,
produk,
SUM(jumlah) AS unit_terjual
FROM penjualan
WHERE strftime('%m', tanggal) = '06'
GROUP BY tahun, produk
ORDER BY tahun, unit_terjual DESC;
-- Revenue per bulan per tahun (bahan perbandingan musiman)
SELECT strftime('%m', tanggal) AS bulan,
SUM(CASE WHEN strftime('%Y', tanggal) = '2025' THEN total ELSE 0 END) AS rev_2025,
SUM(CASE WHEN strftime('%Y', tanggal) = '2026' THEN total ELSE 0 END) AS rev_2026
FROM penjualan
GROUP BY bulan
ORDER BY bulan;
strftime berlaku di SQLite; di MySQL gunakan YEAR(tanggal) / MONTH(tanggal), di SQL Server gunakan DATEPART.3 Introduction to Python (Google Colab & Pandas)
3.1 Persiapan Google Colab
- Buka colab.research.google.com → New Notebook.
- Upload dataset: klik ikon 📁 di sidebar kiri → Upload → pilih
data_penjualan_retail.csv. - Jalankan cell dengan Shift+Enter.
3.2 Load & Eksplorasi Data
import pandas as pd
df = pd.read_csv('data_penjualan_retail.csv')
df.head(10) # lihat 10 baris pertama
df.info() # tipe data & jumlah nilai kosong per kolom
df.describe() # statistik ringkas kolom angka
df.shape # (561, 9) -> 561 baris, 9 kolom
3.3 Data Cleaning dengan Pandas
# 1. Hapus baris duplikat (561 -> 556 baris)
df = df.drop_duplicates()
# 2. Seragamkan penulisan kota: hapus spasi + kapitalisasi awal
df['kota'] = df['kota'].str.strip().str.title()
# 3. Perbaiki typo nama produk
df['produk'] = df['produk'].replace({
'Mouse Wirelless': 'Mouse Wireless',
'Keybord Mechanical': 'Keyboard Mechanical'
})
# 4. Seragamkan format tanggal (format campuran -> datetime)
df['tanggal'] = pd.to_datetime(df['tanggal'], format='mixed', dayfirst=True)
# 5. Isi harga satuan kosong berdasarkan harga produk yang sama
df['harga_satuan'] = df.groupby('produk')['harga_satuan'] \
.transform(lambda x: x.fillna(x.median()))
# 6. Tangani jumlah kosong / negatif
df['jumlah'] = df['jumlah'].fillna(1) # asumsi minimal beli 1
df['jumlah'] = df['jumlah'].abs() # -1 dianggap salah input
# 7. Hitung ulang kolom total agar konsisten
df['total'] = df['jumlah'] * df['harga_satuan']
# 8. Cek hasil akhir
df.info()
df.isna().sum() # pastikan tidak ada nilai kosong tersisa
3.4 Analisis & Visualisasi
# Revenue per kota
df.groupby('kota')['total'].sum().sort_values(ascending=False)
# Produk terlaris berdasarkan unit
df.groupby('produk')['jumlah'].sum().sort_values(ascending=False)
# Tren revenue bulanan
df['bulan'] = df['tanggal'].dt.to_period('M')
tren = df.groupby('bulan')['total'].sum()
tren.plot(kind='line', marker='o', title='Tren Revenue Bulanan')
# --- Analisis Year-over-Year: habit tahun lalu di bulan yang sama ---
df['tahun'] = df['tanggal'].dt.year
df['no_bulan'] = df['tanggal'].dt.month
# Produk yang laku di bulan Juni, dibandingkan antar tahun
juni = df[df['no_bulan'] == 6]
juni.pivot_table(index='produk', columns='tahun', values='jumlah', aggfunc='sum')
# Pola musiman: unit terjual per produk per bulan (cikal bakal heatmap)
df.pivot_table(index='produk', columns='no_bulan', values='jumlah', aggfunc='sum')
# Simpan data bersih untuk dipakai di Power BI
df.to_csv('data_penjualan_bersih.csv', index=False)
pivot_table + grouped bar chart.data_penjualan_bersih.csv (bahan Modul 4).4 Power BI — Visualisasi & Mini Dashboard
4.1 Prinsip Visualisasi Singkat
- Perbandingan antar kategori → Bar chart.
- Tren dari waktu ke waktu → Line chart.
- Angka kunci (KPI) → Card.
- Proporsi (maks. 4–5 bagian) → Pie/Donut chart.
- Hindari chart junk: 3D, warna berlebihan, terlalu banyak visual dalam satu halaman.
4.2 Langkah Import & Transformasi
- Buka Power BI Desktop → Get Data → Text/CSV → pilih
data_penjualan_bersih.csv(hasil Modul 3; boleh juga CSV mentah untuk berlatih cleaning di Power Query). - Klik Transform Data (Power Query) dan pastikan:
tanggalbertipe Date;jumlah,harga_satuan,totalbertipe Whole Number.- Jika memakai data mentah: Remove Duplicates, Transform → Format → Trim & Capitalize Each Word pada kolom kota, Replace Values untuk typo produk.
- Close & Apply.
4.3 Membuat Measure (DAX)
Total Revenue = SUM(penjualan[total])
Jumlah Transaksi = COUNTROWS(penjualan)
Rata-rata Nilai Order = DIVIDE([Total Revenue], [Jumlah Transaksi])
Total Unit Terjual = SUM(penjualan[jumlah])
Time intelligence (perbandingan tahun lalu) — buat dulu tabel tanggal: Modeling → New Table → TabelTanggal = CALENDARAUTO(), lalu hubungkan ke kolom tanggal:
Revenue Tahun Lalu = CALCULATE([Total Revenue], SAMEPERIODLASTYEAR(TabelTanggal[Date]))
YoY Growth % = DIVIDE([Total Revenue] - [Revenue Tahun Lalu], [Revenue Tahun Lalu])
4.4 Menyusun Mini Dashboard (1 Halaman)
- Card: Total Revenue
- Card: Jumlah Transaksi
- Card: Rata-rata Nilai Order
- Bar chart: Revenue per Kota
- Bar chart: Unit Terjual per Produk
- Line chart: Tren Revenue per Bulan (+ garis Revenue Tahun Lalu untuk YoY)
- Matrix: Produk × Bulan (unit terjual) — untuk melihat pola musiman
- Slicer: Kategori, Tahun, dan/atau rentang Tanggal
Uji interaktivitas: klik salah satu kota di bar chart → semua visual lain otomatis terfilter (cross-filtering).
.pbix berisi 1 halaman dashboard interaktif dengan minimal 3 KPI card + 3 visual + 1 slicer.5 Integrated Study Case
5.1 Skenario Bisnis
Anda adalah Data Analyst di toko online "TokoTech". Manajer memberi Anda data penjualan mentah 2 tahun terakhir (Juli 2024 – Juni 2026) (data_penjualan_retail.csv) dan meminta laporan untuk rapat evaluasi tahunan.
5.2 Pertanyaan Bisnis yang Harus Dijawab
- Produk apa yang paling laris (berdasarkan unit) dan produk apa penyumbang revenue terbesar? Apakah keduanya sama?
- Kota mana dengan revenue tertinggi, dan bagaimana urutan keempat kota?
- Bagaimana tren revenue bulanan selama 2 tahun? Bulan apa yang selalu tertinggi — apakah polanya berulang tiap tahun?
- Kategori mana yang mendominasi revenue, dan berapa persen kontribusinya?
- (YoY) Dibanding bulan yang sama tahun lalu, produk apa yang lebih laku dan yang menurun? Pola kebiasaan (habit) musiman apa yang bisa Anda temukan?
- (Bonus) Masalah kualitas data apa saja yang Anda temukan, dan keputusan apa yang Anda ambil untuk masing-masing?
5.3 Langkah Pengerjaan
- Cleaning — pilih Excel (Modul 1) atau Pandas (Modul 3). Dokumentasikan setiap keputusan (mis. "jumlah -1 diubah menjadi 1 karena diasumsikan salah input").
- Analysis — jawab pertanyaan bisnis dengan Pivot Table, SQL, atau Pandas.
- Dashboard — tuangkan jawaban ke satu halaman Power BI mengikuti pola Modul 4.
- Insight — tulis 3–5 kalimat insight + 1 rekomendasi aksi. Insight yang baik: angka + konteks + rekomendasi. Contoh pola: "Monitor 24 inch menyumbang X% revenue meski unitnya sedikit — pertimbangkan bundling dengan aksesoris untuk menaikkan basket size."
🔑 Panduan Kunci untuk Instruktur (klik untuk membuka)
- Cleaning yang benar menghasilkan: 556 transaksi unik (dari 561 baris); 4 kota seragam (Jakarta, Bandung, Surabaya, Semarang); tanggal seragam; tidak ada nilai kosong; total = jumlah × harga_satuan (termasuk memperbaiki 2 baris total salah hitung).
- Q1: produk terlaris by unit ≠ penyumbang revenue terbesar — Mouse Wireless (±210 unit) dan USB Hub unggul di unit, tetapi Monitor 24 inch dominan di revenue (±Rp 127,8 juta dari total ±Rp 320,5 juta). Ini poin diskusi utama.
- Q2: urutan revenue: Jakarta (±Rp 119,7 jt) > Surabaya (±Rp 87,8 jt) > Bandung (±Rp 70,8 jt) > Semarang (±Rp 42,3 jt). Angka final peserta boleh sedikit berbeda tergantung keputusan cleaning (mis. cara mengisi 6 baris kota kosong) — yang dinilai adalah konsistensi proses.
- Q3: puncak revenue terjadi di Desember 2025 (±Rp 33 jt) dan Desember 2024 (±Rp 20,4 jt) — pola Harbolnas yang berulang tiap tahun; volume juga tumbuh dari 2024 ke 2025.
- Q4: Aksesoris kategori terbesar (±43% revenue) karena jumlah produknya banyak, tetapi produk tunggal terbesar adalah Monitor 24 inch (Elektronik, ±40%).
- Q5 (YoY): Juni 2025 dipimpin Headset Gaming (8 unit — awal musim liburan), sedangkan Juni 2026 dipimpin USB Hub & Mouse Wireless (8 unit). Pola musiman yang ditanam: Headset Gaming & Laptop Stand memuncak Juni–Agustus (liburan/tahun ajaran baru), Monitor & SSD memuncak November–Desember (Harbolnas).
- Q6 (bonus): minimal menemukan 5 dari 7 jenis masalah yang ditanam (lihat bagian Data Sheet), termasuk yang paling tersembunyi: total salah hitung ORD-2101 & ORD-2281.
Rubrik penilaian sederhana (100 poin): Cleaning tepat & terdokumentasi (30) · Jawaban analisis benar & berdasar (30) · Dashboard rapi & interaktif (25) · Kualitas insight & rekomendasi (15).
💡 Insight Lanjutan — di atas Fundamental
Peta Kemungkinan Insight
🔄 Year-over-Year
strftime, Pandas pivot_table, DAX SAMEPERIODLASTYEAR.📅 Pola Musiman
📈 Pertumbuhan MoM / YoY
(periode ini − periode lalu) ÷ periode lalu — Pandas pct_change(), DAX YoY Growth %.🎯 Pareto 80/20 Produk
💰 AOV & Basket Size
total per order per bulan — bahan strategi bundling/upselling.👥 Pelanggan Repeat (RFM)
nama_pelanggan: frekuensi order + total belanja — dataset ini memuat kelompok pelanggan loyal untuk ditemukan.🗺 Afinitas Kota × Produk
pd.crosstab, Power BI Matrix.🔍 Audit Anomali Berkala
jumlah < 0 atau total ≠ jumlah × harga — insight tentang kualitas proses input data.Contoh Implementasi Cepat (Pandas)
# 3. Pertumbuhan bulanan (MoM %)
tren = df.groupby(df['tanggal'].dt.to_period('M'))['total'].sum()
tren.pct_change().mul(100).round(1)
# 4. Pareto 80/20: persentase kumulatif revenue per produk
rev = df.groupby('produk')['total'].sum().sort_values(ascending=False)
(rev.cumsum() / rev.sum() * 100).round(1)
# 6. Pelanggan top: frekuensi order & total belanja
df.groupby('nama_pelanggan').agg(
frekuensi=('order_id', 'nunique'),
total_belanja=('total', 'sum')
).sort_values('total_belanja', ascending=False).head(10)
# 7. Afinitas kota x produk (unit terjual)
pd.crosstab(df['kota'], df['produk'], values=df['jumlah'], aggfunc='sum')