경기도 인공지능 개발 과정/R

R 결측치

agingcurve 2022. 4. 17. 15:36
반응형

### 데이터 정제 작업 : 결측치(빠진 데이터) /  이상치(이상한 데이터)

# 결측치(NA) 정제
# 1. NA 값 찾기
df <- data.frame(sex=c("M", "F", NA, "M", "F"),
                 score=c(5,4,3,4,NA)
                 )

# 데이터프레임으로부터 NA 값을 확인하는 함수 : is.na(데이터프레임)
# is.na() 실행 결과 : NA가 맞으면 TRUE / NA가 아니면 FALSE
is.na(df)

# 결측치 빈도표(table()) 생성
table(is.na(df))

table(is.na(df$sex))

table(is.na(df$score))

# 결측치 제거
# 1. 결측치만 걸러 내는 방법 (filter())
df %>% filter(is.na(score))

# 2. 결측치가 아닌 데이터만 걸러 내는 방법
df_nomiss <- df %>% filter(!is.na(score))
mean(df_nomiss$score)
sum(df_nomiss$score)

# 3. 결측치가 아닌 데이터만 걸러 내는 방법 : 여러개의 변수
df_nomiss <- df %>% filter(!is.na(score)  &  !is.na(sex))


# 4. 결측치가 존재하는 행을 한번에 제거하는 방법 : na.omit()
# na.omit(데이터프레임) : 데이터프레임으로부터 결측치가 발견되면 해당 행을 제거
df_nomiss2 <- na.omit(df)


# 5. 결측치를 제거하지 않고, 집계 함수를 이용하여 연산에서 제외 시킬 경우.
# na.rm 을 사용하면 된다, 단, 모든 함수에 지원되는 것은 아니다!!
mean(df$score)
mean(df$score, na.rm = T)

exam %>% summarise(mean_math=mean(math, na.rm = T))

# 데이터프레임의 변수 데이터 변경
exam[c(3,8,15), "math"] <- NA
# exam[c(변경될 행 번호리스트), 변경될 변수] <- 변경값

exam %>% summarise(mean_math=mean(math))
exam %>% summarise(mean_math=mean(math, na.rm = T))

exam %>% summarise(mean_math=sum(math, na.rm = T))

exam %>% summarise(mean_math=median(math, na.rm = T))

# 결측치 대체하기
# 대체 방법 : 평균, 최빈값, 대표값으로 대체.. / 통계분석기법으로 예측값을 추정
# 평균값을 이용하여 결측치를 대체
mean(exam$math, na.rm = T)   # 55.23529 => 55 값을 대체  값으로..

exam$math <- ifelse(is.na(exam$math), 55, exam$math)
# 만약 exam의 math 변수의 값이 NA 이면 55, 그렇지 않으면 원래 값을 할당
table(is.na(exam$math))