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.

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

text
== 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 kolom

Mari kita telaah bagian-bagian pentingnya:

  1. bulanan: resample("ME").mean() dirapikan dengan strftime("%Y-%m"), round(0), dan astype("int64") agar terbaca sebagai rupiah bulat; idxmax() menunjuk bulan termahal cabai, 2026-02.
  2. basis100: pembagian harian / harian.iloc[0] * 100 menormalisasi setiap kolom terhadap 1 Januari, lalu resample("ME").last() mengambil nilai akhir bulan dan strftime merapikan labelnya.
  3. korelasi: corr(numeric_only=True) menghasilkan matriks Pearson 5 x 5; diagonalnya 1.00 karena setiap kolom berkorelasi sempurna dengan dirinya sendiri.
  4. Penyaringan diagonal: korelasi.where(~np.eye(len(korelasi), dtype=bool)) menetapkan diagonal menjadi NaN, lalu stack() memipihkan matriks menjadi 20 pasangan nilai; idxmax() dan idxmin() menemukan pasangan terkuat dan terlemah.
  5. Temuan utama: idxmax() dan idxmin() pada perubahan total memilih kenaikan tertinggi dan terendah, sedangkan puncak bulanan cabai diambil dari tabel_bulanan.
  6. Ekspor: to_csv() dengan index_label="bulan" dan index_label="komoditas" menulis dua berkas ke tempfile.TemporaryDirectory(), kemudian read_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 .