본문 바로가기
R 프로그래밍/R을 활용한 탐색적 자료 분석

탐색적 자료 분석(결측치 처리)

by 찐남 2021. 9. 28.
본 포스팅은 R for Data Science를 기반으로 하여 작성하였습니다.

 

데이터 세트에서 비정상적인 값을 발견하고, 단순히 나머지 분석으로 이동하려는 경우에 진행할 수 있는 선택 사항은 아래 두 가지가 있습니다. 

 

1. 비정상적인 값이 존재하는 전체 데이터 행 삭제

 

diamonds2 <- diamonds %>%
____filter(between(y, 3, 20))

하나의 측정값이 유효하지 않다고 해서 모든 측정값이 잘못된 것은 아니기 때문에 별로 좋은 선택사항은 아니라고 생각합니다. 또한 품질이 낮은 데이터가 있는 경우 이 접근 방식을 모든 변수에 적용했을 때, 최종적으로 남아 있는 분석 데이터가 별로 없게 될 수도 있습니다.

 



2. 비정상적인 값을 결측 값으로 교체

 

이를 수행하는 가장 쉬운 방법은 mutate()를 사용하여 변수를 수정된 복사본으로 바꾸는 것입니다. ifelse() 함수를 사용하여 비정상적인 값을 NA로 바꿀 수 있습니다. 

 

diamonds2 <- diamonds %>%
____mutate(y = ifelse(y < 3 | y > 20, NA, y))

 

ifelse()에는 세 개의 인수가 있습니다. 첫 번째 인수는 논리 벡터(y < 3 | y > 20)입니다. 결과에는 논리연산이 TRUE인 경우 두 번째 인수의 값인 yes(NA)가 포함되고, false인 경우 세 번째 인수의 값인 no(y)가 포함됩니다. ifelse 대신 dplyr::case_when()을 사용하세요. case_when()은 기존 변수의 복잡한 조합에 의존하는 새 변수를 생성하려는 경우 mutate 내부에서 특히 유용합니다.

 

case_when()함수는 아래와 같이 사용하시면 됩니다. 결과는 위의 문장과 동일합니다.

diamonds3 <- diamonds %>%
____mutate(
________y = case_when(
________________y < 3 ~ NA_real_ ,
________________y > 20 ~ NA_real_ ,
________________TRUE ~ y
________________)
____)

# diamonds2 와 diamonds3의 동일성 체크
sum(diamonds2 != diamonds3) 
0
# 두 개의 DataFrame이 다르지 않음

 

R과 마찬가지로 ggplot2는 누락된 값이 자동으로 누락되어서는 안 된다는 철학에 동의합니다. 결측 값을 어디에 플롯 해야 하는지 명확하지 않으므로 ggplot2는 결측 값을 플롯에 포함하지 않지만 제거되었음을 경고합니다. 

 

ggplot(data = diamonds2, mapping = aes(x = x, y = y)) +
____geom_point()
#> Warning: Removed 9 rows containing missing values (geom_point).

 

해당 경고를 표시하지 않으려면 na.rm = TRUE 옵션을 설정하시면 됩니다.

ggplot(data = diamonds2, mapping = aes(x = x, y = y)) +
____geom_point(na.rm = TRUE)

 

다른 경우에는 결측값이 있는 관측값이 기록된 값이 있는 관측값과 다른 이유를 이해하려고 합니다. 예를 들어, nycflights13::flights에서 dep_time 변수의 누락된 값은 항공편이 취소되었음을 나타냅니다. 따라서 취소된 시간과 취소되지 않은 시간의 예정된 출발 시간을 비교할 수 있습니다. is.na()를 사용하여 새 변수를 만들어 이를 수행할 수 있습니다.

 

nycflights13::flights %>%
____mutate(
________cancelled = is.na(dep_time),
________sched_hour = sched_dep_time %/% 100,
________sched_min = sched_dep_time %% 100,
________sched_dep_time = sched_hour + sched_min / 60
____) %>%
____ggplot(mapping = aes(sched_dep_time)) +
________geom_freqpoly(mapping = aes(colour = cancelled), binwidth = 1/4)

그러나 이 플롯은 취소된 항공편보다 취소되지 않은 항공편이 더 많기 때문에 별로 좋은 예시는 아니긴 합니다. 



반응형

댓글