Charles Grillet
Paris / Rennes / Everywhere

Cyclistic

Data, Case Study, Learning


Pour cette étude de cas qui clôt le programme de formation certifiante sur l’analyse des données proposée par Google sur le site Coursera "Google Data Analytics", j’assume le rôle de Data Analyst junior chez Cyclistic, une entreprise de vélos en libre-service basée à Chicago.

Cyclistic propose plus de 5 800 vélos dans plus de 600 stations d’accueil réparties sur Chicago. La société propose deux types de vélos classiques et électriques et les commercialise à deux segments de clientèle : les occasionnels et les membres. Les cyclistes occasionnels sont les clients qui achètent des laissez-passer pour un trajet simple ou une journée complète. Les membres sont les clients qui achètent des abonnements annuels de la société Cyclistic, ces derniers sont plus rentables que les cyclistes occasionnels.

La stratégie future de la société vise à convertir les usagers occasionnels en membres annuels. Pour ce faire, l’équipe d’analystes marketing est chargée de mieux comprendre en quoi les cyclistes membres et les cyclistes occasionnels diffèrent en analysant des données historiques sur les trajets à vélo de la société de l’année 2023 afin d’identifier les tendances et de proposer une compagne publicitaire appropriée à la stratégie de l’entreprise.

Je mets à disposition le pdf de présentationici.

Executive Summary

J'ai analysé le data pour l'année 2023 afin d'identifier les variations de tendances entre l'usage des membres annuels et des utilisateurs occasionnels.

Dans ces deux groupes, les usages diffèrent sur plusieurs points :

  • La proportion d’utilisateurs occasionnels augmente au printemps et pendant l'été, de juin à août.
  • Tout au long de l'année, nos membres payants sont plus nombreux.
  • L'usage varie selon le jour de la semaine.
    • Les abonnés vont favoriser un usage tout au long de la semaine avec des durées plutôt homogènes.
    • Les occasionnels iront favoriser le week-end avec une durée d'utilisation extrêmement variée.
  • En regardant les horaires d'utilisation :
    • les deux groupes favorisent la soirée avec un pic à 17h
    • les trajets matinaux étant l'apanage des utilisateurs membres.

Les recommandations que je ferai en fin de ce document se basent sur ces trois éléments de différentiation :

  • la saisonnalité
  • le type d'usage
  • l'heure d'usage

Sources

Pour cette analyse, j'utilise le data mis à disposition par Cyclistic que l'on peut retrouverici. (Remarque : Les jeux de données ont un nom différent car Cyclistic est une entreprise fictive). Les données ont été mises à disposition par Motivate International Inc. sous cettelicence).
J'utilise les données de Janvier 2023 à Décembre 2023 pour baser mon analyse sur une année pleine.

Stakeholders et Contexte

Personnages et équipes

  • Cyclistic : Un programme de vélos en libre-service qui comprend plus de 5 800 vélos et 600 stations d'accueil. Cyclistic se distingue en proposant également des vélos inclinables, des tricycles à propulsion manuelle et des vélos-cargos, ce qui rend les vélos en libre-service plus adaptés aux personnes handicapées et aux cyclistes qui ne peuvent pas utiliser un vélo à deux roues standard. La majorité des usagers optent pour des vélos traditionnels ; environ 8 % des usagers utilisent les options d'assistance. Les utilisateurs Cyclistic sont plus susceptibles de rouler pour leurs loisirs, mais environ 30 % d'entre eux l'utilisent pour se rendre au travail chaque jour.
  • Lily Moreno : La directrice du marketing et votre responsable. Lily Moreno est responsable du développement de campagnes et d'initiatives visant à promouvoir le programme de vélos en libre-service. Il peut s'agir d’e-mails, de médias sociaux et d'autres canaux.
  • Équipe d'analytique marketing Cyclistic : Une équipe d'analystes de données qui sont responsables de la collecte, de l'analyse et du reporting des données qui aident à guider la stratégie marketing de Cyclistic. J'ai rejoint cette équipe il y a six mois et j'ai été occupé à apprendre la mission et les objectifs commerciaux de Cyclistic - ainsi que la façon dont je peux aider Cyclistic à les atteindre.
  • Équipe de direction Cyclistic : L'équipe de direction, notoirement orientée vers les détails, décidera d'approuver ou non le programme de marketing recommandé.

À propos de l'entreprise

En 2016, Cyclistic a lancé avec succès une offre de vélos en libre-service. Depuis lors, le programme s'est développé pour atteindre un parc de 5 824 vélos géolocalisés et verrouillés dans un réseau de 692 stations à travers Chicago. Les vélos peuvent être retirés à partir d'une station et retournés à n'importe quelle autre station du système, à tout moment.
Jusqu'à présent, la stratégie marketing de Cyclistic reposait sur la sensibilisation générale et l'attrait pour de larges segments de consommateurs. L'une des approches qui a contribué à rendre ces choses possibles est la flexibilité de ses plans tarifaires : pass pour une seule promenade, pass pour une journée entière et adhésions annuelles. Les clients qui achètent des abonnements pour un seul trajet ou pour une journée entière sont appelés « usagers occasionnels ». Les clients qui achètent des abonnements annuels sont des membres Cyclistic.
Les analystes financiers de Cyclistic ont conclu que les membres annuels sont beaucoup plus profitables que les cyclistes occasionnels. Bien que la flexibilité des prix aide Cyclistic à attirer davantage de clients, Lily Moreno pense que la maximisation du nombre de membres annuels sera la clé de la croissance future. Plutôt que de créer une campagne de marketing ciblant de tout nouveaux clients, Lily Moreno estime qu'il y a de très bonnes chances de convertir les usagers occasionnels en membres. Elle note que les usagers occasionnels connaissent déjà le programme Cyclistic et ont choisi Cyclistic pour leurs besoins de mobilité.

Demander

Je vais me servir du framework SMART : S-Specific, M-Measurable, A-Action-Oriented, R-Relevant, T-Time-Bound

En ressortent ces questions :

  • En quoi les usages diffèrent entre membres et occasionnels ?
  • Pourquoi les occasionnels achèteraient un abonnement pour devenir des membres ?
  • comment les médias numériques pourraient affecter leurs tactiques de marketing ?

Business Task
Lily Moreno a fixé un objectif clair : Concevoir des stratégies de marketing visant à convertir les usagers occasionnels en membres annuels. Pour ce faire, cependant, l'équipe d'analystes marketing doit mieux comprendre en quoi les membres annuels et les usagers occasionnels diffèrent, pourquoi les usagers occasionnels achèteraient un abonnement, et comment les médias numériques pourraient affecter leurs tactiques de marketing.
Lily Moreno et son équipe souhaitent analyser les données historiques des déplacements à vélo de Cyclistic afin d'identifier les tendances.

Préparer

Le Data a été téléchargé et des copies ont été stockées en local sur mon ordinateur ainsi que sur google Drive.
Le data se présente sous la forme de fichiers CSV (comma-separated values), tous de 13 colonnes.
J'utilise pour mon analyse le data des 12 mois de 2023.
Dans l'optique du Case Study, ce dataset me permettra de répondre à la demande. Mais des questions de confidentialité m'empêcheront d'utiliser des éléments identifiables afin de savoir si les utilisateurs occasionnels sont des occurences uniques ou si ce sont des clients récurrents.

Traiter

Je vais utiliser le logiciel RStudio sous sa forme Desktop au vu du nombre d'entrées data.
Le fichier R source est disponibleici.

Je vais en premier lieu installer et activer les packages suivants :

tidyverse
lubridate
ggplot2
dplyr
geosphere
tibble

Ensuite, je vais importer les CSV des mois que je vais analyser :

jan_23_data <- read_csv("202301-divvy-tripdata.csv")
... rinse et repeat jusqu'à ...
dec_23_data <- read_csv("202312-divvy-tripdata.csv")
													
Maintenant on va vérifier les noms de colonnes
avant de pouvoir tout réunir pour avoir du data sur l'année :

colnames(jan_23_data)
... etc ...
colnames(dec_23_data)
												
On constate que c'est bon, il y a bien 13 colonnes partout
et toutes ont les mêmes intitulés.

L'étape suivante va être de réunir tout ça en un seul jeu.

trip_data <- bind_rows(jan_23_data, fev_23_data, mar_23_data, avr_23_data, mai_23_data,
jun_23_data, jul_23_data, aug_23_data, sept_23_data, oct_23_data, nov_23_data, dec_23_data)
												
On découpe les dates en jours / mois / années
puis on appelle la colonne pour vérifier :

trip_data$date <- as.Date(trip_data$started_at) 
trip_data$month <- format(as.Date(trip_data$date), "%m")
trip_data$day <- format(as.Date(trip_data$date), "%d")
trip_data$year <- format(as.Date(trip_data$date), "%Y")
trip_data$day_of_week <- format(as.Date(trip_data$date), "%A")
colnames(trip_data)
												
On rajoute une colonne de 'durée de voyage' qu'on inspecte avec la fonction str.

trip_data$ride_length <- difftime(trip_data$ended_at, trip_data$started_at)
str(trip_data)
												
On passe en numérique la colonne ride_length pour faciliter les calculs,
on demande une confirmation avec un boolén et,
par minutie, on inspecte avec la fonction str.

trip_data$ride_length <- as.numeric(as.character(trip_data$ride_length))
is.numeric(trip_data$ride_length) #le [1] TRUE nous le confirme
str(trip_data)
												
Maintenant on rajoute une colonne distance parcourue en km.

trip_data$ride_distance <- distGeo(matrix(c(trip_data$start_lng, trip_data$start_lat), ncol=2),
	matrix (c(trip_data$end_lng, trip_data$end_lat), ncol=2))
trip_data$ride_distance <- trip_data$ride_distance/1000
												
Plus qu'à effectuer un petit nettoyage des entrées
ride_length est négatif ou égal à 0
puis à ranger les données clean dans une nouvelle table.

trip_data_clean <- trip_data[!(trip_data$ride_length <= 0),]
glimpse(trip_data_clean)
												
On ouvre la version nettoyée avant de passer à la phase d'analyse

View(trip_data_clean)
												

Analyser

Maintenant que le Data a été nettoyé, je vais pouvoir l'analyser et en dégager des tendances.
Le fichier R source est disponibleici.

Mon objectif est de comparer plusieurs points :

  • La différence de nombre de trajets entre utilisateurs abonnés et occasionnels
  • Cette différence mais selon les jours de la semaine
  • Cette différence mais selon les mois
  • La durée moyenne des trajets des abonnés et des occasionnels selon les jours
  • La distance moyenne parcourue
  • Les variations horaires d'usage des vélos

Pour commencer, on va regrouper les cyclistes occasionnels
et les membres et comparer leurs min, max, average et median ride_length (durée)

trip_data_clean %>% 
  group_by(member_casual) %>%
  summarise(average_ride_length = mean(ride_length),
  			median_length = median(ride_length), 
            max_ride_length = max(ride_length),
            min_ride_length = min(ride_length))
													
On va regrouper les cyclistes occasionnels et les membres
et comparer le nombre de rides totaux

trip_data_clean %>% 
  group_by(member_casual) %>% 
  summarise(ride_count = length(ride_id))
													
On aimerait bien avoir ce tibble en ggplot,
donc je le mets dans une nouvelle table :

ride_count <- trip_data_clean %>% 
  group_by(member_casual) %>% 
  summarise(ride_count = length(ride_id))
  													
Je visualise ma nouvelle table qui devrait être comme le tibble :

View(ride_count)
													
Puis on crée le visuel.

ggplot(ride_count, aes(x = member_casual, y = ride_count, fill = member_casual)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = ride_count), vjust = -0.5) +
  labs(title = "Nombre de trajets : membres Vs cyclistes occasionnels",
       x = "Type d'utilisateur",
       y = "Nombre de trajets") +
  theme_minimal() +
  scale_fill_manual(values = c("member" = "goldenrod2",
  	"casual" = "lightblue1"))
  													

Premier constat : il y a plus d'utilisateurs abonnés que d'occasionnels.
Attelons nous au découpage par jours.

trip_data_clean$day_of_week <- ordered(trip_data_clean$day_of_week,
levels=c("lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"))
trip_data_clean %>% 
  group_by(member_casual, day_of_week) %>%
  summarise(number_of_rides = n()		#calcul du total de voyages et de leur durée moyenne 
  ,average_ride_length = mean(ride_length),.groups="drop") %>%		#calcul de la durée moyenne
  arrange(member_casual, day_of_week)
													
On met ces résultats dans une table,
on passe en ggplot :


Le graphique nous montre que les occasionnels roulent majoritairement le weekend
alors que les abonnés, tout en restant stable en semaine ont une baisse d'utilisation en weekend.

Découpage mois maintenant.

trip_data_clean %>%  
  group_by(member_casual, month) %>% 
  summarise(number_of_rides = n(),.groups="drop") %>% 
  arrange(member_casual, month)

number_of_rides <- trip_data_clean %>%  
  group_by(member_casual, month) %>% 
  summarise(number_of_rides = n(),.groups="drop") %>% 
  arrange(member_casual, month)

ggplot(number_of_rides, aes(x = month, y = number_of_rides, fill = member_casual)) +
  labs(title ="Trajets des Membres et des Cyclistes occasionnels par mois",
       x = "mois",
       y = "Nombre de trajets") +
  theme(axis.text.x = element_text(angle = 45)) +
  geom_col(width=0.5, position = position_dodge(width=0.5)) +
  scale_y_continuous(labels = function(x) format(x, scientific = FALSE))+
  theme_minimal() +
  scale_fill_manual(values = c("member" = "goldenrod2", "casual" = "lightblue1"))
													



Ce sont les abonnés qui utilisent plus les vélos au long de l’année,
il n'y a que l’été (juin, juillet, août), où les occasionnels réduisent l'écart.

Voyons maintenant la durée et la distance moyennes pour chacun des groupes.

ggplot(ride_count_daily, aes(x = day_of_week,
	y = average_ride_length,
	fill = member_casual)) +
  labs(title ="Durée moyenne des trajets :
  		Membres and Cyclistes occasionnels Vs. Jour de la semaine",
       x = "",
       y = "Durée des trajets en minutes") +
  geom_col(width=0.5, position = position_dodge(width=0.5)) +
  scale_y_continuous(labels = function(x) format(x, scientific = FALSE))+
  theme_minimal() +
  scale_fill_manual(values = c("member" = "goldenrod2", "casual" = "lightblue1"))

trip_data_clean %>% 
  group_by(member_casual) %>% drop_na() %>%
  summarise(average_ride_distance = mean(ride_distance))

average_ride_distance <- trip_data_clean %>% 
  group_by(member_casual) %>% drop_na() %>%
  summarise(average_ride_distance = mean(ride_distance))
View(average_ride_distance)

ggplot(average_ride_distance, aes(x = member_casual,
y = average_ride_distance,
fill = member_casual)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = round(average_ride_distance, 2)),
  vjust = -0.5) +
  labs(title = "Distance moyenne des trajets par type d'utilisateur",
       x = "",
       y = "Distance moyenne (km)") +
  theme_minimal() +
  scale_fill_manual(values = c("member" = "goldenrod2", "casual" = "lightblue1"))
													


De manière générale, les occasionnels ont tendance à faire de plus longs usages des vélos que les abonnés
mais cela ne se retranscrit pas dans la distance parcourue,
ce qui semble indiquer un usage plus "efficace" des abonnés
.

Finissons par la variation horaire des usages pour chacun des groupes.
Il nous faut muter la colonne pour l'heure des débuts des trajets :

trip_data_clean <- trip_data_clean %>%
  mutate(start_hour = lubridate::hour(started_at))
													

Calculer le nombre de trajets par heure pour les abonnés et les utilisateurs occasionnels

hourly_usage <- trip_data_clean %>%
  group_by(member_casual, start_hour) %>%
  summarise(ride_count = n()) %>%
  ungroup()
													

Visualiser les variations d'horaires d'usage

ggplot(hourly_usage, aes(x = start_hour, y = ride_count, color = member_casual, group = member_casual)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  labs(title = "Variations d'horaires d'usage par type d'utilisateur",
       x = "Heure de début",
       y = "Nombre de trajets") +
  theme_minimal() +
  scale_color_manual(values = c("member" = "goldenrod2", "casual" = "lightblue"))
													


Le graphique souligne deux choses :
  • Il y a un pic d'usage à 17h pour les abonnés et les usagers occasionnels.
  • Les utilisateurs occasionnels ne prennent pas les vélos le matin.
C'est une opportunité de développement non négligeable pour cette tranche d'utilisateurs.

Partager

Je mets à disposition le pdf de présentationici.

Agir

À partir de mon analyse, je peux déduire quelques grandes tendances :

  • Saisonnalité : l’augmentation du printemps et de l’été.
    L’augmentation de la demande de nos vélos pendant le printemps et l’été nous offre une fenêtre de tir toute trouvée pour des campagnes de promotions et de publicité.
  • Type d’usage : le même vélo, des habitudes différentes
    Les abonnés utilisent nos vélos pour aller bosser : pendant la semaine, des pics le matin et le soir, avec des durées stables.
    Les cyclistes occasionnels ont un usage récréatif : le week-end, pour aller se balader en soirée l’été.
  • Heure d’usage : l’opportunité de la tranche matinale.
    La seule différence notable dans les horaires d’utilisation des vélos se situe dans la tranche matinale : entre 05:00 et 10:00.

Propositions de solutions pour transformer des cyclistes occasionnels en membre annuels.

  • Créer une campagne de mailing ciblant spécifiquement les cyclistes occasionnels pendant la fin du printemps et tout au long de l’été.
    Prévoir des promotions et du matériel promotionnel en lien : Tarifs réduits sur l’abonnement annuel sur les 3 mois de l’été, des propositions de balades été et leurs contreparties hiver pour promouvoir l’usage all year long, faire des ventes flash de l’abonnement à prix cassés sur un an, etc.

  • Créer des variations "sur mesure" de l’abonnement annuel.
    • Offre spéciale «Riders du week-end» pour pousser l’usage en week-ends.
    • Offre spéciale «Long rider» qui va chercher les aficionados des grandes balades.
    • Offre spéciale «Half Week» avec un tarif réduit le week-end selon l’usage en pleine semaine.
    Organiser des événements spécifiquement pour les abonnés pendant les weekends pour jouer sur le FOMO des occasionnels pour les amener à s’abonner.

  • Communiquer sur les bienfaits sanitaires de Cyclistic pour les trajets quotidiens.
    Appuyer sur les bienfaits du vélo pour la santé avec des campagnes marketing ciblées. Les cyclistes abonnés et occasionnels ne diffèrent pas tant que ça en horaire d’usage, l’occasion présentée par le vide de la tranche matinale en terme de croissance est non négligeable.

Last Updated: 3/6/2024 ■ 21:16