이상치

image

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))))

+ Recent posts