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
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 detrack_metadata_tbl.- Sélectionnez les champs
artist_hotttnesssetyear. - Convertissez la colonne
yearennumeric. - Utilisez
ft_bucketizer()pour créer un nouveau champdecadequi découpe les années selondecades. - Collectez le résultat.
- Convertissez le champ
decadeen facteur avec les étiquettesdecade_labels.
- Sélectionnez les champs
- Tracez un diagramme en barres
ggplot()deartist_hotttnessspardecade.- Le premier argument de
ggplot()est l’argument data,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 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(___, ___)) +
___()