Bar plot menempatkan satu bar untuk setiap kategori, tetapi data penjualan harian tidak berasal dari kategori — nilainya menyebar di sebuah rentang angka. Untuk menjawab “berapa hari penjualan jatuh di kisaran tertentu?”, kita memakai histogram: sumbu x dibagi menjadi beberapa bin (kotak rentang), dan tinggi tiap bin menghitung banyaknya data di rentang itu. Pada pandas, method .plot.hist() menggambarnya, dan parameter bins menentukan jumlah kotaknya. Chapter ini memakai dataset penjualan harian April 2026 Toko Alat Tulis Sinar yang dibangun dari formula deterministik.

Dataset Harian dan Rentang Nilai #

Skrip pertama mengambil kolom Buku Tulis dari data harian, mencetak nilai minimum, maksimum, dan rata-ratanya, lalu menggambarkan histogramnya:

python
import matplotlib

matplotlib.use("Agg")
import pandas as pd
from pathlib import Path

harian = pd.DataFrame(
    {
        "Buku Tulis": [10 + (i % 7) * 3 + (i // 7) for i in range(1, 31)],
        "Pulpen": [5 + (i % 5) * 2 + (i // 10) for i in range(1, 31)],
        "Kertas HVS": [8 + (i % 4) * 4 + (i // 6) for i in range(1, 31)],
    },
    index=pd.date_range("2026-04-01", periods=30, freq="D"),
)
nilai = harian["Buku Tulis"]
print("min:", nilai.min(), "| max:", nilai.max(), "| rata-rata:", nilai.mean())

ax = nilai.plot.hist(bins=5, figsize=(8, 4))
print("\nTipe objek :", type(ax).__name__)
print("Jumlah bin :", len(ax.patches))
batas = [p.get_x() for p in ax.patches] + [ax.patches[-1].get_x() + ax.patches[-1].get_width()]
print("Batas bin  :", [float(b) for b in batas])
print("Tinggi bin :", [int(p.get_height()) for p in ax.patches])

ax.get_figure().savefig("hist_harian.png", dpi=100)
print("\nPlot tersimpan sebagai hist_harian.png")
Path("hist_harian.png").unlink()

Output yang Dihasilkan:

text
min: 11 | max: 31 | rata-rata: 20.5

Tipe objek : Axes
Jumlah bin : 5
Batas bin  : [11.0, 15.0, 19.0, 23.0, 27.0, 31.0]
Tinggi bin : [6, 6, 7, 5, 6]

Plot tersimpan sebagai hist_harian.png

Nilai Buku Tulis berada antara 11 dan 31 dengan rata-rata 20.5. Parameter bins=5 membagi rentang tersebut menjadi lima bin berlebar sama: lebar bin adalah (31 - 11) / 5 = 4, sehingga batas-batasnya tercetak sebagai [11.0, 15.0, 19.0, 23.0, 27.0, 31.0] — enam titik batas untuk lima bin. Tinggi bin tercetak [6, 6, 7, 5, 6]; jumlah keenam tinggi itu adalah 30, sama dengan jumlah baris data.

Pembacaan histogramnya pun langsung: enam hari penjualan terjadi di kisaran 11-15 unit, tujuh hari di kisaran 15-19 unit, dan seterusnya hingga enam hari di kisaran 27-31 unit. Sebaran yang relatif datar seperti ini muncul karena data dibangun dari pola mingguan; data toko nyata biasanya menumpuk di satu kisaran dan menipis di kedua ujung. Bentuk tumpukan itulah yang menjadi petunjuk awal sebelum kita menghitung statistik resminya.

Mari kita telaah baris-baris kuncinya:

  1. Baris 9-11 (formula harian): setiap kolom diisi dari pola mingguan deterministik, sehingga setiap angka pada output dapat dihitung ulang.
  2. Baris 15-16 (nilai = harian["Buku Tulis"]): histogram digambar dari Series tunggal; min() dan max() memberi batas bawah-atas yang menjadi dasar pembagian bin.
  3. Baris 18 (nilai.plot.hist(bins=5, ...)): pandas mendelegasikan perhitungan bin ke Matplotlib, lalu menggambar satu bar per bin.
  4. Baris 20-23 (inspeksi ax.patches): bar histogram disimpan sebagai patches pada Axes; get_x() dan get_width() pada tiap patch menghasilkan batas bin, dan get_height() menghasilkan frekuensinya.

Histogram Multi Kolom Sekaligus #

Memanggil .plot.hist() pada DataFrame menggambar histogram semua kolom numeriknya dalam satu gambar:

python
import matplotlib

matplotlib.use("Agg")
import pandas as pd
from pathlib import Path

harian = pd.DataFrame(
    {
        "Buku Tulis": [10 + (i % 7) * 3 + (i // 7) for i in range(1, 31)],
        "Pulpen": [5 + (i % 5) * 2 + (i // 10) for i in range(1, 31)],
        "Kertas HVS": [8 + (i % 4) * 4 + (i // 6) for i in range(1, 31)],
    },
    index=pd.date_range("2026-04-01", periods=30, freq="D"),
)

ax = harian.plot.hist(alpha=0.6, bins=8, figsize=(8, 4))
print("Tipe objek :", type(ax).__name__)
print("Jumlah bar :", len(ax.patches))
print("Legend     :", [t.get_text() for t in ax.get_legend().get_texts()])

ax.get_figure().savefig("hist_multi_kolom.png", dpi=100)
print("\nPlot tersimpan sebagai hist_multi_kolom.png")
Path("hist_multi_kolom.png").unlink()

Output yang Dihasilkan:

text
Tipe objek : Axes
Jumlah bar : 24
Legend     : ['Buku Tulis', 'Pulpen', 'Kertas HVS']

Plot tersimpan sebagai hist_multi_kolom.png

len(ax.patches) bernilai 24 — delapan bin kali tiga kolom. Parameter alpha=0.6 membuat bar tembus pandang sehingga tiga histogram yang bertumpuk masih bisa dibedakan, dan legend berisi nama kolom dibuat otomatis. Perhatikan bahwa ketiga kolom memakai skala sumbu x yang sama; bila satu kolom memiliki rentang jauh lebih lebar daripada kolom lain, lebih jelas menggambarnya terpisah, misalnya lewat subplots=True yang dibahas pada chapter penutup section ini.

Histogram Bukan Bar Chart #

Keduanya tampak serupa — bar berdampingan dengan tinggi tertentu — tetapi maknanya berbeda. Bar chart menganggap setiap kategori berdiri sendiri, sehingga urutan bar boleh diatur dan antarbar diberi jarak. Histogram membagi satu sumbu angka menjadi rentang yang berurutan dan bersambung, sehingga bar-bar saling menempel dan urutannya tidak boleh diubah. Menukar kedua jenis ini membuat pembaca salah menafsir: tinggi bar histogram di bin 11-15 bukan “kategori 11-15”, melainkan “banyaknya data di rentang 11 sampai 15”.

Histogram memperlihatkan seluruh sebaran, tetapi kadang kita hanya butuh ringkasan lima angka dan daftar pencilannya. Itulah keahlian box plot pada chapter berikutnya.

Referensi resmi: pandas.DataFrame.plot.hist untuk parameter bins dan alpha pada DataFrame, pandas.Series.plot.hist untuk versi Series, serta user guide visualization yang membandingkan histogram dengan pendekatan lain.