Courses
การเปรียบเทียบหลายกลุ่มทำได้ง่ายเมื่อข้อมูลมีการแจกแจงแบบปกติ ปัญหาคือ ข้อมูลในโลกความเป็นจริงส่วนใหญ่ไม่ได้เป็นเช่นนั้น
หากใช้ ANOVA เป็นค่าเริ่มต้น คุณอาจสรุปผิดพลาดได้ เพราะ ANOVA สมมติว่าข้อมูลมีการแจกแจงแบบปกติ เมื่อไม่เป็นไปตามนั้น — นึกถึงข้อมูลที่มีการเบ้หรือขนาดตัวอย่างเล็ก — จำเป็นต้องใช้วิธีอื่น
การทดสอบ Kruskal-Wallis คือวิธีทางเลือกนั้น เป็นทางเลือกแบบนอนพาราเมตริกของ ANOVA และทำงานกับลำดับอันดับ (ranks) แทนค่าดิบ ดังนั้นจึงไม่ต้องอาศัยการแจกแจงแบบปกติ
บทความนี้จะครอบคลุมแนวคิด คณิตศาสตร์เบื้องหลัง วิธีรันด้วย Python และ R และวิธีตีความผลลัพธ์
การทดสอบ Kruskal-Wallis คืออะไร?
การทดสอบ Kruskal-Wallis เป็นวิธีแบบนอนพาราเมตริกสำหรับเปรียบเทียบสามกลุ่มขึ้นไปที่เป็นอิสระต่อกัน โดยจะแปลงการสังเกตทั้งหมดเป็นอันดับ แล้วเปรียบเทียบอันดับเหล่านั้นระหว่างกลุ่มแทนการใช้ค่าดิบ
อาจมองว่าเป็นการขยายของ การทดสอบ Mann-Whitney U ซึ่งผู้เขียนเคยอธิบายไว้แล้ว
Mann-Whitney U ทำการเปรียบเทียบแบบใช้ลำดับอันดับเช่นเดียวกัน แต่ใช้ได้กับสองกลุ่มเท่านั้น Kruskal-Wallis ขยายไปยังสามกลุ่มขึ้นไป ดังนั้นเมื่อมีหลายกลุ่มและใช้ ANOVA ไม่ได้ ก็ควรใช้วิธีนี้
เพราะทำงานกับอันดับแทนค่าดิบ จึงไม่สมมติว่าข้อมูลมีการแจกแจงแบบใดแบบหนึ่ง นั่นทำให้มีประโยชน์กับข้อมูลในโลกจริงที่มักไม่เป็นไปตามการแจกแจงเดียวอย่างสมบูรณ์
ควรใช้การทดสอบ Kruskal-Wallis เมื่อใด
การทดสอบ Kruskal-Wallis เหมาะอย่างยิ่งเมื่อกำลังจัดการกับ:
- สามกลุ่มหรือมากกว่าที่เป็นอิสระจากกัน และต้องการเปรียบเทียบ
- ข้อมูลแบบอันดับหรือแบบต่อเนื่อง เช่น ค่าประเมินแบบ Likert หรือข้อมูลการวัด
- การแจกแจงที่ไม่เป็นปกติ ด้วยข้อมูลที่เบ้ ค่าผิดปกติ ตัวอย่างเล็ก หรือกรณีอื่นที่ ANOVA จัดการไม่ได้
- ขนาดตัวอย่างเล็ก ที่ยากจะตรวจสอบความเป็นปกติ
ตัวอย่างง่าย ๆ มีดังนี้
สมมติว่าต้องการเปรียบเทียบคะแนนสอบระหว่างสามห้องเรียน คะแนนมีการเบ้และตัวอย่างเล็ก จึงไม่เหมาะกับ ANOVA การทดสอบ Kruskal-Wallis ไม่ต้องการความเป็นปกติ จึงใช้ได้ในกรณีนี้ มันจะบอกได้ว่าอย่างน้อยหนึ่งห้องมีคะแนนต่างจากห้องอื่น โดยไม่ต้องตั้งสมมติฐานที่ข้อมูลรองรับไม่ได้
Kruskal-Wallis เทียบกับ ANOVA
ทั้งสองการทดสอบเปรียบเทียบกลุ่ม แต่ทำงานต่างกัน
ANOVA เปรียบเทียบค่าเฉลี่ยของกลุ่ม และสมมติว่าข้อมูลมีการแจกแจงแบบปกติและมีความแปรปรวนใกล้เคียงกัน เมื่อสมมติฐานเหล่านี้เป็นจริง ANOVA จะดีกว่า — มีอำนาจทางสถิติสูงกว่าและผลลัพธ์ตีความได้ง่ายกว่า
Kruskal-Wallis เปรียบเทียบการแจกแจงของกลุ่มโดยใช้อันดับ ไม่สนใจความเป็นปกติหรือความแปรปรวนเท่ากัน จึงยืดหยุ่นกว่า แต่ต้องแลกด้วยอำนาจทางสถิติที่ลดลงบ้าง
ตารางเปรียบเทียบโดยย่อมีดังนี้:

ANOVA เทียบกับการทดสอบ Kruskal-Wallis
ถ้าข้อมูลมีการแจกแจงแบบปกติ ให้ใช้ ANOVA ถ้าไม่ใช่ — หรือไม่สามารถยืนยันได้ — ให้ใช้ Kruskal-Wallis
สูตรของการทดสอบ Kruskal-Wallis
การทดสอบ Kruskal-Wallis สรุปเป็นสถิติการทดสอบเดียวคือ H โดยมีสูตรดังนี้:

สูตร Kruskal-Wallis
คำอธิบายองค์ประกอบมีดังนี้:
-
N- จำนวนการสังเกตทั้งหมดจากทุกกลุ่ม -
k- จำนวนกลุ่ม -
n_i- จำนวนการสังเกตในกลุ่มที่i -
R_i- ผลรวมอันดับของกลุ่มที่i
สูตรนี้วัดว่าผลรวมอันดับของแต่ละกลุ่มเบี่ยงเบนจากค่าที่คาดว่าจะเป็น หากทุกกลุ่มเหมือนกันมากน้อยเพียงใด ค่าH ขนาดใหญ่หมายถึงกลุ่มต่างกัน ขนาดเล็กหมายถึงกลุ่มไม่ได้ต่างกันมาก
เมื่อได้ค่า H แล้ว ให้นำไปเปรียบเทียบกับการแจกแจงไคสแควร์ที่มีองศาเสรี k - 1 เพื่อหาค่า p-value
การทำงานของการทดสอบ Kruskal-Wallis
มีสี่ขั้นตอนในการทำการทดสอบ Kruskal-Wallis:
- รวมทุกกลุ่ม: นำการสังเกตจากทุกกลุ่มมารวมกันเป็นชุดข้อมูลเดียว
- จัดอันดับการสังเกตทั้งหมด: เรียงข้อมูลรวมจากน้อยไปมากและกำหนดอันดับ ค่าที่น้อยที่สุดได้อันดับ 1 ถัดไปอันดับ 2 และต่อไปเรื่อย ๆ หากมีค่าสองค่าเท่ากัน ให้ใช้อันดับเฉลี่ยของตำแหน่งที่ควรได้
- คำนวณผลรวมอันดับ: แยกอันดับกลับไปยังกลุ่มเดิม บวกอันดับของแต่ละกลุ่ม นี่คือผลรวมอันดับของคุณ —
R_iในสูตร - คำนวณค่าสถิติการทดสอบ: ใส่ผลรวมอันดับลงในสูตร
Hหากกลุ่มคล้ายกัน ผลรวมอันดับจะใกล้เคียงกันและค่าHจะมีค่าน้อย หากมีกลุ่มหนึ่งได้อันดับสูงหรือต่ำกว่าอย่างสม่ำเสมอ ค่าHจะเพิ่มขึ้น
เพียงเท่านี้เอง!
จะเห็นว่าการทดสอบไม่สนใจค่าจริง แต่สนใจเพียงตำแหน่งสัมพัทธ์เมื่อเทียบกับค่าทั้งหมด
การทดสอบ Kruskal-Wallis ใน Python
ไลบรารี scipy ของ Python มีฟังก์ชันสำเร็จรูปสำหรับการทดสอบ Kruskal-Wallis จึงไม่ต้องลงมือคำนวณสูตรเอง มาดูตัวอย่างกัน
สมมติว่ากำลังเปรียบเทียบคะแนนสอบระหว่างสามห้องเรียน วิธีรันการทดสอบมีดังนี้:
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}")

ผลลัพธ์ Python
ค่า p-value ต่ำกว่า 0.05 ซึ่งหมายความว่าอย่างน้อยหนึ่งห้องมีคะแนนต่างจากห้องอื่น โปรดจำไว้ว่าการทดสอบนี้จะไม่บอกว่าห้องใดต่าง — ต้องใช้การทดสอบหลังการวิเคราะห์ (post hoc) ซึ่งจะกล่าวถึงในหัวข้อถัดไป
การทดสอบ Kruskal-Wallis ใน R
เช่นเดียวกับ Python, R ก็มีฟังก์ชันสำเร็จรูปสำหรับการทดสอบนี้ ใช้สถานการณ์คะแนนสอบเดิม
# 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)

ผลลัพธ์ R
ผลลัพธ์เหมือนกับที่ได้ใน Python — ค่า H และ p-value เท่ากัน เมื่อ p < 0.05 ให้ปฏิเสธสมมติฐานว่างและสรุปว่าอย่างน้อยหนึ่งกลุ่มแตกต่าง
วิธีตีความผลการทดสอบ Kruskal-Wallis
สมมติฐานว่างของการทดสอบ Kruskal-Wallis คือทุกกลุ่มมีการแจกแจงเดียวกัน ค่า p-value จะบอกว่าควรปฏิเสธหรือไม่ ต่อไปนี้คือแนวทางตีความ:
- p < 0.05: อย่างน้อยหนึ่งกลุ่มต่างจากกลุ่มอื่น ๆ ให้ปฏิเสธสมมติฐานว่าง
- p >= 0.05: ไม่มีหลักฐานชัดเจนว่ากลุ่มต่างกัน จึงไม่ปฏิเสธสมมติฐานว่าง
เกณฑ์ 0.05 เป็นธรรมเนียม ปรับเข้มงวดเป็น 0.01 หรือผ่อนคลายเป็น 0.10 ได้ตามสาขาหรือความสำคัญของการวิเคราะห์
โปรดทราบว่าการทดสอบนี้จะไม่บอกว่ากลุ่มใดต่าง ผลลัพธ์ที่มีนัยสำคัญเพียงชี้ว่ากลุ่มไม่เหมือนกันทั้งหมด ทราบว่าเกิดความต่าง แต่ยังไม่รู้ว่าที่ใด เพื่อหาว่าคู่ใดเป็นตัวขับความแตกต่าง จำเป็นต้องใช้การทดสอบหลังการวิเคราะห์
การทดสอบ Post Hoc หลัง Kruskal-Wallis
การทดสอบบอกว่าอย่างน้อยหนึ่งกลุ่มต่าง แต่ไม่บอกว่ากลุ่มใดต่าง หากมีสามกลุ่มและ p < 0.05 อาจเป็น A เทียบ B, A เทียบ C, B เทียบ C หรือหลายคู่รวมกัน จำเป็นต้องทำการทดสอบหลังการวิเคราะห์เพื่อได้การเปรียบเทียบแบบจับคู่
การทดสอบของ Dunn เป็นตัวเลือกที่ใช้บ่อยที่สุด จะทำการเปรียบเทียบแบบจับคู่ระหว่างทุกกลุ่มและปรับค่า p เพื่อลดโอกาสบวกลวง หากไม่มีการปรับ ยิ่งเปรียบเทียบหลายคู่ ยิ่งเสี่ยงพบผล "มีนัยสำคัญ" โดยบังเอิญ
การทดสอบของ Dunn ใน Python
ต้องใช้ไลบรารี scikit_posthocs หากยังไม่มี ให้ติดตั้งด้วย pip install scikit-posthocs.
จากนั้นการคำนวณก็ง่ายมาก:
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)

การทดสอบของ Dunn ใน Python
แต่ละช่องแสดงค่า p ที่ปรับแล้วของคู่นั้น ๆ ที่นี่เฉพาะ B เทียบ C (p = 0.004) ที่ต่ำกว่าเกณฑ์ 0.05 จึงแตกต่างกัน ส่วน A เทียบ B (p = 0.167) และ A เทียบ C (p = 0.607) ไม่แตกต่าง หมายความว่าห้อง A ไม่ได้ต่างเชิงสถิติกับอีกสองห้อง
การทดสอบของ Dunn ใน R
เริ่มต้นด้วยการติดตั้งไลบรารีเมื่อจำเป็นด้วยคำสั่ง 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")

การทดสอบของ Dunn ใน R
ผลสอดคล้องกับ Python ตามคาด มีเฉพาะ B เทียบ C ที่มีนัยสำคัญ ขณะที่ A เทียบ B และ A เทียบ C ไม่มี ห้อง B และห้อง C คือคู่ที่อยู่เบื้องหลังความแตกต่างที่ Kruskal-Wallis ตรวจพบ
สมมติฐานของการทดสอบ Kruskal-Wallis
Kruskal-Wallis ยืดหยุ่นกว่า ANOVA แต่ยังมีสมมติฐาน 3 ข้อที่ควรตรวจสอบก่อนใช้งาน:
- ตัวอย่างเป็นอิสระต่อกัน: การสังเกตในกลุ่มหนึ่งไม่ส่งอิทธิพลต่ออีกกลุ่ม หากข้อมูลเป็นแบบจับคู่หรือวัดซ้ำ การทดสอบนี้ไม่เหมาะ
- ข้อมูลแบบอันดับหรือแบบต่อเนื่อง: ต้องเป็นข้อมูลที่จัดอันดับได้ หมวดหมู่เชิงนามธรรม (เช่น สีหรือฉลาก) จัดอันดับไม่ได้ จึงใช้ไม่ได้ที่นี่
- รูปทรงการแจกแจงใกล้เคียงกัน: หากต้องการตีความว่าเป็นการเปรียบเทียบค่ามัธยฐานแทนที่จะเป็นการแจกแจงโดยรวม รูปร่างของการแจกแจงระหว่างกลุ่มควรใกล้เคียงกัน หากต่างกันมาก ยังเปรียบเทียบการแจกแจงได้ แต่การตีความเชิงมัธยฐานจะใช้ไม่ได้
หากละเมิดสองข้อแรก ผลการทดสอบจะไม่ถูกต้อง ข้อที่สามยืดหยุ่นกว่า เพราะมีผลต่อการตีความ ไม่ได้ห้ามการรันทดสอบ
เมื่อไม่ควรใช้การทดสอบ Kruskal-Wallis
มีสามกรณีที่ควรใช้การทดสอบอื่นแทน:
- ข้อมูลเป็นแบบจับคู่หรือวัดซ้ำ: หากมีผู้เข้าร่วมคนเดิมปรากฏในหลายกลุ่ม ให้ใช้การทดสอบ Friedman แทน ซึ่งเป็นแบบนอนพาราเมตริกสำหรับตัวอย่างที่พึ่งพากัน การใช้ Kruskal-Wallis กับข้อมูลจับคู่จะเมินความสัมพันธ์ของการสังเกตและอาจสรุปผิด
- ข้อมูลเป็นไปตามสมมติฐานของ ANOVA: ถ้าข้อมูลแจกแจงแบบปกติและมีความแปรปรวนใกล้เคียงกัน ANOVA จะดีกว่า มีอำนาจทางสถิติมากกว่า จึงตรวจจับความแตกต่างจริงได้ดีกว่าเมื่อมีอยู่
- ขนาดตัวอย่างใหญ่: เมื่อมีตัวอย่างจำนวนมาก วิธีแบบพาราเมตริกมักใช้ได้ดีแม้ข้อมูลไม่ปกติสมบูรณ์ กฎขีดจำกัดส่วนกลางช่วยไว้ และ ANOVA จะให้ผลที่เชื่อถือได้กว่าวิธีใช้อันดับ หากทำงานกับหลายร้อยหรือหลายพันตัวอย่างต่อกลุ่ม Kruskal-Wallis ไม่ใช่ตัวเลือกที่เหมาะ
สรุป
การทดสอบ Kruskal-Wallis ใช้เปรียบเทียบสามกลุ่มขึ้นไปที่เป็นอิสระต่อกันเมื่อข้อมูลไม่เป็นไปตามการแจกแจงแบบปกติที่การทดสอบอย่าง ANOVA ต้องการ ทำได้เพราะทำงานกับอันดับแทนค่าดิบ
อย่างไรก็ตาม มันไม่ได้มาแทนที่ ANOVA หากข้อมูลเป็นปกติ ANOVA จะดีกว่าเพราะมีนัยสำคัญทางสถิติมากกว่า ในทางกลับกัน หากข้อมูลเป็นแบบจับคู่ ให้ใช้การทดสอบ Friedman เช่นเคย การเลือกการทดสอบที่ถูกต้องขึ้นอยู่กับข้อมูล
เมื่อเงื่อนไขเหมาะสม การทดสอบ Kruskal-Wallis เป็นตัวเลือกที่เชื่อถือได้และตรงไปตรงมา เพียงรันทดสอบ ตรวจสอบค่า p และทำการทดสอบของ Dunn ต่อ หากต้องการทราบว่ากลุ่มใดอยู่เบื้องหลังความแตกต่าง
ความรู้สถิติเริ่มฝืดหรือไม่? เรียนคอร์ส Introduction to Statistics ของเรา แล้วกลับมาแม่นอีกครั้งได้ในบ่ายเดียว
คำถามที่พบบ่อยเกี่ยวกับการทดสอบ Kruskal-Wallis
การทดสอบ Kruskal-Wallis ใช้ทำอะไร?
การทดสอบ Kruskal-Wallis ใช้เพื่อเปรียบเทียบสามกลุ่มขึ้นไปที่เป็นอิสระต่อกันเมื่อไม่สามารถสมมติได้ว่าข้อมูลมีการแจกแจงแบบปกติ เป็นทางเลือกแบบนอนพาราเมตริกของ ANOVA ที่ทำงานกับลำดับอันดับแทนค่าดิบ เหมาะในสถานการณ์ที่การแจกแจงมีการเบ้หรือข้อมูลเป็นเชิงอันดับ
ผลลัพธ์ Kruskal-Wallis ที่มีนัยสำคัญหมายถึงอะไร?
ผลลัพธ์ที่มีนัยสำคัญ — โดยทั่วไป p < 0.05 — หมายความว่าอย่างน้อยหนึ่งกลุ่มแตกต่างจากกลุ่มอื่น การทดสอบจะไม่บอกว่ากลุ่มใดต่าง เพียงแต่บอกว่ากลุ่มทั้งหมดไม่เหมือนกัน เพื่อหาว่าคู่ใดอยู่เบื้องหลังความต่าง จำเป็นต้องทำการทดสอบหลังการวิเคราะห์ เช่น การทดสอบของ Dunn
สมมติฐานของการทดสอบ Kruskal-Wallis คืออะไร?
การทดสอบนี้ต้องการตัวอย่างที่เป็นอิสระ กล่าวคือ การสังเกตในกลุ่มหนึ่งไม่ส่งผลต่ออีกกลุ่ม ข้อมูลต้องเป็นเชิงอันดับหรือเชิงต่อเนื่อง — ต้องจัดอันดับได้ หากต้องการตีความเป็นการเปรียบเทียบค่ามัธยฐาน กลุ่มต่าง ๆ ควรมีรูปทรงการแจกแจงใกล้เคียงกันด้วย
ความแตกต่างระหว่างการทดสอบ Kruskal-Wallis และ Mann-Whitney U คืออะไร?
การทดสอบ Mann-Whitney U เปรียบเทียบสองกลุ่มที่เป็นอิสระ ส่วน Kruskal-Wallis ขยายแนวทางเดียวกันไปยังสามกลุ่มขึ้นไป ทั้งสองทำงานกับลำดับอันดับและไม่สมมติความเป็นปกติ หากมีเพียงสองกลุ่ม ให้ใช้ Mann-Whitney U — Kruskal-Wallis เป็นเวอร์ชันสำหรับหลายกลุ่ม
ควรใช้การทดสอบของ Dunn หลัง Kruskal-Wallis เมื่อใด?
ให้รันการทดสอบของ Dunn เมื่อผล Kruskal-Wallis มีนัยสำคัญและต้องการทราบว่าคู่ของกลุ่มใดต่างกันบ้าง การทดสอบนี้จะเปรียบเทียบแบบจับคู่ระหว่างทุกกลุ่มและปรับค่า p เพื่อลดโอกาสบวกลวง ใน Python ใช้ scikit_posthocs.posthoc_dunn() และใน R มีแพ็กเกจ dunn.test ให้ใช้งานฟังก์ชันเดียวกัน