pandas dengan cepat menjawab pertanyaan deskriptif: berapa rata-rata, berapa median, bagaimana sebarannya. Ketika pertanyaan bergeser menjadi inferensi — apakah selisih dua kelompok nyata atau hanya kebetulan sampel, bagaimana persamaan garis trennya — kita membutuhkan scipy. Library ini menyediakan perangkat statistik dan fungsi ilmiah yang matang secara akademis, dan seluruh fungsi itu menerima Series pandas sebagai masukan tanpa konversi manual. Pada Chapter ini kita menjalankan uji-t dua sampel dan regresi linear sederhana di atas data penjualan yang sudah kita kenal.
Peran scipy dalam Alur Analisis #
SciPy (Scientific Python) dibangun di atas NumPy dan membagi kemampuannya ke dalam modul. Dua modul yang paling sering bertemu dengan pandas:
| Modul | Isi | Contoh pemakaian dengan pandas |
|---|---|---|
scipy.stats | uji hipotesis, distribusi, korelasi | ttest_ind(Series A, Series B), linregress(x, y) |
scipy.interpolate | interpolasi titik data | mengisi nilai antar titik pengukuran |
Pola integrasinya sederhana: pandas bertugas menyimpan dan memfilter data hingga bentuk yang diinginkan, lalu Series hasil seleksi diteruskan ke fungsi scipy. Hasil scipy berupa angka atau objek hasil uji yang bisa kita simpan kembali sebagai kolom atau variabel laporan.
Uji-t Dua Sampel dengan ttest_ind #
Misalkan kita mencatat unit terjual harian dua kota selama enam hari dan ingin tahu apakah rata-rata Jakarta benar-benar berbeda dari Bandung. Uji-t dua sampel independen (ttest_ind) menjawabnya:
from scipy import stats
import pandas as pd
# 1. Uji-t dua sampel independen pada Series penjualan harian
jakarta = pd.Series([120, 135, 150, 128, 142, 133])
bandung = pd.Series([100, 108, 95, 112, 104, 99])
uji = stats.ttest_ind(jakarta, bandung)
print("t-statistic :", round(uji.statistic, 3))
print("p-value :", f"{uji.pvalue:.5f}")
print()
# 2. Regresi linear sederhana jumlah terhadap total
penjualan = pd.DataFrame({
"kota": ["Jakarta", "Jakarta", "Jakarta", "Jakarta",
"Bandung", "Bandung", "Bandung", "Bandung",
"Surabaya", "Surabaya", "Surabaya", "Surabaya"],
"produk": ["Beras", "Minyak", "Gula", "Kopi",
"Beras", "Minyak", "Gula", "Kopi",
"Beras", "Minyak", "Gula", "Kopi"],
"jumlah": [40, 25, 30, 20, 32, 22, 27, 18, 36, 19, 25, 21],
"harga": [68000, 35000, 18000, 26000, 67500, 34500, 17500, 25500, 67000, 34000, 17200, 25000],
})
penjualan["total"] = penjualan["jumlah"] * penjualan["harga"]
reg = stats.linregress(penjualan["jumlah"], penjualan["total"])
print("slope :", round(reg.slope, 1))
print("intercept:", round(reg.intercept, 1))
print("r-value :", round(reg.rvalue, 3))
print()
# 3. Prediksi memakai persamaan regresi
prediksi = reg.intercept + reg.slope * 35
print("prediksi total untuk jumlah = 35 :", round(prediksi))Output yang Dihasilkan:
t-statistic : 6.345
p-value : 0.00008
slope : 104364.4
intercept: -1696357.6
r-value : 0.856
prediksi total untuk jumlah = 35 : 1956397Mari kita telaah baris-baris pentingnya:
- Baris 5-6 (
jakarta = pd.Series(...),bandung = pd.Series(...)): kedua sampel disiapkan sebagai Series; scipy membaca isi Series seperti membaca array biasa. - Baris 8 (
stats.ttest_ind(jakarta, bandung)): fungsi menguji hipotesis nol “rata-rata kedua kelompok sama” dan mengembalikan objekTtestResultdengan atributstatisticdanpvalue. - Baris 9-10 (pencetakan): atribut hasil uji bertipe
np.float64, sehinggaround()dan f-string digunakan untuk mencetak angka bersih dengan pembulatan tetap. - Baris 24 (
penjualan["total"] = ...): kolom target regresi disiapkan sebagai kolom DataFrame biasa. - Baris 26 (
stats.linregress(x, y)): kedua argumen berupa kolom DataFrame; fungsi mengembalikan objek dengan atributslope(gradien),intercept(konstanta), danrvalue(koefisien korelasi). - Baris 33 (
prediksi = reg.intercept + reg.slope * 35): persamaan garisy = a + b·xdipakai memprediksi total untuk penjualan 35 unit — nilai kembaliannya angkanp.float64biasa.
Cara membaca hasilnya: nilai t sebesar 6,345 dengan p-value 0,00008 jauh di bawah ambang konvensional 0,05, sehingga hipotesis nol ditolak — selisih rata-rata dua kota sangat kecil kemungkinannya murni kebetulan. Pada regresi, slope 104364,4 berarti setiap tambahan satu unit kira-kira menaikkan total 104 ribu rupiah, dan rvalue 0,856 menunjukkan hubungan linear yang kuat tetapi tidak sempurna karena harga per produk berbeda-beda.
Angka uji statistik memberi kepastian, tetapi belum melakukan prediksi terhadap data baru yang menyertakan kolom kategori seperti kota dan produk. Untuk itu Chapter berikutnya menaikkan taruhannya ke machine learning dengan scikit-learn, yang membaca DataFrame secara native.
Referensi resmi untuk pendalaman: dokumentasi SciPy dan catatan rilis pandas 3.0.0 .