CommencerCommencer gratuitement

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

Une généralisation de l’idée précédente consiste à utiliser plusieurs seuils : autrement dit, vous découpez 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 tabagiques, 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 sparklyr consiste à utiliser ft_bucketizer(). Le code est similaire à 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 dans la gestion des valeurs aux bornes. Dans cut(), par défaut, la borne supérieure (droite) est incluse dans chaque classe, mais pas la borne gauche. ft_bucketizer() inclut la borne inférieure (gauche) dans chaque classe, 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 la classe la plus élevée. ft_bucketizer() est donc également équivalent à include.lowest = TRUE avec cut().

Dernier point : alors que cut() renvoie un facteur, ft_bucketizer() renvoie un vecteur numeric, avec 0 pour la première classe, 1 pour la deuxième, 2 pour la troisième, etc. Si vous voulez exploiter le résultat dans R, vous devez le convertir explicitement en facteur. C’est un motif de code courant :

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

Cet exercice fait partie du cours

Introduction à Spark avec sparklyr en R

Afficher le cours

Instructions

Une connexion Spark a été créée pour vous sous le nom spark_conn. Un tibble lié aux métadonnées des morceaux 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 découpe les années selon decades.
    • Collectez le résultat.
    • Convertissez le champ decade en facteur avec les étiquettes decade_labels.
  • Tracez un diagramme en barres ggplot() de artist_hotttnesss par decade.
    • Le premier argument de ggplot() est l’argument data, 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.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

# 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(___, ___)) +
  ___()  
Modifier et exécuter le code