Chuyển đến nội dung chính

Kiểm định Kruskal-Wallis: So sánh nhiều nhóm không cần giả định chuẩn

Hướng dẫn thực tiễn về kiểm định Kruskal-Wallis - nó là gì, hoạt động thế nào, khi nào dùng thay cho ANOVA, và cách chạy cũng như diễn giải trong Python và R.
Đã cập nhật 4 thg 5, 2026  · 9 phút đọc

So sánh nhiều nhóm trở nên dễ dàng khi dữ liệu của bạn tuân theo phân phối chuẩn. Vấn đề là hầu hết dữ liệu thực tế thì không.

Nếu ANOVA là kiểm định mặc định của bạn, bạn có thể đi đến kết luận sai, vì kiểm định này giả định dữ liệu tuân theo phân phối chuẩn. Khi điều đó không đúng - hãy nghĩ đến dữ liệu lệch hoặc mẫu nhỏ - bạn cần một cách tiếp cận khác.

Kiểm định Kruskal-Wallis chính là cách tiếp cận khác đó. Đây là lựa chọn phi tham số thay thế cho ANOVA và hoạt động trên dữ liệu thứ hạng thay vì giá trị thô, nên không yêu cầu phân phối chuẩn.

Trong bài viết này, tôi sẽ trình bày khái niệm, phần toán học phía sau, cách chạy trong Python và R, cùng cách diễn giải kết quả.

Kiểm định Kruskal-Wallis là gì?

Kiểm định Kruskal-Wallis là phương pháp phi tham số để so sánh ba nhóm độc lập trở lên. Nó chuyển tất cả quan sát thành thứ hạng và so sánh các thứ hạng giữa các nhóm thay vì làm việc với giá trị thô.

Bạn có thể coi nó là phần mở rộng của kiểm định Mann-Whitney U, mà tôi cũng đã viết về nó.

Mann-Whitney U cũng so sánh dựa trên thứ hạng, nhưng chỉ cho hai nhóm. Kruskal-Wallis mở rộng lên ba nhóm trở lên, nên khi bạn có nhiều nhóm và không thể dùng ANOVA, đây là phương án nên sử dụng.

Vì làm việc với thứ hạng chứ không phải giá trị thô, nó không giả định dữ liệu tuân theo bất kỳ phân phối cụ thể nào. Đó là lý do nó hữu ích với dữ liệu thực tế, vốn hiếm khi tuân theo hoàn hảo một dạng phân phối.

Khi nào nên dùng kiểm định Kruskal-Wallis

Kiểm định Kruskal-Wallis rất phù hợp khi bạn đang xử lý:

  • Ba nhóm độc lập trở lên mà bạn muốn so sánh
  • Dữ liệu thứ bậc hoặc liên tục như thang đo Likert hoặc dữ liệu đo lường
  • Phân phối không chuẩn do dữ liệu lệch, ngoại lai, mẫu nhỏ, hoặc bất cứ điều gì ANOVA không xử lý được
  • Kích thước mẫu nhỏ khiến việc kiểm tra tính chuẩn khó khăn

Đây là một ví dụ đơn giản.

Giả sử bạn muốn so sánh điểm thi giữa ba lớp khác nhau. Điểm bị lệch và mẫu nhỏ, nên ANOVA không phải lựa chọn tốt. Kiểm định Kruskal-Wallis không cần tính chuẩn, nên phù hợp ở đây. Nó sẽ cho bạn biết liệu có ít nhất một lớp có điểm khác với các lớp còn lại, mà không đưa ra các giả định dữ liệu của bạn không đáp ứng.

Kruskal-Wallis so với ANOVA

Cả hai kiểm định đều so sánh các nhóm, nhưng thực hiện theo cách khác nhau.

ANOVA so sánh trung bình giữa các nhóm và giả định dữ liệu có phân phối chuẩn với phương sai xấp xỉ bằng nhau. Khi các giả định đó đúng, đây là lựa chọn tốt hơn - mạnh hơn về mặt thống kê và kết quả dễ diễn giải hơn.

Kruskal-Wallis so sánh phân phối giữa các nhóm bằng cách dùng thứ hạng. Nó không quan tâm đến tính chuẩn hay phương sai bằng nhau. Điều đó giúp linh hoạt hơn, nhưng bạn sẽ mất một phần sức mạnh thống kê.

Dưới đây là bảng so sánh nhanh:

ANOVA so với kiểm định Kruskal-Wallis

ANOVA so với kiểm định Kruskal-Wallis

Nếu dữ liệu của bạn có phân phối chuẩn, hãy dùng ANOVA. Nếu không - hoặc bạn không thể xác minh - hãy dùng Kruskal-Wallis.

Công thức kiểm định Kruskal-Wallis

Kiểm định Kruskal-Wallis quy về một thống kê kiểm định duy nhất, H. Đây là công thức:

Công thức Kruskal-Wallis

Công thức Kruskal-Wallis

Giải thích các thành phần:

  • N - tổng số quan sát trên tất cả các nhóm

  • k - số nhóm

  • n_i - số quan sát trong nhóm i

  • R_i - tổng thứ hạng gán cho nhóm i

Công thức đo lường mức độ các tổng thứ hạng của mỗi nhóm lệch khỏi kỳ vọng nếu tất cả nhóm giống hệt nhau. H lớn nghĩa là các nhóm khác biệt, còn H nhỏ nghĩa là chúng không khác nhau nhiều.

Khi có H, bạn so sánh nó với phân phối khi bình phương với k - 1 bậc tự do để lấy p-value.

Cách hoạt động của kiểm định Kruskal-Wallis

Có bốn bước để thực hiện kiểm định Kruskal-Wallis:

  1. Gộp tất cả các nhóm: Lấy mọi quan sát từ mỗi nhóm và gộp thành một tập dữ liệu duy nhất
  2. Xếp hạng tất cả quan sát: Sắp dữ liệu gộp từ nhỏ đến lớn và gán thứ hạng. Giá trị nhỏ nhất nhận hạng 1, kế tiếp hạng 2, v.v. Nếu hai giá trị bằng nhau, chúng chia sẻ trung bình các hạng lẽ ra sẽ nhận.
  3. Tính tổng thứ hạng: Tách các thứ hạng về nhóm ban đầu. Cộng các thứ hạng cho mỗi nhóm. Đây là tổng thứ hạng của bạn - R_i trong công thức
  4. Tính thống kê kiểm định: Thay các tổng thứ hạng vào công thức H. Nếu các nhóm tương tự nhau, tổng thứ hạng của chúng sẽ gần nhau và H sẽ nhỏ. Nếu một nhóm liên tục nhận thứ hạng cao hơn hoặc thấp hơn, H sẽ tăng lên

Vậy là xong!

Bạn có thể thấy kiểm định này không quan tâm đến giá trị thực, mà chỉ xem chúng đứng ở đâu so với phần còn lại.

Kiểm định Kruskal-Wallis trong Python

Thư viện scipy của Python có sẵn hàm cho kiểm định Kruskal-Wallis, nghĩa là bạn không phải tự triển khai công thức. Hãy xem một ví dụ.

Giả sử bạn đang so sánh điểm thi giữa ba lớp. Cách chạy kiểm định như sau:

from scipy import stats

# Exam scores
class_a = [78, 85, 90, 72, 88]
class_b = [65, 70, 68, 74, 60]
class_c = [88, 92, 95, 85, 91]

# Run the test
statistic, p_value = stats.kruskal(class_a, class_b, class_c)

print(f"H statistic: {statistic:.4f}")
print(f"P-value: {p_value:.4f}")

Kết quả Python

Kết quả Python

P-value nhỏ hơn 0,05, nghĩa là có ít nhất một lớp có điểm khác với các lớp còn lại. Hãy nhớ rằng kiểm định không cho bạn biết cụ thể lớp nào - bạn sẽ cần kiểm định hậu nghiệm, tôi sẽ đề cập ở phần tiếp theo.

Kiểm định Kruskal-Wallis trong R

Tương tự Python, R có sẵn hàm cho kiểm định này. Hãy dùng cùng kịch bản điểm thi.

# Exam scores
class_a <- c(78, 85, 90, 72, 88)
class_b <- c(65, 70, 68, 74, 60)
class_c <- c(88, 92, 95, 85, 91)

# Combine
scores <- c(class_a, class_b, class_c)
groups <- factor(rep(c("A", "B", "C"), each = 5))

# Run the test
kruskal.test(scores ~ groups)

Kết quả R

Kết quả R

Kết quả giống như tôi có trong Python - cùng thống kê H, cùng p-value. Với p < 0,05, bạn sẽ bác bỏ giả thuyết không và kết luận rằng có ít nhất một nhóm khác biệt.

Cách diễn giải kết quả Kruskal-Wallis

Giả thuyết không của kiểm định Kruskal-Wallis là tất cả các nhóm có cùng phân phối. P-value cho biết bạn có nên bác bỏ nó hay không. Diễn giải như sau:

  • p < 0,05: Có ít nhất một nhóm khác các nhóm còn lại, nên bác bỏ giả thuyết không
  • p >= 0,05: Không có bằng chứng mạnh cho thấy các nhóm khác nhau, nên không bác bỏ giả thuyết không

Ngưỡng 0,05 là quy ước. Tùy lĩnh vực hoặc mức độ hệ trọng của phân tích, bạn có thể dùng ngưỡng chặt hơn như 0,01 hoặc lỏng hơn như 0,10.

Lưu ý kiểm định này sẽ không cho bạn biết nhóm nào khác biệt. Kết quả có ý nghĩa chỉ cho thấy các nhóm không hoàn toàn giống nhau. Bạn biết có điều gì đó xảy ra, nhưng chưa rõ ở đâu. Để tìm cặp nào tạo ra khác biệt, bạn cần kiểm định hậu nghiệm.

Kiểm định hậu nghiệm sau Kruskal-Wallis

Kiểm định cho bạn biết có ít nhất một nhóm khác, nhưng không cho biết nhóm nào thực sự khác. Nếu bạn có ba nhóm và p < 0,05, có thể là A so với B, A so với C, B so với C, hoặc kết hợp nào đó. Bạn cần thực hiện kiểm định hậu nghiệm để có các so sánh cặp.

Kiểm định Dunn là lựa chọn phổ biến nhất. Nó chạy so sánh cặp giữa mọi nhóm và điều chỉnh p-value để tính đến nhiều so sánh - nếu không điều chỉnh, bạn sẽ làm tăng khả năng dương tính giả. Càng nhiều so sánh, rủi ro tìm thấy kết quả "có ý nghĩa" do ngẫu nhiên càng cao.

Kiểm định Dunn trong Python

Bạn sẽ cần thư viện scikit_posthocs cho việc này. Nếu chưa có, cài đặt bằng pip install scikit-posthocs.

Từ đó, việc tính toán rất đơn giản:

import scikit_posthocs as sp
import pandas as pd

# Same exam scores as before
class_a = [78, 85, 90, 72, 88]
class_b = [65, 70, 68, 74, 60]
class_c = [88, 92, 95, 85, 91]

# Combine
scores = class_a + class_b + class_c
groups = ["A"] * 5 + ["B"] * 5 + ["C"] * 5

df = pd.DataFrame({"score": scores, "group": groups})

# Run the test
result = sp.posthoc_dunn(df, val_col="score", group_col="group", p_adjust="bonferroni")
print(result)

Kiểm định Dunn trong Python

Kiểm định Dunn trong Python

Mỗi ô hiển thị p-value đã điều chỉnh cho cặp đó. Ở đây, chỉ B so với C (p = 0,004) vượt qua ngưỡng 0,05, nên hai nhóm đó khác nhau. A so với B (p = 0,167) và A so với C (p = 0,607) thì không, nghĩa là lớp A không khác biệt có ý nghĩa thống kê so với hai lớp còn lại.

Kiểm định Dunn trong R

Đầu tiên, cài đặt thư viện nếu cần với lệnh install.packages("dunn.test"):

library(dunn.test)

# Same exam scores as before
class_a <- c(78, 85, 90, 72, 88)
class_b <- c(65, 70, 68, 74, 60)
class_c <- c(88, 92, 95, 85, 91)

scores <- c(class_a, class_b, class_c)
groups <- factor(rep(c("A", "B", "C"), each = 5))

# Run the test
dunn.test(scores, groups, method = "bonferroni")

Kiểm định Dunn trong R

Kiểm định Dunn trong R

Kết quả khớp với Python, như bạn kỳ vọng. Chỉ B so với C là có ý nghĩa, còn A so với B và A so với C thì không. Lớp B và lớp C là hai nhóm đứng sau sự khác biệt mà kiểm định Kruskal-Wallis phát hiện.

Các giả định của kiểm định Kruskal-Wallis

Kruskal-Wallis linh hoạt hơn ANOVA, nhưng vẫn có ba giả định bạn cần kiểm tra trước khi chạy:

  • Mẫu độc lập: Quan sát ở một nhóm không ảnh hưởng quan sát ở nhóm khác. Nếu dữ liệu của bạn là cặp ghép hoặc đo lặp, kiểm định này không phù hợp
  • Dữ liệu thứ bậc hoặc liên tục: Kiểm định cần dữ liệu có thể xếp hạng. Danh mục định danh (như màu sắc hoặc nhãn) không thể xếp hạng, nên không áp dụng ở đây
  • Hình dạng phân phối tương tự: Nếu bạn muốn diễn giải kết quả như so sánh trung vị thay vì chỉ phân phối, các nhóm cần có hình dạng xấp xỉ giống nhau. Nếu hình dạng khác nhau nhiều, bạn vẫn có thể so sánh phân phối, nhưng diễn giải theo trung vị không còn đúng

Nếu vi phạm hai giả định đầu, kết quả kiểm định sẽ không hợp lệ. Giả định thứ ba mềm hơn, vì nó ảnh hưởng đến cách bạn diễn giải kết quả, không phải việc có thể chạy kiểm định hay không.

Khi nào bạn không nên dùng kiểm định Kruskal-Wallis

Có ba trường hợp một kiểm định khác sẽ phù hợp hơn:

  • Dữ liệu của bạn là cặp ghép hoặc đo lặp: Nếu cùng đối tượng xuất hiện ở nhiều nhóm, hãy dùng kiểm định Friedman. Đây là tương đương phi tham số dành cho mẫu phụ thuộc. Dùng Kruskal-Wallis cho dữ liệu cặp ghép sẽ bỏ qua mối liên hệ giữa các quan sát và có thể dẫn đến kết luận sai
  • Dữ liệu của bạn đáp ứng giả định của ANOVA: Nếu dữ liệu có phân phối chuẩn với phương sai xấp xỉ bằng nhau, ANOVA là lựa chọn tốt hơn. Nó mạnh hơn về mặt thống kê, nghĩa là tốt hơn trong việc phát hiện khác biệt thực sự khi chúng tồn tại
  • Kích thước mẫu của bạn lớn: Với mẫu lớn, các phương pháp tham số thường hoạt động tốt ngay cả khi dữ liệu không hoàn toàn chuẩn. Định lý giới hạn trung tâm phát huy tác dụng, và ANOVA sẽ cho kết quả tin cậy hơn so với cách tiếp cận dựa trên thứ hạng. Nếu bạn làm việc với hàng trăm hoặc hàng nghìn quan sát mỗi nhóm, Kruskal-Wallis không phải kiểm định dành cho bạn

Kết luận

Kiểm định Kruskal-Wallis so sánh ba nhóm độc lập trở lên khi dữ liệu của bạn không tuân theo phân phối chuẩn mà các kiểm định như ANOVA yêu cầu. Điều này khả thi vì nó hoạt động trên thứ hạng thay vì giá trị thô.

Tuy vậy, nó không thay thế cho ANOVA. Nếu dữ liệu của bạn chuẩn, ANOVA là kiểm định tốt hơn vì có sức mạnh thống kê cao hơn. Ngược lại, nếu dữ liệu là cặp ghép, hãy dùng kiểm định Friedman. Như mọi khi, kiểm định phù hợp phụ thuộc vào dữ liệu của bạn.

Khi điều kiện phù hợp, kiểm định Kruskal-Wallis là lựa chọn tin cậy và đơn giản. Bạn chỉ cần chạy, kiểm tra p-value và tiếp tục với kiểm định Dunn nếu cần biết những nhóm nào đứng sau sự khác biệt.

Bạn thấy kiến thức thống kê hơi mai một? Hãy tham gia khóa Nhập môn Thống kê của chúng tôi và bắt kịp chỉ trong một buổi chiều.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.

Câu hỏi thường gặp về kiểm định Kruskal-Wallis

Kiểm định Kruskal-Wallis dùng để làm gì?

Kiểm định Kruskal-Wallis được dùng để so sánh ba nhóm độc lập trở lên khi bạn không thể giả định dữ liệu tuân theo phân phối chuẩn. Đây là lựa chọn phi tham số thay thế ANOVA, hoạt động trên dữ liệu thứ hạng thay vì giá trị thô. Bạn sẽ thấy hữu ích trong các tình huống phân phối bị lệch hoặc dữ liệu là thứ bậc.

Kết quả Kruskal-Wallis có ý nghĩa thống kê nghĩa là gì?

Kết quả có ý nghĩa - thường là p < 0,05 - nghĩa là có ít nhất một nhóm khác các nhóm còn lại. Nó không cho bạn biết nhóm nào khác, chỉ rằng chúng không hoàn toàn giống nhau. Để biết cặp nào đứng sau sự khác biệt, bạn cần kiểm định hậu nghiệm như kiểm định Dunn.

Các giả định của kiểm định Kruskal-Wallis là gì?

Kiểm định yêu cầu các mẫu độc lập, nghĩa là quan sát ở một nhóm không ảnh hưởng quan sát ở nhóm khác. Dữ liệu của bạn cần là thứ bậc hoặc liên tục - tức có thể xếp hạng. Nếu bạn muốn diễn giải kết quả như so sánh trung vị, các nhóm cũng nên có hình dạng phân phối tương tự.

Sự khác nhau giữa kiểm định Kruskal-Wallis và Mann-Whitney U là gì?

Kiểm định Mann-Whitney U so sánh hai nhóm độc lập, trong khi Kruskal-Wallis mở rộng cách tiếp cận đó cho ba nhóm trở lên. Cả hai đều làm việc với dữ liệu thứ hạng và không giả định tính chuẩn. Nếu bạn chỉ có hai nhóm, Mann-Whitney U là lựa chọn đúng - Kruskal-Wallis là tương đương cho nhiều nhóm.

Khi nào bạn nên dùng kiểm định Dunn sau Kruskal-Wallis?

Chạy kiểm định Dunn khi kết quả Kruskal-Wallis có ý nghĩa và bạn cần biết cặp nhóm cụ thể nào khác nhau. Nó thực hiện so sánh cặp giữa tất cả nhóm và điều chỉnh p-value để giảm khả năng dương tính giả. Trong Python, scikit_posthocs.posthoc_dunn() thực hiện việc này, và trong R, gói dunn.test cung cấp chức năng tương tự.

Chủ đề

Học cùng DataCamp

Courses

Nhập môn Thống kê với R

4 giờ
128.6K
Nâng cao kỹ năng thống kê của quý vị và học cách thu thập, phân tích và đưa ra kết luận chính xác từ dữ liệu.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow