Ringkas pencapaian target dengan bullet chart

Visualize

Ringkas pencapaian target dengan bullet chart

Dibuat: Pembaruan terakhir: Waktu baca: 1 menit

Saat ingin menampilkan daftar KPI beserta selisih dari target, bullet chart sangat hemat ruang. Pita latar belakang membantu menyampaikan level pencapaian sekaligus.

import matplotlib.pyplot as plt
import numpy as np

metrics = ["CVR", "Nilai pesanan rata-rata", "Retensi langganan", "NPS"]
actual = np.array([0.046, 12_300, 0.78, 32])
target = np.array([0.05, 12_000, 0.8, 35])
thresholds = np.array(
    [
        [0.02, 0.04, 0.06],
        [9000, 11_000, 13_500],
        [0.6, 0.75, 0.85],
        [10, 25, 40],
    ]
)

fig, ax = plt.subplots(figsize=(6.2, 4))
for idx, name in enumerate(metrics):
    base, good, excellent = thresholds[idx]
    ax.barh(idx, excellent, color="#f1f5f9", height=0.8)
    ax.barh(idx, good, color="#cbd5f5", height=0.8)
    ax.barh(idx, base, color="#94a3b8", height=0.8)
    ax.barh(idx, actual[idx], color="#38bdf8", height=0.3)
    ax.plot(
        [target[idx], target[idx]],
        [idx - 0.4, idx + 0.4],
        color="#ef4444",
        linewidth=2,
    )
    ax.text(
        actual[idx] * 1.02,
        idx,
        f"{actual[idx]:.2f}" if idx != 1 else f"{actual[idx]:,.0f}",
        va="center",
        ha="left",
        fontsize=9,
    )

ax.set_yticks(range(len(metrics)), labels=metrics)
ax.set_xlabel("Nilai metrik")
ax.set_title("Progress KPI utama (bullet chart)")
ax.set_xlim(0, max(thresholds[:, -1]) * 1.05)
ax.grid(axis="x", alpha=0.2)
ax.spines[["right", "top"]].set_visible(False)

fig.tight_layout()

plt.show()

Pita latar menunjukkan level pencapaian di samping bar.

Kiat membaca #

  • Pita latar adalah zona pencapaian. Jika bar mencapai pita yang lebih gelap, KPI melampaui target tinggi.
  • Garis vertikal merah adalah target. Bar yang melewati garis berarti di atas target, sedangkan yang belum mencapai berarti di bawah.
  • Banyak KPI bisa diringkas dalam satu panel, cocok untuk ringkasan laporan mingguan.