Analisis sampai titik ini hidup di dalam tabel, dan tabel memang alat yang baik untuk verifikasi — tetapi buruk untuk bercerita. Mata Bu Warni akan lebih cepat menangkap “bukit” harga cabai dari satu garis merah daripada dari delapan angka, dan kebanyakan pembaca laporan bersikap serupa. Bagian ini menggambar tiga grafik yang memikul temuan proyek: grafik garis pergerakan lima komoditas, perbesaran empat komoditas lainnya, dan grafik batang peringkat gejolak dari Bagian 8. Seluruh blok tetap berdiri sendiri dengan resep pembersihan Bagian 4, dan tiap grafik kita bacakan bentuknya — gambar tanpa pembacaan mudah salah tafsir.
Grafik Garis Lima Komoditas dalam Satu Bidang #
Pergerakan sepanjang waktu digambar sebagai grafik garis (line chart): sumbu mendatar menampung pekan M1–M8, sumbu tegak menampung harga, dan tiap komoditas menjadi satu garis berpenanda. Warna dan penanda berpasangan supaya tiap garis tetap terbedakan meski grafik dicetak tanpa warna; legend menjadi kunci bacanya. Prinsip memilih bentuk grafik sesuai data dibahas pada chapter Memilih Jenis Grafik ; berikut penerapannya:
import matplotlib.pyplot as plt
import pandas as pd
# Resep pembersihan Bagian 4: 41 baris mentah menjadi 40 baris bersih.
df = pd.read_csv("../data/harga_komoditas.csv")
df = df.drop_duplicates(subset=["minggu", "komoditas"], keep="first").copy()
df["komoditas"] = df["komoditas"].str.strip().str.lower()
df["harga_rata_ribu"] = pd.to_numeric(df["harga_rata_ribu"], errors="coerce")
df = df.sort_values(["komoditas", "minggu"])
df["harga_rata_ribu"] = df.groupby("komoditas")["harga_rata_ribu"].transform(
lambda s: s.interpolate()
)
pivot = df.pivot(index="minggu", columns="komoditas", values="harga_rata_ribu")
warna_komoditas = {
"ayam broiler": "tab:blue",
"bawang merah": "tab:orange",
"beras": "tab:green",
"cabai merah": "tab:red",
"gula pasir": "tab:purple",
}
fig, ax = plt.subplots(figsize=(7.5, 4))
for komoditas, warna in warna_komoditas.items():
ax.plot(pivot.index, pivot[komoditas], color=warna, marker="o", label=komoditas)
ax.set_title("Harga Lima Komoditas Warung Bu Warni, M1-M8 2026")
ax.set_xlabel("Pekan")
ax.set_ylabel("Harga (ribu rupiah per kg)")
ax.grid(True)
ax.legend(title="Komoditas")
plt.show()Grafik yang muncul memuat lima garis berpenanda lingkaran pada rentang harga 13 sampai 78 ribu rupiah. Garis cabai merah mendominasi pemandangan: dari 38.0 garis tersebut bergerak nyaris datar selama tiga pekan, melompat ke 65.0 lalu 78.0 pada M4–M5, kemudian menuruni tangga 55.0, 44.0, sampai 40.0 pada M8 — bentuk bukit yang sejak Bagian 5 kita kenal. Empat garis lainnya berdesakan di pita bawah: bawang merah berayun di kisaran 30.0–36.0, ayam broiler menaiki tangga landai dari 33.0 menuju 35.2, sementara beras dan gula pasir nyaris merupakan garis mendatar di sekitar 13 dan 17.5. Satu bidang ini langsung menjawab pertanyaan terbesar proyek: satu komoditas berperilaku sama sekali berbeda dari empat yang lain.
Memperbesar Empat Komoditas Lainnya #
Pada bidang pertama, beras dan gula pasir tampak sebagai garis mendatar — bukan karena harganya benar-benar tidak bergerak, melainkan karena sumbu tegak direnggangkan sampai 78 demi menampung cabai merah. Ketika cabai merah dikeluarkan, empat komoditas sisanya bisa digambar dengan sumbu yang jauh lebih rapat sehingga detailnya terbaca:
import matplotlib.pyplot as plt
import pandas as pd
# Resep pembersihan Bagian 4: 41 baris mentah menjadi 40 baris bersih.
df = pd.read_csv("../data/harga_komoditas.csv")
df = df.drop_duplicates(subset=["minggu", "komoditas"], keep="first").copy()
df["komoditas"] = df["komoditas"].str.strip().str.lower()
df["harga_rata_ribu"] = pd.to_numeric(df["harga_rata_ribu"], errors="coerce")
df = df.sort_values(["komoditas", "minggu"])
df["harga_rata_ribu"] = df.groupby("komoditas")["harga_rata_ribu"].transform(
lambda s: s.interpolate()
)
pivot = df.pivot(index="minggu", columns="komoditas", values="harga_rata_ribu")
warna_komoditas = {
"ayam broiler": "tab:blue",
"bawang merah": "tab:orange",
"beras": "tab:green",
"cabai merah": "tab:red",
"gula pasir": "tab:purple",
}
empat_lainnya = ["bawang merah", "ayam broiler", "beras", "gula pasir"]
fig, ax = plt.subplots(figsize=(7.5, 4))
for komoditas in empat_lainnya:
ax.plot(
pivot.index,
pivot[komoditas],
color=warna_komoditas[komoditas],
marker="o",
label=komoditas,
)
ax.set_title("Harga Empat Komoditas Lainnya, M1-M8 2026")
ax.set_xlabel("Pekan")
ax.set_ylabel("Harga (ribu rupiah per kg)")
ax.grid(True)
ax.legend(title="Komoditas")
plt.show()Tanpa cabai merah, sumbu tegak berhenti di kisaran 36 dan empat garis pun leluasa. Gelombang bawang merah kini terbaca jelas: naik ke 36.0 pada M4, surut berturut ke 33.0, 32.5, dan 32.0 pada M5–M7, lalu menutup dengan lompatan kecil ke 35.0 pada M8. Tangga ayam broiler juga terlihat — tujuh anak tangga kecil yang nyaris tanpa jeda dari 33.0 menuju 35.2, satu-satunya pergerakan yang terus menaik. Beras dan gula pasir tetap mendatar; kini kelandaiannya bisa dipercaya karena skala sumbunya memang rapat. Kedua grafik garis saling melengkapi: bidang pertama menangkap dominasi cabai merah, bidang kedua menangkap detail empat komoditas lainnya.
Peringkat Gejolak dalam Grafik Batang #
Untuk membandingkan satu ukuran lintas kategori, bentuk andalannya adalah grafik batang (bar chart). Kita menggambar cv dari Bagian 8 dalam urutan menurun sehingga ceritanya terbaca dari kiri ke kanan: batang pertama adalah komoditas paling bergejolak. Batang cabai merah diberi warna merah agar mata langsung jatuh ke komoditas yang perlu diawasi, garis putus-putus pada 5% menandai ambang kelompok bergejolak, dan label nilai di atas tiap batang menyelamatkan pembaca dari menebak-nebak:
import matplotlib.pyplot as plt
import pandas as pd
# Resep pembersihan Bagian 4: 41 baris mentah menjadi 40 baris bersih.
df = pd.read_csv("../data/harga_komoditas.csv")
df = df.drop_duplicates(subset=["minggu", "komoditas"], keep="first").copy()
df["komoditas"] = df["komoditas"].str.strip().str.lower()
df["harga_rata_ribu"] = pd.to_numeric(df["harga_rata_ribu"], errors="coerce")
df = df.sort_values(["komoditas", "minggu"])
df["harga_rata_ribu"] = df.groupby("komoditas")["harga_rata_ribu"].transform(
lambda s: s.interpolate()
)
stat = df.groupby("komoditas")["harga_rata_ribu"].agg(["mean", "std"])
stat["cv"] = stat["std"] / stat["mean"] * 100
cv_urut = stat["cv"].sort_values(ascending=False)
fig, ax = plt.subplots(figsize=(7, 3.5))
warna_bar = ["tab:red" if k == "cabai merah" else "tab:blue" for k in cv_urut.index]
ax.bar(cv_urut.index, cv_urut.values, color=warna_bar)
ax.axhline(5, color="gray", linestyle="--", linewidth=1)
ax.text(4.4, 5.5, "batas bergejolak 5%", ha="right", fontsize=9)
ax.set_ylim(0, 33)
ax.set_title("Peringkat Koefisien Variasi Harga, 8 Pekan")
ax.set_xlabel("Komoditas")
ax.set_ylabel("cv (%)")
for posisi, nilai in enumerate(cv_urut.values):
ax.text(posisi, nilai + 0.4, f"{nilai:.2f}", ha="center", fontsize=9)
plt.show()Batang pertama berdiri jauh lebih tinggi (28.91) dibanding empat batang lain yang berjejer rendah (6.10, 2.29, 1.21, 0.68) — papan peringkat Bagian 8 kini tampak sebagai siluet, bukan daftar angka. Garis putus-putus pada 5% membagi bidang menjadi dua wilayah: hanya bawang merah dan cabai merah yang menembusnya ke atas, persis kelompok bergejolak Bagian 8, dengan bawang merah tipis di atas garis dan cabai merah menjulang hampir enam kali lipat ambang tersebut. Teknik menggambar batang untuk perbandingan kategori diulas pada chapter Grafik Perbandingan ; katalog bentuk grafik lengkap tersedia di plot types matplotlib .
Ketiga grafik di atas memakai plt.show() untuk menampilkan hasil di layar. Untuk melampirkan grafik pada laporan cetak atau pesan singkat, ganti pemanggilan itu dengan plt.savefig("peringkat_cv.png", dpi=150) sehingga grafik tersimpan sebagai berkas gambar — daftar lengkap fungsi plt ada di ringkasan pyplot matplotlib
.
Ringkasan Bagian 9 #
- Grafik garis adalah bentuk tepat untuk pergerakan harga: pekan pada sumbu mendatar, satu warna dan satu penanda per komoditas, legend sebagai kunci baca.
- Satu bidang untuk lima komoditas menonjolkan dominasi cabai merah; bidang kedua tanpa cabai memberi ruang bagi detail empat komoditas lainnya dengan skala sumbu yang lebih rapat.
- Grafik batang cv terurut menerjemahkan papan peringkat Bagian 8 menjadi siluet: cabai merah menjulang sendirian di atas ambang 5%, bawang merah tipis menembus, tiga sisanya jauh di bawah.
- Grafik siap lampir bisa disimpan dengan
plt.savefig()sebagai penggantiplt.show().
Tiga grafik beserta seluruh angka kini siap dikemas. Pada Bagian 10: Menyusun Laporan kita membaca laporan akhir yang ditulis pipeline secara utuh — struktur, temuan, rekomendasi, dan keterbatasannya — lalu menutup proyek ini.