[R, 빅분기] 이상치 출력 및 제거하기 TIL
R에서 데이터분석을 하기전에 전처리과정이 필요한데, 그 중 깔끔한 데이터 셋을 만들기 위해서는 이상치를 제거하는 과정이 필요하다.
오늘은 이상치제거를 하기위해 필요한 작업과 결과물을 정리해보려고 한다.
CSV 파일 불러오기
먼저 저장되어 있는 CSV파일을 출력해보자.
df = read.csv("app_rating.csv")
> df id rating_count_tot rating_count_ver user_rating 1 284035177 1126879 3594 4.0 2 281796108 161065 26 4.0 3 281656475 21292 26 4.0 4 283646709 119487 879 4.0 5 285994151 11447 781 5.0 6 284815117 105776 166 3.5 7 281940292 188583 2822 3.5 8 284791396 76720 4017 4.5 9 284736660 7885 40 4.0 10 284666222 1117 4 4.5 11 284993459 402925 136 4.0 12 285005463 31456 4178 4.0 13 286058814 137951 131 4.0 14 285946052 2929 966 4.5
여기서 csv파일이 출력이 안되거나 경로가 잘못 되어 있을 때,
getwd()
함수를 사용하면 현재 내가 작업하고 있는 경로나 입력되있는 경로를 알 수 있다.
그리고 경로를 수정할 때는 setwd()
를 사용해서 ()안에 불러올 csv파일이 있는 경로를 넣어주면 된다.
예시를 들자면
getwd()
setwd("C:/Users/s/Desktop/빅분기실기준비/CSV파일")
그리고 여기서 어떤 파일이 있나 볼려면
list.files()
를 입력하면 해당 경로에 있는 파일을 전부 보여준다.
분위 확인하기
우리가 가져온 데이터 셋의 분위수를 확인해보려고 한다.
이때는 quatile()
함수를 사용하면 된다.
q = quantile(df$rating_count_tot)
> q 0% 25% 50% 75% 100% 1117.00 13908.25 91248.00 155286.50 1126879.00
위의 4분위수 결과를 가져올 수 있다.
이 값의 최소값과 최대값이 일치하는지 한번 확인해보자
min(df$rating_count_tot)
max(df$rating_count_tot)
둘의 결과는 정확히 일치하는 모습을 확인할 수 있다.
여기서 더 나아가서 quantile()
함수로 더 다양한 분위별 값을 볼 수 있다.
quantile(df$rating_count_tot, probs = 0.45)
이렇게 하면 45%에 해당하는 값을 확인할 수 있다.
이제 이것을 응용하여 IQR을 사용해서 이상치를 찾아보자.
IQR로 이상치 출력
IQR의 공식은 (Q3 - Q1)이다.
q1
과 q3
를 만들어보자
q1 = quantile(df$rating_count_tot, probs = 0.25)
q3 = quantile(df$rating_count_tot, probs = 0.75)
여기서 직접 q3 - q1
의 계산을 해줘도되지만, IQR()함수가 있으니 직접사용하면 더 간편하게 계산할 수 있다.
iqr = IQR(df$rating_count_tot) # q3 - q1의 값과 동일
이 q1
와 q3
, iqr
을 가지고 이상치를 찾아보자
IQR을 사용한 이상치 공식은
(Q1 - 1.5 x IQR) > x(data) > (Q3 + 1.5 x IQR) 이다
df_out = df[ ( df$rating_count_tot < (q1 - 1.5 * iqr) ) | ( df$rating_count_tot > (q3 + 1.5 * iqr) ), ]
위의 코드를 사용해서 이상치 값을 출력할 수 있다.
그런데 여기서 이상치를 뽑아내기 위한 코드가 너무 길다 생각이 드니까 조금 짧게 만들어 수정해보자.
조건을 변수로 만들어서 넣어주면된다.
# 조건이 길어져서 짧게 만들어줌
cond1 = df$rating_count_tot < (q1 - 1.5 * iqr)
cond2 = df$rating_count_tot > (q3 + 1.5 * iqr)
# 범위를 벗어나는 이상값이 들어있는 row만 출력
df_out = df[cond1 | cond2, ]
위 처럼 코드를 실행하면 훨씬 더 가독성도 좋아진다.
IQR로 이상치 없는 데이터 셋 출력하기
이번에는 반대로 이상치가 없는 데이터셋을 출력해보자.
아까와 반대로 하면 되니까 어렵지 않다
# 이상치만 제거하고 남은 데이터프레임 출력
cond3 = df$rating_count_tot >= (q1 - 1.5*iqr)
cond4 = df$rating_count_tot <= (q3 + 1.5*iqr)
# cond3와 cond4를 동시에 만족하는 row를 출력
df_in = df[cond3 & cond4, ]
df_in
결과를 보면 이상치라고 했던 1과 11이 제외된 결과를 얻을 수 있다.
평균과 표준편차를 이용하기
이번에는 평균과 표준편차를 이용해서도 이상치를 찾을 수 있는 것을 확인해보자
평균과 표준편차는
평균에서 1 표준편차 더 큰 것, 평균으로부터 2 표준편차 더 큰 값을 이상치라고 한다했을때 적용한다.
cond5 = df$rating_count_tot > (stat_mean + 2 * stat_sd)
cond6 = df$rating_count_tot < (stat_mean - 2 * stat_sd)
df_out2 = df[cond5 | cond6, ]
결과는 제대로 잘 나온다.
물론 IQR과는 조건이 다르기 때문에 결과값은 조금 다를수 밖에 없다.
Author And Source
이 문제에 관하여([R, 빅분기] 이상치 출력 및 제거하기 TIL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lifeisbeautiful/R-이상치-출력-및-제거하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)