Analisis pada Bagian 7 menghasilkan banyak angka, tetapi pembaca laporan tidak membutuhkan angka — mereka membutuhkan jawaban yang bisa ditindaklanjuti. Pada bagian ini kita menyusun temuan dengan disiplin tiga kolom: klaim, bukti, dan tindakan. Klaim tanpa bukti hanyalah opini; bukti tanpa tindakan hanyalah laporan statistik yang berakhir di laci. Pola penyusunan ini mempraktikkan materi chapter Menyampaikan Temuan dan Menyajikan Rekomendasi langsung pada data Toko Kopi Kita.
Tiga Kolom Wajib Setiap Temuan #
Empat temuan yang muncul dari eksplorasi dan analisis kita rangkum menjadi satu tabel. Seluruh kolom bukti diisi dari hitungan data bersih — bukan dari ingatan — sehingga setiap klaim bisa diperiksa ulang siapa pun yang menjalankan kode yang sama:
import pandas as pd
def muat_bersih(path):
"""Muat data mentah dan terapkan pembersihan hasil Bagian 5."""
df = pd.read_csv(path).drop_duplicates().reset_index(drop=True)
df["menu"] = df["menu"].str.lower()
df["gelas"] = pd.to_numeric(df["gelas"].replace("-", pd.NA))
valid = df[df["gelas"].notna() & (df["pendapatan_ribu"] > 0)]
harga = (valid["pendapatan_ribu"] / valid["gelas"]).groupby(valid["menu"]).median()
nol = df["pendapatan_ribu"] == 0
df.loc[nol, "pendapatan_ribu"] = (
df.loc[nol, "gelas"] * df.loc[nol, "menu"].map(harga)
).astype(int)
kosong = df["gelas"].isna()
df.loc[kosong, "gelas"] = (
df.loc[kosong, "pendapatan_ribu"] / df.loc[kosong, "menu"].map(harga)
)
df["gelas"] = df["gelas"].astype(int)
return df
def ribuan(nilai):
"""Format bilangan bulat dengan titik ribuan gaya Indonesia."""
return f"{int(nilai):,}".replace(",", ".")
def desimal(nilai, digit=1):
"""Format desimal dengan koma gaya Indonesia, mis. '1,57'."""
return f"{nilai:.{digit}f}".replace(".", ",")
bersih = muat_bersih("../data/penjualan_kotor.csv")
AKHIR_PEKAN = ("2026-01-10", "2026-01-11")
per_menu = bersih.groupby("menu")["pendapatan_ribu"].sum().sort_values(ascending=False)
total = per_menu.sum()
per_hari = bersih.groupby("tanggal")["pendapatan_ribu"].sum()
mask_pekan = per_hari.index.isin(AKHIR_PEKAN)
rata_pekan = per_hari[mask_pekan].mean()
rata_kerja = per_hari[~mask_pekan].mean()
anomali = per_hari["2026-01-14"]
temuan = pd.DataFrame([
{
"kode": "T1",
"temuan": "kopi susu adalah menu penopang pendapatan",
"bukti": f"{ribuan(per_menu.iloc[0])} ribu rupiah, {desimal(100 * per_menu.iloc[0] / total)}% dari total",
"tindakan": "prioritaskan belanja susu dan biji kopi setiap hari",
},
{
"kode": "T2",
"temuan": "akhir pekan jauh lebih ramai daripada hari kerja",
"bukti": f"rata-rata {ribuan(rata_pekan)} vs {ribuan(rata_kerja)} ribu per hari (rasio {desimal(rata_pekan / rata_kerja, 2)})",
"tindakan": "tambah stok dan jadwal pegawai setiap Sabtu-Minggu",
},
{
"kode": "T3",
"temuan": "Rabu 14 Januari adalah anomali penurunan tajam",
"bukti": f"{ribuan(anomali)} ribu rupiah, {desimal(100 * anomali / per_hari.mean())}% dari rata-rata harian",
"tindakan": "siapkan strategi hari hujan (promo, pesan-antar)",
},
{
"kode": "T4",
"temuan": "teh tawar menyumbang porsi terkecil",
"bukti": f"{ribuan(per_menu.iloc[-1])} ribu rupiah, {desimal(100 * per_menu.iloc[-1] / total)}% dari total",
"tindakan": "pertahankan sebagai menu pelengkap dengan stok hemat",
},
])
print("Tabel temuan - bukti - tindakan:")
for baris in temuan.itertuples():
print(f"\n{baris.kode}: {baris.temuan}")
print(f" bukti : {baris.bukti}")
print(f" tindakan: {baris.tindakan}")Output yang Dihasilkan:
Tabel temuan - bukti - tindakan:
T1: kopi susu adalah menu penopang pendapatan
bukti : 10.098 ribu rupiah, 42,7% dari total
tindakan: prioritaskan belanja susu dan biji kopi setiap hari
T2: akhir pekan jauh lebih ramai daripada hari kerja
bukti : rata-rata 2.829 vs 1.799 ribu per hari (rasio 1,57)
tindakan: tambah stok dan jadwal pegawai setiap Sabtu-Minggu
T3: Rabu 14 Januari adalah anomali penurunan tajam
bukti : 903 ribu rupiah, 45,8% dari rata-rata harian
tindakan: siapkan strategi hari hujan (promo, pesan-antar)
T4: teh tawar menyumbang porsi terkecil
bukti : 1.920 ribu rupiah, 8,1% dari total
tindakan: pertahankan sebagai menu pelengkap dengan stok hematKeempat temuan kini berdiri berdampingan, dan format cetaknya sengaja bertumpuk per temuan — satu blok kecil berisi klaim, bukti, dan tindakan — supaya mudah dibaca di terminal maupun oleh Bu Rina tanpa tabel lebar. Perhatikan juga bahwa seluruh angka pada kolom bukti persis sama dengan angka jawaban Bagian 7; tidak ada satu pun angka yang diketik manual, semuanya dihitung ulang oleh kode dari data bersih.
Dari Temuan ke Rencana Tindak Lanjut #
Sebuah tindakan baru berguna bila bisa diukur apakah berhasil. Karena itu tiap temuan kita lengkapi dua kolom tambahan: indikator pemantauan (bagaimana Bu Rina tahu tindakannya berhasil) dan pertanyaan analisis mana yang dijawab temuan tersebut. Tabel ini murni hasil penyusunan — tidak ada hitungan baru:
import pandas as pd
tindak_lanjut = pd.DataFrame({
"kode": ["T1", "T2", "T3", "T4"],
"tindakan": [
"belanja susu dan biji kopi untuk rata-rata 38 gelas kopi susu per hari",
"stok dan pegawai Sabtu-Minggu ditambah sekitar 57% dari hari kerja",
"promo minuman hangat dan layanan pesan-antar saat cuaca buruk",
"stok teh tawar secukupnya tanpa menambah porsi besar",
],
"indikator_pemantauan": [
"stok susu tidak habis sebelum tutup toko",
"rasio akhir pekan terhadap hari kerja tetap di atas 1,5",
"penjualan hari hujan tidak jatuh di bawah 60% rata-rata",
"kontribusi teh tawar diperiksa lagi setelah tiga bulan",
],
"menjawab": ["P1, P5", "P2, P3", "P4", "P1"],
})
print("Rencana tindak lanjut tiap temuan:")
for baris in tindak_lanjut.itertuples():
print(f"\n{baris.kode} -> {baris.tindakan}")
print(f" dipantau lewat : {baris.indikator_pemantauan}")
print(f" menjawab : {baris.menjawab}")Output yang Dihasilkan:
Rencana tindak lanjut tiap temuan:
T1 -> belanja susu dan biji kopi untuk rata-rata 38 gelas kopi susu per hari
dipantau lewat : stok susu tidak habis sebelum tutup toko
menjawab : P1, P5
T2 -> stok dan pegawai Sabtu-Minggu ditambah sekitar 57% dari hari kerja
dipantau lewat : rasio akhir pekan terhadap hari kerja tetap di atas 1,5
menjawab : P2, P3
T3 -> promo minuman hangat dan layanan pesan-antar saat cuaca buruk
dipantau lewat : penjualan hari hujan tidak jatuh di bawah 60% rata-rata
menjawab : P4
T4 -> stok teh tawar secukupnya tanpa menambah porsi besar
dipantau lewat : kontribusi teh tawar diperiksa lagi setelah tiga bulan
menjawab : P1Mari kita bedah kedua blok di atas:
- Daftar kamus menjadi baris:
pd.DataFrame([...])menerima daftar kamus; satu kamus menjadi satu baris, dan kunci kamus menjadi nama kolom. Cara ini enak dibaca karena satu temuan tertulis utuh dalam satu blok. - Fungsi
ribuandandesimal: keduanya memformat angka mengikuti kebiasaan Indonesia —10.098dengan titik ribuan dan1,57dengan koma desimal — persis seperti angka yang akan tertulis di laporan akhir. Membaca “2.829 vs 1.799” lebih wajar bagi Bu Rina daripada “2829.0 vs 1799.1”. itertuples()dua kali dengan format berbeda: tabel pertama mencetak klaim-bukti-tindakan bertumpuk, tabel kedua mencetak tindakan-indikator-pertanyaan. Dua tabel itu saling melengkapi, bukan mengulang.- Kolom
menjawab: menjaga jejak balik ke Bagian 2. Kelima pertanyaan (P1-P5) terpetakan habis: P1 dan P5 ke T1 dan T4, P2 dan P3 ke T2, P4 ke T3. Tidak ada pertanyaan yang menggantung tanpa temuan.
Narasi di Balik Tabel #
Tabel menyiapkan bahan, tetapi Bu Rina akan membaca laporan sebagai cerita. Narasinya bisa dirangkai sepanjang empat langkah temuan tadi: penjualan Toko Kopi Kita ditopang kopi susu yang menyumbang 42,7% pendapatan (T1), sehingga susu dan biji kopi adalah belanja paling menentukan. Kedua hari akhir pekan terbukti jauh lebih ramai — rata-rata 1,57 kali hari kerja (T2) — sehingga pekan depan belanja dan pegawai Sabtu-Minggu perlu porsi lebih besar. Di tengah pola itu, Rabu 14 Januari menyimpang sebagai hari tersepi akibat hujan deras seharian (T3), pengingat bahwa cuaca buruk butuh rencana cadangan, bukan panik. Sementara teh tawar tetap dipertahankan sebagai pilihan murah bagi pelanggan non-kopi meskipun kontribusinya kecil (T4) — menu kecil pun punya peran menjaga keragaman. Empat kalimat ini adalah inti dari ringkasan eksekutif yang akan kita tulis pada laporan akhir.
Satu hal penting untuk tetap jujur: T2 berdiri di atas rata-rata dua hari akhir pekan saja. Kami mencatat keterbatasan ini di laporan sebagai bagian dari catatan kualitas data, dan rekomendasi untuk memantau rasionya beberapa pekan ke depan sebelum menjadi kebijakan tetap.
Dengan tabel temuan, rencana tindak lanjut, dan narasi yang sudah tersusun, bahan laporan lengkap. Tugas terakhir tinggal menuliskannya menjadi dokumen yang rapi dan siap dibaca — kita kerjakan pada Bagian 10: Menyusun Laporan .