Statistik Deskriptif dan Pengujian Normalitas
Hitung kemencengan dan kurtosis dengan scipy.stats, jalankan pengujian Shapiro-Wilk untuk normalitas, lalu tafsirkan nilai-p.
Statistik Deskriptif dan Pengujian Normalitas adalah pelajaran Pandas & NumPy Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Pandas & NumPy Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Statistik Deskriptif dan Inferensial
Statistik deskriptif merangkum isi data Anda: mean, median, simpangan baku, dan kemencengan. Statistik inferensial membuat pernyataan tentang populasi berdasarkan sampel: pengujian hipotesis, interval kepercayaan, dan nilai-p. Modul scipy.stats milik SciPy menjembatani kedua hal ini—modul tersebut menyediakan ukuran deskriptif yang melampaui describe() milik Pandas serta rangkaian lengkap pengujian hipotesis klasik. Menggabungkan Pandas untuk manipulasi data dan SciPy untuk pengujian statistik merupakan alur kerja standar dalam ilmu data Python.
Statistik Deskriptif Lanjutan
describe() milik Pandas memberikan count, mean, std, min/maksimum, dan kuartil. scipy.stats menambahkan kemencengan (ketidaksimetrian distribusi) dan kurtosis (ketebalan ekor). Kemencengan sebesar 0 berarti simetris; kemencengan positif berarti ekor kanan lebih panjang (banyak nilai kecil, sedikit nilai yang sangat besar). Kurtosis sebesar 3 (atau 0 dalam bentuk berlebih) adalah normal; nilai yang lebih tinggi menunjukkan ekor yang lebih tebal dengan lebih banyak pencilan ekstrem daripada yang dihasilkan distribusi normal.
import pandas as pd
from scipy import stats
import numpy as np
np.random.seed(0)
data = np.concatenate([
np.random.exponential(scale=2, size=500), # right-skewed
np.random.normal(loc=5, scale=1, size=500)
])
print('Mean:', round(data.mean(), 3))
print('Std:', round(data.std(), 3))
print('Skewness:', round(stats.skew(data), 3))
print('Kurtosis (excess):', round(stats.kurtosis(data), 3))Memahami Kemencengan
Kemencengan penting untuk memilih pengujian statistik dan transformasi. Distribusi yang menceng ke kanan (kemencengan positif) memiliki mean yang lebih besar daripada mediannya, seperti yang umum ditemukan pada data pendapatan, waktu reaksi, dan jumlah penjualan. Distribusi yang menceng ke kiri (kemencengan negatif) memiliki mean yang lebih kecil daripada mediannya. Patokan umum: |kemencengan| < 0,5 berarti kira-kira simetris; 0,5–1,0 berarti agak menceng; > 1,0 berarti sangat menceng dan mungkin akan lebih baik jika ditransformasi menggunakan log atau akar kuadrat sebelum menerapkan pengujian yang mengasumsikan kenormalan.
import numpy as np
from scipy import stats
# Right-skewed: income-like data
right_skewed = np.random.lognormal(mean=1, sigma=1, size=1000)
print('Right skew:', round(stats.skew(right_skewed), 3))
# After log transform
print('After log transform:', round(stats.skew(np.log(right_skewed)), 3))
# Symmetric normal
normal_data = np.random.normal(0, 1, 1000)
print('Normal skew:', round(stats.skew(normal_data), 3))Mengapa Pengujian Kenormalan Penting
Banyak pengujian statistik—uji-t, ANOVA, dan korelasi Pearson—mengasumsikan bahwa data (atau residual) mengikuti distribusi normal (Gaussian). Jika asumsi ini dilanggar pada sampel kecil, nilai-p pengujian mungkin tidak akurat. Pengujian kenormalan memeriksa apakah asumsi tersebut terpenuhi. Untuk sampel besar (n > 100), pengujian kenormalan menjadi sangat sensitif dan hampir selalu menolak kenormalan untuk penyimpangan kecil—dalam kasus tersebut, andalkan Teorema Limit Pusat (mean sampel kira-kira berdistribusi normal), bukan pengujian terhadap data mentah.
Uji Shapiro-Wilk
Uji Shapiro-Wilk (scipy.stats.shapiro(data)) adalah pengujian kenormalan yang paling kuat untuk ukuran sampel hingga sekitar 5.000. Uji ini mengembalikan statistik-W dan nilai-p. Jika p > 0.05, Anda gagal menolak kenormalan—data konsisten dengan distribusi normal. Jika p ≤ 0.05, Anda menolak kenormalan. Ingat: gagal menolak kenormalan tidak membuktikan bahwa data berdistribusi normal; hal itu hanya berarti Anda tidak memiliki cukup bukti untuk menyatakan bahwa data tidak normal.
import numpy as np
from scipy import stats
np.random.seed(42)
# Normal data
normal = np.random.normal(0, 1, 100)
stat, p = stats.shapiro(normal)
print(f'Normal data: W={stat:.4f}, p={p:.4f}')
print('Conclusion:', 'Looks normal' if p > 0.05 else 'Not normal')
# Skewed data
skewed = np.random.exponential(1, 100)
stat2, p2 = stats.shapiro(skewed)
print(f'Skewed data: W={stat2:.4f}, p={p2:.4f}')
print('Conclusion:', 'Looks normal' if p2 > 0.05 else 'Not normal')Uji Kolmogorov-Smirnov
Uji Kolmogorov-Smirnov (K-S) (scipy.stats.kstest(data, 'norm', args)) menguji apakah sampel mengikuti distribusi tertentu. Berbeda dari Shapiro-Wilk, uji ini dapat digunakan untuk distribusi apa pun (bukan hanya normal) dan untuk sampel besar. Uji ini menghitung perbedaan maksimum antara CDF empiris data dan CDF teoretis. Variasinya, yaitu uji K-S dua sampel (stats.ks_2samp(a, b)), menguji apakah dua sampel berasal dari distribusi yang sama—berguna untuk membandingkan distribusi sebelum dan sesudah.
import numpy as np
from scipy import stats
np.random.seed(0)
data = np.random.normal(loc=5, scale=2, size=200)
# One-sample K-S test against N(5, 2) distribution
stat, p = stats.kstest(data, 'norm', args=(5, 2))
print(f'K-S test: stat={stat:.4f}, p={p:.4f}')
print('Follows N(5,2)?', 'Yes' if p > 0.05 else 'No')
# Two-sample K-S test
data2 = np.random.normal(loc=5.5, scale=2, size=200)
stat2, p2 = stats.ks_2samp(data, data2)
print(f'Two-sample K-S: stat={stat2:.4f}, p={p2:.4f}')Pemeriksaan Kenormalan Visual: Plot QQ
Plot Q-Q (kuantil-kuantil) adalah pemeriksaan kenormalan secara visual: plot ini memetakan kuantil data Anda terhadap kuantil distribusi normal. Jika data berdistribusi normal, titik-titiknya berada pada garis diagonal lurus. Penyimpangan dari garis menunjukkan penyimpangan dari kenormalan—kurva berbentuk S menunjukkan kurtosis, sedangkan lengkungan menunjukkan kemencengan. Pengujian statistik memberi tahu Anda apakah penyimpangan itu signifikan; plot Q-Q menunjukkan sifat dan lokasi penyimpangan. Gunakan scipy.stats.probplot() untuk menghasilkan data plot Q-Q.
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(1)
data = np.random.exponential(2, 200)
# Q-Q plot
(osm, osr), (slope, intercept, r) = stats.probplot(data, dist='norm')
print(f'R-squared of Q-Q fit: {r**2:.4f}') # Close to 1 = normal
# Visual inspection: if plotting, points on the line = normal
# plt.figure()
# stats.probplot(data, dist='norm', plot=plt)
# plt.show()Teorema Limit Pusat dalam Praktik
Teorema Limit Pusat (CLT) menyatakan bahwa distribusi mean sampel mendekati distribusi normal seiring bertambahnya ukuran sampel, terlepas dari distribusi yang mendasarinya. Untuk n ≥ 30, mean sampel kira-kira berdistribusi normal meskipun pengamatan individual menceng. Inilah alasan uji-t cukup tangguh untuk sampel besar: Anda menguji apakah mean berbeda, dan mean kira-kira berdistribusi normal meskipun data mentah tidak normal. Untuk sampel kecil dari populasi yang tidak normal, gunakan pengujian nonparametrik.
import numpy as np
from scipy import stats
np.random.seed(0)
# Population: heavily right-skewed (exponential)
population = np.random.exponential(scale=1, size=10000)
print('Population skewness:', round(stats.skew(population), 3))
# Sample means are approximately normal (CLT)
sample_means = [np.random.choice(population, 50).mean()
for _ in range(1000)]
print('Sample means skewness:', round(stats.skew(sample_means), 3))
_, p = stats.shapiro(sample_means)
print('Shapiro p-value for means:', round(p, 4))Kenormalan Berdasarkan Kelompok
Dalam pengujian perbandingan kelompok (uji-t, ANOVA), kenormalan diperlukan dalam setiap kelompok, bukan pada keseluruhan data. Saat menguji apakah penjualan berbeda berdasarkan wilayah, uji kenormalan penjualan secara terpisah dalam setiap wilayah. Distribusi yang tidak normal secara keseluruhan tetap dapat memenuhi kenormalan dalam subkelompok. Terapkan stats.shapiro() pada setiap kelompok menggunakan groupby() milik Pandas dan lakukan iterasi pada kelompok untuk memeriksa asumsi secara sistematis.
import pandas as pd
import numpy as np
from scipy import stats
np.random.seed(0)
df = pd.DataFrame({
'region': ['N']*50 + ['S']*50 + ['E']*50,
'sales': np.concatenate([
np.random.normal(100, 20, 50),
np.random.normal(110, 25, 50),
np.random.normal(95, 15, 50)
])
})
for region, group in df.groupby('region'):
stat, p = stats.shapiro(group['sales'])
print(f'Region {region}: W={stat:.4f}, p={p:.4f} -> '
f'{"Normal" if p>0.05 else "Not normal"}')Alternatif Nonparametrik
Jika kenormalan dilanggar, gunakan pengujian nonparametrik yang tidak membuat asumsi distribusi. Uji Mann-Whitney U (stats.mannwhitneyu) menggantikan uji-t independen; uji peringkat bertanda Wilcoxon (stats.wilcoxon) menggantikan uji-t berpasangan; uji Kruskal-Wallis (stats.kruskal) menggantikan ANOVA satu arah. Pengujian ini menggunakan peringkat, bukan nilai mentah, dan tahan terhadap pencilan, tetapi daya statistiknya lebih rendah daripada pengujian parametrik yang setara ketika kenormalan memang terpenuhi.
import numpy as np
from scipy import stats
np.random.seed(0)
# Non-normal data
group_a = np.random.exponential(2, 40)
group_b = np.random.exponential(2.5, 40)
# Parametric would be wrong here; use non-parametric
stat, p = stats.mannwhitneyu(group_a, group_b, alternative='two-sided')
print(f'Mann-Whitney U test: U={stat:.1f}, p={p:.4f}')
print('Groups differ?' , 'Yes' if p < 0.05 else 'No')Merangkum Statistik untuk Beberapa Kolom
Dalam EDA, Anda sering perlu memeriksa kenormalan dan kemencengan semua kolom numerik sekaligus. Gabungkan select_dtypes milik Pandas dengan perulangan pada kolom yang memanggil stats.shapiro() dan stats.skew(). Buat DataFrame ringkasan dengan kolom untuk kemencengan, kurtosis, dan nilai-p Shapiro agar dapat melihat secara umum kolom mana yang tidak normal dan memerlukan transformasi sebelum pemodelan. Ini merupakan bagian dari daftar periksa kualitas data yang sistematis.
import pandas as pd
import numpy as np
from scipy import stats
np.random.seed(0)
df = pd.DataFrame({
'age': np.random.normal(35, 10, 200),
'income': np.random.lognormal(10, 1, 200),
'score': np.random.uniform(0, 100, 200)
})
rows = []
for col in df.select_dtypes(include='number').columns:
s = stats.skew(df[col])
_, p = stats.shapiro(df[col][:200])
rows.append({'column': col, 'skewness': round(s, 3),
'shapiro_p': round(p, 4), 'normal': p > 0.05})
print(pd.DataFrame(rows).to_string(index=False))Pemeriksaan Singkat
Uji pemahaman Anda tentang konsep Analisis Data dari pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda mempelajari bahwa scipy.stats.skew() dan kurtosis() menjelaskan bentuk distribusi secara lebih mendalam daripada yang diberikan oleh describe(), scipy.stats.shapiro() menguji kenormalan dengan p > 0,05 yang berarti tidak ada bukti yang menentang kenormalan, dan Teorema Limit Pusat membuat uji-t tangguh untuk sampel besar meskipun datanya tidak normal. Selanjutnya, kita akan menerapkan pengujian hipotesis dengan uji-t untuk membandingkan mean kelompok.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Statistik Deskriptif dan Pengujian Normalitas” gratis?
Ya — teks lengkap “Statistik Deskriptif dan Pengujian Normalitas” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Pandas & NumPy Academy, upgrade ke CoddyKit PRO. Kursus Pandas & NumPy Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Statistik Deskriptif dan Pengujian Normalitas”?
Hitung kemencengan dan kurtosis dengan scipy.stats, jalankan pengujian Shapiro-Wilk untuk normalitas, lalu tafsirkan nilai-p. Kamu berlatih Pandas & NumPy Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Pandas & NumPy Academy?
Tidak diperlukan pengalaman sebelumnya. Pandas & NumPy Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Statistik Deskriptif dan Pengujian Normalitas” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Pandas & NumPy Academy ini?
Ya. Setiap pelajaran Pandas & NumPy Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Statistik Deskriptif dan Pengujian Normalitas
- Pengujian-t untuk Membandingkan Rata-Rata
- Pengujian Chi-Kuadrat untuk Independensi
- ANOVA dan Pengujian Pasca-Hoc