Patrick's 데이터 세상

결측값 처리, 이상값 검색 본문

Programming/R

결측값 처리, 이상값 검색

patrick610 2020. 6. 25. 00:20
반응형
SMALL

데이터 탐색

 

데이터를 본격 분석하기 앞서 대략의 데이터의 특성을 파악하고, 데이터에 대한 통찰을 얻기 위해 다각도로 접근함.

 

⊙ 데이터 기초 통계

data(iris)
head(iris)  # 데이터에서 앞 6줄만 보도록 한다.

 

#Result

head(iris,10)  # 숫자를 넣어주면 원하는 개수만큼 볼 수 있다.

#Result

str(iris)  # 데이터의 구조를 파악하도록 한다.

#Result

 

summary(iris)  # 데이터의 기초통계량을 볼 수 있다.

# 연속형 변수의 경우 4분위수, 최소값, 최대값, 중앙값, 평균 등을 출력하고 범주형 변수의 경우 각 범주에 대한 빈도수를 출력하여 데이터의 분포를 파악한다.
# 연속형 변수의 경우 cov와 cor함수를 ㅗㅇ해 공분산행렬과 상관계수행렬을 출력하여 변수 간의 선형 상관관계의 강도를 확인한다.

#Result

cov(iris[,1:4])  # 공분산

#Result

cor(iris[,1:4])  # 상관계수

#Result

 

 

 

결측값 처리

 

R에서는 결측값을 NA(Not Available)로 처리한다.
불가능한 값(예를 들면 dividing by zero)은 NaN(not a number)으로 처리된다.
결측값을 입력하는 방법은 NA를 이용하면 되고, is.na를 이용해 결측값인지 여부를 확인할 수 있다.

y <- c(1,2,3,NA)
is.na(y)

#Result

 

mydata[mydata$v1==99, "v1"] <- NA

특정값을 결측걊으로 입력한 경우 이를 변환해 처리하면 된다.
'99'를 결측값으로 처리하려면 해당 값이 있는 위치에 NA를 입력하면 된다.

x <- c(1,2,NA,3)
mean(x)

#Result

mean(x, na.rm=T)

#Result

평균 산출 등 데이터 처리에서 결측값으로 인한 문제를 해결하는 방법으로는 해당 값을 제외하는 방법이 있다.

mydata[!complete.cases(mydata),]

결측값이 포함된 관측치를 complete.cases() 함수를 이용해 삭제하는데, 결측값이 넓게 분포된 경우 많은 데이터의 삭제에 따른 문제가 발생할 수 있으니 이를 염두해야 함.

 

※ Amellia

install.packages("Amelia")
library(Amelia)

 

data(freetrade)
head(freetrade)

#Result

str(freetrade)

#Result


freetrade는 1980년부터 1993년까지의 무역정책 자유화에 대한 분석 데이터이다.
변수는 연도, 국가, 관세율, 정치지수(~10~10으로 자유화된 국가는 10의 값을 갖는다.), 총인구, 국민총생산, 총국제준비액, IMF 가입년도, 재무적 공개성, US선호지수로 구성됐다.

 

a.out <- amelia(freetrade, m=5, ts="year", cs="country")
hist(a.out$imputations[[3]]$tariff, col="grey", border="white")
save(a.out, file="imputations.RData")
write.amelia(obj=a.out, file.stem="outdata")

일반적인 결측값 처리 방식은 해당 레코드를 모두 삭제하는 것이다.
전체적으로 결측값이 많은 레코드에 걸쳐 분포하면, 너무 많은 자료가 삭제돼 정보를 획득하기 어려워질 수 있다.

이를 방지하는 차원에서 결측값을 해당 변수의 대표값으로 대체하는 경우가 있는데, 이 방식 또한 많은 문제점이 있다.
그 대신 변수들간의 관계를 이용해 imputation을 하는 효율적인 방법이 있다.

m은 몇 개의 imputation 데이터세트를 만들지를 결정하는 값이며, ts는 시계열에 대한 정보, cs는 cross-sectional 분석에 포함될 정보다.
따라서 위 모델에서는 연도와 국가를 고려해 모든 freetrade 정보를 활용한 결측값에 대한 imputation이 이뤄진다.

 

missmap(a.out)

#Result

위의 과정을 통해 a.out은 결측값들이 imputation 방법에 의해 대체된 5개의 데이터세트를 포함하고 각 데이터세트가 outdata1.csv, outdata2.csv, outdata3.csv, outdate4.csv, outdata5.csv의 이름으로 생성된다.

 

freetrade$tariff<-a.out$imputation[[5]]$tariff
missmap(freetrade)

#Result

 

 

 

이상값 검색

 

이상값(Outlier) 검색은 분석에서 전처리를 어떻게 할지를 결정할 때와 부정사용 방지 시스템(Fraud Detection System, FDS)에서 규칙을 발견하는 데 사용할 수 있다.
이상값은 의도하지 않게 잘못 입력한 경우(a1), 의도하지 않게 입력됐으나 분석 목적에 부합되지 않아 제거해야 하는 경우(a2), 의도되지 않은 현상이지만 분석에 포함해야 하는 경우(a3)가 있다. 그리고 의도된 이상값(b1)인 경우가 있는데, b1의 경우는 대부분 사기(fraud)이다.
특히 a1, a2는 bad data라고 할 수 있고 a3, b1이 이상값이라고 할 수 있다.

 

x=rnorm(100)  # 표준정규분포를 따르는 난수 100개 생성
boxplot(x)  # 여기에서는 이상갑싱 없을 알 수 있다.

#Result

x=c(x, 19, 28, 30)  # 19, 28, 30은 이상 값
outwith=boxplot(x)  # 여기에서는 이상 값이 있음을 알 수 있다.

#Result

outwith$out  # 이상 값을 프린트 해 준다.

#Result

 

install.packages("outliers")
library(outliers)
set.seed(1234)
y=rnorm(100)
outlier(y)  # 평균과 가장 차이가 많이 나는 값 출력

#Result

outlier(y, opposite=TRUE)  # 반대방향으로 가장 차이가 많이 나는 값 출력

 #Result

dim(y) = c(20, 5)  # 행 20 열 5의 행렬 생성
outlier(y)  # 각 열이 평균과 가장 차이가 많은 값을 각 열별로 출력

#Result

outlier(y, opposite=TRUE)  # 각 열별로 반대 방향으로 열 평균과 가장 차이가 많은 값 출력

#Result

boxplot(y)

#Result

또 다른 방법은 outliers패키지를 사용하여 이상값일 가능성이 큰 값을 찾아내어 주는 것이다.
outliers 패키지의 outlier() 함수는 평균과 가장 큰 차이가 있는 값을 알려주며, outlier() 함수 인수(argument) 중에 opposite=TRUE를 사용하면 반대편으로 평균과 가장 큰 값을 알려준다.

반응형
LIST

'Programming > R' 카테고리의 다른 글

기초 통계 분석  (0) 2020.06.25
통계학 개론  (0) 2020.06.25
데이터 마트 - 데이터 테이블  (0) 2020.06.25
데이터 마트 - plyr  (0) 2020.06.25
데이터 마트 - sqldf를 이용한 데이터 분석  (0) 2020.06.25
Comments