Bagian 3 telah mengukur perubahan harga tiap komoditas secara terpisah, tetapi membandingkan komoditas satu dengan yang lain menuntut langkah tambahan: harga cabai sekitar Rp55.000 per kg bergerak pada skala yang berbeda dari minyak goreng sekitar Rp17.500 per liter, sehingga selisih rupiah tidak memberi perbandingan yang adil. Pada bagian penutup proyek ini kita merangkum matriks harian menjadi rata-rata bulanan dengan resample("ME"), menyamakan titik awal seluruh komoditas lewat indeks basis 100, dan mengukur ketergerakan bersama dengan korelasi. Skrip penutup ini juga mengekspor dua berkas CSV ringkasan sebagai keluaran akhir proyek. Setelah bagian ini, satu proyek analisis data telah kita tuntaskan dari berkas mentah hingga temuan.
Rata-rata Bulanan dan Indeks Basis 100 #
resample("ME") mengelompokkan baris matriks harian per akhir bulan (Month End), dan mean() merata-ratakan harga harian di dalam bulan; strftime("%Y-%m") mengubah label Timestamp menjadi teks ringkas seperti 2026-02. Rata-rata bulanan membuat lonjakan cabai pada Bagian 3 tampak utuh: Februari tercatat Rp77.242, sekitar 40 persen di atas Januari Rp54.951, lalu harga kembali ke Rp57.883 pada Maret.
Indeks basis 100 menyamakan titik awal: seluruh matriks dibagi harga 1 Januari, yaitu harian.iloc[0], lalu dikalikan 100. Pembagian DataFrame dengan Series di-broadcast per kolom, materi chapter Operasi Aritmetika, sehingga setiap komoditas dinormalisasi terhadap harga awalnya sendiri. Metode resample("ME").last() mengambil nilai indeks terakhir tiap bulan. Pada tabelnya, cabai berdiri di 122.9 akhir Februari — naik 22.9 persen sejak 1 Januari — sementara minyak goreng nyaris diam di sekitar 100.0.
Menjalankan Skrip Pembanding #
Skrip bandingkan_komoditas.py memanggil matriks_harian() dari buat_dataset.py — teknik Bagian 3 yang kini tersedia sebagai fungsi siap pakai — lalu menampilkan tabel bulanan, indeks, matriks korelasi, temuan utama, dan hasil ekspor dalam satu kali eksekusi.
"""Membandingkan komoditas: rata-rata bulanan, indeks basis 100, dan korelasi."""
from pathlib import Path
import tempfile
import numpy as np
import pandas as pd
from buat_dataset import bersihkan, buat_dataset, matriks_harian
if __name__ == "__main__":
with tempfile.TemporaryDirectory() as folder:
berkas = Path(folder) / "harga_komoditas.csv"
buat_dataset().to_csv(berkas, index=False)
mentah = pd.read_csv(berkas)
df = bersihkan(mentah)
harian = matriks_harian(df)
bulanan = harian.resample("ME").mean()
bulanan.index = bulanan.index.strftime("%Y-%m")
tabel_bulanan = bulanan.round(0).astype("int64")
print("== Harga rata-rata bulanan (rupiah) ==")
print(tabel_bulanan.to_string())
print(f"bulan termahal cabai: {tabel_bulanan['Cabai Merah Keriting'].idxmax()}")
basis100 = harian / harian.iloc[0] * 100
akhir_bulan = basis100.resample("ME").last()
akhir_bulan.index = akhir_bulan.index.strftime("%Y-%m")
print("\n== Indeks basis 100 per akhir bulan (1 Jan = 100) ==")
print(akhir_bulan.round(1).to_string())
korelasi = harian.corr(numeric_only=True)
print("\n== Korelasi antar komoditas ==")
print(korelasi.round(2).to_string())
off_diagonal = korelasi.where(~np.eye(len(korelasi), dtype=bool)).stack()
a, b = off_diagonal.idxmax()
print(f"korelasi terkuat : {a} x {b} ({off_diagonal.max():.2f})")
a, b = off_diagonal.idxmin()
print(f"korelasi terlemah: {a} x {b} ({off_diagonal.min():.2f})")
total = (harian.iloc[-1] / harian.iloc[0] - 1) * 100
print("\n== Temuan utama ==")
print(f"kenaikan tertinggi : {total.idxmax()} (+{total.max():.1f}%)")
print(f"kenaikan terendah : {total.idxmin()} (+{total.min():.1f}%)")
puncak_cabai = tabel_bulanan["Cabai Merah Keriting"].max()
print(f"puncak bulanan cabai: 2026-02 (rata-rata Rp{puncak_cabai:,})")
with tempfile.TemporaryDirectory() as folder:
berkas_bulanan = Path(folder) / "ringkasan_bulanan.csv"
tabel_bulanan.to_csv(berkas_bulanan, index_label="bulan")
berkas_korelasi = Path(folder) / "korelasi_komoditas.csv"
korelasi.round(4).to_csv(berkas_korelasi, index_label="komoditas")
baca_bulanan = pd.read_csv(berkas_bulanan)
baca_korelasi = pd.read_csv(berkas_korelasi)
print("\n== Ekspor ringkasan ==")
print(
f"ringkasan_bulanan.csv : {baca_bulanan.shape[0]} baris x "
f"{baca_bulanan.shape[1]} kolom"
)
print(
f"korelasi_komoditas.csv: {baca_korelasi.shape[0]} baris x "
f"{baca_korelasi.shape[1]} kolom"
)Output yang Dihasilkan:
== Harga rata-rata bulanan (rupiah) ==
komoditas Bawang Merah Beras Premium Cabai Merah Keriting Gula Pasir Minyak Goreng Kemasan
tanggal
2026-01 38152 15653 54951 18154 17557
2026-02 38322 15984 77242 18417 17560
2026-03 38551 16212 57883 18700 17628
bulan termahal cabai: 2026-02
== Indeks basis 100 per akhir bulan (1 Jan = 100) ==
komoditas Bawang Merah Beras Premium Cabai Merah Keriting Gula Pasir Minyak Goreng Kemasan
tanggal
2026-01 99.3 101.6 101.0 101.1 100.0
2026-02 100.6 104.8 122.9 102.0 100.0
2026-03 100.9 106.4 106.3 103.4 100.1
== Korelasi antar komoditas ==
komoditas Bawang Merah Beras Premium Cabai Merah Keriting Gula Pasir Minyak Goreng Kemasan
komoditas
Bawang Merah 1.00 0.45 0.08 0.51 0.20
Beras Premium 0.45 1.00 0.23 0.82 0.34
Cabai Merah Keriting 0.08 0.23 1.00 0.17 -0.10
Gula Pasir 0.51 0.82 0.17 1.00 0.31
Minyak Goreng Kemasan 0.20 0.34 -0.10 0.31 1.00
korelasi terkuat : Beras Premium x Gula Pasir (0.82)
korelasi terlemah: Cabai Merah Keriting x Minyak Goreng Kemasan (-0.10)
== Temuan utama ==
kenaikan tertinggi : Beras Premium (+6.4%)
kenaikan terendah : Minyak Goreng Kemasan (+0.1%)
puncak bulanan cabai: 2026-02 (rata-rata Rp77,242)
== Ekspor ringkasan ==
ringkasan_bulanan.csv : 3 baris x 6 kolom
korelasi_komoditas.csv: 5 baris x 6 kolomMari kita telaah bagian-bagian pentingnya:
bulanan:resample("ME").mean()dirapikan denganstrftime("%Y-%m"),round(0), danastype("int64")agar terbaca sebagai rupiah bulat;idxmax()menunjuk bulan termahal cabai,2026-02.basis100: pembagianharian / harian.iloc[0] * 100menormalisasi setiap kolom terhadap 1 Januari, laluresample("ME").last()mengambil nilai akhir bulan danstrftimemerapikan labelnya.korelasi:corr(numeric_only=True)menghasilkan matriks Pearson 5 x 5; diagonalnya 1.00 karena setiap kolom berkorelasi sempurna dengan dirinya sendiri.- Penyaringan diagonal:
korelasi.where(~np.eye(len(korelasi), dtype=bool))menetapkan diagonal menjadi NaN, lalustack()memipihkan matriks menjadi 20 pasangan nilai;idxmax()danidxmin()menemukan pasangan terkuat dan terlemah. - Temuan utama:
idxmax()danidxmin()pada perubahan total memilih kenaikan tertinggi dan terendah, sedangkan puncak bulanan cabai diambil daritabel_bulanan. - Ekspor:
to_csv()denganindex_label="bulan"danindex_label="komoditas"menulis dua berkas ketempfile.TemporaryDirectory(), kemudianread_csv()membaca ulang keduanya; bentuk 3 x 6 dan 5 x 6 mencakup kolom index ditambah lima kolom komoditas.
Membaca Temuan Perbandingan #
Korelasi melengkapi cerita Bagian 3. Pasangan terkuat adalah Beras Premium dan Gula Pasir dengan 0.82: dua bahan pokok ini naik pelan dan konsisten sepanjang periode sehingga bergerak searah. Pasangan terlemah adalah Cabai Merah Keriting dan Minyak Goreng Kemasan dengan -0.10: lonjakan cabai sifatnya spesifik pada pasokan komoditas itu, bukan kenaikan harga umum, sehingga pergerakannya lepas dari komoditas lain.
Indeks basis 100 memberi perbandingan akhir yang setara: beras naik ke 106.4, gula ke 103.4, cabai kembali ke 106.3 setelah puncak 122.9, dan minyak goreng tinggal di 100.1. Perlu diingat, korelasi mengukur ketergerakan, bukan sebab-akibat; angka 0.82 tidak menyatakan beras menyebabkan gula naik, melainkan bahwa keduanya mengikuti pola waktu yang mirip.
Dengan tabel bulanan, indeks basis 100, matriks korelasi, dan dua berkas CSV ringkasan, proyek Analisis Harga Komoditas selesai: dataset mentah 1313 baris penuh masalah kini menjadi temuan yang siap dilaporkan. Proyek berikutnya mengajak kita menganalisis catatan harian stasiun cuaca pada Proyek: Analisis Data Cuaca, dimulai dari Bagian 1: Membaca Data Cuaca — keahlian yang sama, karakter data yang berbeda.
Sumber bacaan resmi: pandas.DataFrame.corr , pandas.DataFrame.resample , dan pandas.DataFrame.to_csv .