[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)이다.

q1q3 를 만들어보자

	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의 값과 동일

q1q3, 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과는 조건이 다르기 때문에 결과값은 조금 다를수 밖에 없다.

좋은 웹페이지 즐겨찾기