ข้ามไปยังเนื้อหาหลัก

การทดสอบ Kruskal-Wallis: เปรียบเทียบหลายกลุ่มโดยไม่ต้องอาศัยความเป็นปกติ

คู่มือเชิงปฏิบัติสำหรับการทดสอบ Kruskal-Wallis — คืออะไร ทำงานอย่างไร ควรใช้เมื่อใดแทน ANOVA และวิธีรันกับการตีความผลใน Python และ R
อัปเดตแล้ว 4 พ.ค. 2569  · 9 นาที อ่าน

การเปรียบเทียบหลายกลุ่มทำได้ง่ายเมื่อข้อมูลมีการแจกแจงแบบปกติ ปัญหาคือ ข้อมูลในโลกความเป็นจริงส่วนใหญ่ไม่ได้เป็นเช่นนั้น

หากใช้ 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

ถ้าข้อมูลมีการแจกแจงแบบปกติ ให้ใช้ ANOVA ถ้าไม่ใช่ — หรือไม่สามารถยืนยันได้ — ให้ใช้ Kruskal-Wallis

สูตรของการทดสอบ Kruskal-Wallis

การทดสอบ Kruskal-Wallis สรุปเป็นสถิติการทดสอบเดียวคือ H โดยมีสูตรดังนี้:

สูตร Kruskal-Wallis

สูตร Kruskal-Wallis

คำอธิบายองค์ประกอบมีดังนี้:

  • N - จำนวนการสังเกตทั้งหมดจากทุกกลุ่ม

  • k - จำนวนกลุ่ม

  • n_i - จำนวนการสังเกตในกลุ่มที่ i

  • R_i - ผลรวมอันดับของกลุ่มที่ i

สูตรนี้วัดว่าผลรวมอันดับของแต่ละกลุ่มเบี่ยงเบนจากค่าที่คาดว่าจะเป็น หากทุกกลุ่มเหมือนกันมากน้อยเพียงใด ค่าH ขนาดใหญ่หมายถึงกลุ่มต่างกัน ขนาดเล็กหมายถึงกลุ่มไม่ได้ต่างกันมาก

เมื่อได้ค่า H แล้ว ให้นำไปเปรียบเทียบกับการแจกแจงไคสแควร์ที่มีองศาเสรี k - 1 เพื่อหาค่า p-value

การทำงานของการทดสอบ Kruskal-Wallis

มีสี่ขั้นตอนในการทำการทดสอบ Kruskal-Wallis:

  1. รวมทุกกลุ่ม: นำการสังเกตจากทุกกลุ่มมารวมกันเป็นชุดข้อมูลเดียว
  2. จัดอันดับการสังเกตทั้งหมด: เรียงข้อมูลรวมจากน้อยไปมากและกำหนดอันดับ ค่าที่น้อยที่สุดได้อันดับ 1 ถัดไปอันดับ 2 และต่อไปเรื่อย ๆ หากมีค่าสองค่าเท่ากัน ให้ใช้อันดับเฉลี่ยของตำแหน่งที่ควรได้
  3. คำนวณผลรวมอันดับ: แยกอันดับกลับไปยังกลุ่มเดิม บวกอันดับของแต่ละกลุ่ม นี่คือผลรวมอันดับของคุณ — R_i ในสูตร
  4. คำนวณค่าสถิติการทดสอบ: ใส่ผลรวมอันดับลงในสูตร 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

ผลลัพธ์ 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

ผลลัพธ์ 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

การทดสอบของ 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

การทดสอบของ 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 ให้ใช้งานฟังก์ชันเดียวกัน

หัวข้อ

เรียนรู้กับ DataCamp

Courses

Introduction to Statistics in R

4 ชม.
128.6K
Grow your statistical skills and learn how to collect, analyze, and draw accurate conclusions from data.
ดูรายละเอียดRight Arrow
เริ่มหลักสูตร
ดูเพิ่มเติมRight Arrow