연속형 변수를 범주형으로 변환하기 (1)
앞선 아이디어를 일반화하면 임계값을 여러 개 두는 방식이에요. 즉, 히스토그램처럼 연속형 변수를 여러 "버킷"(또는 "빈")으로 나눕니다. base R에서는 이 작업에 cut()를 사용해요. 예를 들어 흡연 습관 연구에서 하루 평균 흡연 개비 수를 받아 범주형 변수로 바꿀 수 있습니다.
smoking_status <- cut(
cigarettes_per_day,
breaks = c(0, 1, 10, 20, Inf),
labels = c("non", "light", "moderate", "heavy"),
right = FALSE
)
sparklyr에서는 동일한 작업에 ft_bucketizer()를 사용합니다. 코드는 ft_binarizer()와 유사한 형태이지만, 이번에는 splits 인수에 구간 경계값 벡터를 전달해야 합니다. 아래는 같은 예시를 sparklyr 스타일로 다시 작성한 코드예요.
smoking_data %>%
ft_bucketizer("cigarettes_per_day", "smoking_status", splits = c(0, 1, 10, 20, Inf))
주의할 점이 몇 가지 있습니다. cut()의 breaks 인수는 ft_bucketizer()의 splits 인수와 동일하다는 것을 눈치채셨을 거예요. 경계값을 처리하는 방식에는 약간의 차이가 있습니다. 기본적으로 cut()에서는 각 구간에 상한(오른쪽 경계)은 포함되고 하한은 포함되지 않아요. 반면 ft_bucketizer()는 각 구간에 하한(왼쪽 경계)은 포함하고 상한은 포함하지 않습니다. 즉, right = FALSE로 cut()을 호출한 것과 동일합니다.
한 가지 예외는 최상위 구간에서 ft_bucketizer()가 양쪽 경계의 값을 모두 포함한다는 점이에요. 따라서 cut()을 사용할 때 include.lowest = TRUE를 설정한 것과도 동일합니다.
마지막으로 기억할 점은, cut()은 factor를 반환하는 반면 ft_bucketizer()는 numeric 벡터를 반환한다는 것입니다. 첫 번째 구간은 0, 두 번째는 1, 세 번째는 2처럼 값이 매겨집니다. R에서 이 결과를 범주로 다루려면 명시적으로 factor로 변환해야 해요. 다음은 자주 쓰는 코드 패턴입니다.
a_tibble %>%
ft_bucketizer("x", "x_buckets", splits = splits) %>%
collect() %>%
mutate(x_buckets = factor(x_buckets, labels = labels))
이 연습은 강의의 일부입니다
R에서 sparklyr로 시작하는 Spark
연습 안내
spark_conn이라는 Spark 연결이 준비되어 있고, Spark에 저장된 트랙 메타데이터에 연결된 티블 track_metadata_tbl이 미리 정의되어 있습니다. decades는 1920, 1930, …, 2020으로 이어지는 수열이고, decade_labels는 해당 10년대에 대한 텍스트 라벨입니다.
track_metadata_tbl에서 변수hotttnesss_over_time을 만드세요.artist_hotttnesss와year필드를 선택하세요.year열을numeric으로 변환하세요.ft_bucketizer()를 사용해decades를 기준으로 연도를 분할한 새 필드decade를 만드세요.- 결과를 collect 하세요.
decade필드를decade_labels라벨을 가진 factor로 변환하세요.
decade별artist_hotttnesss의ggplot()박스플롯을 그리세요.ggplot()의 첫 번째 인수는 데이터hotttnesss_over_time입니다.ggplot()의 두 번째 인수는 미적 기준이며,aes()안에decade와artist_hotttnesss를 넣습니다.- 막대를 그리려면
geom_boxplot()을 추가하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
# track_metadata_tbl, decades, decade_labels have been pre-defined
track_metadata_tbl
decades
decade_labels
hotttnesss_over_time <- track_metadata_tbl %>%
# Select artist_hotttnesss and year
___ %>%
# Convert year to numeric
___ %>%
# Bucketize year to decade using decades vector
___ %>%
# Collect the result
___ %>%
# Convert decade to factor using decade_labels
___
# Draw a boxplot of artist_hotttnesss by decade
ggplot(___, aes(___, ___)) +
___()