Histogram menampilkan seluruh sebaran nilai, tetapi membacanya butuh waktu — apalagi bila kita membandingkan tiga kolom sekaligus. Box plot memadatkan setiap distribusi menjadi satu simbol: sebuah kotak yang menggambarkan Q1, median, dan Q3, ditambah garis kumis (whisker) dan titik outlier. Pada pandas, method .plot.box() menggambar satu kotak untuk setiap kolom numerik DataFrame. Chapter ini sengaja menambahkan satu lonjakan penjualan pada dataset harian April 2026, agar kotaknya benar-benar “menangkap” sebuah outlier — temuan yang biasanya dipelajari lewat angka pada section Missing Data dan Outlier Lanjutan.
Menambahkan Lonjakan pada Dataset #
Data harian Pulpen April 2026 dibangun dari formula yang sama dengan chapter sebelumnya, lalu satu baris disengaja dinaikkan: penjualan tanggal 15 April ditambah 18 unit untuk menyimulasikan lonjakan promo. Skrip mencetak ringkasan statistiknya terlebih dahulu, kemudian menggambar box plot ketiga kolom:
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"),
)
harian.loc["2026-04-15", "Pulpen"] += 18 # lonjakan promo tanggal 15
print("Ringkasan Pulpen:")
print(harian["Pulpen"].describe().round(2))
q1 = harian["Pulpen"].quantile(0.25)
q3 = harian["Pulpen"].quantile(0.75)
iqr = q3 - q1
pagar_atas = q3 + 1.5 * iqr
print("\nQ1:", q1, "| Q3:", q3, "| IQR:", iqr, "| pagar atas:", pagar_atas)
print("Outlier di atas pagar:", harian["Pulpen"].idxmax().date(), "=", harian["Pulpen"].max())
ax = harian.plot.box(figsize=(8, 4))
print("\nTipe objek :", type(ax).__name__)
print("Jumlah garis :", len(ax.lines))
print("Kotak per kolom :", len(ax.lines) // 7)
ax.get_figure().savefig("box_penjualan.png", dpi=100)
print("\nPlot tersimpan sebagai box_penjualan.png")
Path("box_penjualan.png").unlink()Output yang Dihasilkan:
Ringkasan Pulpen:
count 30.00
mean 10.70
std 3.73
min 5.00
25% 8.00
50% 10.50
75% 13.00
max 24.00
Name: Pulpen, dtype: float64
Q1: 8.0 | Q3: 13.0 | IQR: 5.0 | pagar atas: 20.5
Outlier di atas pagar: 2026-04-15 = 24
Tipe objek : Axes
Jumlah garis : 21
Kotak per kolom : 3
Plot tersimpan sebagai box_penjualan.pngPerhatikan angka-angka yang tercetak sebelum plot digambar. Kuartal pertama Q1 bernilai 8.0, median 10.5, dan Q3 bernilai 13.0, sehingga rentang antarkuartil IQR = 13.0 - 8.0 = 5.0. Pagar atas yang dipakai Matplotlib secara bawaan adalah Q3 + 1.5 × IQR = 20.5. Nilai maksimum 24 pada tanggal 2026-04-15 berada di luar pagar itu — tepat satu titik — dan pada box plot nilai tersebut digambar sebagai titik terpisah di atas kumis kolom Pulpen.
Membaca Simbol Box Plot #
Satu kotak box plot memuat lima angka sekaligus:
| Simbol | Arti | Nilai pada kolom Pulpen |
|---|---|---|
| Batas bawah kotak | Q1 (kuartil 25%) | 8.0 |
| Garis di dalam kotak | Median (kuartil 50%) | 10.5 |
| Batas atas kotak | Q3 (kuartil 75%) | 13.0 |
| Ujung kumis | Data terjauh yang masih dalam pagar 1.5 × IQR | 5.0 (bawah) dan 15.0 (atas) |
| Titik terpisah | Outlier di luar pagar | 24.0 |
Mari kita telaah baris-baris kuncinya:
- Baris 15 (
harian.loc["2026-04-15", "Pulpen"] += 18): penambahan satu sel dengan.loc— pola yang sudah kita pelajari pada section indexing — menaikkan nilai tanggal 15 dari 6 menjadi 24. - Baris 18 (
harian["Pulpen"].describe().round(2)):describe()menghasilkan count, mean, std, dan lima angka ringkasan yang menjadi dasar kotak. - Baris 20-23 (perhitungan IQR): kuartil dihitung ulang dengan
quantile(), lalu pagar atasq3 + 1.5 * iqrdihitung dengan aturan yang sama seperti yang dipakai Matplotlib. - Baris 27 (
harian.plot.box(figsize=(8, 4))): satu kotak untuk setiap kolom; method mengembalikanAxesseperti method.plotlainnya. - Baris 29-30 (
len(ax.lines)): 21 garis terbagi rapi menjadi 7 per kolom — kumis bawah, kumis atas, dua tutup kumis, kotak, median, dan sekumpulan titik outlier — sehinggalen(ax.lines) // 7membuktikan ada 3 kotak.
Box plot merangkum satu kolom pada satu waktu. Untuk memeriksa hubungan antara dua kolom numerik — apakah naik bersamaan atau tidak — kita butuh titik data berpasangan, dan itulah scatter plot pada chapter berikutnya.
Referensi resmi: pandas.DataFrame.plot.box untuk parameter box plot, pandas.DataFrame.describe untuk ringkasan lima angka, dan pandas.DataFrame.quantile untuk perhitungan kuartil.