連続変数を論理値型に変換する
論理値型変数は便利です。数値よりも「はい・いいえ」で考えるほうがわかりやすい場面が多いからです。たとえば「お茶を一杯いかがですか?」と聞かれたとき、「飲みたい確率は0.73です」と答えるより、「はい」か「いいえ」で答えるほうが自然ですよね。これはデータサイエンスでも同様です。たとえば、糖尿病検査では患者の血漿中のブドウ糖濃度が数値として返されますが、本当に知りたいのは「この患者は糖尿病か?」という点です。そのため、ある閾値をもとに数値を論理値に変換する必要があります。
base-R では、次のように比較的シンプルに記述できます。
threshold_mmol_per_l <- 7
has_diabetes <- plasma_glucose_concentration > threshold_mmol_per_l
sparklyr の特徴量変換関数はすべて同じようなインターフェースを持っています。最初の3つの引数は常に、Spark のチブル(tibble)、入力列の名前を表す文字列、出力列の名前を表す文字列です。つまり、次のパターンに従います。
a_tibble %>%
ft_some_transformation("x", "y", some_other_args)
sparklyr で連続変数を論理値型に変換するには、ft_binarizer() を使います。先ほどの糖尿病の例は、次のように書き直せます。閾値には、データセット内の列名を表す文字列ではなく、数値を指定してください。
diabetes_data %>%
ft_binarizer("plasma_glucose_concentration", "has_diabetes", threshold = threshold_mmol_per_l)
Spark では DoubleType を統一的に使うという設計思想があるため、ft_binarizer() の出力は論理値型ではなく numeric 型になります。Spark 上でそのまま作業や変換を続けるうえでは適切な方法ですが、R でデータを処理したい場合は、明示的に論理値型へ変換することを忘れないようにしましょう。よく使われるコードパターンは次のとおりです。
a_tibble %>%
ft_binarizer("x", "is_x_big", threshold = threshold) %>%
collect() %>%
mutate(is_x_big = as.logical(is_x_big))
この演習では、artist_hotttnesss フィールドを扱います。このフィールドは、データセット作成時点でそのアーティストがどれだけ話題になっていたかを示す指標です。ggplot2 パッケージを使ったグラフ描画についてさらに学びたい方は、Introduction to Data Visualization with ggplot2 コースをご覧ください。
この演習はコースの一部です
sparklyr を使った Spark 入門(R)
演習の手順
Spark 接続は spark_conn として作成済みです。Spark に保存されたトラックのメタデータに紐づいたチブル(tibble)は track_metadata_tbl として事前に定義されています。
track_metadata_tblをもとに、hotttnesssという変数を作成します。artist_hotttnesssフィールドを選択します。ft_binarizer()を使って、artist_hotttnesssが 0.5 より大きい場合にTRUEとなる新しいフィールドis_hottt_or_notttを作成します。- 結果を収集します。
is_hottt_or_notttフィールドを論理値型に変換します。
is_hottt_or_notttのggplot()棒グラフを描画します。ggplot()の第1引数にはデータ引数としてhotttnesssを指定します。ggplot()の第2引数には、aes()でis_hottt_or_notttを囲んだ審美的マッピングを指定します。geom_bar()を追加して棒を描画します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# track_metadata_tbl has been pre-defined
track_metadata_tbl
hotttnesss <- track_metadata_tbl %>%
# Select artist_hotttnesss
___ %>%
# Binarize to is_hottt_or_nottt
___ %>%
# Collect the result
___ %>%
# Convert is_hottt_or_nottt to logical
___
# Draw a barplot of is_hottt_or_nottt
ggplot(___, aes(___)) +
___()