1. 学ぶ
  2. /
  3. コース
  4. /
  5. sparklyr を使った Spark 入門(R)

Connected

演習

連続変数をカテゴリ変数に変換する(1)

前の演習のアイデアをさらに発展させると、複数のしきい値を設けることができます。つまり、ヒストグラムのように連続変数を「バケット」(または「ビン」)に分割する方法です。ベースRでは、この処理に cut() を使用します。たとえば、喫煙習慣の研究では、1日に吸うタバコの本数を取得し、因子型に変換することができます。

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() は下側(左側)の境界値を含み、上側は含みません。つまり、cut() に right = FALSE を指定した場合と同等の動作になります。

例外として、ft_bucketizer() は最上位のバケットについては両側の境界値を含みます。そのため、ft_bucketizer() は cut() で include.lowest = TRUE を指定した場合とも同等になります。

最後に注意すべき点があります。cut() は因子型を返しますが、ft_bucketizer() は numeric 型のベクトルを返します。最初のバケットの値は0、2番目は1、3番目は2というように返されます。Rで結果を扱う場合は、明示的に因子型に変換する必要があります。よく使われるコードパターンは次のとおりです。

a_tibble %>%
  ft_bucketizer("x", "x_buckets", splits = splits) %>%
  collect() %>%
  mutate(x_buckets = factor(x_buckets, labels = labels))

指示

100 XP

Spark への接続は spark_conn として作成済みです。Spark に格納されたトラックメタデータに紐付けられたtibbleは track_metadata_tbl として事前に定義されています。decades は1920、1930、…、2020の数値シーケンスで、decade_labels はそれぞれの年代を表すテキストです。

  • track_metadata_tbl から hotttnesss_over_time という変数を作成します。
    • artist_hotttnesss と year フィールドを選択します。
    • year 列を numeric 型に変換します。
    • ft_bucketizer() を使って、decades で年を分割した新しいフィールド decade を作成します。
    • 結果を収集します。
    • decade フィールドをラベル decade_labels を持つ因子型に変換します。
  • decade ごとに artist_hotttnesss を示す ggplot() 箱ひげ図を描きます。
    • ggplot() の第1引数にはデータ引数として hotttnesss_over_time を渡します。
    • ggplot() の第2引数には、decade と artist_hotttnesss を aes() で囲んだ審美的マッピングを渡します。
    • geom_boxplot() を追加して箱ひげ図を描きます。