Analisis yang benar tetapi tidak diceritakan berhenti menjadi berkas, dan storytelling dengan data adalah disiplin menyusun temuan menjadi narasi konteks, konflik, dan resolusi yang menggerakkan keputusan. Topik ini membedah tiga bagian naratif tersebut, mengubah temuan dataset latihan menjadi satu grafik dengan satu pesan, serta menegaskan batas kejujurannya terhadap data. Setelah membacanya, satu grafik beserta tiga kalimat pendampinya dapat menyampaikan kesimpulan tanpa mengorbankan kebenarannya.
Tiga bagian narasi: konteks, konflik, resolusi#
Konteks menyatakan keadaan yang sudah diketahui pembaca, misalnya dua stasiun memantau kualitas udara dengan ambang Baik sebesar 55. Konflik menyatakan ketegangan yang ditemukan data, misalnya Stasiun B menembus ambang pada tiga dari empat periode, dan resolusinya menyatakan tindakan yang ditawarkan, misalnya pemeriksaan sumber emisi jalan utama sebelum musim kemarau.
Urutan tersebut bukan gaya, melainkan urutan pemahaman. Tanpa konteks, angka 63.3 tidak bermakna apa pun, tanpa konflik, tidak ada alasan bertindak, dan tanpa resolusi yang jelas, pembaca menutup halaman dengan kecemasan tanpa keputusan. Satu temuan menopang satu narasi, sedangkan daftar temuan panjang adalah lampiran, bukan cerita.
Narasi juga memilih pembandingnya secara sadar, dan pada dataset latihan ini pembanding yang bermakna adalah ambang Baik, bukan rata-rata dua stasiun, karena keputusan yang diminta berbicara tentang batas kesehatan, bukan persaingan antar stasiun.
Satu grafik, satu pesan#
Grafik naratif berbeda dari grafik eksplorasi karena ia sudah tahu pesannya, dan setiap elemen bekerja untuk pesan itu. Skrip berikut menyusun rata-rata PM2.5 Stasiun B per periode, mewarnai periode yang menembus ambang, dan memberi anotasi pada bar pagi sebagai puncaknya.
"""Satu grafik dengan narasi: periode mana yang melampaui ambang Baik."""
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv(
"ukuran_udara.csv",
na_values=["kosong", "-999.0"],
dtype={"pm25": "string", "kelembapan": "string"},
)
data["pm25"] = data["pm25"].astype("float")
data["waktu"] = pd.to_datetime(data["waktu"], format="mixed", dayfirst=True)
sah = data[data["pm25"] < 500].copy()
sah["periode"] = pd.cut(
sah["waktu"].dt.hour,
bins=[-1, 5, 10, 15, 23],
labels=["dini", "pagi", "siang", "malam"],
)
b = (
sah[sah["stasiun"] == "Stasiun B"]
.groupby("periode", observed=True)["pm25"]
.mean()
.round(1)
)
warna = ["#4c72b0" if v <= 55 else "#c44e52" for v in b.values]
fig, ax = plt.subplots(figsize=(5.8, 3.4), constrained_layout=True)
ax.bar(b.index.astype(str), b.values, color=warna, width=0.55)
ax.axhline(55, color="#263238", linestyle="--", linewidth=1.2)
ax.text(2.45, 56.3, "ambang Baik 55", fontsize=9)
ax.annotate(
f"pagi: {b['pagi']:.1f}",
xy=(1, b["pagi"]),
xytext=(10, 14),
textcoords="offset points",
fontsize=9,
arrowprops={"arrowstyle": "->", "color": "#263238"},
)
ax.set_ylim(0, 75)
ax.set_ylabel("rata-rata PM2.5")
ax.set_title("PM2.5 Stasiun B per periode, terhadap ambang Baik")
fig.savefig("narasi-grafik.png", dpi=110)
print("tersimpan: narasi-grafik.png")
print(b.to_dict())tersimpan: narasi-grafik.png
{'dini': 55.3, 'pagi': 63.3, 'siang': 56.6, 'malam': 49.2}
Grafik di atas membawa satu pesan, yaitu pagi adalah periode tertinggi dengan 63.3, dan tiga dari empat periode menembus ambang Baik. Warna merah menandai periode yang melampaui, garis putus menyatakan ambangnya, dan anotasi menunjuk puncaknya, sedangkan judul menyatakan perbandingannya tanpa menyimpulkan lebih dari yang datanya izinkan.
Tiga kalimat pendampingnya mengikuti struktur narasi, yaitu “dua stasiun memantau PM2.5 dengan ambang Baik 55” sebagai konteks, “Stasiun B menembus ambang pada tiga periode dengan puncak pagi 63.3” sebagai konflik, dan “pemeriksaan sumber emisi jalan utama dijadwalkan sebelum pola berulang” sebagai resolusi.
Kejujuran dalam narasi#
Narasi yang kuat menuntut disiplin lebih tinggi, sebab jarak antara memilih sorotan dan menyesatkan mudah terlewati. Angka yang disorot harus dapat dipertanggungjawabkan granularitasnya, dan rata-rata periode pada dataset dua hari adalah indikasi, bukan kepastian musiman, sehingga kalimatnya menyebut rentang datanya.
Pertanyaan yang membedakan narasi sehat dari yang menyesatkan adalah
apakah pembaca dapat menemukan angka yang sama pada data mentahnya. Grafik
di atas dapat dibangun ulang dari ukuran_udara.csv dengan kode yang
tersedia, dan inilah bentuk akuntabilitasnya, sejalan dengan kejujuran
visual pada modul visualisasi.
Resolusi juga menahan diri pada wilayahnya, yaitu data memberi dasar perhatian pada pagi, sedangkan keputusan operasional milik pemangku kepentingan, dan menyebut tindakan sebagai saran beserta dasarnya menjaga peran itu tetap jelas.
Kesalahan umum#
Kesalahan pertama adalah menaruh seluruh eksplorasi ke dalam satu presentasi. Pembaca kehilangan pesannya di antara sepuluh grafik, sedangkan satu grafik dengan satu pesan dan lampiran untuk sisanya menahan perhatian pada keputusan.
Kesalahan kedua adalah judul yang mengulang sumbu, misalnya “PM2.5 per periode”, alih-alih menyatakan temuan. Judul adalah tempat pertama pesan tinggal, dan “pagi tertinggi, tiga periode menembus ambang” memberi pembaca kesimpulan sebelum membaca angkanya.
Kesalahan ketiga adalah resolusi yang melampaui datanya, misalnya menuntut penutupan jalan dari dua hari pengukuran. Saran yang disebut beserta keterbatasannya menjaga kepercayaan untuk analisis berikutnya.
Ringkasan#
- Narasi tersusun dari konteks, konflik, dan resolusi, dan setiap bagian menjawab kebutuhan pemahaman yang berbeda.
- Satu grafik membawa satu pesan, dengan warna, ambang, dan anotasi yang bekerja untuk pesan tersebut.
- Kejujuran narasi diuji dengan kemampuan pembaca menemukan angkanya kembali pada data mentahnya.
- Resolusi disebut sebagai saran beserta dasar dan batas datanya, karena keputusan operasional milik pemangku kepentingan.
Referensi#
- Storytelling with Data — Cole Nussbaumer Knaflic, Wiley — rujukan praktik narasi konteks-konflik-resolusi yang dipakai industri.
- Matplotlib Annotations Guide — Matplotlib documentation — rujukan resmi anotasi yang dipakai menunjuk puncak pada grafik.