Bỏ qua

Kiểm định giả thuyết

Kiểm định giả thuyết cung cấp một khuôn khổ chặt chẽ để quyết định xem các hiệu ứng quan sát được là thực hay do ngẫu nhiên. Tài liệu này bao quát giả thuyết không và thay thế, giá trị p, mức ý nghĩa, kiểm định t, kiểm định chi-bình phương, ANOVA, và sai lầm Loại I/II — cùng một logic được dùng trong A/B testing, so sánh mô hình và nghiên cứu.

  • Thống kê không chỉ về mô tả dữ liệu. Thường bạn cần đưa ra một quyết định: một loại thuốc mới có hiệu quả không? Một thuật toán có nhanh hơn thuật toán khác không? Giá trị trung bình đã thay đổi chưa? Kiểm định giả thuyết cung cấp cho bạn một khuôn khổ có cấu trúc để trả lời những câu hỏi này bằng dữ liệu.

  • Ý tưởng đơn giản: giả sử không có gì thay đổi ("giả thuyết không"), sau đó kiểm tra xem dữ liệu có quá cực đoan đến nỗi giả định này trở nên khó tin hay không.

  • Giả thuyết không (\(H_0\)) là khẳng định mặc định, thường là một phát biểu về "không có hiệu ứng" hay "không có khác biệt." Ví dụ: "thời gian giao hàng trung bình vẫn là 30 phút" hoặc "mô hình mới không tốt hơn mô hình cũ."

  • Giả thuyết thay thế (\(H_1\) hay \(H_a\)) là điều bạn nghi ngờ có thể đúng thay vào đó: "thời gian giao hàng trung bình đã thay đổi" hoặc "mô hình mới tốt hơn."

  • Bạn không bao giờ chứng minh \(H_1\) một cách trực tiếp. Thay vào đó, bạn hỏi: nếu \(H_0\) là đúng, khả năng tôi thấy dữ liệu cực đoan đến thế này là bao nhiêu? Nếu nó rất khó xảy ra, bạn bác bỏ \(H_0\) để chọn \(H_1\).

  • Thống kê kiểm định (test statistic) là một con số duy nhất tóm tắt khoảng cách giữa kết quả mẫu của bạn với những gì \(H_0\) dự đoán. Các kiểm định khác nhau dùng các công thức khác nhau, nhưng logic luôn giống nhau: đo khoảng cách giữa quan sát và kỳ vọng.

  • Giá trị p (p-value) là xác suất quan sát được một thống kê kiểm định ít nhất là cực đoan như của bạn, giả sử \(H_0\) là đúng. Giá trị p nhỏ nghĩa là dữ liệu gây bất ngờ dưới \(H_0\).

  • Mức ý nghĩa (\(\alpha\)) là ngưỡng bạn đặt ra trước khi nhìn vào dữ liệu. Nếu \(p \le \alpha\), bạn bác bỏ \(H_0\). Các lựa chọn phổ biến là \(\alpha = 0.05\) (5%) và \(\alpha = 0.01\) (1%).

Đường cong chuẩn với các vùng bác bỏ được tô bóng, thống kê kiểm định được đánh dấu, và vùng giá trị p được tô sáng

  • Các phần đuôi tô bóng là các vùng bác bỏ (rejection regions). Nếu thống kê kiểm định của bạn rơi vào đó, dữ liệu đủ gây bất ngờ dưới \(H_0\) để bạn bác bỏ nó. Vùng xanh lá thể hiện giá trị p cho một thống kê kiểm định cụ thể.

  • Đây là quy trình từng bước:

    • Bước 1: Phát biểu \(H_0\)\(H_1\)
    • Bước 2: Chọn mức ý nghĩa \(\alpha\)
    • Bước 3: Thu thập dữ liệu và tính thống kê kiểm định
    • Bước 4: Tìm giá trị p (hoặc so sánh thống kê kiểm định với một giá trị tới hạn)
    • Bước 5: Nếu \(p \le \alpha\), bác bỏ \(H_0\). Nếu không, không bác bỏ \(H_0\).
  • Ví dụ đã làm: Một nhà máy tuyên bố bu-lông của họ có chiều dài trung bình 10 cm. Bạn đo 36 bu-lông và tìm thấy trung bình mẫu là 10.3 cm. Độ lệch chuẩn tổng thể đã biết là 0.9 cm. Có bằng chứng cho thấy chiều dài trung bình đã thay đổi?

  • \(H_0\): \(\mu = 10\), \(H_1\): \(\mu \neq 10\), \(\alpha = 0.05\)

  • Thống kê kiểm định (kiểm định z, vì \(\sigma\) đã biết và \(n\) lớn):

\[z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}} = \frac{10.3 - 10}{0.9 / \sqrt{36}} = \frac{0.3}{0.15} = 2.0\]
  • Với kiểm định hai phía tại \(\alpha = 0.05\), các giá trị tới hạn là \(\pm 1.96\). Giá trị \(z = 2.0 > 1.96\), nên ta bác bỏ \(H_0\). Giá trị p xấp xỉ 0.046, nhỏ hơn 0.05.

  • Kết luận: có bằng chứng thống kê có ý nghĩa rằng chiều dài bu-lông trung bình khác với 10 cm.

  • Kiểm định một phía (one-tailed test) kiểm tra hiệu ứng theo một hướng cụ thể (\(H_1\): \(\mu > 10\) hoặc \(\mu < 10\)). Toàn bộ \(\alpha\) dồn vào một đuôi, giúp dễ bác bỏ \(H_0\) theo hướng đó hơn nhưng không thể phát hiện hiệu ứng theo hướng ngược lại.

  • Kiểm định hai phía (two-tailed test) kiểm tra bất kỳ sự khác biệt nào (\(H_1\): \(\mu \neq 10\)). \(\alpha\) được chia đều cho cả hai đuôi (\(\alpha/2\) mỗi bên). Điều này thận trọng hơn nhưng bắt được các hiệu ứng ở cả hai hướng.

  • Ngay cả với một quy trình tốt, sai lầm vẫn xảy ra. Có chính xác hai loại sai lầm:

Ma trận 2x2 thể hiện sai lầm Loại I và Loại II: thực tế vs quyết định

  • Sai lầm Loại I (dương tính giả): bạn bác bỏ \(H_0\) khi nó thực sự đúng. Xác suất này là \(\alpha\), mà bạn kiểm soát bằng cách chọn mức ý nghĩa của mình. Giống như chuông báo cháy kêu trong khi không có cháy.

  • Sai lầm Loại II (âm tính giả): bạn không bác bỏ \(H_0\) khi nó thực sự sai. Xác suất này là \(\beta\). Giống như chuông báo cháy im lặng trong khi có cháy thật.

  • Lực kiểm định (Power)\(1 - \beta\), xác suất bác bỏ đúng một \(H_0\) sai. Lực kiểm định càng cao nghĩa là bạn càng giỏi phát hiện các hiệu ứng thực. Lực kiểm định tăng khi:

    • Kích thước hiệu ứng thực lớn hơn (khác biệt lớn hơn dễ phát hiện)
    • Kích thước mẫu lớn hơn (nhiều dữ liệu hơn = độ chính xác cao hơn)
    • Mức ý nghĩa \(\alpha\) lớn hơn (nhưng điều này tăng rủi ro sai lầm Loại I)
    • Độ biến thiên thấp hơn (ít nhiễu hơn)
  • Có sự căng thẳng giữa sai lầm Loại I và Loại II. Giảm \(\alpha\) (cẩn thận hơn về dương tính giả) làm tăng \(\beta\) (nhiều âm tính giả hơn). Bạn không thể tối thiểu hóa cả hai đồng thời với một kích thước mẫu cố định.

  • Kiểm định tham số (parametric tests) giả định dữ liệu tuân theo một phân bố cụ thể (thường là chuẩn). Chúng mạnh mẽ hơn khi các giả định có hiệu lực.

  • Kiểm định Z: so sánh trung bình mẫu với một giá trị đã biết khi \(\sigma\) đã biết và \(n\) lớn (\(n \ge 30\)). Thống kê kiểm định:

\[z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}}\]
  • Kiểm định T: giống kiểm định z, nhưng dùng khi \(\sigma\) không biết (ước lượng từ mẫu) hoặc \(n\) nhỏ. Dùng phân bố t, có đuôi nặng hơn phân bố chuẩn. Các đuôi nặng hơn tính đến sự không chắc chắn thêm từ việc ước lượng \(\sigma\).
\[t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}\]
  • Phân bố t có một tham số gọi là bậc tự do (degrees of freedom) (\(df = n - 1\)). Khi \(df\) tăng, phân bố t tiến tới phân bố chuẩn.

  • Có vài dạng kiểm định t:

    • Kiểm định t một mẫu: trung bình mẫu có khác so với một giá trị cụ thể không?
    • Kiểm định t hai mẫu độc lập: trung bình của hai nhóm riêng biệt có khác nhau không?
    • Kiểm định t bắt cặp: trung bình của hai phép đo có liên quan có khác nhau không (vd. trước và sau điều trị trên cùng đối tượng)?
  • ANOVA (Phân tích phương sai) : kiểm tra xem trung bình của ba nhóm trở lên có bằng nhau không. Thay vì thực hiện nhiều kiểm định t (làm tăng tỷ lệ sai lầm Loại I), ANOVA thực hiện một kiểm định duy nhất bằng cách so sánh phương sai giữa các nhóm với phương sai trong các nhóm.

\[F = \frac{\text{phương sai giữa các nhóm}}{\text{phương sai trong các nhóm}}\]
  • Tỉ lệ \(F\) lớn nghĩa là các nhóm khác nhau nhiều hơn so với kỳ vọng từ dao động ngẫu nhiên đơn thuần.

  • Kiểm định phi tham số (non-parametric tests) đưa ra ít giả định hơn về phân bố dữ liệu. Chúng làm việc trên các hạng thay vì giá trị thô, khiến chúng mạnh mẽ với ngoại lệ và tính không chuẩn.

  • Kiểm định Chi-bình phương (\(\chi^2\)): kiểm tra xem các tần số quan sát có khớp với các tần số kỳ vọng không. Dùng cho dữ liệu phân loại. Ví dụ: tỷ lệ xe màu đỏ, xanh, và xanh lá có khớp với tỷ lệ nhà sản xuất tuyên bố không?

\[\chi^2 = \sum \frac{(O_i - E_i)^2}{E_i}\]
  • Kiểm định Mann-Whitney U: thay thế phi tham số cho kiểm định t hai mẫu độc lập. Nó kiểm tra xem một nhóm có xu hướng có giá trị lớn hơn nhóm kia hay không bằng cách so sánh các hạng.

  • Kiểm định Wilcoxon signed-rank: thay thế phi tham số cho kiểm định t bắt cặp. So sánh các quan sát bắt cặp bằng cách xem xét độ lớn và hướng của các khác biệt.

  • Kiểm định Kruskal-Wallis: thay thế phi tham số cho ANOVA một chiều. Kiểm tra xem nhiều nhóm có đến từ cùng một phân bố không bằng cách so sánh các hạng trên tất cả các nhóm.

  • Kiểm định mức độ phù hợp (Goodness-of-fit) kiểm tra xem dữ liệu của bạn có tuân theo một phân bố lý thuyết cụ thể không. Kiểm định chi-bình phương về mức độ phù hợp so sánh số đếm bin quan sát với số đếm kỳ vọng dưới phân bố giả định.

  • Kiểm định tính chuẩn (normality tests) kiểm tra cụ thể xem dữ liệu có phân bố chuẩn không. Các kiểm định phổ biến bao gồm kiểm định Shapiro-Wilk (mạnh cho mẫu nhỏ) và kiểm định Kolmogorov-Smirnov (so sánh CDF mẫu với CDF lý thuyết).

  • Trong ML, kiểm định giả thuyết xuất hiện khi bạn so sánh hiệu năng mô hình. Nếu mô hình A đạt độ chính xác 92% và mô hình B đạt 91%, sự khác biệt là thực hay chỉ là nhiễu? Một kiểm định t bắt cặp trên các điểm xác thực chéo có thể trả lời điều này.

Bài tập lập trình (dùng CoLab hoặc notebook)

  1. Thực hiện kiểm định z cho ví dụ nhà máy bu-lông từ văn bản. Tính thống kê kiểm định, giá trị p, và đưa ra quyết định.

    import jax.numpy as jnp
    
    x_bar = 10.3    # sample mean
    mu_0 = 10.0     # null hypothesis value
    sigma = 0.9     # known population std
    n = 36           # sample size
    alpha = 0.05
    
    # Test statistic
    z = (x_bar - mu_0) / (sigma / jnp.sqrt(n))
    print(f"z = {z:.4f}")
    
    # p-value (two-tailed) using the normal CDF approximation
    # For |z| = 2.0, p ≈ 0.0456
    from jax.scipy.stats import norm
    p_value = 2 * (1 - norm.cdf(jnp.abs(z)))
    print(f"p-value = {p_value:.4f}")
    print(f"Reject H₀? {p_value <= alpha}")
    

  2. Mô phỏng sai lầm Loại I: khi \(H_0\) đúng, ta thường nhầm lẫn bác bỏ nó bao nhiêu lần? Chạy 10,000 thí nghiệm và kiểm tra tỷ lệ bác bỏ có khớp với \(\alpha\) không.

    import jax
    import jax.numpy as jnp
    
    key = jax.random.PRNGKey(0)
    mu_0 = 50.0
    sigma = 10.0
    n = 30
    alpha = 0.05
    n_experiments = 10_000
    
    rejections = 0
    for i in range(n_experiments):
        key, subkey = jax.random.split(key)
        sample = mu_0 + sigma * jax.random.normal(subkey, shape=(n,))
        z = (sample.mean() - mu_0) / (sigma / jnp.sqrt(n))
        p_value = 2 * (1 - __import__("jax").scipy.stats.norm.cdf(jnp.abs(z)))
        if p_value <= alpha:
            rejections += 1
    
    print(f"Rejection rate: {rejections/n_experiments:.4f}")
    print(f"Expected (α):   {alpha}")
    

  3. So sánh kiểm định t và kiểm định Mann-Whitney U trên hai nhóm. Tạo dữ liệu nơi một nhóm có trung bình cao hơn một chút và xem kiểm định nào phát hiện sự khác biệt.

    import jax
    import jax.numpy as jnp
    
    key = jax.random.PRNGKey(99)
    k1, k2 = jax.random.split(key)
    
    group_a = jax.random.normal(k1, shape=(25,)) * 5 + 100
    group_b = jax.random.normal(k2, shape=(25,)) * 5 + 103  # slightly higher mean
    
    # Two-sample t-test (equal variance assumed)
    n_a, n_b = len(group_a), len(group_b)
    mean_a, mean_b = group_a.mean(), group_b.mean()
    pooled_var = ((n_a - 1) * group_a.var() + (n_b - 1) * group_b.var()) / (n_a + n_b - 2)
    se = jnp.sqrt(pooled_var * (1/n_a + 1/n_b))
    t_stat = (mean_a - mean_b) / se
    print(f"T-test statistic: {t_stat:.4f}")
    
    # Mann-Whitney: count how often group_a values beat group_b values
    u_stat = jnp.sum(group_a[:, None] < group_b[None, :])
    print(f"Mann-Whitney U:   {u_stat}")
    print(f"\nGroup A mean: {mean_a:.2f}, Group B mean: {mean_b:.2f}")