Selama section ini kita mengumpulkan alat satu per satu: resample() untuk mengubah granularitas, rolling() dan expanding() untuk meratakan serta mengakumulasi, shift() dan pct_change() untuk membandingkan antarperiode, ditambah asfreq() dan interpolate() untuk melengkapi kalender. Kini saatnya menyusunnya menjadi satu alur kerja analisis yang utuh pada dataset penjualan harian sepanjang Januari-Maret 2026. Skrip penutup ini menjawab tiga pertanyaan khas deret waktu: seberapa cepat pertumbuhan bulanan, bagaimana bentuk tren harian di balik fluktuasinya, dan kapan rekor terjadi. Kita tutup dengan grafik tren sederhana, lalu jembatani belajar kita ke section berikutnya.

Dataset dan Alur Analisis #

Dataset yang sama kita bangun dari rumus yang sudah akrab: basis 200 unit, tren naik 2 unit per hari, dan tambahan 80 unit pada Sabtu-Minggu. Karena datanya sepenuhnya deterministik, setiap angka pada output dapat Anda periksa ulang dengan tangan. Alur analisisnya tiga tahap: ringkas per bulan dengan resample(), bandingkan antarbulan dengan shift() dan pct_change(), lalu peratakan granularitas harian dengan rolling() dan expanding(). Halaman user guide timeseries merangkum semua alat tersebut dalam satu referensi, dan pandas.DataFrame.resample merinci parameter agregasi yang kita pakai pada tahap pertama.

python
import matplotlib

matplotlib.use("Agg")
import numpy as np
import pandas as pd
from pathlib import Path

kalender = pd.date_range("2026-01-01", "2026-03-31", freq="D")
penjualan = pd.Series(
    200 + 2 * np.arange(len(kalender)) + np.where(kalender.dayofweek >= 5, 80, 0),
    index=kalender,
    name="penjualan",
)
df = penjualan.to_frame()

bulanan = df.resample("ME").sum()
bulanan["bulan_lalu"] = bulanan["penjualan"].shift(1)
bulanan["pertumbuhan_pct"] = bulanan["penjualan"].pct_change().mul(100).round(1)
print("Total penjualan per bulan dan pertumbuhannya:")
print(bulanan)

df["rata_7hari"] = df["penjualan"].rolling(7).mean().round(1)
df["rata_kumulatif"] = df["penjualan"].expanding().mean().round(1)
print("\nLima baris pertama hasil perataan:")
print(df.head(5))

rekor = df["penjualan"].expanding().max()
jumlah_rekor = int((df["penjualan"] == rekor).sum())
print("\nJumlah hari yang memecahkan rekor penjualan:", jumlah_rekor)
print("Hari dengan penjualan tertinggi:", df["penjualan"].idxmax().date())

ax = df[["penjualan", "rata_7hari"]].plot.line(figsize=(8, 4))
ax.get_figure().savefig("tren_penjualan.png", dpi=100)
print("\nGrafik tren tersimpan sebagai tren_penjualan.png")

Path("tren_penjualan.png").unlink()

Output yang Dihasilkan:

text
Total penjualan per bulan dan pertumbuhannya:
            penjualan  bulan_lalu  pertumbuhan_pct
2026-01-31       7850         NaN              NaN
2026-02-28       8732      7850.0             11.2
2026-03-31      11508      8732.0             31.8

Lima baris pertama hasil perataan:
            penjualan  rata_7hari  rata_kumulatif
2026-01-01        200         NaN           200.0
2026-01-02        202         NaN           201.0
2026-01-03        284         NaN           228.7
2026-01-04        286         NaN           243.0
2026-01-05        208         NaN           236.0

Jumlah hari yang memecahkan rekor penjualan: 28
Hari dengan penjualan tertinggi: 2026-03-29

Grafik tren tersimpan sebagai tren_penjualan.png

Mari kita telaah baris-baris kuncinya:

  1. Baris 1-6: backend matplotlib diarahkan ke Agg sebelum modul lain dipakai, sehingga grafik dirender ke file tanpa memerlukan tampilan layar.
  2. Baris 8-13: 90 hari kalender Januari-Maret 2026 dibangun dari rumus tren dan akhir pekan, lalu to_frame() mengemasnya menjadi DataFrame.
  3. Baris 16-18 (tren bulanan): resample("ME").sum() menjumlahkan per bulan; shift(1) menempelkan total bulan sebelumnya; pct_change().mul(100).round(1) mengubah kenaikan menjadi persen.
  4. Baris 22-23 (perataan): rolling(7).mean() meredam fluktuasi mingguan, dan expanding().mean() mengikuti rata-rata kumulatif sejak awal periode.
  5. Baris 27-30 (rekor): expanding().max() menjadi patokan untuk menghitung hari rekor, dan idxmax() menemukan tanggal penjualan tertinggi.
  6. Baris 32-36 (visualisasi): dua kolom utama diplot sebagai garis, disimpan sementara sebagai PNG, lalu file tersebut dihapus agar bundle tetap bersih.

Membaca Hasil Analisis #

Blok pertama output menjawab pertanyaan pertumbuhan: total penjualan naik dari 7850 pada Januari ke 8732 pada Februari (11.2 persen), lalu melonjak ke 11508 pada Maret (31.8 persen). Lonjakan Maret lebih tajam karena bulan itu memiliki 31 hari, bukan 28, sehingga lebih banyak hari dengan basis tren yang tinggi — perbandingan bulanan selalu perlu mempertimbangkan panjang bulan. Blok kedua memperlihatkan perataan bekerja: rata_7hari masih NaN selama enam hari pertama karena jendela belum penuh, sementara rata_kumulatif langsung terisi mulai 200.0.

Angka rekor melengkapi ceritanya: 28 hari memecahkan rekor penjualan sepanjang kuartal, dan tanggal tertingginya adalah 2026-03-29. Angka itu wajar untuk dataset bertren naik — hampir setiap akhir pekan menetapkan rekor baru karena basis harian terus bertambah. Pola seperti ini adalah sinyal khas deret waktu: tren jangka panjang menutupi variasi harian, sehingga perataan rolling(7) dan agregasi resample("ME") sama-sama diperlukan untuk membaca keduanya pada skala yang tepat.

Dari Angka ke Grafik #

Baris terakhir skrip membuat grafik garis berisi penjualan harian dan rata-rata tujuh harinya. Grafik semacam ini memvisualkan apa yang sudah kita hitung: garis harian bergelombang mengikuti pola akhir pekan, sedangkan garis rata-rata menanjak dengan landai mengikuti tren. Skrip menyimpannya sebagai tren_penjualan.png untuk menunjukkan pola kerjanya, lalu langsung menghapus file tersebut karena bundle chapter hanya menyimpan kode, bukan artefak hasil eksekusi.

Perjalanan section Data Waktu dan Deret Waktu sampai di sini: kita mengubah teks menjadi datetime, menjadikannya index, mengatur granularitas dengan resample dan frekuensi, meratakan dengan rolling, expanding, dan ewm, membandingkan periode dengan shift dan diff, menata zona waktu, hingga menambal kalender yang bolong. Seluruh dataset yang kita olah pun berupa angka murni, padahal data nyata selalu membawa teks: nama produk, kategori barang, dan kota pengiriman. Section berikutnya, Data Teks dan Kategori, membahas pengolahan kolom tersebut; chapter pembukanya, String Methods pada Kolom, mengenalkan accessor .str untuk membersihkan dan mengolah teks langsung di dalam pandas.