1. Apprendre
  2. /
  3. Cours
  4. /
  5. Introduction à Spark avec sparklyr en R

Connected

Exercice

Transformer des variables continues en variables catégorielles (1)

Une généralisation de l'idée précédente consiste à définir plusieurs seuils : vous scindez ainsi une variable continue en « buckets » (ou « classes »), comme le fait un histogramme. En R de base, vous utiliseriez cut() pour cette tâche. Par exemple, dans une étude sur les habitudes de tabagisme, vous pourriez prendre le nombre typique de cigarettes fumées par jour et le transformer en facteur.

smoking_status <- cut(
  cigarettes_per_day,
  breaks = c(0, 1, 10, 20, Inf),
  labels = c("non", "light", "moderate", "heavy"),
  right  = FALSE
)

L'équivalent dans sparklyr est d'utiliser ft_bucketizer(). Le code a une forme semblable à ft_binarizer(), mais cette fois vous devez passer un vecteur de points de coupure à l'argument splits. Voici le même exemple réécrit à la manière de sparklyr.

smoking_data %>%
  ft_bucketizer("cigarettes_per_day", "smoking_status", splits = c(0, 1, 10, 20, Inf))

Plusieurs points importants sont à noter. Vous aurez remarqué que l'argument breaks de cut() correspond à l'argument splits de ft_bucketizer(). Il existe une légère différence quant au traitement des valeurs aux bornes. Dans cut(), par défaut, la borne supérieure (droite) est incluse dans chaque intervalle, mais pas la borne gauche. ft_bucketizer() inclut la borne inférieure (gauche) dans chaque intervalle, mais pas la borne droite. Cela revient donc à appeler cut() avec l'argument right = FALSE.

Une exception : ft_bucketizer() inclut les valeurs sur les deux bornes pour l'intervalle le plus élevé. ft_bucketizer() équivaut donc aussi à utiliser include.lowest = TRUE avec cut().

Dernier point : alors que cut() retourne un facteur, ft_bucketizer() retourne un vecteur numeric, avec les valeurs du premier intervalle codées à zéro, celles du deuxième à un, celles du troisième à deux, et ainsi de suite. Si vous souhaitez travailler avec les résultats dans R, vous devez convertir explicitement en facteur. Voici un patron de code courant :

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

Instructions

100 XP

Une connexion Spark a été créée pour vous sous le nom spark_conn. Un tibble lié aux métadonnées des pistes stockées dans Spark a été pré‑défini sous le nom track_metadata_tbl. decades est une suite numérique 1920, 1930, …, 2020, et decade_labels est une description textuelle de ces décennies.

  • Créez une variable nommée hotttnesss_over_time à partir de track_metadata_tbl.
    • Sélectionnez les champs artist_hotttnesss et year.
    • Convertissez la colonne year en numeric.
    • Utilisez ft_bucketizer() pour créer un nouveau champ decade qui regroupe les années selon decades.
    • Rapatriez le résultat avec collect().
    • Convertissez le champ decade en facteur avec les étiquettes decade_labels.
  • Tracez un diagramme à barres ggplot() de artist_hotttnesss par decade.
    • Le premier argument de ggplot() est l'argument des données, hotttnesss_over_time.
    • Le deuxième argument de ggplot() est l'esthétique, qui prend decade et artist_hotttnesss enveloppés dans aes().
    • Ajoutez geom_boxplot() pour tracer les barres.