Statistik ringkas pada Bagian 2 memperlihatkan pusat dan lebar sebaran, tetapi bentuk sebaran belum terlihat: apakah data menumpuk simetris di tengah, atau justru berekor ke satu sisi? Bentuk menentukan pilihan alat — data miring menggeser mean, memengaruhi pilihan median, dan menentukan apakah nilai ekstrem pantas disebut outlier. Pada bagian ini kita membedah bentuk ketiga mata pelajaran dengan tiga alat berurutan: tabel frekuensi kelas dan histogram untuk melihat bentuk secara langsung, skewness untuk mengukurnya, lalu z-score dan aturan IQR untuk menguji status nilai 45 secara formal.

Tabel Frekuensi Kelas Matematika #

Pengelompokan mengikuti alur chapter Tabel Frekuensi. Dengan n = 30, aturan Sturges mengusulkan k = 1 + 3.3 log 30 ≈ 5.87, dibulatkan menjadi enam kelas. Rentang data matematika adalah 92 − 45 = 47; dibagi enam kelas menghasilkan lebar 7.83 yang dibulatkan menjadi 8, sehingga kelas-kelasnya berjalan dari 45-52 sampai 85-92:

python
matematika = [70, 88, 76, 80, 65, 84, 92, 68, 78, 86,
              73, 62, 82, 45, 90, 66, 77, 81, 60, 79,
              74, 87, 67, 76, 83, 69, 75, 64, 72, 85]

kelas = [(45, 52), (53, 60), (61, 68), (69, 76), (77, 84), (85, 92)]
n = len(matematika)
for bawah, atas in kelas:
    frek = sum(1 for x in matematika if bawah <= x <= atas)
    print(f"{bawah}-{atas} : {frek:2d} siswa ({frek / n * 100:.2f}%)")
print("jumlah  :", sum(1 for x in matematika if 45 <= x <= 92), "data")

Output yang Dihasilkan:

text
45-52 :  1 siswa (3.33%)
53-60 :  1 siswa (3.33%)
61-68 :  6 siswa (20.00%)
69-76 :  8 siswa (26.67%)
77-84 :  8 siswa (26.67%)
85-92 :  6 siswa (20.00%)
jumlah  : 30 data

Bentuk tabelnya sudah bercerita. Dua kelas tengah (69-76 dan 77-84) menjadi puncak dengan delapan siswa masing-masing, dan frekuensi menurun landai ke kedua sisi — pola menara yang hampir simetris. Persentase frekuensi relatif dihitung dari frekuensi dibagi 30 dan dibulatkan ke dua desimal, dan jumlah baris verifikasi 30 data memastikan tidak ada siswa yang tercecer dari pengelompokan. Yang menonjol adalah kelas terbawah: kelas 45-52 hanya berisi satu siswa, terpisah oleh satu kelas nyaris kosong (53-60 juga hanya satu) dari kelompok utama. Nilai 45 berdiri sendiri di luar struktur sebaran sisanya — inilah yang oleh box plot akan digambar sebagai titik terpisah.

Histogram Matematika #

Tabel frekuensi yang sama kini digambar. Batas kelas untuk plt.hist ditulis sebagai tepi bin — 45, 53, 61, 69, 77, 85, 93 — sehingga setiap batang mengcover satu kelas yang persis sama dengan tabel di atas. Frekuensi batang diverifikasi lebih dulu dengan np.histogram, kebiasaan dari chapter Histogram: angka yang digambar harus sama dengan angka yang dihitung:

python
import numpy as np
import matplotlib.pyplot as plt

matematika = [70, 88, 76, 80, 65, 84, 92, 68, 78, 86,
              73, 62, 82, 45, 90, 66, 77, 81, 60, 79,
              74, 87, 67, 76, 83, 69, 75, 64, 72, 85]
batas = [45, 53, 61, 69, 77, 85, 93]

jumlah, tepi = np.histogram(matematika, bins=batas)
print("batas kelas :", tepi.tolist())
print("frekuensi   :", jumlah.tolist())
print("total data  :", int(jumlah.sum()))

plt.figure()
plt.hist(matematika, bins=batas, edgecolor="black")
plt.xlabel("Nilai")
plt.ylabel("Banyak siswa")
plt.title("Histogram Nilai Matematika (30 siswa)")
plt.savefig("histogram_matematika.png")
plt.close()

Output yang Dihasilkan:

text
batas kelas : [45, 53, 61, 69, 77, 85, 93]
frekuensi   : [1, 1, 6, 8, 8, 6]
total data  : 30

Frekuensi [1, 1, 6, 8, 8, 6] identik dengan tabel frekuensi — histogram dan tabel memang dua wajah dari pengelompokan yang sama. Pada gambar yang tersimpan sebagai histogram_matematika.png, batang pertama berdiri sendiri di kiri dengan tinggi satu, terpisah dari menara tengah oleh dua batang rendah; sisi kanan menurun landai sampai batang terakhir berisi dua siswa ber nilai 90 ke atas. Ekor kiri yang menjulur itulah tanda visual sebaran miring kiri ringan — satu nilai rendah yang jauh dari kelompok. Perlu dicatat bahwa .png tersimpan di folder skrip dan aman dihapus setelah dilihat; kode memakai savefig + close sesuai konvensi chapter Visualisasi dengan matplotlib.

Skewness Tiga Mata Pelajaran #

Kesan visual histogram kini diukur dengan angka. scipy.stats.skew menghitung skewness momen populasi — pembagi n, bukan n − 1 — sama dengan pengaturan yang dipakai chapter Skewness, sehingga hasilnya dapat dibandingkan langsung dengan pedoman sana:

python
from scipy.stats import skew

matematika = [70, 88, 76, 80, 65, 84, 92, 68, 78, 86,
              73, 62, 82, 45, 90, 66, 77, 81, 60, 79,
              74, 87, 67, 76, 83, 69, 75, 64, 72, 85]
bahasa = [78, 70, 91, 84, 67, 82, 74, 89, 76, 80,
          86, 64, 93, 72, 88, 75, 81, 68, 95, 77,
          69, 85, 73, 90, 80, 87, 71, 92, 83, 80]
sains = [88, 60, 93, 73, 70, 78, 64, 90, 75, 83,
         58, 71, 68, 76, 92, 65, 74, 79, 62, 72,
         85, 67, 77, 70, 81, 59, 86, 74, 63, 82]

for nama, nilai in [("matematika", matematika), ("bahasa", bahasa), ("sains", sains)]:
    print(f"skewness {nama:<11s}: {skew(nilai):6.2f}")

Output yang Dihasilkan:

text
skewness matematika :  -0.68
skewness bahasa     :  -0.04
skewness sains      :   0.15

Ketiga angka mengikuti kisah yang sama dengan ukuran pemusatan pada Bagian 2. Matematika mencatat −0.68, miring kiri: ekor kirinya lahir dari satu nilai rendah yang menjulur, dan tanda negatif sesuai dengan mean yang berada di bawah median. Bahasa mencatat −0.04, praktis nol — sebaran simetris, konsisten dengan mean = median = modus = 80. Sains mencatat 0.15, miring kanan ringan: beberapa nilai tinggi (90, 92, 93) menarik mean sedikit ke atas median. Ketiganya masih di bawah ambang kasar 0.5 yang oleh chapter Skewness disebut sebatas pedoman, bukan ketetapan.

Deteksi Outlier dengan Z-Score #

Tanda miring belum menjawab pertanyaan utama kita: apakah nilai 45 benar-benar outlier? Uji formalnya memakai z-score — jarak data ke mean dalam satuan standar deviasi — dengan ambang |z| > 2 sebagai penyaring kasar sesuai chapter Z-Score. Cuplikan berikut menghitung z untuk seluruh 30 siswa dan menampilkan hanya yang melampaui ambang:

python
import statistics

import numpy as np

data = [("Adi", 70), ("Bunga", 88), ("Cakra", 76), ("Dewi", 80), ("Eka", 65),
        ("Fajar", 84), ("Gilang", 92), ("Hana", 68), ("Intan", 78), ("Joko", 86),
        ("Kirana", 73), ("Lukman", 62), ("Maya", 82), ("Nadia", 45), ("Okta", 90),
        ("Putri", 66), ("Qori", 77), ("Rafi", 81), ("Sari", 60), ("Tirta", 79),
        ("Utami", 74), ("Vina", 87), ("Wahyu", 67), ("Yuni", 76), ("Zaki", 83),
        ("Bagas", 69), ("Citra", 75), ("Danu", 64), ("Eni", 72), ("Filda", 85)]
nilai = [x for _, x in data]
mean = statistics.mean(nilai)
s = statistics.stdev(nilai)

print(f"mean matematika : {mean:.2f}   std sampel : {s:.2f}")
print("siswa dengan |z| > 2 :")
for nama, x in data:
    z = (x - mean) / s
    if abs(z) > 2:
        print(f"  {nama:6s}: nilai {x:2d}, z = {z:.2f}")
sisa = sorted(abs((x - mean) / s) for _, x in data)
print(f"|z| terbesar di luar nilai itu : {sisa[-2]:.2f}")

q1, q3 = np.percentile(nilai, [25, 75])
iqr = q3 - q1
print(f"batas bawah aturan IQR : {q1 - 1.5 * iqr:.1f}")

Output yang Dihasilkan:

text
mean matematika : 75.13   std sampel : 10.37
siswa dengan |z| > 2 :
  Nadia : nilai 45, z = -2.91
|z| terbesar di luar nilai itu : 1.63
batas bawah aturan IQR : 46.5

Hasilnya tegas. Hanya satu siswa yang melampaui ambang: Nadia dengan nilai 45 dan z = −2.91 — hampir tiga standar deviasi di bawah mean 75.13. Siswa terdekat berikutnya hanya mencapai |z| 1.63, sehingga jarak 45 ke kelompok bukan perkara gradasi melainkan lompatan. Sebagai pembanding, aturan 1.5 × IQR dari chapter Rentang dan Interquartile Range memberi batas bawah 46.5 — nilai 45 berada di bawahnya, sehingga kedua aturan sepakat. Status outlier Nadia kini terkonfirmasi oleh dua ukuran yang berbeda cara kerjanya.

Membandingkan Bentuk Tiga Mata Pelajaran #

Seluruh bukti kini terkumpul dan dapat dirangkum dalam satu tabel:

Mata pelajaranSkewnessMean vs medianOutlierBentuk
matematika−0.68mean di bawah median45 (Nadia, z −2.91)miring kiri karena outlier
bahasa−0.04bertemu di 80tidak adahampir simetris
sains0.15mean di atas mediantidak adamiring kanan ringan

Ketiga mata pelajaran ternyata menyimpan tiga bentuk yang berbeda dalam satu kelas yang sama — keberuntungan pedagogis yang jarang datang dua kali. Satu langkah tersisa: merangkum seluruh temuan menjadi laporan yang rapi dan dapat direproduksi. Bagian 4 mengerjakannya dengan satu skrip utuh yang menyatukan data, perhitungan, dan kesimpulan.