วิธีลบค่าผิดปกติใน 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 คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับคุณลักษณะนี้ ได้ที่นี่

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

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