連続変数をカテゴリ変数に変換する(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))
この演習はコースの一部です
sparklyr を使った Spark 入門(R)
演習の手順
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()を追加して箱ひげ図を描きます。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# 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(___, ___)) +
___()