วิธีทดสอบความเป็นปกติใน python (4 วิธี)


การทดสอบทางสถิติจำนวนมาก ถือว่า ชุดข้อมูลมีการกระจายตามปกติ

มีสี่วิธีทั่วไปในการตรวจสอบสมมติฐานนี้ใน Python:

1. (วิธีการมองเห็น) สร้างฮิสโตแกรม

  • ถ้าฮิสโตแกรมมีรูปร่างประมาณ “ระฆัง” จะถือว่าข้อมูลมีการกระจายตามปกติ

2. (วิธีการมองเห็น) สร้างพล็อต QQ

  • หากจุดบนโครงเรื่องอยู่ตามแนวเส้นทแยงมุมโดยประมาณ ก็จะถือว่าข้อมูลมีการกระจายตามปกติ

3. (การทดสอบทางสถิติอย่างเป็นทางการ) ทำการทดสอบชาปิโร-วิลค์

  • หากค่า p ของการทดสอบมากกว่า α = 0.05 จะถือว่าข้อมูลมีการกระจายตามปกติ

4. (การทดสอบทางสถิติอย่างเป็นทางการ) ทำการทดสอบ Kolmogorov-Smirnov

  • หากค่า p ของการทดสอบมากกว่า α = 0.05 จะถือว่าข้อมูลมีการกระจายตามปกติ

ตัวอย่างต่อไปนี้แสดงวิธีการใช้แต่ละวิธีในทางปฏิบัติ

วิธีที่ 1: สร้างฮิสโตแกรม

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

 import math
import numpy as np
from scipy. stats import lognorm
import matplotlib. pyplot as plt

#make this example reproducible
n.p. random . seeds (1)

#generate dataset that contains 1000 log-normal distributed values
lognorm_dataset = lognorm. rvs (s=.5, scale= math.exp (1), size=1000)

#create histogram to visualize values in dataset
plt. hist (lognorm_dataset, edgecolor=' black ', bins=20) 

เพียงดูฮิสโตแกรมนี้ เราก็บอกได้เลยว่าชุดข้อมูลไม่แสดง “รูปร่างระฆัง” และไม่ได้กระจายตามปกติ

วิธีที่ 2: สร้างพล็อต QQ

รหัสต่อไปนี้แสดงวิธีการสร้างการลงจุด QQ สำหรับชุดข้อมูลที่เป็นไปตามการแจกแจงแบบบันทึกปกติ:

 import math
import numpy as np
from scipy. stats import lognorm
import statsmodels. api as sm
import matplotlib. pyplot as plt

#make this example reproducible
n.p. random . seeds (1)

#generate dataset that contains 1000 log-normal distributed values
lognorm_dataset = lognorm. rvs (s=.5, scale= math.exp (1), size=1000)

#create QQ plot with 45-degree line added to plot
fig = sm. qqplot (lognorm_dataset, line=' 45 ')

plt. show ()

หากจุดลงจุดอยู่ตามแนวเส้นทแยงมุมโดยประมาณ โดยทั่วไปเราจะถือว่าชุดข้อมูลมีการกระจายตามปกติ

อย่างไรก็ตาม จุดบนกราฟนี้ไม่สอดคล้องกับเส้นสีแดงอย่างชัดเจน ดังนั้นเราจึงไม่สามารถสรุปได้ว่าชุดข้อมูลนี้มีการกระจายตามปกติ

สิ่งนี้น่าจะสมเหตุสมผลเนื่องจากเราสร้างข้อมูลโดยใช้ฟังก์ชันการแจกแจงแบบบันทึกปกติ

วิธีที่ 3: ทำการทดสอบ Shapiro-Wilk

รหัสต่อไปนี้แสดงวิธีการดำเนินการ Shapiro-Wilk สำหรับชุดข้อมูลที่เป็นไปตามการแจกแจงแบบล็อกปกติ:

 import math
import numpy as np
from scipy.stats import shapiro 
from scipy. stats import lognorm

#make this example reproducible
n.p. random . seeds (1)

#generate dataset that contains 1000 log-normal distributed values
lognorm_dataset = lognorm. rvs (s=.5, scale= math.exp (1), size=1000)

#perform Shapiro-Wilk test for normality
shapiro(lognorm_dataset)

ShapiroResult(statistic=0.8573324680328369, pvalue=3.880663073872444e-29)

จากผลลัพธ์ เราจะเห็นว่าสถิติการทดสอบคือ 0.857 และค่า p ที่สอดคล้องกันคือ 3.88e-29 (ใกล้กับศูนย์อย่างยิ่ง)

เนื่องจากค่า p น้อยกว่า 0.05 เราจึงปฏิเสธสมมติฐานว่างของการทดสอบชาปิโร-วิลค์

ซึ่งหมายความว่าเรามีหลักฐานเพียงพอที่จะบอกว่าข้อมูลตัวอย่างไม่ได้มาจากการแจกแจงแบบปกติ

วิธีที่ 4: ทำการทดสอบ Kolmogorov-Smirnov

รหัสต่อไปนี้แสดงวิธีดำเนินการทดสอบ Kolmogorov-Smirnov สำหรับชุดข้อมูลที่เป็นไปตามการแจกแจงแบบล็อกปกติ:

 import math
import numpy as np
from scipy.stats import kstest
from scipy. stats import lognorm

#make this example reproducible
n.p. random . seeds (1)

#generate dataset that contains 1000 log-normal distributed values
lognorm_dataset = lognorm. rvs (s=.5, scale= math.exp (1), size=1000)

#perform Kolmogorov-Smirnov test for normality
kstest(lognorm_dataset, ' norm ')

KstestResult(statistic=0.84125708308077, pvalue=0.0)

จากผลลัพธ์เราจะเห็นว่าสถิติการทดสอบคือ 0.841 และค่า p ที่สอดคล้องกันคือ 0.0

เนื่องจากค่า p น้อยกว่า 0.05 เราจึงปฏิเสธสมมติฐานว่างของการทดสอบ Kolmogorov-Smirnov

ซึ่งหมายความว่าเรามีหลักฐานเพียงพอที่จะบอกว่าข้อมูลตัวอย่างไม่ได้มาจากการแจกแจงแบบปกติ

วิธีจัดการกับข้อมูลที่ไม่ปกติ

หากชุดข้อมูลที่ระบุ ไม่ได้ รับการเผยแพร่ตามปกติ เรามักจะสามารถดำเนินการแปลงอย่างใดอย่างหนึ่งต่อไปนี้เพื่อให้มีการกระจายแบบปกติมากขึ้น:

1. การแปลงบันทึก: แปลงค่า x เป็น log(x)

2. การแปลงรากที่สอง: แปลงค่าของ x เป็น √x

3. การแปลงรูทคิวบ์: แปลงค่าของ x เป็น x 1/3 .

เมื่อทำการแปลงเหล่านี้ ชุดข้อมูลจะมีการกระจายตามปกติมากขึ้น

อ่าน บทช่วยสอนนี้ เพื่อดูวิธีดำเนินการแปลงเหล่านี้ใน Python

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *