1. Learn
  2. /
  3. कोर्स
  4. /
  5. R에서 sparklyr로 시작하는 Spark

Connected

अभ्यास

연속형 변수를 범주형으로 변환하기 (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))

निर्देश

100 XP

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()을 추가하세요.