Lingkungan kerja dari chapter Persiapan Python sudah siap, tetapi kita belum membutuhkan satu pustaka eksternal pun untuk statistik dasar. Python membawa module statistics di dalam instalasi standarnya: mean, median, modus, variansi, kuartil, korelasi, sampai distribusi normal tersedia begitu interpreter berjalan. Chapter ini menghitung ulang seluruh ukuran dari Section Statistika Deskriptif pada dataset sepuluh siswa (68, 75, 75, 81, 84, 88, 90, 92, 97, 70), menambah korelasi Pearson dan peluang normal, lalu menutup dengan satu skrip laporan utuh yang dapat Anda jalankan dan modifikasi.

Module statistics Tanpa Instalasi #

Module statistics adalah bagian standard library — tidak ada pip install, tidak ada dependensi, dan kodenya dapat berjalan pada instalasi Python apa pun. Untuk data berbentuk list (puluhan hingga ribuan angka), module ini sepenuhnya memadai. Sebuah keunggulan teknisnya: perhitungan pada data integer memakai pecahan eksak secara internal, sehingga mean dari data bulat tidak mengalami galat pembulatan di tengah jalan. Dokumentasi resminya lengkap di docs.python.org/3/library/statistics — rujukan pertama saat kita lupa nama function.

Tendensi Sentral: mean, median, dan modus #

Tiga ukuran pemusatan dari chapter Mean, Median, dan Modus masing-masing punya pasangan function:

python
import statistics

nilai = [68, 75, 75, 81, 84, 88, 90, 92, 97, 70]

print("fmean         :", statistics.fmean(nilai))
print("mean          :", statistics.mean(nilai))
print("median        :", statistics.median(nilai))
print("median 3 data :", statistics.median([75, 68, 81]))
print("mode          :", statistics.mode(nilai))
print("multimode     :", statistics.multimode(nilai))
print("mode 3 data   :", statistics.mode([70, 80, 90]))
print("multimode 3   :", statistics.multimode([70, 80, 90]))

Output yang Dihasilkan:

text
fmean         : 82.0
mean          : 82
median        : 82.5
median 3 data : 75
mode          : 75
multimode     : [75]
mode 3 data   : 70
multimode 3   : [70, 80, 90]

Mari kita bedah hasilnya:

  1. fmean(nilai) = 82.0: versi mean yang selalu mengembalikan float dan lebih cepat untuk data besar; hasil numeriknya sama dengan mean.
  2. mean(nilai) = 82: pada data integer, module memakai pecahan eksak sehingga hasilnya tepat — jumlah 820 dibagi 10.
  3. median(nilai) = 82.5: jumlah data genap (n = 10) membuat function merata-ratakan dua nilai tengah 81 dan 84, sesuai aturan chapter Median; contoh tiga data menunjukkan kasus ganjil yang langsung mengambil nilai tengah 75.
  4. mode(nilai) = 75: satu-satunya nilai yang muncul dua kali; multimode melaporkannya sebagai list [75].
  5. mode([70, 80, 90]) = 70 dan multimode = [70, 80, 90]: ketika seluruh nilai sama sering muncul, mode mengambil yang pertama ditemui, sedangkan multimode melaporkan seluruh kandidatnya.

Sebaran: variance, stdev, dan kuartil #

Pilihan function sebaran mengikuti satu pertanyaan dari chapter Varians: apakah data adalah sampel atau populasi? variance dan stdev memakai pembagi n − 1; pvariance dan pstdev memakai pembagi n:

python
import statistics

nilai = [68, 75, 75, 81, 84, 88, 90, 92, 97, 70]

print("variance  (n-1) :", statistics.variance(nilai))
print("stdev     (n-1) :", statistics.stdev(nilai))
print("pvariance (n)   :", statistics.pvariance(nilai))
print("pstdev    (n)   :", statistics.pstdev(nilai))
print()
q_incl = statistics.quantiles(nilai, n=4, method="inclusive")
q_excl = statistics.quantiles(nilai, n=4, method="exclusive")
print("kuartil inclusive :", q_incl)
print("kuartil exclusive :", q_excl)

Output yang Dihasilkan:

text
variance  (n-1) : 96.44444444444444
stdev     (n-1) : 9.820613241770824
pvariance (n)   : 86.8
pstdev    (n)   : 9.316651759081692

kuartil inclusive : [75.0, 82.5, 89.5]
kuartil exclusive : [73.75, 82.5, 90.5]

Pada dataset ini variansi sampel 96.44 melawan variansi populasi 86.8 — pembagi 9 melawan pembagi 10, dan keduanya sah selama kita menyebut versinya. Untuk kuartil, parameter n=4 meminta data dibagi empat sehingga function mengembalikan tiga titik potong Q1, Q2, Q3. Metode exclusive memakai rumus posisi (n + 1) × k/4 persis seperti hitungan manual chapter Kuartil dan Persentil — itulah mengapa Q1-nya 73.75 dan Q3-nya 90.5. Metode inclusive memakai skala posisi 1 + (n − 1) × k/4 sehingga hasilnya 75.0, 82.5, 89.5; metode ini penting karena cocok dengan default NumPy yang kita temui di chapter berikutnya. Q2 pada kedua metode 82.5, sama dengan median.

Korelasi Pearson dan Distribusi Normal #

Dataset kita kini diperluas: sepuluh siswa yang sama juga mengikuti ulangan Bahasa Indonesia dengan nilai 70, 78, 74, 79, 85, 82, 88, 90, 94, 72 (mean 81.2). Function correlation(x, y) menghitung koefisien Pearson r, sedangkan class NormalDist membawa mesin peluang distribusi normal dari chapter Distribusi Normal:

python
import statistics
from statistics import NormalDist

matematika = [68, 75, 75, 81, 84, 88, 90, 92, 97, 70]
bahasa = [70, 78, 74, 79, 85, 82, 88, 90, 94, 72]

r = statistics.correlation(matematika, bahasa)
print("r matematika-bahasa :", round(r, 4))
print()
normal = NormalDist(mu=82, sigma=10)
print("P(X <= 92)     :", round(normal.cdf(92), 4))
print("P(X > 92)      :", round(1 - normal.cdf(92), 4))
baku = NormalDist()
print("z batas 97.5%  :", round(baku.inv_cdf(0.975), 4))
sampel = NormalDist(70, 10).samples(5, seed=42)
print("5 sampel       :", [round(x, 2) for x in sampel])

Output yang Dihasilkan:

text
r matematika-bahasa : 0.9714

P(X <= 92)     : 0.8413
P(X > 92)      : 0.1587
z batas 97.5%  : 1.96
5 sampel       : [68.56, 68.27, 68.89, 77.02, 68.72]

Mari kita bedah hasilnya:

  1. r = 0.9714: korelasi positif sangat kuat — siswa dengan nilai Matematika tinggi cenderung juga memperoleh nilai Bahasa Indonesia tinggi; membaca dan menafsirkan angka r dibahas tuntas pada chapter Korelasi.
  2. P(X ≤ 92) = 0.8413: nilai 92 berada satu sigma di atas mean 82 (z = 1), dan luas kurva normal sampai z = 1 memang 0.8413; sisanya di ekor kanan 0.1587.
  3. z batas 97.5% = 1.96: inv_cdf adalah kebalikan dari cdf — angka 1.96 ini sama dengan nilai kritis pada tabel chapter Confidence Interval.
  4. 5 sampel: method samples() menarik lima nilai acak dari distribusi bermean 70 dan sigma 10; parameter seed=42 membuat hasil dapat direproduksi, mengikuti aturan determinisme di seluruh course.

Ringkasan Function dan Padanannya #

FunctionPadanan konsep di course
mean(data), fmean(data)Mean (Section Statistika Deskriptif)
median(data)Median, termasuk data genap
mode(data), multimode(data)Modus dan data multimodal
variance(data), stdev(data)Varians dan Standar Deviasi versi sampel
pvariance(data), pstdev(data)kedua versi populasi
quantiles(data, n=4, method=...)Kuartil dan Persentil
correlation(x, y)Korelasi Pearson
linear_regression(x, y)Simple Linear Regression (dipakai chapter Regresi dengan Python)
NormalDist(mu, sigma)Distribusi Normal dan z-score

Kapan Python Standar Cukup #

Aturan praktisnya sederhana. Module statistics menangkupi kebutuhan saat data berupa satu list dan analisis berupa ukuran tunggal: laporan ulangan satu kelas, ringkasan penjualan bulanan, pemeriksaan cepat sebaran. Pindah ke NumPy ketika data berupa tabel angka besar atau membutuhkan operasi per baris dan kolom; ke SciPy ketika analisis membutuhkan distribusi lanjutan atau pengujian hipotesis; ke pandas ketika data berlabel dan dibaca dari file. Seluruh perpindahan itu tetap memakai konsep yang sudah dihitung manual di section teori — hanya mesin hitungnya yang berganti.

Skrip Lengkap: analisis_nilai.py #

Seluruh function di atas dirangkai menjadi satu skrip laporan. Simpan sebagai analisis_nilai.py di folder kerja Anda, lalu jalankan dengan python3 analisis_nilai.py:

python analisis_nilai.py
import statistics

nilai = [68, 75, 75, 81, 84, 88, 90, 92, 97, 70]

q1, q2, q3 = statistics.quantiles(nilai, n=4, method="inclusive")
iqr = q3 - q1

print("=" * 38)
print("Laporan Statistik Nilai Matematika")
print("=" * 38)
print(f"Banyak siswa    : {len(nilai)}")
print(f"Nilai terendah  : {min(nilai)}")
print(f"Nilai tertinggi : {max(nilai)}")
print(f"Mean            : {statistics.mean(nilai):.2f}")
print(f"Median          : {statistics.median(nilai):.2f}")
print(f"Modus           : {statistics.multimode(nilai)}")
print(f"Stdev (sampel)  : {statistics.stdev(nilai):.2f}")
print(f"Q1              : {q1:.2f}")
print(f"Q2              : {q2:.2f}")
print(f"Q3              : {q3:.2f}")
print(f"IQR             : {iqr:.2f}")

Output yang Dihasilkan:

text
======================================
Laporan Statistik Nilai Matematika
======================================
Banyak siswa    : 10
Nilai terendah  : 68
Nilai tertinggi : 97
Mean            : 82.00
Median          : 82.50
Modus           : [75]
Stdev (sampel)  : 9.82
Q1              : 75.00
Q2              : 82.50
Q3              : 89.50
IQR             : 14.50

Skrip memakai metode inclusive agar konsisten dengan default NumPy pada chapter berikutnya; menggantinya ke "exclusive" mengubah Q1 menjadi 73.75, Q3 menjadi 90.5, dan IQR menjadi 16.75 — perbandingan yang menegaskan pesan chapter Kuartil dan Persentil: sebutkan metode saat melaporkan kuartil. Baris IQR dihitung dari nilai kuartil penuh sebelum pemformatan, mengikuti kebiasaan menyimpan nilai penuh lalu membulatkan hanya saat mencetak.

Module statistics menyelesaikan seluruh hitungan dengan benar, tetapi setiap operasinya tetap memproses list demi list. Ketika data tumbuh menjadi matriks nilai lintas kelas, array NumPy mengambil alih dengan model komputasi yang jauh lebih ringkas — materi chapter Statistik dengan NumPy.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

analisis_nilai.py

Unduh berkas
python
import statistics

nilai = [68, 75, 75, 81, 84, 88, 90, 92, 97, 70]

q1, q2, q3 = statistics.quantiles(nilai, n=4, method="inclusive")
iqr = q3 - q1

print("=" * 38)
print("Laporan Statistik Nilai Matematika")
print("=" * 38)
print(f"Banyak siswa    : {len(nilai)}")
print(f"Nilai terendah  : {min(nilai)}")
print(f"Nilai tertinggi : {max(nilai)}")
print(f"Mean            : {statistics.mean(nilai):.2f}")
print(f"Median          : {statistics.median(nilai):.2f}")
print(f"Modus           : {statistics.multimode(nilai)}")
print(f"Stdev (sampel)  : {statistics.stdev(nilai):.2f}")
print(f"Q1              : {q1:.2f}")
print(f"Q2              : {q2:.2f}")
print(f"Q3              : {q3:.2f}")
print(f"IQR             : {iqr:.2f}")