Bagian penutup proyek ini mengumpulkan semua hasil sebelumnya menjadi satu ringkasan yang bisa dilampirkan ke laporan manajemen: satu baris per outlet berisi total, rata-rata harian, bulan terbaik dan terburuk, serta pertumbuhan. Kita juga menyusun pivot bulan x outlet dari sisi sebaliknya, mencetak narasi temuan bernomor yang angkanya dihitung dari data, dan mengekspor tabel ringkasan ke CSV. Setelah itu, proyek sekaligus seluruh rangkaian section proyek course pandas resmi tuntas.

Tabel Ringkasan per Outlet #

python
"""Menyusun ringkasan deret waktu penjualan Toko Roti Manis.

Membangun tabel ringkasan per outlet (total, rata-rata harian, bulan
terbaik dan terburuk, pertumbuhan), pivot rata-rata harian bulan x
outlet, mencetak narasi temuan bernomor, dan mengekspor ringkasan ke CSV.
"""
import tempfile
from pathlib import Path

import pandas as pd

from buat_dataset import muat_bersih

if __name__ == "__main__":
    bersih = muat_bersih()
    bulanan = bersih.groupby("outlet").resample("ME")["omzet"].sum()

    print("== Tabel ringkasan per outlet ==")
    baris = []
    for outlet, omzet in bersih.groupby("outlet")["omzet"]:
        bulan = bulanan.xs(outlet, level=0)
        baris.append({
            "outlet": outlet,
            "total_juta": round(omzet.sum() / 1_000_000, 1),
            "rata_harian": round(omzet.mean() / 1_000_000, 2),
            "bulan_terbaik": bulan.idxmax().strftime("%Y-%m"),
            "bulan_terburuk": bulan.idxmin().strftime("%Y-%m"),
            "tumbuh_pct": round((bulan.iloc[-1] / bulan.iloc[0] - 1) * 100, 1),
        })
    ringkas = pd.DataFrame(baris)
    print(ringkas.to_string(index=False))

    print("\n== Pivot rata-rata omzet harian, bulan x outlet (juta rupiah) ==")
    harian = bersih.copy()
    harian["bulan"] = harian.index.strftime("%Y-%m")
    rata = harian.pivot_table(
        index="bulan", columns="outlet", values="omzet", aggfunc="mean",
    )
    print((rata / 1_000_000).round(2).to_string())

    print("\n== Temuan utama ==")
    total = int(bersih["omzet"].sum())
    pangsa = bersih.groupby("outlet")["omzet"].sum() / total * 100
    kem = ringkas.loc[ringkas["outlet"] == "Kemang"].iloc[0]
    mal = ringkas.loc[ringkas["outlet"] == "Malioboro"].iloc[0]
    ci = ringkas.loc[ringkas["outlet"] == "Cihampelas"].iloc[0]
    kem_sep = bulanan.xs("Kemang", level=0).iloc[-1] / 1_000_000
    print(f"1. Kemang tumbuh tercepat: omzet September {kem_sep:.1f} juta "
          f"({kem['tumbuh_pct']:+.1f}% vs April).")
    print(f"2. Malioboro menurun: {mal['tumbuh_pct']:+.1f}% sejak April; bulan "
          f"terburuknya {mal['bulan_terburuk']}.")
    print(f"3. Cihampelas stabil di sekitar {ci['rata_harian']:.2f} juta per hari "
          f"({ci['tumbuh_pct']:+.1f}% sejak April).")
    posisi_puncak = bersih["omzet"].idxmax()
    print("4. Hari terbaik setiap outlet jatuh pada akhir pekan.")
    print(f"   Puncak jaringan: {posisi_puncak.day_name()} "
          f"{posisi_puncak.strftime('%Y-%m-%d')} di Kemang "
          f"({int(bersih['omzet'].max()):,}).")
    print(f"5. Total enam bulan jaringan: {total:,} dengan kontribusi Kemang "
          f"{pangsa['Kemang']:.1f}%.")

    print("\n== Ekspor ringkasan ==")
    with tempfile.TemporaryDirectory() as folder:
        berkas = Path(folder) / "ringkasan_outlet.csv"
        ringkas.to_csv(berkas, index=False)
        cek = pd.read_csv(berkas)
        print(f"ringkasan_outlet.csv: {cek.shape[0]} baris x {cek.shape[1]} kolom "
              f"({berkas.stat().st_size} byte)")

Output yang Dihasilkan:

text
== Tabel ringkasan per outlet ==
    outlet  total_juta  rata_harian bulan_terbaik bulan_terburuk  tumbuh_pct
Cihampelas       648.2         3.54       2026-07        2026-04         2.4
    Kemang       932.4         5.10       2026-09        2026-04        24.2
 Malioboro       462.2         2.53       2026-05        2026-09       -11.2

== Pivot rata-rata omzet harian, bulan x outlet (juta rupiah) ==
outlet   Cihampelas  Kemang  Malioboro
bulan                                 
2026-04        3.50    4.53       2.71
2026-05        3.46    4.81       2.65
2026-06        3.60    5.06       2.51
2026-07        3.56    5.14       2.47
2026-08        3.54    5.41       2.41
2026-09        3.59    5.62       2.41

== Temuan utama ==
1. Kemang tumbuh tercepat: omzet September 168.7 juta (+24.2% vs April).
2. Malioboro menurun: -11.2% sejak April; bulan terburuknya 2026-09.
3. Cihampelas stabil di sekitar 3.54 juta per hari (+2.4% sejak April).
4. Hari terbaik setiap outlet jatuh pada akhir pekan.
   Puncak jaringan: Sunday 2026-09-27 di Kemang (6,870,800).
5. Total enam bulan jaringan: 2,042,813,200 dengan kontribusi Kemang 45.6%.

== Ekspor ringkasan ==
ringkasan_outlet.csv: 3 baris x 6 kolom (193 byte)

Mari kita telaah bagian-bagian pentingnya:

  1. Loop bersih.groupby("outlet")["omzet"]: setiap outlet menghasilkan satu dict — total dalam juta rupiah, rata-rata harian, bulan terbaik dan terburuk dari idxmax()/idxmin() atas rekap bulanan, dan tumbuh_pct yang membandingkan September dengan April.
  2. pd.DataFrame(baris): daftar dict menjadi tabel ringkasan 3 baris x 6 kolom; pola kumpulkan-ke-dict-lalu-jadikan-DataFrame ini menjaga setiap metrik tetap mudah diuji.
  3. pivot_table(index="bulan", columns="outlet", ...): kini bulan menjadi baris dan outlet menjadi kolom, sehingga laju Kemang (4,53 menjadi 5,62 juta) dan peluruhan Malioboro (2,71 menjadi 2,41 juta) terbaca berdampingan per baris bulan.
  4. Narasi “Temuan utama”: lima temuan dicetak dengan f-string dari angka yang dihitung, bukan ditulis tangan — termasuk puncak jaringan Minggu 2026-09-27 di Kemang (6.870.800) dan pangsa Kemang 45,6% dari total 2.042.813.200.
  5. Ekspor CSV: ringkas.to_csv() menulis ringkasan_outlet.csv ke TemporaryDirectory, dibaca ulang dengan read_csv() untuk memastikan 3 baris x 6 kolom, lalu folder sementara terhapus otomatis.

Empat bagian proyek kini tertutup lengkap: Bagian 1 mengubah 546 baris mentah menjadi deret harian bersih 549 baris, Bagian 2 meringkasnya ke periode mingguan dan bulanan, Bagian 3 membaca arah tren tiap outlet, dan Bagian 4 merangkum semuanya menjadi tabel serta narasi siap lapor. Dengan selesainya proyek ini, keenam proyek pada section proyek course pandas — dari Analisis Penjualan hingga Analisis Deret Waktu Penjualan — sudah bisa Anda kerjakan dari ujung ke ujung.

Bila teknik deret waktunya masih terasa rapat, ulangi chapter kunci pada section Data Waktu dan Deret Waktu: Datetime Index, Resampling Data, Rolling Window, dan Menangani Data Waktu yang Hilang. Bila seluruh materi terasa kokoh, section Sumber Belajar menanti dengan lembar contekan, dataset latihan tambahan, dan glosarium untuk menutup perjalanan belajar pandas Anda.

Sumber bacaan resmi: pandas.DataFrame.groupby , pandas.DataFrame.to_csv , dan User Guide: Time series / date functionality .