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))
Cette activité fait partie du cours
Introduction à Spark avec sparklyr en R
Instructions de l’exercice
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 detrack_metadata_tbl.- Sélectionnez les champs
artist_hotttnesssetyear. - Convertissez la colonne
yearennumeric. - Utilisez
ft_bucketizer()pour créer un nouveau champdecadequi regroupe les années selondecades. - Rapatriez le résultat avec
collect(). - Convertissez le champ
decadeen facteur avec les étiquettesdecade_labels.
- Sélectionnez les champs
- Tracez un diagramme à barres
ggplot()deartist_hotttnessspardecade.- 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 prenddecadeetartist_hotttnesssenveloppés dansaes(). - Ajoutez
geom_boxplot()pour tracer les barres.
- Le premier argument de
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
# 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(___, ___)) +
___()