Proyek Mini: Analisis Data Penjualan
Proyek akhir: dari data mentah sampai insight dan grafik. Termasuk tugas yang dinilai AI.
Proyek ini seperti kasus detektif
Bayangkan kamu detektif: ada TKP (data mentah), kamu kumpulkan bukti (bersihkan data), susun teori (analisis), lalu presentasikan ke pengadilan (laporan ke pemilik bisnis). Proyek mini ini melatih alur lengkap itu dalam skala kecil. Setelah ini, kamu tidak cuma "bisa pandas", tapi bisa menyelesaikan satu pekerjaan analyst dari awal sampai akhir.
Kenapa proyek end-to-end sepenting itu
Di dunia kerja dan saat melamar, tidak ada yang bertanya "coba sebutkan 5 method DataFrame". Yang ditanya: "pernah analisis apa, hasilnya apa?" Portofolio berisi satu proyek utuh yang rapi nilainya jauh lebih besar daripada sepuluh notebook berisi potongan kode acak. Proyek ini juga memaksamu menggabungkan semua yang sudah dipelajari: Python, pandas, pola pikir SQL, dan visualisasi.
Contoh minimal: satu pertanyaan, satu jawaban
Sebelum ke proyek besar, rasakan dulu polanya dalam skala super kecil:
import pandas as pd
df = pd.DataFrame({
"produk": ["kopi", "teh", "kopi", "roti", "teh", "kopi"],
"jumlah": [2, 1, 3, 2, 4, 1],
"harga": [15000, 8000, 15000, 12000, 8000, 15000],
})
df["omzet"] = df["jumlah"] * df["harga"]
# Pertanyaan bisnis: produk apa penyumbang omzet terbesar?
print(df.groupby("produk")["omzet"].sum().sort_values(ascending=False))
# kopi jawabannya. Selesai: pertanyaan -> kode -> jawaban.Setiap analisis, sebesar apa pun, intinya pengulangan pola ini: pertanyaan bisnis, kode yang menjawab, lalu jawaban yang bisa diceritakan.
Contoh realistis: analisis kedai kopi 90 hari
Sekarang skala nyata. Kamu analyst di sebuah kedai kopi dengan file penjualan.csv (tanggal, produk, kategori, jumlah, harga). Karena ini latihan, kita generate datanya dulu:
import pandas as pd
import numpy as np
np.random.seed(42)
produk = ["Kopi Tubruk", "Es Kopi Susu", "Teh Manis", "Roti Bakar"]
tgl = pd.date_range("2026-01-01", periods=90)
df = pd.DataFrame({
"tanggal": np.random.choice(tgl, 500),
"produk": np.random.choice(produk, 500),
"jumlah": np.random.randint(1, 6, 500),
"harga": np.random.choice([15000, 18000, 8000, 12000], 500),
})
df["omzet"] = df["jumlah"] * df["harga"]
df.to_csv("penjualan.csv", index=False)Langkah wajib sebelum analisis: bersihkan dulu. Jangan pernah skip ini:
df = pd.read_csv("penjualan.csv", parse_dates=["tanggal"])
print(df.info()) # cek tipe data & missing value
print(df.describe()) # cek angka aneh (harga negatif? jumlah 0?)
print(df.isna().sum()) # hitung missing per kolomBaru jawab pertanyaan bisnisnya:
# 1. Total omzet 90 hari?
print("Omzet:", df["omzet"].sum())
# 2. Produk terlaris (berdasar jumlah terjual)?
print(df.groupby("produk")["jumlah"].sum().sort_values(ascending=False))
# 3. Tren omzet bulanan?
df["bulan"] = df["tanggal"].dt.to_period("M")
print(df.groupby("bulan")["omzet"].sum())
# 4. Hari apa paling ramai?
df["hari"] = df["tanggal"].dt.day_name()
print(df.groupby("hari")["omzet"].sum().sort_values(ascending=False))Dan visualisasikan untuk laporan (grafik berlabel lengkap, disimpan sebagai file):
import matplotlib.pyplot as plt
bulanan = df.groupby("bulan")["omzet"].sum()
bulanan.plot(kind="bar", color="#8B5CF6")
plt.title("Omzet Bulanan Kedai Kopi")
plt.ylabel("Rupiah")
plt.xticks(rotation=0)
plt.tight_layout()
plt.savefig("omzet_bulanan.png")
plt.show()Tutup dengan insight tertulis, bukan sekadar angka: "Omzet bulan Maret 18% lebih tinggi dari Februari, didorong Es Kopi Susu di akhir pekan. Saran: tambah stok susu dan jadwalkan satu barista ekstra untuk Sabtu-Minggu."
Jebakan 1: analisis tanpa cek tipe data
SALAH:
df = pd.read_csv("penjualan.csv")
print(df.sort_values("tanggal").head()) # tanggal masih string: "10" < "2", urutan kacauBENAR:
df = pd.read_csv("penjualan.csv", parse_dates=["tanggal"])
print(df.sort_values("tanggal").head()) # datetime: urutan benarKolom tanggal yang terbaca sebagai string akan merusak sorting, grouping per bulan, dan plotting. df.info() adalah kebiasaan 10 detik yang menyelamatkan jam debugging.
Jebakan 2: angka tanpa konteks dan grafik tanpa label
SALAH: "Omzet 45 juta." (dibandingkan apa? naik atau turun? bagus atau tidak?) BENAR: "Omzet 45 juta, naik 12% dibanding bulan lalu dan 8% di atas target."
Grafik pun begitu: tanpa judul, label sumbu, dan satuan, grafikmu tidak bisa dibaca orang lain. Standar output analyst: bukan kode, tapi cerita yang didukung angka.
Checklist proyek yang baik
- Data dibersihkan dulu (cek
info()dandescribe(), tangani missing value). - Setiap angka punya konteks (dibandingkan dengan apa?).
- Minimal 2 grafik berlabel lengkap, disimpan sebagai PNG.
- Ada 2-3 kalimat insight tertulis, bukan cuma angka.
- Kode berjalan dari atas sampai bawah tanpa error.
Tantangan
Hari tersibuk
Dari DataFrame penjualan proyek ini, tambahkan kolom nama hari (df['tanggal'].dt.day_name()), lalu cari hari dengan total omzet tertinggi memakai groupby. Print hasilnya.
Tugas
Tugas Akhir: Laporan Analisis Kedai Kopi
Kerjakan proyek mini di atas sampai tuntas dan kumpulkan script Python lengkap kamu. Script harus: (1) generate/membaca data penjualan, (2) membersihkan data (cek info, tangani missing value bila ada), (3) menjawab minimal 3 pertanyaan bisnis dengan groupby/agregasi, (4) menghasilkan minimal 2 grafik berlabel lengkap yang disimpan sebagai file PNG, (5) mencetak 2-3 kalimat insight di akhir via print().
Kriteria penilaian:
- Data dibersihkan sebelum dianalisis (info/describe dicek)
- Minimal 3 pertanyaan bisnis dijawab dengan agregasi
- Minimal 2 grafik dengan title dan label lengkap, tersimpan sebagai PNG
- Ada insight tertulis, bukan sekadar angka
- Kode berjalan tanpa error dari atas sampai bawah
AI tutor akan memeriksa bug, kesalahan syntax, dan memberi saran perbaikan.