[R] 데이터 정제 (2) - 이상치

[R] 데이터 정제 (2) - 이상치

이상치는 정상 범주에서 크게 벗어난 값을 말합니다. 데이터 수집 과정에서 오류가 발생할 수 있기 때문에, 현장에서 만들어진 실제 데이터에는 이상치가 포함될 수 있다. 이상치가 포함되어 있으면 분석 결과가 왜곡되기 때문에 분석에 앞서 이상치를 제거하는 작업을 해야 합니다.

#01. 이상치의 이해

1) 이상치란?

  • 의도하지 않게 잘못 입력한 경우 (Bad data)
  • 의도하지 않게 입력되었으나 분석 목적에 부합되지 않아 제거해야 하는 경우 (Bad data)
  • 의도하지 않은 현상이지만 분석에 포함해야 하는 경우
  • 의도된 이상값 (fraud, 불량)인 경우
  • 이상값을 꼭 제거해야 하는 것은 아니기 때문에 분석의 목적이나 종류에 따라 적절한 판단이 필요하다 .

2) 극단치

이상치의 한 종류.

오류는 아니지만 굉장히 드물게 발생하는 극단적인 값.

💡 ex) 몸무게 변수에 200kg 이상의 값이 있다면, 존재할 가능성은 있지만 굉장히 드문 경우이므로 극단치라 볼 수 있다.

#02. 이상치 인식과 처리

1) 이상치의 인식 방법

극단치 제거를 위해 먼저 어디까지를 정상 범위로 볼 것인가를 정해야 한다.

논리적으로 판단하여 정하기

성인의 몸무게가 40~150kg를 벗어나는 경우는 상당히 드물 것으로 판단하고, 이 범위를 벗어나면 극단치로 간주하는 것이다.

통계적인 기준을 이용하기 : ESD (Extreme Studentized Deviation)

상하위 0.3% 또는 +-3 표준 편차에 해당할 만큼 극단적으로 크거나 작으면 극단치로 간주하는 방법

/images/posts/2022/1222/img.png

$기하평균 - 2.5 x 표준편차 < data < 기하평균 + 2.5 x 표준편차$

상자그림

  • 중심에서 크게 벗어난 값을 극단치로 간주.
  • 극단치가 원으로 표시된다.
  • $Q1 - 1.5 x (Q3 - Q1) < data < Q3 + 1.5 x ( Q3 - Q1)$를 벗어나는 데이터

2) 극단값 처리

이름 태그
기하평균을 이용한 제거 geo_mean
하단,상단 % 이용한 제거 10% 절단(상하위 5%에 해당되는 데이터 제거 )

극단값 조정 방법

  • 상한값과 하한값을 벗어나는 값들을 하한 , 상한값으로 바꾸어 활용

/images/posts/2022/1222/img_1.png

/images/posts/2022/1222/img_2.png

#03. R에서 이상치 처리하기

1) 이상치가 존재하는지 확인하기

데이터 빈도표를 통한 확인

값의 종류를 알 수 있기 때문에 이상치나 극단치를 확인할 수 있다.

아래 빈도표들을 보면 국어점수에서 120점에 대한 수치가 1건 표시됨을 알 수 있다.

print(table(성적표$이름))
print(table(성적표$학년))
print(table(성적표$성별))
print(table(성적표$국어))
print(table(성적표$영어))
print(table(성적표$수학))
print(table(성적표$과학))

💻 출력결과

민수   수현   영희 철수  호영
   1    1    1    1    1

1 2 3 4
2 1 1 1

남자  여자
  3    2

63  88  92  98 120
 1   1   1   1   1

50   60  67.5  70  90
 1    1     1   1   1

31   60.3333333333333   62  88
 1                  2    1   1

64   70   72 73.5   88
 1    1    1    1    1

상자그림을 통한 확인

극단치가 원으로 표시된다.

options(warn=-1)
par(family='NanumGothic')
options(repr.plot.width=10, repr.plot.height=7)
boxplot(성적표$국어, 성적표$영어, 성적표$수학, 성적표$과학,
        names=c('국어','영어', '수학', '과학'))

💻 출력결과

/images/posts/2022/1222/img_3.png

도출된 극단치 중에서 어디까지를 극단치로 봐야 할 것인지에 대해 분석가의 주관이 필요하다.

  • 국어 점수가 120점인 케이스는 100점을 만점으로 봤을 때 점수 입력 오류이므로 극단치가 맞다.
  • 평균보다 점수가 낮거나 높더라도 정상적인 점수의 범주에 있다면 특별히 공부를 열심히 했거나 답안지를 밀려썼을 수 있기 때문에 극단치로 보아서는 안된다.

국어점수에 대한 상자그림 상태 확인

boxplot()$stats는 상자그림에 대한 각 위치의 수치값을 표시한다.

극단치 자체를 표시하지는 않는다.

표시 순서대로 아래쪽 극단치 경계, 1사분위 수, 중앙값, 3사분위 수, 위쪽 극단치 경계를 의미한다.

boxplot(성적표$국어)$stats

💻 출력결과

88  88  92  98  98

/images/posts/2022/1222/img_4.png

2) 이상치를 결측치로 변환하기

상자그림을 통해 이상치의 위치와 범위를 파악하고 결측치로 대체

국어점수의 위쪽 극단치 경계가 98점으로 표시되었으므로 98점보다 큰 데이터는 모두 극단치로 간주하고 결측치(NA)로 대체한다.

# 원본을 유지하기 위해 복사본을 하나 만들고 진행
결측치제거 <- 성적표

결측치제거$국어 <- ifelse(결측치제거$국어 > 98, NA, 결측치제거$국어)
결측치제거

💻 출력결과

/images/posts/2022/1222/img_5.png

결측치로 처리된 이상치를 다른 통계적 산출 값으로 대체

결측치 대체법을 적용하여 처리한다. 아래 코드는 결측치를 중앙값으로 대체하고 있다.

결측치제거$국어[is.na(결측치제거$국어)] <- median(결측치제거$국어, na.rm=TRUE)
결측치제거

💻 출력결과

/images/posts/2022/1222/img_6.png

호쌤(이광호)'s Picture

About 호쌤(이광호)

메가스터디IT아카데미에서 Java, Spring, Python, Frontend 등을 강의하는 IT 전문 강사이자 프리렌서 개발자 입니다.
https://www.youtube.com/@hossam-codingclub

Seoul, Korea http://www.hossam.kr