12. 이상치(Outliers) 확인 - df[ , ]에 order() 인덱싱 / quantile() 활용하기 / ggplot / boxplot
이상치
setwd('c:/users/is2js/R_da/')
#### 이상치(Outliers) ####
# - 데이터의 중심경향성에서 많이 떨어져있는 값
# - 이상치, 이상값, 특이치, 특이값
# - 처리절차 : 이상치 확인 -> 필터(또는색인) -> 처리방법 선정 -> 치환또는 제거
# - 처리방법 선정 :
# (1) 단순 제거 : 너무 적을 때
# (2) 대표값 치환 : 보너스 점수 받은 102점 -> 100점으로 치환
# (3) 통계기반 처리 : 평균값으로..
# (4) 머신러닝 기반 처리 : 남자의 평균, 여자의 평균.. 등
#### 데이터 준비 ####
set.seed(1228)
df = data.frame(xx = 1:200, #xx에는 1부터 200까지
yy = rnorm(n = 200, mean = 5, sd = 3)) #yy에는 정규분포(rnorm) 개수 200, 평균5 표준편차 3짜리
head(df)
#### 1. 이상치 확인 ####
####...L (1) order()를 활용한 상위, 하위 3개값 추출하기 ####
# order(df$하위칼럼)을 행인덱싱자리에 넣어주면, 해당 칼럼 기준 오름차순으로 정리해준다.****
df[order(df$yy), ]
# 열인덱싱자리에 기준칼럼명을 인덱싱하여, 오름차순된 yy칼럼값을 뽑아낸다.
df[order(df$yy), "yy"]
df_sub = df[order(df$yy), ]
head(df_sub)
# 하위 3개 뽑기
df_sub[1:3,] #하위 3개 row전
df_sub[1:3, "yy"] #하위 3개 yy값
# 하위3개(오름차순) 다시 한줄로 요약( 새로운 객체를 만들지 않는 장점!)
df[order(df$yy), "yy"][1:3]
# 상위3개(내림차순) 추출 : ***order(-특정칼럼) 형태로서, ()안에 -를 붙힌다.
df[order(-df$yy), "yy"][1:3]
# 상위 3개 추출값을 %in%을 이용해 매칭되는 row 추출해보기
df[ df$yy %in% ( df[order(-df$yy), "yy"][1:3] ) , ]
# 하위 3개도..
df[ df$yy %in% ( df[order(+df$yy), "yy"][1:3] ) , ]
####...L (2) quantile($인덱싱)을 통해 이상치 확인하기 ####
quantile(df$yy) # 제 4분위 수값을 알 수 있다.
quantile(df$yy, probs = 0.99)# 확률값을 넣어주면, 해당 %에 해당하는 값을 뿌려준다.
quantile(df$yy, probs = c(0.95, 0.99)) # 확률값은 c()를 이용해 여러개 줄 수 있음.
quantile(df$yy, probs = c(0.95, 0.99))[1]
quantile(df$yy, probs = c(0.95, 0.99))[2]
# 결과값을 보면, 99%라는 칼럼처럼 보이지만, name vector로서, name이 붙어있을 뿐,
# 가져오는 것은 벡터연산(인덱싱)으로 한다. [1] or [2]
aa = quantile(df$yy, probs = c(0.95, 0.99))
aa
names(aa) # name vector로서 95%, 99%가 있으나, 인덱싱은 벡터연산[1], [2]로..
aa[1]
aa[2]
# quantile의 결과값인 name vector에서 name을 제거 하고 싶다면
bb = as.numeric(aa)
bb
# ------예제 시작------
# 이제 quantile()을 통해 나온 분위수를 행인덱싱자리 조건문으로 넣어서 이상치 추출
# 상위 98% 백분위수보다 넘어가는 것만 추출해보자.( 2% 미만)
df[ df$yy > quantile(df$yy, probs = 0.98), ]
# 뽑은 것을 처리해보자.- 해당 칼럼에다가 값을 대입해주면 된다.
df[ df$yy > quantile(df$yy, probs = 0.98), "yy"] = 20
df[ df$yy > quantile(df$yy, probs = 0.98), "yy"]
#### ggplot()을 활용해서 확인 ####
library("ggplot2")
ggplot() +
geom_point(data= rbind(df,
data.frame(xx = c(30, 50, 84),
yy = c(35, 40, 39))),
aes(x = xx,
y = yy),
size = 7,
alpha = 0.5,
color = "#FFA500") +
scale_y_continuous(limit = c(-10, 50))
#### 기본 boxplot()을 활용해서 확인 ####
boxplot(rbind(df,
data.frame(xx = c(30, 50, 84),
yy = c(35, 40, 39))))
'한의대 생활 > └ R studio 중급 문법' 카테고리의 다른 글
13. 결측치(Missing value) 처리 - df[ is.na( ), ] 활용 / summary()함수 (0) | 2018.12.29 |
---|---|
11. 벡터연산( df[ df$aa == , ] / dplyr - filter(df, 칼럼명)함수로 필터링하기 (0) | 2018.12.29 |
10. 사용자 정의 함수( 기초 + 응용) (0) | 2018.12.29 |
9. beyond for loop - apply() MARGIN=1,2로 FUN=통계class확인 / sapply() 세로 특화 / ifelse(기준칼럼으로 조건문, y, n)로 값 할당 (0) | 2018.12.29 |
8. R reshape2패키지를 활용한 Pivoting (0) | 2018.12.29 |