본문 바로가기
IT이야기/R 언어

R언어 - EDA, 결측치 처리 이상치 처리, 파생변수 생성

by 행복찾아3만리 2021. 8. 21.
반응형

안녕하세요.

 

이번 글에서는 ADP 실게문제에서 꼭 나오는 문제에 대해 정리해 보았습니다.

 

1. EDA를 진행하라

2. 결측치 처리 하라

3. 이상치 처리 하라

4. 파생변수 생성 하라

 

이 4가지를 빠르게 할 수 있어야 나머지에서 시간을 충분히 투자 할 수 있습니다.

 

getwd()
setwd('D:/ADP/실기준비')

titanic <- read.csv("titanic.csv" 
                    , stringsAsFactors = F 
                    , na.strings=c("","NA","Unknown","NULL"))
titanic$Sex <- as.factor(titanic$Sex)
titanic$Survived <- as.factor(titanic$Survived)
titanic$Embarked <- as.factor(titanic$Embarked)
titanic$Pclass <- as.factor(titanic$Pclass)

#연속형 변수 기초 통계량
sapply(titanic[sapply(titanic, is.numeric)], summary)

#install.packages("fBasics")
library(fBasics)
#왜도
skewness(titanic$Fare)
#첨도
kurtosis(titanic$Fare)

#연속형 변수 분포 확인
hist(titanic$Fare, breaks = 50)
boxplot(titanic$Fare)
plot(density(titanic$Fare))

hist(titanic$Age, breaks = 16)
plot(density(titanic$Age, na.rm = T))

#범주형 변수 기초 통계량
sapply(titanic[sapply(titanic, is.factor)], summary)

#범주형 변수 분포 확인하기
barplot(table(titanic$Survived))


#결측치 처리
data<-airquality

is.na(data)#결측치면 True

complete.cases(data)#결측치가 아니면 True

colSums(is.na(data))#컬럼별 결측치 수

table(is.na(data$Ozone))#ozone의 결측치와 결측치 아닌 수

#결측치 처리

#결측치 제거
na.omit(data)

#평균대치 if 결측치 이면 평균, 아니면 기존 값
data$Ozone<-ifelse(is.na(data$Ozone),mean(data$Ozone, na.rm=T), data$Ozone)

#중앙값대치 if 결측치 이면 평균, 아니면 기존 값
data$Ozone<-ifelse(is.na(data$Ozone),median(data$Ozone, na.rm=T), data$Ozone)

#Factor 같은 경우 최빈 값으로 대치 하는 것이 좋다.

#패키지 활용
#install.packages('DMwR')
library(DMwR)
data<-airquality

#기존 na 값을 가진 index 확인
na_index<-which(is.na(data))
data[na_index,]#na인 Row들

#centralImputation(중앙값 대치)
central_data<-centralImputation(data)
central_data[na_index,]#잘되었는지 확인인

#knnImputation : k 최근접 이웃 알고리즘을 이용하여 na값 대치
knn_data<-knnImputation(data, 5)


#이상치 처리
data<-knn_data

#중앙값-1.5*IQR ~ 중앙값+1.5*IQR 범위를 벗어나는 값을 이상치로 판별한다.

#boxplot으로 이상치 존재 방법
boxplot(data)
boxdata<-boxplot(data$Ozone)
boxdata# $out에서 이상치 index 확인 가능

boxdata$out# $out 데이터터
data[boxdata$out,]#이상치 데이터 확인

#fivenum 함수 이용하여 이상치 확인
fivenum(data$Ozone)#최소값, 1사분위수, 2사분위수, 3사분위수, 최댓값
lower<-fivenum(data$Ozone)[2]
upper<-fivenum(data$Ozone)[4]
IQR<-IQR(data$Ozone, na.rm = T)#upper-lower 이거와 같음
data[(data$Ozone<lower-1.5*IQR)|(data$Ozone>upper+1.5*IQR),]#이상치 확인
data[which(!((data$Ozone<lower-1.5*IQR)|(data$Ozone>upper+1.5*IQR))),]#이상치 제거

#파생변수 생성
#1. 한가지 컬럼을 여러 등급으로 나눈 컬럼 만들기(ex. 수학 점수 등급->1등급, 2등급, 3등급)
#2. 여러 컬럼의 평균을 나타내는 컬럼 만들기(ex. 수학, 과학, 사회 -> 전체 과목 평균)
#3. 새로운 지수 (ex. bmi = 체중(kg) ÷ {키(m) x 키(m)})
#4, 2,3에서 만들어진 파생변수에 1번과 같이 등급으로 나누기

library(dplyr)
#100보다 크면 2 50보다 크면 1 나머지는 0으로 파생 변수 생성
mutate(data, ozone_grade=ifelse(data$Ozone>100,2,ifelse(data$Ozone<100 & data$Ozone>50,1,0)))

 

위 코드를 꼭 외우시고 손에 익히는 것이 중요합니다.

 

도움이 되셨기를 바랍니다.

반응형

댓글