I- Introduction

Dans le cadre du cours Data Mining, nous avons choisi des données temporelles sur le système de partage de vélos de la ville de Chicago. Le but de ce projet est de manipuler des données en grande dimension (nous avons récupéré environ 13 millions de données) et de construire des modèles de prédiction performants.

Notre rapport s’organise de la manière suivante : nous présentons dans une première partie les données brutes puis dans une seconde les données transformées. En effet, un enjeu important a été de transformer les données dans un format compatible avec nos envies de prédiction et nos modèles. Une troisième partie portera sur les modèles que nous avons utilisé pour la prédiction. Dans cette dernière partie, nous parlerons du découpage Tendance/Saisonnalité de nos séries, des modèles additifs généralisés (gam) et des modèles d’arbre (Random Forest).

Dans le cadre du projet, nous avons construit un package R :

library("DivvyBikeProject")

La fonction de ce package est de regrouper toutes les manipulations que nous avons apportées sur les données : il permet donc de passer des données brutes (directement téléchargeables sur Internet, voir II) aux différents jeux de données utilisés dans nos modèles. Nous présenterons les fonctions présentes dans notre package au fur et à mesure des deux premières parties.

II - Présentation des données

Le jeu de données

Divvy est le système de partage de vélos de la ville de Chicago, avec 6 000 vélos disponibles à plus de 570 stations à travers Chicago et Evanston. Divvy, comme les autres systèmes de vélos de libre-service, se compose d’une flotte de vélos qui sont enfermés dans un réseau de stations d’accueil dans toute la région. Les vélos peuvent être déverrouillés à partir d’une station et renvoyés à n’importe quelle autre station du système. Divvy offre aux résidents et aux visiteurs une option de transport pratique pour se déplacer et explorer Chicago.

Divvy est un programme du Département des Transports de Chicago (CDOT), qui possède les vélos, les stations et les véhicules de la ville. Le financement initial du programme provenait de subventions fédérales pour des projets qui favorisent le redressement économique, réduisent la congestion du trafic et améliorent la qualité de l’air, ainsi que des fonds supplémentaires provenant du programme de financement des augmentations d’impôt de la ville. En 2016, Divvy s’est étendu à la banlieue voisine d’Evanston grâce à une subvention de l’État de l’Illinois.

Sur le site de Divvy, les données sur les trajets et les stations sont disponibles au public. Tous les ans, deux jeux de données sont publiés : un premier allant de janvier à juin et un second allant de juillet à décembre.

Chaque trajet à vélo est anonymisé et comprend :

  • Jour et heure du début du voyage

  • Jour et heure de la fin du voyage

  • Station de départ

  • Station d’arrivée

  • Type d’utilisateur (membre, tour unique ou passe d’exploration)

  • Si un membre voyage, le sexe et l’année de naissance sont inclus

Exemple de 5 trajets réalisés en 2014 :

##   trip_id       starttime        stoptime bikeid tripduration
## 1 2355134 6/30/2014 23:57   7/1/2014 0:07   2006          604
## 2 2355133 6/30/2014 23:56   7/1/2014 0:00   2217          263
## 3 2355130 6/30/2014 23:33 6/30/2014 23:35   2798          126
## 4 2355129 6/30/2014 23:26   7/1/2014 0:24    173         3481
## 5 2355128 6/30/2014 23:16 6/30/2014 23:26    173          638
##   from_station_id           from_station_name to_station_id
## 1             131   Lincoln Ave & Belmont Ave           303
## 2             282     Halsted St & Maxwell St            22
## 3             327 Sheffield Ave & Webster Ave           225
## 4             134    Peoria St & Jackson Blvd           194
## 5             320    Loomis St & Lexington St           134
##            to_station_name   usertype gender birthyear
## 1  Broadway & Cornelia Ave Subscriber   Male      1988
## 2       May St & Taylor St Subscriber   Male      1992
## 3 Halsted St & Dickens Ave Subscriber   Male      1993
## 4     State St & Wacker Dr Subscriber Female      1988
## 5 Peoria St & Jackson Blvd Subscriber Female      1988

En plus des deux fichiers sur les trajets à vélo, nous pouvons récupérer tous les ans une table sur les stations. Pour chaque station, nous avons :

  • Identifiant

  • Nom

  • Latitude

  • Longitude

  • Capacité (nombre de vélos que la station peut supporter)

  • Date de mise en service

Les 5 premières lignes de la table des stations de 2014 :

##    id                         name latitude longitude dpcapacity
## 1  43 Michigan Ave & Washington St 41.88389 -87.62465         43
## 2  44       State St & Randolph St 41.88473 -87.62773         27
## 3  33      State St & Van Buren St 41.87718 -87.62784         27
## 4 199       Wabash Ave & Grand Ave 41.89174 -87.62694         15
## 5  51       Clark St & Randolph St 41.88458 -87.63189         31
##   online date
## 1  2013-06-16
## 2  2013-06-16
## 3  2013-06-25
## 4  2013-08-10
## 5  2013-06-17

Analyses descriptives des données

Nombre de trajets et stations par année.
Année Stations Trajets
2013 300 759 788
2014 300 2 454 634
2015 474 3 183 439
2016 581 3 595 383
2017 585 3 829 014
Total : 13 822 258

Les vélos ont été mis en service en juin 2013 d’où un nombre de trajets plus faible. Ces chiffres nous montrent une augmentation du nombre de trajets sur le réseau et une augmentation de la taille du réseau lui-même au cours du temps. C’est entre 2014 et 2015 que ces augmentations sont les plus importantes avec environ 30% de trajets supplémentaires et 174 nouvelles stations.

L’extention du service à la banlieue d’Evanston en 2016 représente la création de quatre nouvelles bornes dans le réseau.

Visualisation géographique

Grâce aux informations présentes dans la table Station, nous pouvons visualiser l’emplacement des stations vélos dans la ville de Chicago.

Sur ce graphique, nous n’avons pas rajouté les stations de 2013 et de 2017 car il y a peu de changements entre 2013 et 2014 et entre 2016 et 2017.

Nous pouvons voir que les stations-vélo ont dans un premier temps été réparties dans le centre puis elles vont ensuite s’étendre vers les banlieues.

Nous nous sommes également rendus compte que certaines stations se déplaçaient de quelques mètres d’une année sur l’autre ou changaient de nom. Ces deux observations font partie des raisons justifiant l’agrégation spatiale faite par la suite.

Regardons maintenant la fréquentation des stations en 2016 :

Nous remarquons sur ce graphique, que les stations-vélos les plus utilisées sont surtout celles du centre-ville, ce qui peut s’expliquer par exemple par une densité plus forte.

Nous pouvons voir qu’il y a un fort écart entre les stations les moins utilisées (moins de 200 vélos empruntés par an) et les stations les plus utilisées (jusqu’à 92 000 vélos empruntés par an).

III - Transformation des données

Nous présenterons dans cette partie les manipulations que nous avons effectuées sur les données. Cette partie représente une bonne partie de notre travail et est donc centrale. Les remarques suivantes permettent de se rendre compte d’une partie des problèmes “simples” que nous avons rencontrés ayant motivés une transformation des données.

Le format des données est variable au cours des ans. Les noms des différents champs, le découpage temporel, l’organisation des fichiers et le format des dates changent souvent. Par ailleurs, la position des stations ainsi que leurs noms peuvent changer d’une année sur l’autre.

 

Nous avons réalisé plusieurs agrégations : une agrégation temporelle et une agrégation spatiale. Ces agrégations ont été motivées d’une part par les problèmes précédemment décrits et d’autre part par une volonté de réduire la dimension de notre jeu de données (13.5 millions de trajets et une dizaine de variables).

Agrégation temporelle

Nous avons compté pour chaque station le nombre de vélos entrants (nbE) et le nombre de vélos sortants (nbS) à chaque heure. L’agrégation au pas horaire nous a paru pertinente car elle permet de garder une maille temporelle assez fine tout en réduisant la dimensionalité de manière efficace.

Ce choix d’agrégation a conditionné nos séries d’intérêt puisque nous avons perdu des informations telles que les informations sur les utilisateurs ou encore le détail précis de chaque trajet.

L’agrégation temporelle (ainsi que la standardisation du format des données) se fait en utilisant la fonction aggregateData du package.

Agrégation spatiale

Le fait que de nouvelles stations s’ouvrent constamment, ainsi que le fait qu’elles sont parfois déplacées, nous a conduit à grouper les données géographiquement. Ainsi, nous supposons que des stations spatialement proches se comportent de la même façon.

Pour gérer les données géographiques, nous avons utilisé les packages R rgdal et raster. Étant donné un découpage spatial de la ville de Chicago contenu dans le Large SpatialPolygonDataFrame area, ainsi qu’un fichier data regroupant les données agrégées temporellement sur les stations, nous obtenons une agrégation spatiale via la fonction groupByGeospatialData(data, area, stations, year, save_data = FALSE)

Pour nos tests, nous avons choisi le découpage géographique par circonscriptions législatives pour la chambre basse de l’Illinois, obtenu sur le site du recensement américain. Ce découpage n’est objectivement pas très bon, notamment à cause de la pratique du gerrymandering. En effet, la forme des circonscriptions est généralement tortueuse (voir carte plus haut) et regroupe des populations différentes pour des considérations électorales. Cependant, il s’agit du seul regroupement à la bonne échelle que nous avons pu trouver. Par ailleurs, comme on le verra, ce découpage est déjà informatif.

On peut ainsi regrouper les stations dans une vingtaine de régions géographiques différentes qui comportent chacune en moyenne 24 stations (avec un écart type de 18).

Ajouts de variables explicatives

Nous avons rajouté \(3\) variables explicatives à notre jeu de données :

  • La pluviométrie (pluvio) et la température (temp) grâce au package riem. Lorsque les données sont manquantes, on prend pour température la température moyenne mensuelle horaire constatée et on suppose qu’il n’y a pas de précipitation.

  • La variable “Day of Week” (dow) qui varie de 1 à 8 : lundi = 1, …, dimanche = 7 et 8 pour les jours fériés.

Ces variables sont ajoutées respectivement par les fonctions getMeteo et getSpecialDays.

L’ensemble des manipulations décrites dans les trois derniers paragraphes ont été regroupées dans la fonction BuildDataSet.

Voici un extrait de nos données finales :

##                   Time district        Day Hour nbE nbS diff nb_stations
## 55 2015-01-01 02:00:00       24 2015-01-01    2   0   0    0           1
## 56 2015-01-01 02:00:00       25 2015-01-01    2   0   0    0          25
## 57 2015-01-01 02:00:00       26 2015-01-01    2   0   0    0          40
## 58 2015-01-01 02:00:00       32 2015-01-01    2   0   0    0           3
## 59 2015-01-01 02:00:00       39 2015-01-01    2   0   0    0          11
## 60 2015-01-01 02:00:00       40 2015-01-01    2   0   0    0          16
##    temp pluvio dow  weekday
## 55 -7.2      0   8 NewYears
## 56 -7.2      0   8 NewYears
## 57 -7.2      0   8 NewYears
## 58 -7.2      0   8 NewYears
## 59 -7.2      0   8 NewYears
## 60 -7.2      0   8 NewYears

Définition de nos séries d’intérêt

Nous avons proposé \(3\) séries d’intérêt différentes :

  • nbEstat : le nombre moyen de vélos par station entrant dans la région à une heure donnée par district

  • nbSstat : le nombre moyen de vélos par station sortant de la région à une heure donnée par district

  • diff = nbEstat - nbStat : la différence entre le nombre de vélos entrant et sortant de chaque région par heure et par district

Nous estimons que cette dernière statistique est la plus utile, car elle permet de déterminer comment les vélos doivent être déplacés entre les différentes régions afin de s’assurer que les stations ne soient jamais soit complètement vides, soit complètement pleines.

Ce premier graphique permet de visualiser la variable diff. La forme générale est la même quelque soit l’année : les vélos sont moins empruntés en début d’année (période hivernale - janvier/février) et c’est en été que la différence entrant/sortant est la plus importante.

Pour bien comprendre la forme de la série, intéressons-nous à nbEstat et nbSstat sur une période de temps restreinte (la deuxième semaine du mois de juillet 2014) et sur une seule station (la station 9). Le district 9 se situe en plein centre ville et regroupe le plus de stations.

Nous pouvons voir qu’en semaine il y a deux grands pics : un premier le matin (au alentour de 7h) et un second en fin d’après-midi (au alentour de 18h, voir graphique sur le profil journalier). On peut supposer que ces pics correspondent aux trajets pour aller et pour revenir du travail/école. Certaines personnes utilisent également les vélos lors de la pause déjeuner d’où un troisième pic moins important le midi.

Le profil des week-end est différent, nous n’observons plus le même rythme au niveau du matin et du soir : les vélos sont plutôt utilisés pour se promener dans la ville de 10h à 18h.

Le choix de la station 9 a une influence sur les semaines. En effet, dans les districts du centre de Chicago, on peut voir que le nombre d’entrée et le nombre de sortie est quasiment similaire au cours de la journée. Cela est surement dû au fait que les personnes au coeur de la ville se déplacent entre ces grands districts et que les personnes vivant un peu plus loin du centre viennent le matin travailler.

Pour comprendre le contraste entre les districts de banlieue et les distrits du centre, le graphique suivant montre la même semaine de juillet 2014 mais pour le district 4.

Nous pouvons supposer que les interactions avec les autres districts sont plus faibles.

Pour compléter la visualisation hebdomadaire, voici le profil d’une journée de semaine type :

IV - Les modèles

Nous utiliserons comme critère de perfomance le RMSE (écart-type moyen). Cela correspond donc l’écart type moyen entre le nombre de vélos empruntés (nBE) et notre prédiction.

Tendance

Pour commencer, intéressons-nous à la tendance de nos séries. La série diff n’ayant pas de tendance par construction (centrée en zéro), nous allons nous concentrer sur les séries nbEstat et nbSstat. Ici, on regroupe la totalité des stations ensembles afin d’avoir un point de vue général, mais on pourrait également effectuer ces manipulations districts par districts. Par ailleurs, on utilisera les données de 2014,2015 et 2016 pour entrainer le modèle, que l’on testera sur les données de 2017.

Pour ces deux séries, nous voyons un effet multiplicatif de la tendance et de la saisonnalité qui est traduit par l’équation suivante :

Série = Tendance * Saisonnalité Annuelle * (Saisonnalité Quotidienne + écart )

Pour chercher la tendance, nous avons utilisé un modèle linéaire (fonction lm). La tendance est représentée par la droite rouge sur les deux graphiques suivants.

Que ce soit pour la variable nbEstat ou pour la variable nbSstat, la tendance est croissante. Nous avons vu précédemment qu’au fur et à mesure du temps, le nombre de vélos entrant ou sortant augmentait.

Les deux séries se ressemblant beaucoup, nous allons présenter uniquement les résultats pour la variable nbEstat.

Le graphique suivant montre la variable corrigée de sa tendance. La courbe rouge est là pour vérifier que nos données corrigées aient bien une tendance nulle.

Saisonnalité

Saisonnalité Annuelle

Les visualisations graphiques semblent nous indiquer une double saisonnalité : annuelle et journalière. Pour rechercher la saisonnalité nous avons utilisé la fonction lm comme précédemment pour la tendance mais également les modèles additifs généralisés (gam). Ces deux méthodes ont abouti au même résultat.

Nous avons commencé par la saisonnalité la plus globale, soit la saisonnalité annuelle qui est visible en rouge sur le graphique suivant :

En corrigeant la variable de sa saisonnalité annuelle (en plus de sa tendance), nous obtenons le résultat suivant :

Il semble qu’il reste une part de saisonnalité ne s’expliquant pas (peut être n’est-elle pas entièrement multiplicative).

Saisonnalité journalière:

Pour chaque jour, nous pouvons calculer une saisonnalité par série de Fourier. Notons que nous ne considèrons à chaque fois que les jours du même type, afin d’avoir une différence raisonnable.

Le graphique suivant représente la saisonnalité journalière (en rouge) sur une semaine de 2017. Les courbes sont relativement semblables. La saisonnalité semble être un peu en avance : c’est sûrement dû a des phénomènes saisonniers ou à des changements d’heure.

Les résidus (ce qu’il reste après avec enlever la tendance et les deux saisonnalités) pour 2017 sont les suivants :

Nous observons une saisonnalité dans nos résidus qui n’a pas été capté par notre saisonnalité annuelle ou journalière.

Écarts

Nous essayons d’expliquer nos résidus par la température et de la pluviométrie à l’aide d’un modèle additif (gam).

On peut comparer un modèle additif pour l’écart avec un modèle multiplicatif.

Nous obtenons pour la prévision sur 2017, un RMSE de 294 pour le premier, et de 286 pour le second, qui semble donc meilleur.

Sur le graphique suivant nous avons le modèle obtenu avec saisonnalité, tendance et écart en rouge:

Série = Tendance * Saisonnalité Annuelle * (Saisonnalité Quotidienne + écart )

Modèle GAM

Un premier modèle :

Une autre idée est d’utiliser les modèles GAM classiques afin de prédire les différentes variables d’intérêts. On procède de la façon suivante:

  • On utilise d’abord les données de 2014 et 2015 comme données d’entraînement, et on valide le choix d’hyper-paramètres en utilisant les données de 2016 comme ensemble de validation ;

  • On utilise ensuite toutes les données de 2014 à 2016 pour prédire la variable en 2017.

Nous avons effectué quelques manipulations de donnée supplémentaires afin de mieux prédire :

  • Nous avons trié les districts par ordre de fréquentation, afin de pouvoir obtenir un comportement monotone ;

  • Par ailleurs, nous avons identifié les périodes les plus actives (de 7 à 8h et de 16 à 18h en semaine) par une variable spéciale.

On obtient un RMSE de 265, ce qui améliore un peu les méthodes précédentes.

Un second modèle :

En utilisant les mêmes hyper-paramètres que précedemment, on peut essayer de n’utiliser comme données d’entraînements que les données concernant un district donné pour prédire sur ce district. On appelle ce modèle modèle local, en opposition au modèle précédent, global. Le plus souvent, les modèles locaux sont plus efficaces pour prédire que le modèle global, mais ce n’est pas toujours le cas. Le tableau suivant montre les résultats obtenus pour quelques districts (choisis pour leur représentativité) :

RMSE par station pour différents districts pour les modèles locaux et globaux
District Global Local
2 0.39 0.13
9 1.00 0.79
12 1.92 1.18
14 0.31 0.34

On représente sur les graphiques suivant nbEstat (en rouge) ainsi que sa prédiction (en noir) entre le 4 et le 12 septembre 2017. On remarque que la prévision semble moins bonne pour le 4 septembre, qui est un jour férié.

Random Forests

Un modèle que nous avons utilisé est celui des random forests du package Random Forests. On utilise les données de 2014 à 2016 pour entraîner le modèle, et on calculera les erreurs sur les données de 2017. Ce modèle est assez simple à implémenter et obtient de très bons résultats. Cependant, il est un peu coûteux en temps de calcul. En utilisant 10 arbres, on obtient pour la prévision de nbEstat un RMSE de 109.

Sur les graphiques suivants, on a représenté les résultats de ce modèle pour différents districts :

Les random forests nous permettent également d’étudier les influences des différentes variables. On peut ainsi supprimer certaines variables, et essayer de voir quelle est l’erreur sans ces variables.

RMSE par stations pour différents modèles
Modèle RMSE
Complet 109
Sans Données géographiques 152
Sans la température 149
Sans le type de jours 180
Sans la pluviométrie 123

Il semble donc que la plupart des variables soient significatives, mais pas la pluviométrie. Notons au passage que le découpage géographique semble pertinent, puisque l’écart si l’on considère que toutes les stations se comportent de manière identiques est plus important.

Là encore, on peut tester la différence entre modèles locaux et globaux.

RMSE pour différents districts pour les modèles locaux et globaux
District Global Local
2 0.10 0.08
9 0.53 0.34
12 0.73 0.52
14 0.14 0.13

Les modèles locaux sont là encore plus efficaces que le modèle global. Par ailleurs, ils prennent individuellement moins de temps à se calculer. Ce sont ces modèles qui semblent être les plus efficaces parmi les modèles étudiés.

V - Conclusion

Nous avons choisi de travailler sur les données de Divvy Bike car les systèmes de partage de vélos sont un sujet au coeur de l’actualité (parisienne). Nous avons apprécié l’accès aux données et leur grand nombre.

Au cours du projet, nous nous sommes rendu compte de l’importance du pré-traitement des données. L’étape de transformation a été trés longue pour deux raisons : la première est conceptuelle et la seconde plus pratique. N’ayant pas de variable à prédire directement présente dans les données, nous avons dû en construire une (trois au final!). Cela nous a demandé de réfléchir d’un côté, à une variable potentiellement intéressante pour DivvyBike et d’un autre à une implémentation dans nos cordes.

Les modèles statistiques de prévision que nous avons utilisé nous ont permis de comprendre les outils spécifiques aux séries temporelles. Nous sommes parvenus à des erreurs relativement faible(moins de 109 vélos par heure), mais qui sont à notre avis perfectible. Une piste d’amélioration possible est de trouver un meilleur découpage géographique, qui tiendrait par exemple compte des données sociologiques et des habitudes de transport.