pythonpandasproyekMahir5 mnt baca

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:

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

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

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

Baru jawab pertanyaan bisnisnya:

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

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

python
df = pd.read_csv("penjualan.csv")
print(df.sort_values("tanggal").head())  # tanggal masih string: "10" < "2", urutan kacau

BENAR:

python
df = pd.read_csv("penjualan.csv", parse_dates=["tanggal"])
print(df.sort_values("tanggal").head())  # datetime: urutan benar

Kolom 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

  1. Data dibersihkan dulu (cek info() dan describe(), tangani missing value).
  2. Setiap angka punya konteks (dibandingkan dengan apa?).
  3. Minimal 2 grafik berlabel lengkap, disimpan sebagai PNG.
  4. Ada 2-3 kalimat insight tertulis, bukan cuma angka.
  5. 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.