🔬 Kiểm định giả thuyết cơ bản
Mục tiêu bài học
Sau bài học này, bạn sẽ:
- Hiểu khái niệm Hypothesis Testing
- Nắm vững quy trình kiểm định
- Hiểu P-value và Significance Level
- Phân biệt Type I và Type II Errors
1. Giới thiệu Hypothesis Testing
1.1 Tại sao cần kiểm định?
Tình huống: Công ty claim sản phẩm mới giúp tăng 20% doanh thu.
Câu hỏi: Làm sao biết claim này có đúng không?
→ Hypothesis Testing giúp đưa ra quyết định dựa trên dữ liệu!
1.2 Các bước kiểm định
Quy trình Kiểm định Giả thuyết
2. Null và Alternative Hypothesis
2.1 Định nghĩa
| Giả thuyết | Ký hiệu | Ý nghĩa |
|---|---|---|
| Null Hypothesis | H₀ | "Không có gì đặc biệt", status quo |
| Alternative Hypothesis | H₁ hoặc Hₐ | Claim cần chứng minh |
2.2 Cách đặt giả thuyết
Ví dụ: Thuốc mới có hiệu quả hơn không?
- H₀: μ = μ₀ (không khác biệt)
- H₁: μ ≠ μ₀ hoặc μ > μ₀ hoặc μ < μ₀
2.3 One-tailed vs Two-tailed
| Loại | H₁ | Khi nào dùng |
|---|---|---|
| Two-tailed | μ ≠ μ₀ | Chỉ quan tâm "khác" |
| Right-tailed | μ > μ₀ | Quan tâm "lớn hơn" |
| Left-tailed | μ < μ₀ | Quan tâm "nhỏ hơn" |
1import numpy as np2import matplotlib.pyplot as plt3from scipy import stats45x = np.linspace(-4, 4, 1000)6y = stats.norm.pdf(x)78fig, axes = plt.subplots(1, 3, figsize=(15, 4))910# Two-tailed11axes[0].plot(x, y)12axes[0].fill_between(x, y, where=(x < -1.96) | (x > 1.96), alpha=0.3, color='red')13axes[0].set_title('Two-tailed (H₁: μ ≠ μ₀)')14axes[0].axvline(-1.96, color='red', linestyle='--')15axes[0].axvline(1.96, color='red', linestyle='--')1617# Right-tailed18axes[1].plot(x, y)19axes[1].fill_between(x, y, where=(x > 1.645), alpha=0.3, color='red')20axes[1].set_title('Right-tailed (H₁: μ > μ₀)')21axes[1].axvline(1.645, color='red', linestyle='--')2223# Left-tailed24axes[2].plot(x, y)25axes[2].fill_between(x, y, where=(x < -1.645), alpha=0.3, color='red')26axes[2].set_title('Left-tailed (H₁: μ < μ₀)')27axes[2].axvline(-1.645, color='red', linestyle='--')2829plt.tight_layout()30plt.show()3. Significance Level (α)
3.1 Định nghĩa
α (alpha) = Xác suất reject H₀ khi H₀ đúng (Type I Error)
Giá trị thường dùng: α = 0.05 (5%)
3.2 Ý nghĩa
α = 0.05 nghĩa là:
- Chấp nhận 5% rủi ro kết luận sai
- 95% confident khi reject H₀
3.3 Critical Value
| α | Two-tailed z | One-tailed z |
|---|---|---|
| 0.10 | ±1.645 | 1.28 |
| 0.05 | ±1.96 | 1.645 |
| 0.01 | ±2.576 | 2.33 |
4. P-value
4.1 Định nghĩa
P-value = Xác suất quan sát được kết quả ít nhất cực đoan như kết quả hiện tại, giả sử H₀ đúng.
4.2 Quy tắc quyết định
| So sánh | Quyết định |
|---|---|
| P-value < α | Reject H₀ (Kết quả significant) |
| P-value ≥ α | Fail to Reject H₀ |
4.3 Cách hiểu P-value
| P-value | Interpretation |
|---|---|
| < 0.01 | Very strong evidence against H₀ |
| 0.01 - 0.05 | Strong evidence against H₀ |
| 0.05 - 0.10 | Weak evidence against H₀ |
| > 0.10 | Little or no evidence against H₀ |
❌ Xác suất H₀ đúng ❌ Xác suất kết quả do ngẫu nhiên ❌ Mức độ quan trọng thực tế (practical significance)
5. Type I và Type II Errors
5.1 Ma trận lỗi
| H₀ True | H₀ False | |
|---|---|---|
| Reject H₀ | Type I Error (α) | Correct ✓ |
| Fail to Reject | Correct ✓ | Type II Error (β) |
5.2 Ví dụ thực tế
Xét nghiệm COVID:
- Type I (False Positive): Không bệnh nhưng kết quả dương tính
- Type II (False Negative): Có bệnh nhưng kết quả âm tính
5.3 Power of Test
Power cao → Khả năng phát hiện hiệu ứng thực cao
5.4 Trade-off
Trade-off giữa α, β và Power
6. Z-Test for Mean
6.1 Điều kiện
- σ đã biết
- n ≥ 30 hoặc population normal
6.2 Test Statistic
6.3 Ví dụ hoàn chỉnh
Bài toán: Công ty claim pin có tuổi thọ trung bình 500 giờ. Kiểm tra mẫu 36 pin: x̄ = 490, σ = 30. Test ở α = 0.05.
Bước 1: Đặt giả thuyết
- H₀: μ = 500
- H₁: μ ≠ 500 (two-tailed)
Bước 2: Tính z-statistic
Bước 3: Tính P-value
Bước 4: Kết luận P-value (0.0456) < α (0.05) → Reject H₀
1from scipy import stats2import numpy as np34# Dữ liệu5x_bar = 4906mu_0 = 5007sigma = 308n = 369alpha = 0.051011# Z-statistic12z = (x_bar - mu_0) / (sigma / np.sqrt(n))13print(f"Z-statistic: {z:.4f}")1415# P-value (two-tailed)16p_value = 2 * stats.norm.cdf(z) # z < 0, nên dùng cdf17print(f"P-value: {p_value:.4f}")1819# Quyết định20if p_value < alpha:21 print(f"P-value ({p_value:.4f}) < α ({alpha}) → Reject H₀")22else:23 print(f"P-value ({p_value:.4f}) ≥ α ({alpha}) → Fail to Reject H₀")7. Z-Test for Proportion
7.1 Test Statistic
7.2 Ví dụ
Bài toán: Tỷ lệ hài lòng trước đây là 70%. Khảo sát mới 200 người, 150 hài lòng (75%). Tỷ lệ có tăng không? (α = 0.05)
1from scipy import stats2import numpy as np34# Dữ liệu5p_hat = 150 / 200 # 0.756p_0 = 0.707n = 2008alpha = 0.05910# Z-statistic11se = np.sqrt(p_0 * (1 - p_0) / n)12z = (p_hat - p_0) / se13print(f"Z-statistic: {z:.4f}")1415# P-value (right-tailed: H₁: p > 0.70)16p_value = 1 - stats.norm.cdf(z)17print(f"P-value (one-tailed): {p_value:.4f}")1819# Quyết định20if p_value < alpha:21 print("→ Reject H₀: Tỷ lệ hài lòng đã tăng")22else:23 print("→ Fail to Reject H₀: Không đủ bằng chứng")8. Using scipy.stats
1from scipy import stats2import numpy as np34# 1. One-sample Z-test (manual)5def z_test_one_sample(x_bar, mu_0, sigma, n, alternative='two-sided'):6 z = (x_bar - mu_0) / (sigma / np.sqrt(n))7 8 if alternative == 'two-sided':9 p_value = 2 * (1 - stats.norm.cdf(abs(z)))10 elif alternative == 'greater':11 p_value = 1 - stats.norm.cdf(z)12 else: # less13 p_value = stats.norm.cdf(z)14 15 return z, p_value1617# 2. Proportion Z-test18from statsmodels.stats.proportion import proportions_ztest1920count = 150 # successes21nobs = 200 # total22p_null = 0.702324z_stat, p_value = proportions_ztest(count, nobs, value=p_null, alternative='larger')25print(f"Z-stat: {z_stat:.4f}, P-value: {p_value:.4f}")9. Practical vs Statistical Significance
9.1 Vấn đề
- Statistical Significance: P-value < α
- Practical Significance: Effect có ý nghĩa thực tế
9.2 Ví dụ
n = 10,000: Thuốc giảm cân trung bình 0.1kg
- P-value = 0.001 (statistically significant)
- Nhưng 0.1kg có ý nghĩa thực tế không? → Có thể KHÔNG!
9.3 Effect Size
Cohen's d cho mean difference:
| d | Interpretation |
|---|---|
| 0.2 | Small effect |
| 0.5 | Medium effect |
| 0.8 | Large effect |
1def cohens_d(x_bar, mu_0, sigma):2 return (x_bar - mu_0) / sigma34# Ví dụ5d = cohens_d(490, 500, 30)6print(f"Cohen's d: {d:.2f}") # -0.33 → Small-Medium effect10. Bài tập thực hành
Bài tập 1: Z-test for Mean
Cân nặng trung bình claim là 500g (σ = 15g). Mẫu 49 sản phẩm: x̄ = 495g.
- Đặt H₀ và H₁ (two-tailed)
- Tính z-statistic
- Tính P-value
- Kết luận ở α = 0.05
Bài tập 2: Z-test for Proportion
Tỷ lệ lỗi target: 3%. Kiểm tra 400 sản phẩm, 20 lỗi.
- Tỷ lệ lỗi có vượt target không? (α = 0.05)
Bài tập 3: Type Errors
Nếu α = 0.01 thay vì 0.05:
- Type I Error tăng hay giảm?
- Type II Error tăng hay giảm?
- Cần làm gì để giảm cả hai?
Tóm tắt
| Khái niệm | Định nghĩa |
|---|---|
| H₀ | Giả thuyết không (status quo) |
| H₁ | Giả thuyết thay thế (claim) |
| α | P(Type I Error) = P(Reject H₀ | H₀ true) |
| β | P(Type II Error) = P(Fail to Reject | H₀ false) |
| P-value | P(kết quả cực đoan | H₀ true) |
| Power | 1 - β |
- Reject H₀ khi P-value < α
- P-value ≠ P(H₀ đúng)
- Type I (α): False Positive
- Type II (β): False Negative
- Practical significance quan trọng không kém statistical
