วิธีลบค่าผิดปกติใน r
ค่าผิดปกติ คือการสังเกตที่อยู่ห่างจากค่าอื่นๆ ในชุดข้อมูลอย่างผิดปกติ ค่าผิดปกติอาจเป็นปัญหาได้เนื่องจากอาจส่งผลต่อผลลัพธ์ของการวิเคราะห์
บทช่วยสอนนี้จะอธิบายวิธีการระบุและลบค่าผิดปกติใน R
วิธีระบุค่าผิดปกติใน R
ก่อนที่คุณจะสามารถลบค่าผิดปกติได้ คุณต้องตัดสินใจก่อนว่าคุณพิจารณาว่าอะไรคือค่าผิดปกติ มีสองวิธีทั่วไปในการทำเช่นนี้:
1. ใช้พิสัยระหว่างควอไทล์
ช่วงระหว่างควอไทล์ (IQR) คือความแตกต่างระหว่างเปอร์เซ็นไทล์ที่ 75 (Q3) และเปอร์เซ็นไทล์ที่ 25 (Q1) ในชุดข้อมูล โดยจะวัดการกระจายของค่าเฉลี่ย 50% ของค่า
คุณสามารถกำหนดให้การสังเกตเป็นค่าผิดปกติได้หากเป็น 1.5 เท่าของช่วงระหว่างควอร์ไทล์เหนือควอไทล์ที่ 3 (Q3) หรือ 1.5 เท่าของช่วงระหว่างควอไทล์ที่ต่ำกว่าควอร์ไทล์ที่ 1 (Q1)
ค่าผิดปกติ = การสังเกต > Q3 + 1.5*IQR หรือ < Q1 – 1.5*IQR
2. ใช้คะแนน z
คะแนน z จะบอกคุณว่าค่าที่กำหนดมาจากค่าเฉลี่ยเป็นจำนวนเท่าใด เราใช้สูตรต่อไปนี้เพื่อคำนวณคะแนน z:
z = (X – μ) / σ
ทอง:
- X คือค่าข้อมูลดิบค่าเดียว
- μ คือค่าเฉลี่ยของประชากร
- σ คือค่าเบี่ยงเบนมาตรฐานของประชากร
คุณสามารถกำหนดการสังเกตให้เป็นค่าผิดปกติได้หากคะแนน z น้อยกว่า -3 หรือมากกว่า 3
ค่าผิดปกติ = การสังเกตด้วยคะแนน z > 3 หรือ < -3
วิธีลบค่าผิดปกติใน R
เมื่อคุณตัดสินใจว่าสิ่งใดที่คุณพิจารณาว่าเป็นค่าผิดปกติ คุณสามารถระบุและลบสิ่งเหล่านั้นออกจากชุดข้อมูลได้ เพื่ออธิบายวิธีการทำสิ่งนี้ เราจะใช้กรอบข้อมูลต่อไปนี้:
#make this example reproducible set.seed(0) #create data frame with three columns A', 'B', 'C' df <- data.frame(A=rnorm(1000, mean=10, sd=3), B=rnorm(1000, mean=20, sd=3), C=rnorm(1000, mean=30, sd=3)) #view first six rows of data frame head(df) ABC 1 13.78886 19.13945 31.33304 2 9.02130 25.52332 30.03579 3 13.98940 19.52971 29.97216 4 13.81729 15.83059 29.09287 5 11.24392 15.58069 31.47707 6 5.38015 19.79144 28.19184
จากนั้นเราสามารถกำหนดและลบค่าผิดปกติได้โดยใช้วิธี z-score หรือวิธีช่วงระหว่างควอไทล์:
วิธี Z-score:
รหัสต่อไปนี้แสดงวิธีการคำนวณคะแนน z ของแต่ละค่าในแต่ละคอลัมน์ของกรอบข้อมูล จากนั้นลบแถวที่มีคะแนน z อย่างน้อยหนึ่งรายการโดยมีค่าสัมบูรณ์มากกว่า 3:
#find absolute value of z-score for each value in each column z_scores <- as.data.frame (sapply(df, function(df) (abs(df-mean(df))/sd(df)))) #view first six rows of z_scores data frame head(z_scores) ABC 1 1.2813403 0.25350805 0.39419878 2 0.3110243 1.80496734 0.05890232 3 1.3483190 0.12766847 0.08112630 4 1.2908343 1.32044506 0.38824414 5 0.4313316 1.40102642 0.44450451 6 1.5271674 0.04327186 0.70295309 #only keep rows in dataframe with all z-scores less than absolute value of 3 no_outliers <- z_scores[!rowSums(z_scores>3), ] #view row and column count of new data frame dim(no_outliers) [1] 994 3
กรอบข้อมูลเดิมมี 1,000 แถวและ 3 คอลัมน์ กรอบข้อมูลใหม่มี 994 แถวและ 3 คอลัมน์ ซึ่งบอกเราว่า 6 แถวถูกลบออกเนื่องจากมีคะแนน z อย่างน้อยหนึ่งรายการโดยมีค่าสัมบูรณ์มากกว่า 3 ในคอลัมน์ใดคอลัมน์หนึ่ง
วิธีพิสัยระหว่างควอไทล์:
ในบางกรณี เราอาจต้องการระบุเฉพาะค่าผิดปกติในคอลัมน์ของกรอบข้อมูลเท่านั้น ตัวอย่างเช่น สมมติว่าเราต้องการลบแถวที่มีค่าผิดปกติในคอลัมน์ “A” ของกรอบข้อมูลของเราเท่านั้น
รหัสต่อไปนี้แสดงวิธีการลบแถวออกจากกรอบข้อมูลที่มีค่าในคอลัมน์ “A” เท่ากับ 1.5 เท่าของช่วงระหว่างควอร์ไทล์เหนือควอร์ไทล์ที่สาม (Q3) หรือ 1.5 เท่าของช่วงระหว่างควอไทล์ที่ต่ำกว่าควอไทล์แรก (Q1) .
#find Q1, Q3, and interquartile range for values in column A Q1 <- quantile(df$A, .25) Q3 <- quantile(df$A, .75) IQR <- IQR(df$A) #only keep rows in dataframe that have values within 1.5*IQR of Q1 and Q3 no_outliers <- subset(df, df$A> (Q1 - 1.5*IQR) & df$A< (Q3 + 1.5*IQR)) #view row and column count of new data frame dim(no_outliers) [1] 994 3
กรอบข้อมูลเดิมมี 1,000 แถวและ 3 คอลัมน์ กรอบข้อมูลใหม่มี 994 แถวและ 3 คอลัมน์ ซึ่งบอกเราว่า 6 แถวถูกลบออกเนื่องจากมีอย่างน้อยหนึ่งค่าผิดปกติในคอลัมน์ A
เมื่อใดควรลบค่าผิดปกติ
หากมีค่าผิดปกติตั้งแต่หนึ่งค่าขึ้นไป คุณต้องตรวจสอบก่อนว่าค่าผิดปกติเหล่านั้นไม่ได้เป็นผลมาจากข้อผิดพลาดในการป้อนข้อมูล บางครั้งบุคคลเพียงแต่กรอกค่าข้อมูลที่ไม่ถูกต้องในขณะที่บันทึกข้อมูล
หากค่าผิดปกติกลายเป็นผลลัพธ์ของข้อผิดพลาดในการป้อนข้อมูล คุณสามารถตัดสินใจกำหนดค่าใหม่ให้กับค่าดังกล่าวได้ เช่น ค่าเฉลี่ยหรือค่ามัธยฐาน ของชุดข้อมูล
หากค่านั้นเป็นค่าผิดปกติจริงๆ คุณสามารถเลือกที่จะลบค่านั้นออกได้หากจะมีผลกระทบสำคัญต่อการวิเคราะห์โดยรวมของคุณ เพียงอย่าลืมพูดถึงในรายงานหรือการวิเคราะห์ขั้นสุดท้ายของคุณว่าคุณได้ลบค่าผิดปกติออก
แหล่งข้อมูลเพิ่มเติม
ในบทช่วยสอนนี้ เราใช้ rnorm() เพื่อสร้างเวกเตอร์ของตัวแปรสุ่มแบบกระจายปกติโดยกำหนดความยาวเวกเตอร์ n ค่าเฉลี่ยประชากร μ และค่าเบี่ยงเบนมาตรฐานของประชากร σ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับคุณลักษณะนี้ ได้ที่นี่
นอกจากนี้เรายังใช้ sapply() เพื่อใช้ฟังก์ชันกับแต่ละคอลัมน์ในกรอบข้อมูลที่คำนวณคะแนน z คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับคุณลักษณะนี้ ได้ที่นี่