class: center, middle, inverse, title-slide # Spatio-Temporal Forecasts for Bike Availability in Dockless Bike Sharing Systems ## Lucas van der Meer ### Supervised by Edzer Pebesma (WWU), Joel Silva (UNL) & Jorge Mateu (UJI) ### Master Thesis Defence. February 4, 2019 --- background-image: url('images/bike.png') background-size: cover class: center, center, inverse # Towards more sustainable cities --- background-image: url('images/bike2.png') background-size: cover class: center, center, inverse # With dockless bike sharing --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # What do we need? .center[ .pull-left[ ### Good bike infrastructure <img src="images/infrastructure.png" width="70%" /> ] .pull-right[ ### A reliable system <img src="images/reliable.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # What does a reliable system mean? .center[ .pull-left[ ### Station based systems <img src="images/station.png" width="70%" /> ] .pull-right[ ### Dockless systems <img src="images/dockless.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # How do forecasts help to make systems more reliable? .center[ .pull-left[ ### User perspective <img src="images/users.png" width="70%" /> ] .pull-right[ ### Operator perspective <img src="images/operators.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% class: middle, center # Aim: # Create a generally applicable <span style = 'color:#fc8c01;'>methodology</span> to forecast bike availability in dockless bike sharing systems --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Challenges .center[ .pull-left[ ### Station based systems <img src="images/station.png" width="70%" /> ] .pull-right[ ### Dockless systems <img src="images/dockless.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Challenges .center[ .pull-left[ ### Patterns over space <img src="images/space.png" width="70%" /> ] .pull-right[ ### Patterns over time <img src="images/time.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 50% 35% class: middle, center # Methodology --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # What to forecast? # For a given <span style = 'color:#fc8c01;'>location</span>, and a given <span style = 'color:#fc8c01;'>timestamp</span> in the future, forecast the expected <span style = 'color:#fc8c01;'>distance</span> to the nearest available bike <img src="images/distancetobike.png" width="599" /> --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Requirements .center[ .col-one[ ### Accurate <img src="images/accurate.png" width="70%" /> ] .col-two[ ### Automated <img src="images/automated.png" width="70%" /> ] .col-three[ ### Fast <img src="images/fast.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Overall design <img src="../figures/workflow.png" width="3251" /> --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Case study: San Francisco
--- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Train and test period <img src="images/traintest.png" width="2700" /> --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Cluster loop <img src="../figures/workflow.png" width="3251" /> --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # System area
--- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Overlaying grid
--- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Spatially constrained hierarchical clustering
--- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Model points
--- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Model loop <img src="../figures/workflow.png" width="3251" /> --- background-image: url('images/timeplots.png') background-size: contain --- background-image: url('images/stlplot_model2.png') background-size: contain --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # The models <table class="table" style="margin-left: auto; margin-right: auto;"> <caption>Model structures</caption> <thead> <tr> <th style="text-align:left;color: black;background-color: #fc8c01;"> </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Seasonality </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Stochastic model </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;width: 8cm; "> Bayview cluster </td> <td style="text-align:left;width: 8cm; "> None </td> <td style="text-align:left;width: 8cm; "> ARIMA(3, 1, 1) </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Downtown cluster </td> <td style="text-align:left;width: 8cm; "> Daily </td> <td style="text-align:left;width: 8cm; "> ARIMA(2, 1, 1) </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Residential cluster </td> <td style="text-align:left;width: 8cm; "> Daily </td> <td style="text-align:left;width: 8cm; "> ARIMA(1, 1, 1) </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Presidio cluster </td> <td style="text-align:left;width: 8cm; "> None </td> <td style="text-align:left;width: 8cm; "> ARIMA(1, 1, 3) </td> </tr> </tbody> </table> --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Forecast loop <img src="../figures/workflow.png" width="3251" /> --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Simulating forecast requests .center[ .col-one[ ### More requests at locations where the usage is higher <img src="images/space.png" width="70%" /> ] .col-two[ ### More request at timestamps when the usage is higher <img src="images/time.png" width="70%" /> ] .col-three[ ### Location and timestamp are always a combination! <img src="images/spacetime.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Test points
--- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Forecasting .center[ .pull-left[ ### Proposed method <img src="images/timeseries.png" width="70%" /> ] .pull-right[ ### Baseline method <img src="images/baseline.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 50% 35% class: middle, center # Results --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Forecast evaluation <table class="table" style="margin-left: auto; margin-right: auto;"> <caption>Mean absolute errors of forecasts</caption> <thead> <tr> <th style="text-align:left;color: black;background-color: #fc8c01;"> </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Proposed method </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Baseline method </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;width: 8cm; "> Overall </td> <td style="text-align:left;width: 8cm; "> 223 m </td> <td style="text-align:left;width: 8cm; "> 322 m </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Bayview cluster </td> <td style="text-align:left;width: 8cm; "> 332 m </td> <td style="text-align:left;width: 8cm; "> 332 m </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Downtown cluster </td> <td style="text-align:left;width: 8cm; "> 203 m </td> <td style="text-align:left;width: 8cm; "> 327 m </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Residential cluster </td> <td style="text-align:left;width: 8cm; "> 240 m </td> <td style="text-align:left;width: 8cm; "> 321 m </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Presidio cluster </td> <td style="text-align:left;width: 8cm; "> 253 m </td> <td style="text-align:left;width: 8cm; "> 253 m </td> </tr> </tbody> </table> --- background-image: url('images/hexagon.png') background-size: 80px background-position: 50% 35% class: middle, center # Discussion --- background-image: url('images/forecastplots.png') background-size: contain --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # Limits of forecastability .center[ <img src="../figures/jumpgo.png" width="70%" /> ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% # What is missing? .center[ .pull-left[ ### Weather <img src="images/weather.png" width="70%" /> ] .pull-right[ ### Special events <img src="images/specialevent.png" width="70%" /> ] ] --- background-image: url('images/hexagon.png') background-size: 80px background-position: 50% 35% class: middle, center # Conclusion --- background-image: url('images/hexagon.png') background-size: 80px background-position: 90% 4% class: middle, center # Created a generally applicable methodology to forecast bike availability in dockless bike sharing systems, that <span style = 'color:#fc8c01;'>outperforms the baseline</span>, but also shows the <span style = 'color:#fc8c01;'>limited forecastability</span> of dockless bike sharing data --- class: middle, center <img src="images/hexagon.png" width="20%" /> #### All code available on github #### https://github.com/luukvdmeer/dockless Slides created with the R package `xaringan` Plots created with the R package `ggplot2` Maps created with the R package `leaflet` Icons adapted from `iconfinder.com` Images from `jump.com` --- <table class="table" style="margin-left: auto; margin-right: auto;"> <caption>Average forecast errors</caption> <thead> <tr> <th style="text-align:left;color: black;background-color: #fc8c01;"> </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Proposed method </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Baseline method </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Model points </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;width: 8cm; "> Root Mean Squared Error </td> <td style="text-align:left;"> 297 m </td> <td style="text-align:left;"> 408 m </td> <td style="text-align:left;"> 251 m </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Mean Absolute Error </td> <td style="text-align:left;"> 223 m </td> <td style="text-align:left;"> 322 m </td> <td style="text-align:left;"> 199 m </td> </tr> </tbody> </table> <table class="table" style="margin-left: auto; margin-right: auto;"> <caption>RMSE per cluster</caption> <thead> <tr> <th style="text-align:left;color: black;background-color: #fc8c01;"> </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Proposed method </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Baseline method </th> <th style="text-align:left;color: black;background-color: #fc8c01;"> Model points </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;width: 8cm; "> Bayview cluster </td> <td style="text-align:left;"> 389 m </td> <td style="text-align:left;"> 389 m </td> <td style="text-align:left;"> 236 m </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Downtown cluster </td> <td style="text-align:left;"> 275 m </td> <td style="text-align:left;"> 414 m </td> <td style="text-align:left;"> 244 m </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Residential cluster </td> <td style="text-align:left;"> 317 m </td> <td style="text-align:left;"> 411 m </td> <td style="text-align:left;"> 270 m </td> </tr> <tr> <td style="text-align:left;width: 8cm; "> Presidio cluster </td> <td style="text-align:left;"> 320 m </td> <td style="text-align:left;"> 320 m </td> <td style="text-align:left;"> 142 m </td> </tr> </tbody> </table> --- background-image: url('../figures/hourlag.png') background-size: contain --- background-image: url('../figures/clusterplots.png') background-size: contain --- background-image: url('../figures/clusterloop.png') background-size: contain --- background-image: url('../figures/modelloop.png') background-size: contain --- background-image: url('../figures/forecastloop.png') background-size: contain --- background-image: url('../figures/pickups.png') background-size: contain --- background-image: url('../figures/residual_timeplots.png') background-size: contain --- background-image: url('../figures/residual_acfplots.png') background-size: contain --- background-image: url('../figures/residual_histograms.png') background-size: contain