สถิติเชิงพรรณนาและการทดสอบการแจกแจงปกติ
คำนวณความเบ้และความโด่งด้วย scipy.stats ดำเนินการทดสอบ Shapiro-Wilk เพื่อตรวจสอบการแจกแจงปกติ และแปลความหมายค่า p
สถิติเชิงพรรณนาและการทดสอบการแจกแจงปกติ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
สถิติเชิงพรรณนาเปรียบเทียบกับสถิติอนุมาน
สถิติเชิงพรรณนาสรุปสิ่งที่มีอยู่ในข้อมูลของคุณ ได้แก่ ค่าเฉลี่ย มัธยฐาน ส่วนเบี่ยงเบนมาตรฐาน และความเบ้ ส่วน สถิติอนุมานใช้ตัวอย่างข้อมูลเพื่อสรุปเกี่ยวกับประชากร ได้แก่ การทดสอบสมมติฐาน ช่วงความเชื่อมั่น และค่า p โมดูล scipy.stats ของ SciPy เชื่อมโยงแนวคิดทั้งสองด้านนี้เข้าด้วยกัน โดยมีทั้งค่าทางสถิติพรรณนาที่ละเอียดกว่าของ describe() ใน Pandas และชุดการทดสอบสมมติฐานแบบดั้งเดิมอย่างครบถ้วน การใช้ Pandas จัดการข้อมูลร่วมกับ SciPy ทดสอบทางสถิติเป็นกระบวนการทำงานมาตรฐานของวิทยาศาสตร์ข้อมูลด้วย Python
สถิติเชิงพรรณนาเพิ่มเติม
describe() ของ Pandas ให้จำนวนข้อมูล ค่าเฉลี่ย std ค่าต่ำสุด/สูงสุด และควอนไทล์ ส่วน scipy.stats เพิ่ม ความเบ้ (ความไม่สมมาตรของการแจกแจง) และ ความโด่ง (ความหนาของหางการแจกแจง) ความเบ้าเท่ากับ 0 หมายถึงสมมาตร ความเบ้าเป็นบวกหมายถึงหางด้านขวายาวกว่า (มีค่าขนาดเล็กจำนวนมาก และมีค่าขนาดใหญ่มากเพียงไม่กี่ค่า) ความโด่งเท่ากับ 3 (หรือ 0 หากใช้รูปแบบส่วนเกิน) ถือว่าเป็นค่าปกติ ค่าที่สูงกว่าบ่งชี้ว่าหางหนากว่าและมีค่าผิดปกติสุดขั้วมากกว่าที่การแจกแจงปกติจะทำให้เกิด
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))ทำความเข้าใจความเบ้
ความเบ้ามีความสำคัญต่อการเลือกการทดสอบทางสถิติและการแปลงข้อมูล การแจกแจงที่ เบ้ขวา (ความเบ้าเป็นบวก) มีค่าเฉลี่ยมากกว่ามัธยฐาน ซึ่งพบได้ทั่วไปในข้อมูลรายได้ เวลาตอบสนอง และยอดขาย ส่วนการแจกแจงที่ เบ้ซ้าย (ความเบ้าเป็นลบ) มีค่าเฉลี่ยน้อยกว่ามัธยฐาน หลักโดยประมาณคือ |ความเบ้า| < 0.5 ถือว่าสมมาตรโดยประมาณ, 0.5–1.0 ถือว่าเบ้ปานกลาง และ > 1.0 ถือว่าเบ้มาก ซึ่งอาจเหมาะกับการแปลงแบบ log หรือรากที่สองก่อนใช้การทดสอบที่ตั้งสมมติฐานว่าข้อมูลมีการแจกแจงปกติ
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))เหตุใดการทดสอบการแจกแจงปกติจึงสำคัญ
การทดสอบทางสถิติหลายประเภท เช่น t-tests, ANOVA และสหสัมพันธ์เพียร์สัน ตั้งสมมติฐานว่าข้อมูล (หรือค่าคลาดเคลื่อน) เป็นไปตาม การแจกแจงปกติ (เกาส์เซียน) หากสมมติฐานนี้ไม่เป็นจริงในตัวอย่างขนาดเล็ก ค่า p ของการทดสอบอาจไม่แม่นยำ การทดสอบการแจกแจงปกติใช้ตรวจสอบว่าสมมติฐานนี้เป็นจริงหรือไม่ สำหรับตัวอย่างขนาดใหญ่ (n > 100) การทดสอบการแจกแจงปกติจะไวต่อความแตกต่างมากเกินไป และแทบจะปฏิเสธความเป็นปกติเสมอแม้ความแตกต่างนั้นจะเล็กน้อย ในกรณีนี้ควรอาศัย ทฤษฎีบทขีดจำกัดส่วนกลาง (ค่าเฉลี่ยตัวอย่างมีการแจกแจงใกล้เคียงปกติ) แทนการทดสอบข้อมูลดิบ
การทดสอบ Shapiro-Wilk
การทดสอบ Shapiro-Wilk (scipy.stats.shapiro(data)) เป็นการทดสอบการแจกแจงปกติที่มีประสิทธิภาพสูงสุดสำหรับขนาดตัวอย่างไม่เกินประมาณ 5,000 รายการ โดยคืนค่าสถิติ W และค่า p หาก p > 0.05 ให้ยังไม่ปฏิเสธความเป็นปกติ ซึ่งหมายความว่าข้อมูลสอดคล้องกับการแจกแจงปกติ หาก p ≤ 0.05 ให้ปฏิเสธความเป็นปกติ โปรดจำไว้ว่าการยังไม่ปฏิเสธความเป็นปกติไม่ได้พิสูจน์ว่าข้อมูลเป็นปกติ เพียงหมายความว่ายังมีหลักฐานไม่เพียงพอที่จะกล่าวว่าข้อมูลไม่เป็นปกติ
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')การทดสอบ Kolmogorov-Smirnov
การทดสอบ Kolmogorov-Smirnov (K-S) (scipy.stats.kstest(data, 'norm', args)) ใช้ตรวจสอบว่าตัวอย่างเป็นไปตามการแจกแจงที่ระบุหรือไม่ แตกต่างจาก Shapiro-Wilk ตรงที่ใช้ได้กับการแจกแจงทุกชนิด ไม่ใช่เฉพาะการแจกแจงปกติ และใช้กับตัวอย่างขนาดใหญ่ได้ การทดสอบนี้คำนวณความแตกต่างสูงสุดระหว่าง CDF เชิงประจักษ์ของข้อมูลกับ CDF ทางทฤษฎี ส่วนรูปแบบหนึ่งคือ การทดสอบ K-S แบบสองตัวอย่าง (stats.ks_2samp(a, b)) ซึ่งตรวจสอบว่าตัวอย่างสองชุดมาจากการแจกแจงเดียวกันหรือไม่ และมีประโยชน์สำหรับเปรียบเทียบการแจกแจงก่อนและหลัง
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}')การตรวจสอบการแจกแจงปกติด้วยภาพ: กราฟ QQ
กราฟ Q-Q (ควอนไทล์-ควอนไทล์) เป็นการตรวจสอบการแจกแจงปกติด้วยภาพ โดยพล็อตควอนไทล์ของข้อมูลเทียบกับควอนไทล์ของการแจกแจงปกติ หากข้อมูลเป็นปกติ จุดต่าง ๆ จะอยู่บนเส้นทแยงตรง การเบี่ยงเบนจากเส้นบ่งชี้ว่าข้อมูลไม่เป็นปกติ โดยเส้นโค้งรูปตัว S บ่งชี้ความโด่ง และการโค้งงอบ่งชี้ความเบ้า การทดสอบทางสถิติบอกว่าความเบี่ยงเบนมีนัยสำคัญหรือไม่ ส่วนกราฟ Q-Q แสดงลักษณะและตำแหน่งของความเบี่ยงเบน ใช้ scipy.stats.probplot() เพื่อสร้างข้อมูลสำหรับกราฟ 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()ทฤษฎีบทขีดจำกัดส่วนกลางในทางปฏิบัติ
ทฤษฎีบทขีดจำกัดส่วนกลาง (CLT) ระบุว่า การแจกแจงของค่าเฉลี่ยตัวอย่างจะเข้าใกล้การแจกแจงปกติมากขึ้นเมื่อขนาดตัวอย่างเพิ่มขึ้น โดยไม่ขึ้นกับการแจกแจงพื้นฐาน สำหรับ n ≥ 30 ค่าเฉลี่ยตัวอย่างจะใกล้เคียงปกติ แม้การสังเกตแต่ละค่าจะมีความเบ้ นี่คือเหตุผลที่ t-tests มีความทนทานสำหรับตัวอย่างขนาดใหญ่ เพราะคุณกำลังทดสอบว่าค่าเฉลี่ยแตกต่างกันหรือไม่ และค่าเฉลี่ยจะใกล้เคียงปกติแม้ข้อมูลดิบจะไม่เป็นปกติ สำหรับตัวอย่างขนาดเล็กจากประชากรที่ไม่เป็นปกติ ให้ใช้การทดสอบแบบไม่อิงพารามิเตอร์แทน
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))การตรวจสอบการแจกแจงปกติแยกตามกลุ่ม
ในการทดสอบเปรียบเทียบกลุ่ม (t-test, ANOVA) จำเป็นต้องมีการแจกแจงปกติ ภายในแต่ละกลุ่ม ไม่ใช่ในข้อมูลทั้งหมด เมื่อทดสอบว่ายอดขายแตกต่างกันตามภูมิภาคหรือไม่ ให้ทดสอบการแจกแจงปกติของยอดขายภายในแต่ละภูมิภาคแยกกัน การแจกแจงที่ไม่เป็นปกติเมื่อดูโดยรวมอาจยังเป็นไปตามเงื่อนไขความเป็นปกติภายในกลุ่มย่อยได้ ใช้ stats.shapiro() กับแต่ละกลุ่มโดยใช้ groupby() ของ Pandas และวนซ้ำผ่านกลุ่มต่าง ๆ เพื่อตรวจสอบสมมติฐานอย่างเป็นระบบ
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"}')ทางเลือกแบบไม่อิงพารามิเตอร์
เมื่อข้อมูลไม่เป็นไปตามสมมติฐานความเป็นปกติ ให้ใช้ การทดสอบแบบไม่อิงพารามิเตอร์ ซึ่งไม่ตั้งสมมติฐานเกี่ยวกับการแจกแจง การทดสอบ Mann-Whitney U (stats.mannwhitneyu) ใช้แทน independent t-test การทดสอบ Wilcoxon signed-rank (stats.wilcoxon) ใช้แทน paired t-test และการทดสอบ Kruskal-Wallis (stats.kruskal) ใช้แทน one-way ANOVA การทดสอบเหล่านี้ใช้ลำดับอันดับแทนค่าดิบและทนต่อค่าผิดปกติได้ดี แต่มีพลังทางสถิติน้อยกว่าการทดสอบแบบอิงพารามิเตอร์ที่สอดคล้องกัน เมื่อข้อมูลเป็นไปตามสมมติฐานความเป็นปกติจริง
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')การสรุปสถิติสำหรับหลายคอลัมน์
ในการทำ EDA คุณมักต้องตรวจสอบความเป็นปกติและความเบ้ของคอลัมน์ตัวเลขทั้งหมดพร้อมกัน ให้ใช้ select_dtypes ของ Pandas ร่วมกับการวนซ้ำในแต่ละคอลัมน์ โดยเรียกใช้ stats.shapiro() และ stats.skew() สร้าง DataFrame สรุปที่มีคอลัมน์สำหรับความเบ้า ความโด่ง และค่า p ของ Shapiro เพื่อให้เห็นภาพรวมว่าคอลัมน์ใดไม่เป็นปกติและต้องแปลงข้อมูลก่อนสร้างแบบจำลอง นี่เป็นส่วนหนึ่งของรายการตรวจสอบคุณภาพข้อมูลอย่างเป็นระบบ
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))ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจแนวคิดการวิเคราะห์ข้อมูลจากบทเรียนนี้
ทบทวนบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า scipy.stats.skew() และ kurtosis() ใช้อธิบายรูปร่างของการแจกแจงได้ละเอียดกว่าที่ describe() ให้ข้อมูล scipy.stats.shapiro() ใช้ทดสอบความเป็นปกติ โดย p > 0.05 หมายถึงไม่มีหลักฐานโต้แย้งความเป็นปกติ และ ทฤษฎีบทขีดจำกัดส่วนกลางทำให้ t-tests มีความทนทานสำหรับตัวอย่างขนาดใหญ่ แม้ข้อมูลจะไม่เป็นปกติ บทถัดไป เราจะใช้การทดสอบสมมติฐานด้วย t-tests เพื่อเปรียบเทียบค่าเฉลี่ยของกลุ่ม
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “สถิติเชิงพรรณนาและการทดสอบการแจกแจงปกติ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สถิติเชิงพรรณนาและการทดสอบการแจกแจงปกติ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สถิติเชิงพรรณนาและการทดสอบการแจกแจงปกติ”
คำนวณความเบ้และความโด่งด้วย scipy.stats ดำเนินการทดสอบ Shapiro-Wilk เพื่อตรวจสอบการแจกแจงปกติ และแปลความหมายค่า p คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “สถิติเชิงพรรณนาและการทดสอบการแจกแจงปกติ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สถิติเชิงพรรณนาและการทดสอบการแจกแจงปกติ
- การทดสอบทีเพื่อเปรียบเทียบค่าเฉลี่ย
- การทดสอบไคสแควร์เพื่อความเป็นอิสระ
- ANOVA และการทดสอบภายหลัง