Same grade requested for both students

Background and Research goals

Bike-sharing systems are gaining popularity around the world. Bike-sharing is a fast-growing and flexible mode of transportation that is changing attitudes to cycling and sharing transportation infrastructure in cities (Caulfield et al., 2017). This mobility option is rather new and allows improvement of first mile / last mile connection to other modes of transport (bus, metro etc.), increases bicycle usage in urban environments and reduces environmental impacts of our transport activities. The introduction of bike-sharing systems has started in Europe and soon expanded to other continents. The understanding of patterns in bike-sharing trips can provide insight to the research of multi-modal transportation systems and can therefore guide policy decisions for sustainable transport development (Kou & Cai, 2018).

Los Angeles is strongly associated with cars. The city has a modal split of around 1% for bicycles and a bit over 5% for public transport (Deloitte MCS Limited, 2018). The default mode of transport in the city is, without a doubt, the car. This is part of the reason why we have decided to work with data of bike trips in this particular city. Using data from the Metro Bike Share program, we evaluated spatial and temporal patterns of bike trips in Los Angeles. The project aims to explore the following research question: Describe spatial and temporal patterns of Metro Bike Share trips in Los Angeles. To explore this question, we focused on four different aspects:

  • Determine where imbalances of the distribution of bicycles might occur and find the most “popular” bike stations of the system

  • The ability of the system to improve multi-modal transportation - an analysis of metro stations and bike-sharing stations

  • Patterns of different weekdays and differences in trips between weekend and weekdays

  • How do people use the bicycles - a trip pattern analysis for two different purposes of bike usage including a temporal analysis

Data & Methods

Data set

Metro Bike Share publishes anonymized trip data on their website (Metro Bike Share, 2019). Data sets are available for each quarter of a year since the start of the project in 2016. We have used the bike trip data of the third quarter of the year 2019 (June - September). This .cvs data set contains 86’590 trips with the following attributes:

  • trip_id: Locally unique integer that identifies the trip
  • duration: Rounded to minutes
  • start_time / end_time
  • start_station / end sation: Station ID
  • start_lat / start_lon: Origin location of the trip (coordinates)
  • end_lat / end_lon: Terminal location of the trip (coordinates)
  • trip_route_category: “Round Trip” for trips starting and ending at the same station or “One Way” for all other trips
  • passholder_type: The name of the passholder’s plan
  • bike_type: The kind of bike used on the trip, including standard pedal-powered bikes, electric assist bikes, or smart bikes

These are only the attributes that we have used for the project. A full list of all attributes can be accessed on https://bikeshare.metro.net/about/data/. Furthermore, metro station data from the developer site of Metro Los Angeles has been used for this project (Metro Bus and Rail GIS Data Developer, 2020).

Pre-Processing

The Metro Bike Share data set needed some additional pre-processing. Trips below 1 minute have been removed and long trips have been capped at 24 hours by Metro Bike Share. We have decided to remove trips below 3 minutes and above 1430 minutes (23 hours 50 minutes) since they can be assumed to be bikes that were returned before usage (e.g. due to damage) or unreturned bikes respectively. Additionally, we have removed trips that did not contain coordinates.

As shown in Figure 1, the bike stations are clustered in four areas of the city with the following centers of the clusters: Downtown Los Angeles, Santa Monica, Long Beach and Valley Village. With the exception of only 3 trips in the data set, all trips take place within a cluster (have the same start and end cluster). The clusters were defined by filtering the stations by their coordinates. A different approach by using a well known clustering method, such as DBSCAN could also have been used. But because the clusters are very clear, the filtering approach does not lead to a different result.

We have then adjusted data types in the data set for further usage and extracted information such as “start_day” or “end_hour” and others for a better overall view from the timestamps. After transforming the data to the NAD83 coordinate system, we calculated the trip distance by using pythagoras between the start and end stations. Afterwards, we could calculate the (average) velocity for each trip by using the distance and the trip duration. The values were added to the data set and are shown in Figure 2 (distance and duration).

We have decided to focus on the Downtown Los Angeles area (see Figure 1). This cluster includes the majority of trips (83%) and stations (57%). The table below shows absolute numbers. The average trip duration is 20.5 minutes and the average trip distance is 1.3 kilometers (linear distance excluding round trips where the distance is zero). The monthly pass is the most common passholder type with 72%. 18% of trips are of the type “Walk-up” and only 10% of the trips can be ascribed to other passholder types (annual, one day, and flex pass).

### Load Data ###
all_stations <- st_read(file.path("Metro/All/Stations_all_0715.shp"), quiet = TRUE)
all_stations <- st_as_sf(all_stations, coords = c("LONG", "LAT"), crs = WGS84)
all_stations_sp <- all_stations %>% 
  st_transform(crs = NAD83) %>%
  as("Spatial")

all_stations <- st_transform(all_stations, crs = WGS84)

biketrips <- read.csv("bike-trips-LA-q3.csv", sep = ",")
station_dic <- read.csv("station_table.csv", sep = ";")
station_dic <- station_dic[,1:2] %>% 
  mutate(Station_ID = as.character(Station_ID))

### Clear Data ###

# get rid of trips without coordinates and columns we don't need
biketrips <- biketrips[!is.na(biketrips$start_lat),]
biketrips <- biketrips[!is.na(biketrips$end_lat),]

# assign character for each cluster depending on coordinates
biketrips <- biketrips %>% 
  mutate(cluster_start = ifelse(start_lat > 34.1364, "B", ifelse(start_lat < 33.8945, "C", ifelse(start_lon > -118.35, "A", "D"))))

biketrips <- biketrips %>% 
  mutate(cluster_end = ifelse(end_lat > 34.1364, "B", ifelse(end_lat < 33.8945, "C", ifelse(end_lon > -118.35, "A", "D"))))

## are start and end region the same? yes, only for 3 trips they are different -> focus on cluster a
biketrips <- biketrips %>% 
  mutate(within = ifelse(cluster_start == cluster_end, TRUE, FALSE))

# add hour, day, month and time to data set and adjust data types
biketrips <- biketrips %>% 
  mutate(start_time=as.POSIXct(start_time, format="%m/%d/%Y %H:%M")) %>%
  mutate(start_hour = as.POSIXlt(start_time)$hour) %>%
  mutate(start_day=floor_date(start_time, unit="day")) %>% 
  mutate(start_month=floor_date(start_time, unit="month")) %>% 
  mutate(end_time=as.POSIXct(end_time, format="%m/%d/%Y %H:%M")) %>%
  mutate(end_hour = as.POSIXlt(end_time)$hour) %>%
  mutate(end_day=floor_date(end_time, unit="day")) %>% 
  mutate(end_month=floor_date(end_time, unit="month")) %>%
  mutate(start_station = as.character(start_station)) %>%
  mutate(end_station = as.character(end_station)) %>%
  mutate(start_lon = as.numeric(start_lon)) %>%
  mutate(start_lat = as.numeric(start_lat)) %>%
  mutate(end_lon = as.numeric(end_lon)) %>%
  mutate(end_lat = as.numeric(end_lat))

# calculate distance and velocity (convert to NAD83 and use pythagoras) and bind it to biketrips
biketrips_duration <- biketrips %>% 
  group_by(duration) %>%
  summarize(count=n())

biketrips <- biketrips %>% 
  filter(duration > 0, duration < 1430)

biketrips_start <- biketrips[c("start_lon", "start_lat")] %>% 
  st_as_sf(coords = c("start_lon", "start_lat"), crs = WGS84) %>%
  st_transform(crs = NAD83)

biketrips_end <- biketrips[c("end_lon", "end_lat")] %>% 
  st_as_sf(coords = c("end_lon", "end_lat"), crs = WGS84) %>% 
  st_transform(crs = NAD83)

biketrips_dist <- st_coordinates(biketrips_start) %>% 
  cbind(st_coordinates(biketrips_end))

colnames(biketrips_dist) <- c("x1", "y1", "x2", "y2")
biketrips_dist <- as.data.frame(biketrips_dist) %>% 
  mutate(distance = sqrt((x1-x2)**2 + (y1-y2)**2)/1000)
biketrips <- biketrips %>% 
  cbind(distance = biketrips_dist$distance) %>% 
  mutate(velocity = distance / duration*60)

# create sf object
bike_start_sf <- biketrips %>% 
  st_as_sf(coords = c("start_lon", "start_lat"), crs = WGS84)

biketrips_a <- biketrips %>% 
  filter(cluster_start == "A" & within == TRUE)

Figure 1: Overview map of the Metro Bike Share stations in Los Angeles and the research area of this project (blue).

##                    Level Number_of_trips Number_of_stations
## 1                Overall           86590                180
## 2              Cluster A           72080                103
## 3 Rounded Proportion [%]              83                 57

Table 1: A summary of the data set

Figure 2: Plot of the distances and the durations of bike trips in cluster A (without return trips) to get a better understanding of the data.

Figure 2: Plot of the distances and the durations of bike trips in cluster A (without return trips) to get a better understanding of the data.

Methods

We would like to note that all methods could be applied to the other clusters and other similar data sets of other cities as well. They were designed to address the different aspects of our chosen research questions.

Metro Station Analysis

Having analysed the imbalances of the distribution of bicycles, another interesting topic emerges when inspecting the spatial patterns of bike-sharing trips. Generally, residential areas are where bike-sharing demands often generate, whilst rail stations are attractive hubs where bike-sharing trips end at (Zhao et al., 2015).

To analyse the connection of metro stations and bike stations/trips, we have conducted a metro station analysis. We have calculated a convex hull of the bike stations and intersected it with the metro station point data set. This way, we can show, which metro stations lie within the area of the bike stations and in our area of interest (cluster A). In order to retrieve the distance between each bike station and the closest metro station, the nncross method from the “spatstat” package was used. This analysis gives an idea about the shortest distance between each bike stations and the closest metro station in Los Angeles. Next, we have created buffers around the mentioned metro stations to see how many bike stations lie within them. For these buffers we used a width of 300 metres, a realistic value for bike stations that are supposed to actually serve a specific metro station (considering that metro stations might have different exits that are quite far from each other). Furthermore, we have calculated the ratio of trips that start from these bike stations to all bike trips within the cluster. This indicates the share of trips that might have the purpose of combining different transportation modes. In the end, we have created a map to show the stations within the convex hull, the bike station within and outside of the metro station buffers and the number of trips that start at the bike stations close to a metro station.

Temporal Analysis

In order to build up our own analysis, we have divided the data set into trips that took place on a day of the weekend or on any other day of the week. Through averaging the results by the number of trips on each day-type (weekday-day or weekend-day) it was possible to compare their properties.

Furthermore, we have calculated the hourly departures for each day of the week to detect peaks throughout the day and disparities between the different days. We expected to detect and identify days of the week which are busier and have a higher number of trips than others. We have not found any literature that has looked at the distribution of average number of trips for each day of the week. Most of the studies separate the week by weekday and weekend such as Zhou (2015) or and Zhao et al. (2015). Romanillos et al. (2018) additionally separates Friday and public holidays from weekend and weekday in order to look at their temporal patterns. This way, they found that Friday shows a shifted peak in the afternoon activity because people working in specific sectors tend to finish work earlier on Fridays.

Trip Pattern Analysis

Kou & Cai (2018) state that bike-sharing systems are mainly used for commuting and touristy purposes and that these two types of trips have very different patterns. We have used some of their inputs and came up with our own method to differentiate between commuter trips and tourist trips.

In order to differentiate between these two types, factors such as “passholder type”, “trip velocity” and “travel time” were used. Furthermore, we identified trips where people seemed to be moving together. Additionally, whether a trip was a “return trip” or “one way” also helped us defining commuters and tourists. Because commuters are meant to use the bikes from home to work or a public transport station and back in two trips. Which and what values we used to retrieve the purpose of a trip is described in the discussion section. This entire approach was also inspired by a paper about semantic trajectories - trajectories that are analysed not only based on the raw movement data but using additional information from the application context (Parent et al., 2013).

In order to detect whether people moved together during their bike trips, we wrote a function. Because our trips are ordered in start time, the function looks at each trip and compares its attributes with the next 100 trips starting after the initial trip. Firstly, both trips need to have the same start and end station. Secondly, we check whether the trips started and ended at a similar time (within 2 minutes). If all requirements were met the initial trip and the corresponding trip were labeled as moving together.

Results

Metro Station Analysis

Figure 6: Map of bike stations and metro stations and the convex hull (red).

Figure 7: Histogram and density of the shortest distances from bike stations to the next metro station.

Figure 7: Histogram and density of the shortest distances from bike stations to the next metro station.

# create buffer around metro stations. First transform to sp to use buffer function
all_stations_nad <- st_transform(all_stations, crs = NAD83)
all_stations_sp <- as(all_stations_nad, "Spatial")
all_stations_coords <- st_coordinates(all_stations)
all_stations_buffer <- buffer(all_stations_sp, width=300)
all_stations_buffer <- st_as_sf(all_stations_buffer)
all_stations_buffer <- st_transform(all_stations_buffer, crs = WGS84)

all_bike_trips_within_metro_buffer <- st_intersection(all_stations_buffer, a_sf)
trips_in_buffer_count_start <- all_bike_trips_within_metro_buffer %>% 
  group_by(start_station) %>% 
  summarize(count=n())

popup_start <- paste("Station Name: ", trips_in_buffer_count_start$start_station, "count: ", trips_in_buffer_count_start$count)
all_bike_stations_within_metro_buffer <- st_intersection(all_stations_buffer, trips_in_buffer_count_start)

leaflet() %>% 
  addProviderTiles(providers$CartoDB.Positron, options = providerTileOptions(opacity = 0.6)) %>% 
  setView(lat=34.06699, lng=-118.2909,zoom=12)%>%
  addPolygons(data = all_stations_buffer, color = "darkred") %>%
  addPolygons(data = a_hull, color = "darkred") %>%
  addCircleMarkers(data = a_sf, col = "darkblue4", radius = 0.7, fillOpacity=0.6, group="Bike Stations in Convex Hull")%>%
  addCircleMarkers(data = all_bike_stations_within_metro_buffer, col = "black", radius = 1, popup = all_bike_stations_within_metro_buffer$STATION, group = "Bike Stations in Metro buffer") %>%
  addCircleMarkers(data = trips_in_buffer_count_start, col = "black", popup = popup_start, radius=sqrt(trips_in_buffer_count_start$count), opacity=0.4, group = "Number of Trips from Stations in Metro buffers")%>%
  addLayersControl(overlayGroups=c("Bike Stations in Convex Hull", "Bike Stations in Metro buffer", "Number of Trips from Stations in Metro buffers"), options=layersControlOptions(collapsed=FALSE))%>%
  hideGroup("Number of Trips from Stations in Metro buffers")

Figure 8: Map of bike stations that lie within the metro station buffers. The circles that can be activated (Number of Trips from Stations in Metro buffers) represent the absolute number of bike trips starting at these bike stations.

Temporal Analysis

## # A tibble: 7 x 4
##   weekday    count mean_trips percentage
##   <fct>      <int>      <dbl>      <dbl>
## 1 Montag     11285       752.       15.7
## 2 Dienstag   11564       826        16  
## 3 Mittwoch   11080       791.       15.4
## 4 Donnerstag 11121       794.       15.4
## 5 Freitag    10920       780        15.1
## 6 Samstag     7945       568.       11  
## 7 Sonntag     8165       583.       11.3

Table 2: Summary of trips for each day of the weak

Figure 9: The average number of trips per day type (weekday-day vs. weekend-day).

Figure 9: The average number of trips per day type (weekday-day vs. weekend-day).

Figure 10: The average number of trips on each day of the week.

Figure 10: The average number of trips on each day of the week.

Trip Pattern Analysis

Figure 11: An analysis of electric and standard bikes in terms of different movement parameters.

Figure 11: An analysis of electric and standard bikes in terms of different movement parameters.

# extract whether multiple people are moving together (start and end at the same time at the same station)
biketrips_a$together <- FALSE

time_diff_ok <- function(trip_a, trip_b){
  diff_starttime <- biketrips_a$start_time[trip_a]-biketrips_a$start_time[trip_b]
  diff_endtime <- abs(biketrips_a$end_time[trip_a]-biketrips_a$end_time[trip_b]) # absolute value because end_time is not sorted
  if (diff_starttime < 3 & diff_endtime < 3){
    return("TRUE")
  }
  else {
    return("FALSE")
  }
}

for (trip in 1:nrow(biketrips_a)){ # iterate through data set
  for (minus in 1:100){ # iterate through the next 100 trips
    if (trip-minus > 0){
      if (biketrips_a$start_station[trip] == biketrips_a$start_station[trip-minus] & biketrips_a$end_station[trip] == biketrips_a$end_station[trip-minus]){
      if (time_diff_ok(trip, trip-minus) == "TRUE"){ # assign TRUE to both trips, if time_diff_ok returned TRUE
        biketrips_a$together[trip] <- TRUE
        biketrips_a$together[trip-minus] <- TRUE
      }
    }
  }
  } 
}

tog <- biketrips_a %>% 
  filter(together == TRUE) %>% 
  nrow()

ratio <- tog / nrow(biketrips_a) # ratio of trips made together

# model purpose of trips (commuter or tourist)
biketrips_a <- biketrips_a %>% 
  mutate(purpose = ifelse(velocity > mean(biketrips_a$velocity) | passholder_type %in% c("Monthly Pass", "Annual Pass", "Flex Pass") & together == FALSE & duration < 15 & trip_route_category == "One Way", "commuter", "tourist"))

purpose_proportion_df <- biketrips_a %>% 
  group_by(purpose) %>% 
  summarize('Proportion [%]' = round(n()*100/nrow(biketrips_a),2))

purpose_proportion_df
## # A tibble: 2 x 2
##   purpose  `Proportion [%]`
##   <chr>               <dbl>
## 1 commuter             64.1
## 2 tourist              35.9

Table 3: Proportions of the two trip purposes

Figure 12: The average number of trips by commuters and tourists over the course of a day.

Figure 12: The average number of trips by commuters and tourists over the course of a day.

commuter <- biketrips_a %>% 
  filter(purpose == "commuter")

tourist <- biketrips_a %>% 
  filter(purpose == "tourist")

commuter_meanduration <- mean(commuter$duration)
commuter_meandistance <- mean(commuter$distance)
tourist_meanduration <- mean(tourist$duration)
tourist_meandistance <- mean(tourist$distance)

# prepare data for plot
# weekday-weekend
tourist_com <- tourist %>% 
  group_by(start_hour, weekday %in% dayLabs[1:5]) %>% 
  summarize(count=n())

names(tourist_com)[2] <- "type"
tourist_com <- tourist_com %>% 
  mutate(type = ifelse(type == TRUE, "WeekDAY", "WeekEND"))

tou_end <- tourist_com %>% 
  filter(type == "WeekEND") %>% 
  mutate(count = count/2/13) #normalize per day

tou_day <- tourist_com %>% 
  filter(type == "WeekDAY") %>% 
  mutate(count = count/5/13) #normalize per day

commuter_com <- commuter %>% 
  group_by(start_hour, weekday %in% dayLabs[1:5]) %>% 
  summarize(count=n())

names(commuter_com)[2] <- "type"
commuter_com <- commuter_com %>% 
  mutate(type = ifelse(type == TRUE, "WeekDAY", "WeekEND"))

com_end <- commuter_com %>% 
  filter(type == "WeekEND") %>%
  mutate(count = count/2/13) #normalize per day

com_day <- commuter_com %>% 
  filter(type == "WeekDAY") %>% 
  mutate(count = count/5/13) #normalize per day

# assign weekday information to each day for plot
monday <-day_hour(dataset = tourist, day = "Montag", number = 14)
tuesday <- day_hour(dataset = tourist, day = "Dienstag", number = 13)
wednesday <- day_hour(dataset = tourist, day = "Mittwoch", number = 13)
thursday <- day_hour(dataset = tourist, day = "Donnerstag", number = 13)
friday <- day_hour(dataset = tourist, day = "Freitag", number = 13)
saturday <- day_hour(dataset = tourist, day = "Samstag", number = 13)
sunday <- day_hour(dataset = tourist, day = "Sonntag", number = 13)

Monday <-day_hour(dataset = commuter, day = "Montag", number = 14)
Tuesday <- day_hour(dataset = commuter, day = "Dienstag", number = 13)
Wednesday <- day_hour(dataset = commuter, day = "Mittwoch", number = 13)
Thursday <- day_hour(dataset = commuter, day = "Donnerstag", number = 13)
Friday <- day_hour(dataset = commuter, day = "Freitag", number = 13)
Saturday <- day_hour(dataset = commuter, day = "Samstag", number = 13)
Sunday <- day_hour(dataset = commuter, day = "Sonntag", number = 13)
Figure 13: The average number of trips over the course of a day, comparing commuters and tourists.

Figure 13: The average number of trips over the course of a day, comparing commuters and tourists.

par(mfrow=c(1,2))
plot(Monday$start_hour, Monday$count, type = "o", col = "blue", ylim = c(0,90), main = "Commuter", xlab = "Hour", ylab = "Count")
lines(Tuesday$start_hour, Tuesday$count, type = "o", col = "red")
lines(Wednesday$start_hour, Wednesday$count, type = "o", col = "chartreuse4")
lines(Thursday$start_hour, Thursday$count, type = "o", col = "blueviolet")
lines(Friday$start_hour, Friday$count, type = "o", col = "darkorange")
lines(Saturday$start_hour, Saturday$count, type = "o", col = "gray")
lines(Sunday$start_hour, Sunday$count, type = "o", col = "black")
legend("topleft", legend=c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),col=c("blue", "red", "chartreuse4", "blueviolet", "darkorange", "gray", "black"), lty = 1, cex= 0.8)

plot(monday$start_hour, monday$count, type = "o", col = "blue", ylim = c(0,90), main = "Tourist", xlab = "Hour", ylab = "Count")
lines(tuesday$start_hour, tuesday$count, type = "o", col = "red")
lines(wednesday$start_hour, wednesday$count, type = "o", col = "chartreuse4")
lines(thursday$start_hour, thursday$count, type = "o", col = "blueviolet")
lines(friday$start_hour, friday$count, type = "o", col = "darkorange")
lines(saturday$start_hour, saturday$count, type = "o", col = "gray")
lines(sunday$start_hour, sunday$count, type = "o", col = "black")
legend("topleft", legend=c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),col=c("blue", "red", "chartreuse4", "blueviolet", "darkorange", "gray", "black"), lty = 1, cex= 0.8)
Figure 14: The average number of trips per day of the week the course of a day, comparing commuters and tourists.

Figure 14: The average number of trips per day of the week the course of a day, comparing commuters and tourists.

Discussion

Firstly, we discuss the results of the exploratory data analysis. To break down the data set and limit ourselves to cluster A was a pretty straightforward decision and does not need any further explanation (see Table 1 for proportions of trips and stations in cluster A when compared to the whole data set). It simply allowed us to focus on a compact set of bike stations to conduct our methods on. After getting to know the data set better and calculating some simple exploratory data values we implemented the different methods in RStudio.

One big limitation has to be mentioned right away: the data set only provides start and end locations (origin and destination data). There is no information available about the more detailed movement behaviour of the trip other than these two fixes. This is, of course, a strong oversimplification of the actual trajectories. Since all derived movement parameters, such as speed, turning angle or sinuosity are strongly influenced by the chosen sampling rate (Laube & Purves, 2018), the detail of analysis is limited due to the given granularity. The trip distance and the trip velocity that we have calculated in the pre-processing stage can not be precise since the paths are unknown and we did not use a street network to estimate the actual distances more accurately as described by Kou & Cai (2018). Therefore, the distance values can only be seen as a rough and rather unprecise approximation of the true values.

Consequently and due to our method to calculate the distance, “round trips” in our data set have a distance value of 0 meters. In order to predict distance values based on trip duration, we have attempted to create a linear model, which can be seen in the code of Figure 2. However, the linear regression model had an adjusted r squared value of 1.75%, which is definitely not a good fit because this amount of variability is explained by the model. That a linear regression is probably not the best approach can be seen in Figure 2. Due to limited knowledge about models, we could not find a model to predict the missing distance values based on trip duration.

The applied methods allowed interesting insights to the bike-sharing system in Los Angeles. All methods could be advanced and developed further. However, they give starting points and ideas for further research with the used data set. The methods could all be used for any data sets of a similar structure.

Metro Station Analysis

Metro Bike Share is a program that emerged from a partnership between the metro company and the City of Los Angeles. Therefore, we think that a metro station analysis is an important approach when discussing spatial patterns. In Figure 6 we have illustrated the bike stations, the metro stations and the convex hull. Twenty-five metro stations came to lie within the convex hull which was generated based on the bike stations of cluster A. As Figure 7 shows, distances between bike stations and metro stations peak between 300 and 500 metres. Figure 8 shows the twenty-six bike stations (out of 103 overall in cluster A) that lie within the buffers that we created with a width of 300m around the metro stations. Our calculations show that 30% of the trips start at these stations and Figure 8 demonstrates nicely, at which stations the most trips start from.

Of course, not all bike trips starting at said twenty-six bike stations were actually used as part of a multi-modal trip chain because many facilities of interest, work places, and activities are often situated close to metro stations as well. However, the share of trips starting from bike stations within the metro buffers is high which shows the importance of these bike stations. Considering the distances in Figure 7 again, using s bigger buffer distance would probably not have been useful here. Many more bike stations in the center would have come to lie within the metro buffers and results would therefore have been less meaningful. We would like to note that the same method could be used for trips ending close to metro stations as well. Furthermore, the analysis shows that some metro stations do not have a bike station close by (see Figure 8). This was a surprising finding, since we expected to detect at least one bike station within each metro station buffer. It also brings up questions about the degree to which the system was actually planned to promote multi-modal transportation. The calculated 30% of trips from our analysis is somewhat comparable to the results of Zhao et al. (2015). However, another analysis for trips ending close to metro stations would have been interesting as well since the study of Zhao et al. (2015) shows even higher ratios for trips ending at rail stations.

Temporal Analysis

As Figure 9 shows, there are different aspects to be mentioned regarding the temporal patterns of bike trips. It is apparent that there are distinctive differences between an average weekend day and an average weekday day. As can be seen in Table 2, the average number of trips is significantly smaller on the weekend. Los Angeles is part of a developed country and hence shows its characteristics that on weekends people are not commuting to work, which underlines Zhou’s (2015) findings in a study similar study in Chicago, USA and contrasts Zhao et al. (2015) investigation about bike-sharing activities in Nanjing, China where more people are using bike-sharing during the weekends because more people tend to work during the weekend.

Zhao et al. (2015) also found out that roughly 65% of all journeys on weekdays take place between 6-9am and 4-7pm. Vogel et al. (2011) have also detected these peaks. Similarly, Beecham and Wood (2014) found that the weekday journeys in London in these time spans account for 75% of all journeys with weekends only accounting for 2%. We have not calculated the exact proportion, but Figure 9 shows similar results. The weekday line in our data shows one additional distinctive peak around noon (besides the morning and afternoon peaks), which has not been brought up in the mentioned literature. The average number of trips on weekends still lies at around 600 and only starts to decrease sharply after 7pm which is a different pattern than the one found by Beecham and Wood (2014).

The temporal distribution of the number of trips starting each day is shown in Figure 10. Again, the three peaks can be clearly detected and at least the first and last peak can be associated to people commuting to and from work (Zhao, 2015; Vogel et al., 2011). The middle peak can be explained by people and using a bike over lunch break. By having a closer look at the first and last peak it is obvious that Tuesday and Wednesday have the highest number of trips compared to the rest of the days. This could be explained by the fact that Tuesday and Wednesday are the most popular days to work since especially part time workers decide to take Monday and / or Friday off and maybe even Thursday. Coming back to Romanillos et al. (2018) findings that friday shows a little peak before the usual maximum of trips at around 5pm we can conclude that this little peak is also visible in Figure 10 at 3pm, even though it is not as clear as in Romanillos et al. paper. Especially, since the peak on Friday at 5pm is still more dominant than on 3pm unlike in Romanillos et al. results. Furthermore, Vogel et al. (2011) have observed a night peak between 12pm and 2am when working with bike-sharing data from Vienna. This characteristics cannot be observed in our data.

Trip Pattern Analysis

With the trip pattern analysis we were able to categorise two travel purposes: tourists and commuters. All trips whose velocity was above the mean velocity of all trips or the passholder types was either Monthly Pass, Annual Pass or Flex Pass and the trip did not move together with another trip and the duration was less than 15 minutes and the trip was a “one way” trip were labeled as commuter. All others were defined as tourist trips. Kou & Cai (2018) state that tourists tend to return the bike in areas near to their origin and therefore have a shorter trip distance but a bigger trip duration. As mentioned before, we included that behaviour in our analysis and assumed that commuters only use bicycles one way. Furthermore, we included the “moving together behaviour”. The ratio of people moving together based on our analysis is 21% - a value that might be roughly too high in our understanding. However, it was an interesting challenge to determine how many trips cover the same route (same origin and destination) at around the same time (2 minutes difference at most) in a simple yet very straightforward and robust way. One might think that we should have differentiated between trips taken by an electric bike and trips by a standard bike (smart bikes are just not used in cluster A). But as Figure 11 reveals, the different numeric attributes are very similar. The standard bike even shows a higher mean velocity. Consequently, we did not include the bike type in our analysis. It must also be mentioned that trips labeled as tourist trips do not necessarily have to be taken by tourists. This behaviour also includes local people’s bike trips for fun on a decent velocity.

The factors that were used for the analysis are all comprehensible and reproducible, yet other people might choose different values and criteria. However, the method allowed us to think about different spatial patterns that commuters and tourists might travel in and therefore was interesting to work with. Using our method, 36% of trips were made by tourists and 64% by commuters (see Table 3). A closer look into the calculated tourist and commuter data reveals that our results show similarities to the study of Kou & Cai (2018). They also worked with Metro Bike Share data of Los Angeles and calculated an average trip distance of 1.02 miles (=1.63km) and an average trip duration of 4.57 minutes for commuters. We have calculated an average trip distance of 1.4 km and an average trip duration of 8.7 for commuters. For tourists, Kou & Cai (2018) have calculated an average travel distance of 0.94 miles (=1.5km) and an average duration of 23.62 minutes. Here, our values differ quite a bit with 0.8 km and 41.4 minutes. It is little surprising that their trip distances are higher than ours since they have used a street network to calculate their distances instead of the euclidean distance based on coordinates of the bike stations. However, we first were quite surprised about our high average duration value. Because in our tourist classification, travel time played quite an important role (more than 15 minutes as a hard criterion), the mean duration is likely to be higher than with the criteria Kou & Cai (2018) have applied. Their categories were based on mathematical calculations of distance and duration values, which is a completely different approach.

By having a look at characteristics of the lines in Figure 12, we can see that the commuter trips are heavily influencing the weekday trips in Figure 9 including the three peaks. Our modelled tourist trips start later in the morning since tourists or people who are up to an easy bike ride do not tend to go on trips between 6 and 7 am. In fact, the number of trips rose over the course of a day and showed slightly levelled peaks at around noon and in the late afternoon. Maybe the peak during the late afternoon corresponds to people returning home or back to their hotel after a day in the city. At night, the values are very similar.

Figure 13 and Figure 14 reveal some interesting traits. According to Figure 13 commuter trips show a completely different behaviour on the weekend than during the week. This is surprising, since in comparison tourist trips follow more or less the same pattern throughout the week. This might be because tourists do not necessarily distinguish between weekday or weekend since they are off or on holiday. Additionally to the different distribution of trips for commuters, the number of trips is also reduced on weekends and approach the numbers of tourist trips, where trips on the weekend show slightly higher numbers. An explanation for this could be that on Saturday and Sunday more local people, who might represent commuter trips during the week, represent tourist behaviour on the weekends.

Sources

Data

Literature

Beecham and Wood (2014) Roger Beecham, R., Wood, J. (2014). Exploring gendered cycling behaviours within a large-scale behavioural data-set, Transportation Planning and Technology, 37:1, 83-97.

Caulfield, B., O’Mahony, M., Brazil, W., Weldon, P. (2017). Examining usage patterns of a bike-sharing scheme in a medium sized city, Transportation Research Part A: Policy and Practice Volume 100, June 2017, Pages 152-161.

Chabchoub, Y., & Fricker, C. (2014). Classification of the vélib stations using Kmeans, Dynamic Time Wraping and DBA averaging method. 2014 International Workshop on Computational Intelligence for Multimedia Understanding, IWCIM 2014, 1–5.

Côme, E., Randriamanamihaga, A. N., Oukhellou, L., & Aknin, P. (2014). Spatio-temporal Analysis of Dynamic Origin-Destination Data using Latent Dirichlet Allocation: Application to the Vélib ’ Bike Sharing System of Paris. Transportation Research Board 93rd Annual Meeting, 19.

Deloitte MCS Limited (2018). Deloitte City Mobility Index, Los Angeles https://www2.deloitte.com/content/dam/insights/us/articles/4331_Deloitte-City-Mobility-Index/LosAngeles_GlobalCityMobility_WEB.pdf (accessed April 16th, 2020).

Jiménez, P., Nogal, M., Caulfield, B., & Pilla, F. (2016). Perceptually important points of mobility patterns to characterise bike sharing systems: The Dublin case. Journal of Transport Geography, 54, 228–239.

Kou, Z, Cai, H. (2018). Understanding bike sharing travel patterns: An analysis of trip data from eight cities, Physica A: Statistical Mechanics and its Applications, Volume 515, Pages 785-797.

Laube, P., Purves, R. (2011). How fast is a cow? Cross-scale Analysis of Movement Data, Transaction in GIS. 15(3), Pages 401-418.

Oliveira, G. N., Sotomayor, J. L., Torchelsen, R. P., Silva, C. T., & Comba, J. L. D. (2016). Visual analysis of bike-sharing systems. Computers and Graphics (Pergamon), 60, 119–129.

O′Neill, P., Caulfield, B. (2012). Examining user behaviour on a shared bike scheme: the case of Dublin Bikes. 13th International Conference on Travel Behaviour Research.

Parent, C., Spaccapietra, S., Renso, C., Andrienko, G., Andrienko, N., Bogorny, V., et al.. (2013). Semantic trajectories modeling and analysis. ACM Computing Surveys (CSUR), 45(4), 42.

Romanillos, G., Moya-Gómez, B., Zaltz-Austwick, M., & Lamíquiz-Daudén, P. J. (2018). The pulse of the cycling city: visualising Madrid bike share system GPS routes and cycling flow. Journal of Maps, 14(1), 34–43.

Vogel, P., Greiser, T., Mattfeld, D.C. (2011). Understanding bike-sharing systems using data mining: exploring activity patterns. Procedia Social Behavioral Sciences 20, 514–523.

Zhao, J. Wang, J., Deng, W. (2015). Exploring bikesharing travel time and trip chain by gender and day of the week Transportation Research Part C, 58 (2015), Pages 251-264.

Zhou, X. (2015). Understanding spatiotemporal patterns of biking behavior by analyzing massive bike sharing data in Chicago. PLoS ONE, 10(10), 1–20.