My Capstone Project for the Google Data Analytics Professional Certificate.
In September 2021 I have completed the Google Data Analytics Professional Certificate Program hosted on Coursera. The program is very extensive and covers all the steps of the data analysis process as taught by Google (ask, prepare process, analyze, share, and act). It consists of 8 courses, the last of which is dedicated to a capstone project. As a passionate cyclist I have chosen the Cyclistic bike-share analysis case study to showcase what I have learned. I hope you’ll like it!
Note: The original project is published on Kaggle in November 2021.
In this version, instead of Tableau Public, I used the
leaflet package to visualize the most popular starting
stations.
In this case study I am a junior data analyst working in the marketing analyst team at Cyclistic, a fictional bike-share company in Chicago. The director of marketing believes the company’s future success depends on maximizing the number of annual memberships. Therefore, my team wants to understand how casual riders and annual members use Cyclistic bikes differently. From these insights, my team will design a new marketing strategy to convert casual riders into annual members. But first, Cyclistic executives must approve our recommendations, so they must be backed up with compelling data insights and professional data visualizations.
Three questions will guide the future marketing program:
Lily Moreno, the director of marketing and my manager has assigned me the first question to answer.
In the first step of the data analysis process we identify the business task and consider key stakeholders.
Business task
How do annual members and casual
riders use Cyclistic bikes differently?
Primary Stakeholders
Secondary Stakeholders
The objective of this step is to prepare data for the analysis. I will use the past 12 months of Cyclitis’s historical trip data (from September 2020 to August 2021) to analyze and identify trends. Because Cyclistic is a fictional company, for the purposes of this case study I will use data from a real bike-share company in Chicago, Divvy. The data has been made available for public use by Motivate International Inc. under this license and can be downloaded here.
The data is released on a monthly schedule and anonymized. It is reliable, original, comprehensive, current, and cited.
I have downloaded 12 csv files (datasets). Each dataset contains historical trip data for an individual month. In all 12 datasets each variable has its own column, each observation has its own row, and each value has its own cell. Therefore, I can conclude that the datasets are tidy.
There are 13 columns (variables) in each csv file. Metadata isn’t provided but most of the variables are self-explanatory.
| No | Column Name | Data Type | Definition |
|---|---|---|---|
| 1 | ride_id | Text | Unique ride ID |
| 2 | rideable_type | Text | Classic, docked, or electric bike |
| 3 | started_at | Date & Time | Trip start day and time |
| 4 | ended_at | Date & Time | Trip end day and time |
| 5 | start_station_name | Text | Trip start station name |
| 6 | start_station_id | Text | Trip start station ID |
| 7 | end_station_name | Text | Trip end station name |
| 8 | end_station_id | Text | Trip end station ID |
| 9 | start_lat | Numeric | Trip start station latitude |
| 10 | start_lng | Numeric | Trip start station longitude |
| 11 | end_lat | Numeric | Trip end station latitude |
| 12 | end_lng | Numeric | Trip end station longitude |
| 13 | member_casual | Text | User type (casual or member) |
Only two variables need further clarification:
rideable_type - there are three possible values for
this variable: classic_bike, docked_bike, and
electric_bike. classic_bike is actually a
classic dockless bike, docked_bike is a classic docked
bike, and electric_bike is an e-bike that can be either
docked at any station or locked with cable at any e-station for no
additional cost. For an extra $2, it’s possible to lock a bike to any
public bike rack, light pole, signpost, or retired parking meter outside
of a station within the service area. Classic blue Divvy bikes can only
be docked in the traditional Divvy stations.
member_casual - there are two possible values for
this variable: casual and member representing
casual riders and annual members. Casual riders buy a Single Ride Pass
(one trip up to 30 minutes), or a Day Pass (unlimited 3-hour rides for
24-hours), while members buy Annual Membership (unlimited 45-min rides).
This is important because in the cleaning step of the analysis I will
filter out all trips with ride length longer than 3
hours.
Note: If we want to show the most popular stations for each group on the map, each station must have unique geographical coordinates. This is not the case for trips taken with electric bikes. Each such ride has its own starting and ending coordinates, regardless of the start or end station. The problem is illustrated in the following maps made in Tableau:
Figure 1: Start station frequency for classic and docked bikes
Figure 2: Start station frequency for electric bikes
Hence, I will additionally use the publicly available file, Divvy_Bicycle_Stations.csv, that contains a list of all stations and corresponding geographical coordinates (link). This file is updated regularly. My version is from October, 2021. I’ll also use it to check current station names.
# historical monthly trip data
sep_2020 <- read_csv("data/202009-divvy-tripdata.csv")
oct_2020 <- read_csv("data/202010-divvy-tripdata.csv")
nov_2020 <- read_csv("data/202011-divvy-tripdata.csv")
dec_2020 <- read_csv("data/202012-divvy-tripdata.csv")
jan_2021 <- read_csv("data/202101-divvy-tripdata.csv")
feb_2021 <- read_csv("data/202102-divvy-tripdata.csv")
mar_2021 <- read_csv("data/202103-divvy-tripdata.csv")
apr_2021 <- read_csv("data/202104-divvy-tripdata.csv")
may_2021 <- read_csv("data/202105-divvy-tripdata.csv")
jun_2021 <- read_csv("data/202106-divvy-tripdata.csv")
jul_2021 <- read_csv("data/202107-divvy-tripdata.csv")
aug_2021 <- read_csv("data/202108-divvy-tripdata.csv")
# current Divvy stations with coordinates
divvy_stations <- read_csv("data/Divvy_Bicycle_Stations.csv")
In order to bind all 12 dataframes into a single dataframe they need to have consistent column names and data types. I will now check if the dataframes are row-bindable.
compare_df_cols_same(
sep_2020, oct_2020, nov_2020, dec_2020, jan_2021, feb_2021, mar_2021,
apr_2021, may_2021, jun_2021, jul_2021, aug_2021,
bind_method = c("bind_rows", "rbind"),
verbose = TRUE
)
column_name ..1 ..2 ..3 ..4 ..5
1 end_station_id numeric numeric numeric character character
2 start_station_id numeric numeric numeric character character
..6 ..7 ..8 ..9 ..10 ..11
1 character character character character character character
2 character character character character character character
..12
1 character
2 character
[1] FALSE
Columns start_station_id and end_station_id
in the first three datasets (2020-Sep to 2020-Nov) have a numeric data
type. I will convert them to characters.
sep_2020 <- mutate(sep_2020, start_station_id = as.character(start_station_id),
end_station_id = as.character(end_station_id))
oct_2020 <- mutate(oct_2020, start_station_id = as.character(start_station_id),
end_station_id = as.character(end_station_id))
nov_2020 <- mutate(nov_2020, start_station_id = as.character(start_station_id),
end_station_id = as.character(end_station_id))
Binding individual month’s dataframes into one big dataframe.
all_trips <- bind_rows(sep_2020, oct_2020, nov_2020, dec_2020, jan_2021, feb_2021,
mar_2021, apr_2021, may_2021, jun_2021, jul_2021, aug_2021)
# data dimensions (rows x columns)
dim_desc(all_trips)
[1] "[4,913,072 x 13]"
rmarkdown::paged_table(head(all_trips))
glimpse(all_trips)
Rows: 4,913,072
Columns: 13
$ ride_id <chr> "2B22BD5F95FB2629", "A7FB70B4AFC6CAF2", "…
$ rideable_type <chr> "electric_bike", "electric_bike", "electr…
$ started_at <dttm> 2020-09-17 14:27:11, 2020-09-17 15:07:31…
$ ended_at <dttm> 2020-09-17 14:44:24, 2020-09-17 15:07:45…
$ start_station_name <chr> "Michigan Ave & Lake St", "W Oakdale Ave …
$ start_station_id <chr> "52", NA, NA, "246", "24", "94", "291", N…
$ end_station_name <chr> "Green St & Randolph St", "W Oakdale Ave …
$ end_station_id <chr> "112", NA, NA, "249", "24", NA, "256", NA…
$ start_lat <dbl> 41.88669, 41.94000, 41.94000, 41.95606, 4…
$ start_lng <dbl> -87.62356, -87.64000, -87.64000, -87.6689…
$ end_lat <dbl> 41.88357, 41.94000, 41.94000, 41.96398, 4…
$ end_lng <dbl> -87.64873, -87.64000, -87.64000, -87.6382…
$ member_casual <chr> "casual", "casual", "casual", "casual", "…
head(all_trips$started_at)
[1] "2020-09-17 14:27:11 UTC" "2020-09-17 15:07:31 UTC"
[3] "2020-09-17 15:09:04 UTC" "2020-09-17 18:10:46 UTC"
[5] "2020-09-17 15:16:13 UTC" "2020-09-17 18:37:04 UTC"
Overview of the dataframe with current Divvy stations and corresponding coordinates.
dim_desc(divvy_stations)
[1] "[785 x 8]"
rmarkdown::paged_table(head(divvy_stations))
# making column names clean
divvy_stations <- divvy_stations %>%
set_names(names(.) %>% str_replace(" ", "_") %>% str_to_lower())
names(divvy_stations)
[1] "id" "station_name" "total_docks"
[4] "docks_in service" "status" "latitude"
[7] "longitude" "location"
In this step I am going to explore the data further and finally clean it.
Right now I can aggregate data only at the ride level, so I am going
to create 3 new columns year_month,
day_of_week, and hour extracted from the
datetime column started_at and convert them to factors
where needed.
Calculating and creating a new column ride_length in
minutes, then converting it to a numeric data type and rounding to 2
decimal places.
Checking if everything is OK.
rmarkdown::paged_table(sample_n(all_trips, 10))
All is good! Let’s see the summary statistics.
skim_without_charts(all_trips)
| Name | all_trips |
| Number of rows | 4913072 |
| Number of columns | 17 |
| _______________________ | |
| Column type frequency: | |
| character | 7 |
| factor | 3 |
| numeric | 5 |
| POSIXct | 2 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| ride_id | 0 | 1.00 | 16 | 16 | 0 | 4912863 | 0 |
| rideable_type | 0 | 1.00 | 11 | 13 | 0 | 3 | 0 |
| start_station_name | 450045 | 0.91 | 3 | 53 | 0 | 757 | 0 |
| start_station_id | 450571 | 0.91 | 1 | 36 | 0 | 1293 | 0 |
| end_station_name | 491380 | 0.90 | 10 | 53 | 0 | 756 | 0 |
| end_station_id | 491764 | 0.90 | 1 | 36 | 0 | 1293 | 0 |
| member_casual | 0 | 1.00 | 6 | 6 | 0 | 2 | 0 |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| year_month | 0 | 1 | FALSE | 12 | 202: 822410, 202: 804352, 202: 729595, 202: 532958 |
| day_of_week | 0 | 1 | TRUE | 7 | Sat: 889412, Sun: 758229, Fri: 719239, Wed: 648981 |
| hour | 0 | 1 | FALSE | 24 | 17: 499035, 18: 435037, 16: 415752, 15: 353319 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 |
|---|---|---|---|---|---|---|---|---|---|
| start_lat | 0 | 1 | 41.90 | 0.04 | 41.64 | 41.88 | 41.90 | 41.93 | 42.08 |
| start_lng | 0 | 1 | -87.65 | 0.03 | -87.84 | -87.66 | -87.64 | -87.63 | -87.52 |
| end_lat | 5015 | 1 | 41.90 | 0.04 | 41.51 | 41.88 | 41.90 | 41.93 | 42.15 |
| end_lng | 5015 | 1 | -87.65 | 0.03 | -88.07 | -87.66 | -87.64 | -87.63 | -87.44 |
| ride_length | 0 | 1 | 21.14 | 317.71 | -29049.97 | 7.18 | 12.80 | 23.27 | 55944.15 |
Variable type: POSIXct
| skim_variable | n_missing | complete_rate | min | max | median | n_unique |
|---|---|---|---|---|---|---|
| started_at | 0 | 1 | 2020-09-01 00:00:07 | 2021-08-31 23:59:35 | 2021-05-26 16:51:05 | 4137017 |
| ended_at | 0 | 1 | 2020-09-01 00:04:43 | 2021-09-01 17:37:35 | 2021-05-26 17:12:45 | 4124534 |
By observing the data summary we can notice the following problems that need to be addressed:
start_station_name,
start_station_id, end_station_name, and
end_station_id columnmember_casual column is vague, I will
rename it to user_typeend_lat and
end_lng columnride_length column is -20.2 days,
maximum value is 38.9 daysride_id columnEach row represents one observation (trip). Based on the previous summary, there is a total of 4,913,072 rows and 4,912,863 unique ride_id values, meaning there are 209 rows of duplicated data. I will remove them.
all_trips_v2 <- all_trips[!duplicated(all_trips$ride_id), ]
nrow(all_trips) - nrow(all_trips_v2)
[1] 209
member_casual to user_typeall_trips_v2 <- rename(all_trips_v2, user_type = member_casual)
end_lat and
end_lng columnall_trips_NA %>%
filter(between(ride_length, 1, 180)) %>%
summarise(mean_ride_length = mean(ride_length))
# A tibble: 1 × 1
mean_ride_length
<dbl>
1 51.5
all_trips_v2 %>%
filter(between(ride_length, 1, 180)) %>%
summarise(mean_ride_length = mean(ride_length))
# A tibble: 1 × 1
mean_ride_length
<dbl>
1 19.4
ftable(all_trips_NA$user_type, all_trips_NA$year_month, all_trips_NA$rideable_type)
classic_bike docked_bike
casual 2020-09 0 325
2020-10 0 180
2020-11 0 93
2020-12 31 4
2021-01 22 0
2021-02 58 0
2021-03 110 0
2021-04 187 0
2021-05 339 0
2021-06 525 0
2021-07 583 0
2021-08 561 0
member 2020-09 0 464
2020-10 0 294
2020-11 0 191
2020-12 47 28
2021-01 81 0
2021-02 156 0
2021-03 57 0
2021-04 80 0
2021-05 113 0
2021-06 192 0
2021-07 148 0
2021-08 145 0
Conclusion: in this subset there are 5015 observations (0.1%) across all months; only classic and docked bikes; average ride length is unusually high (51 min) compared to the whole dataset (19.4 min). These rides ended somewhere outside of the station for some reason (traffic accident, malfunction, etc.). I will remove this subset from the dataset.
all_trips_v2 <- setdiff(all_trips_v2, all_trips_NA)
I won’t need the columns with coordinates anymore, so I’ll remove them to make my dataframe lighter. Later on, I’ll join the coordinates from the divvy_stations dataframe.
Looking for specific values in the start_station_name
column associated with Divvy test and repair stations.
unique(all_trips_v2$start_station_name)
[1] "Michigan Ave & Lake St"
[2] "W Oakdale Ave & N Broadway"
[3] "Ashland Ave & Belle Plaine Ave"
[4] "Fairbanks Ct & Grand Ave"
[5] "Clark St & Armitage Ave"
[6] "Wells St & Evergreen Ave"
[7] NA
[8] "Michigan Ave & 18th St"
[9] "Mies van der Rohe Way & Chestnut St"
[10] "Halsted St & Polk St"
[11] "Albany Ave & Bloomingdale Ave"
[12] "Lake Shore Dr & Diversey Pkwy"
[13] "Elston Ave & Wabansia Ave"
[14] "Clybourn Ave & Division St"
[15] "Campbell Ave & Fullerton Ave"
[16] "Clark St & Lake St"
[17] "Sawyer Ave & Irving Park Rd"
[18] "Financial Pl & Ida B Wells Dr"
[19] "Wells St & Huron St"
[20] "Shedd Aquarium"
[21] "Streeter Dr & Grand Ave"
[22] "Bissell St & Armitage Ave"
[23] "Franklin St & Lake St"
[24] "Sedgwick St & Huron St"
[25] "Dearborn Pkwy & Delaware Pl"
[26] "Halsted St & Dickens Ave"
[27] "Clark St & Schiller St"
[28] "Michigan Ave & Washington St"
[29] "Aberdeen St & Jackson Blvd"
[30] "Wilton Ave & Diversey Pkwy"
[31] "Wells St & Hubbard St"
[32] "Archer (Damen) Ave & 37th St"
[33] "Franklin St & Monroe St"
[34] "Dearborn St & Monroe St"
[35] "Morgan St & Lake St"
[36] "Broadway & Granville Ave"
[37] "Columbus Dr & Randolph St"
[38] "California Ave & Milwaukee Ave"
[39] "Milwaukee Ave & Cuyler Ave"
[40] "Wells St & Concord Ln"
[41] "Ashland Ave & Wellington Ave"
[42] "Sheridan Rd & Buena Ave"
[43] "Cottage Grove Ave & 83rd St"
[44] "LaSalle Dr & Huron St"
[45] "Michigan Ave & 14th St"
[46] "Damen Ave & Division St"
[47] "Museum of Science and Industry"
[48] "Wells St & Polk St"
[49] "Clark St & North Ave"
[50] "Milwaukee Ave & Grand Ave"
[51] "Wentworth Ave & 104th St"
[52] "Rush St & Cedar St"
[53] "Lincoln Park Conservatory"
[54] "Lake Shore Dr & Wellington Ave"
[55] "Dearborn St & Erie St"
[56] "Adler Planetarium"
[57] "Leavitt St & Addison St"
[58] "Damen Ave & Madison St"
[59] "Sheffield Ave & Willow St"
[60] "McClurg Ct & Illinois St"
[61] "Indiana Ave & Roosevelt Rd"
[62] "Orleans St & Hubbard St"
[63] "Seeley Ave & Roscoe St"
[64] "Clark St & Grace St"
[65] "Wabash Ave & Grand Ave"
[66] "Clark St & Schreiber Ave"
[67] "Paulina Ave & North Ave"
[68] "Southport Ave & Waveland Ave"
[69] "Wentworth Ave & Cermak Rd"
[70] "Buckingham Fountain"
[71] "Fort Dearborn Dr & 31st St"
[72] "Francisco Ave & Foster Ave"
[73] "Sheridan Rd & Loyola Ave"
[74] "Clinton St & Madison St"
[75] "Halsted St & Clybourn Ave"
[76] "Halsted St & Wrightwood Ave"
[77] "Peoria St & Jackson Blvd"
[78] "Ellis Ave & 60th St"
[79] "Michigan Ave & Madison St"
[80] "Lakefront Trail & Bryn Mawr Ave"
[81] "Lake Shore Dr & North Blvd"
[82] "Clark St & Bryn Mawr Ave"
[83] "University Ave & 57th St"
[84] "Ashland Ave & Blackhawk St"
[85] "Larrabee St & Armitage Ave"
[86] "Damen Ave & Pierce Ave"
[87] "Damen Ave & Melrose Ave"
[88] "Racine Ave & Belmont Ave"
[89] "Franklin St & Illinois St"
[90] "Broadway & Thorndale Ave"
[91] "Ashland Ave & Chicago Ave"
[92] "Honore St & Division St"
[93] "Southport Ave & Wrightwood Ave"
[94] "Clark St & Winnemac Ave"
[95] "Eastlake Ter & Rogers Ave"
[96] "Clarendon Ave & Junior Ter"
[97] "Lake Shore Dr & Monroe St"
[98] "Kedzie Ave & Milwaukee Ave"
[99] "Michigan Ave & 8th St"
[100] "Clinton St & Jackson Blvd"
[101] "Lincoln Ave & Sunnyside Ave"
[102] "Lake Park Ave & 53rd St"
[103] "Desplaines St & Kinzie St"
[104] "Lake Park Ave & 35th St"
[105] "Kingsbury St & Kinzie St"
[106] "Dayton St & North Ave"
[107] "Lakeview Ave & Fullerton Pkwy"
[108] "Paulina St & Howard St"
[109] "Clarendon Ave & Leland Ave"
[110] "Chicago Ave & Sheridan Rd"
[111] "May St & Cullerton St"
[112] "Wood St & Milwaukee Ave"
[113] "Green St & Madison St"
[114] "Western Ave & Winnebago Ave"
[115] "Broadway & Cornelia Ave"
[116] "Orleans St & Merchandise Mart Plaza"
[117] "McClurg Ct & Erie St"
[118] "Dorchester Ave & 49th St"
[119] "Sheffield Ave & Wrightwood Ave"
[120] "Shore Dr & 55th St"
[121] "Larrabee St & Kingsbury St"
[122] "Damen Ave & Wellington Ave"
[123] "Wood St & Chicago Ave"
[124] "Desplaines St & Jackson Blvd"
[125] "LaSalle St & Illinois St"
[126] "State St & Kinzie St"
[127] "Richmond St & Diversey Ave"
[128] "Sedgwick St & Schiller St"
[129] "Southport Ave & Wellington Ave"
[130] "Eberhart Ave & 61st St"
[131] "MLK Jr Dr & 29th St"
[132] "Indiana Ave & 26th St"
[133] "Humboldt Blvd & Armitage Ave"
[134] "Damen Ave & Chicago Ave"
[135] "Burling St & Diversey Pkwy"
[136] "Franklin St & Adams St (Temp)"
[137] "Greenview Ave & Jarvis Ave"
[138] "Mies van der Rohe Way & Chicago Ave"
[139] "Racine Ave & 18th St"
[140] "Kedzie Ave & Roosevelt Rd"
[141] "Ridge Blvd & Howard St"
[142] "Canal St & Adams St"
[143] "Lake Shore Dr & Ohio St"
[144] "Ritchie Ct & Banks St"
[145] "Clinton St & Lake St"
[146] "Noble St & Milwaukee Ave"
[147] "Logan Blvd & Elston Ave"
[148] "Austin Blvd & Lake St"
[149] "Wabash Ave & Roosevelt Rd"
[150] "Loomis St & Lexington St"
[151] "Wabash Ave & 9th St"
[152] "Larrabee St & Oak St"
[153] "Wells St & Walton St"
[154] "Ashland Ave & Wrightwood Ave"
[155] "Orleans St & Chestnut St (NEXT Apts)"
[156] "Clark St & Jarvis Ave"
[157] "Larrabee St & Menomonee St"
[158] "Broadway & Waveland Ave"
[159] "Clark St & Elmdale Ave"
[160] "Racine Ave & Washington Blvd"
[161] "Ellis Ave & 58th St"
[162] "Racine Ave & Fullerton Ave"
[163] "Drake Ave & Fullerton Ave"
[164] "Indiana Ave & 31st St"
[165] "Broadway & Berwyn Ave"
[166] "Kingsbury St & Erie St"
[167] "Dearborn St & Van Buren St"
[168] "Clark St & Newport St"
[169] "Ogden Ave & Race Ave"
[170] "Clinton St & Roosevelt Rd"
[171] "Sheridan Rd & Lawrence Ave"
[172] "Larrabee St & Webster Ave"
[173] "Green St & Randolph St"
[174] "Leavitt St & Belmont Ave"
[175] "Kosciuszko Park"
[176] "Michigan Ave & Jackson Blvd"
[177] "Montrose Harbor"
[178] "Lincoln Ave & Winona St"
[179] "Aberdeen St & Randolph St"
[180] "Clark St & Berwyn Ave"
[181] "Ada St & Washington Blvd"
[182] "Clark St & Elm St"
[183] "Ashland Ave & Division St"
[184] "Ashland Ave & Grand Ave"
[185] "Federal St & Polk St"
[186] "Lake Shore Dr & Belmont Ave"
[187] "W Armitage Ave & N Sheffield Ave"
[188] "Burling St (Halsted) & Diversey Pkwy (Temp)"
[189] "Lincoln Ave & Diversey Pkwy"
[190] "Winchester Ave & Elston Ave"
[191] "Field Blvd & South Water St"
[192] "Stetson Ave & South Water St"
[193] "Cityfront Plaza Dr & Pioneer Ct"
[194] "Wabash Ave & Wacker Pl"
[195] "Carpenter St & Huron St"
[196] "Kimbark Ave & 53rd St"
[197] "Larrabee St & North Ave"
[198] "Larrabee St & Division St"
[199] "Fairfield Ave & Roosevelt Rd"
[200] "Sheridan Rd & Noyes St (NU)"
[201] "Chicago Ave & Dempster St"
[202] "Hermitage Ave & Polk St"
[203] "Central Park Ave & Elbridge Ave"
[204] "State St & 33rd St"
[205] "Greenwood Ave & 47th St"
[206] "Chicago Ave & Washington St"
[207] "Broadway & Ridge Ave"
[208] "Sheffield Ave & Kingsbury St"
[209] "Pine Grove Ave & Irving Park Rd"
[210] "California Ave & Montrose Ave"
[211] "Sheridan Rd & Montrose Ave"
[212] "Clark St & Randolph St"
[213] "Calumet Ave & 18th St"
[214] "Spaulding Ave & Armitage Ave"
[215] "Damen Ave & Cortland St"
[216] "Wells St & Elm St"
[217] "Winthrop Ave & Lawrence Ave"
[218] "Clark St & Lincoln Ave"
[219] "Western Ave & Division St"
[220] "Millennium Park"
[221] "Sheridan Rd & Irving Park Rd"
[222] "Milwaukee Ave & Wabansia Ave"
[223] "Greenview Ave & Diversey Pkwy"
[224] "Rush St & Superior St"
[225] "Desplaines St & Randolph St"
[226] "Pine Grove Ave & Waveland Ave"
[227] "Emerald Ave & 31st St"
[228] "Cannon Dr & Fullerton Ave"
[229] "Michigan Ave & Ida B Wells Dr"
[230] "Halsted St & 47th Pl"
[231] "LaSalle St & Washington St"
[232] "Halsted St & 18th St"
[233] "Southport Ave & Roscoe St"
[234] "Ogden Ave & Chicago Ave"
[235] "Jefferson St & Monroe St"
[236] "Walsh Park"
[237] "California Ave & Francis Pl (Temp)"
[238] "Michigan Ave & Oak St"
[239] "Sheridan Rd & Columbia Ave"
[240] "Burnham Harbor"
[241] "Cottage Grove Ave & Oakwood Blvd"
[242] "Western Ave & Leland Ave"
[243] "Clark St & Drummond Pl"
[244] "Theater on the Lake"
[245] "McCormick Place"
[246] "Lincoln Ave & Waveland Ave"
[247] "Monticello Ave & Irving Park Rd"
[248] "California Ave & Byron St"
[249] "Glenwood Ave & Morse Ave"
[250] "Lincoln Ave & Fullerton Ave"
[251] "State St & 19th St"
[252] "Damen Ave & Leland Ave"
[253] "Albany Ave & Montrose Ave"
[254] "Wilton Ave & Belmont Ave"
[255] "State St & Pearson St"
[256] "Field Museum"
[257] "Wacker Dr & Washington St"
[258] "Kedzie Ave & Palmer Ct"
[259] "Sheffield Ave & Waveland Ave"
[260] "Washtenaw Ave & Lawrence Ave"
[261] "Broadway & Belmont Ave"
[262] "Sheffield Ave & Wellington Ave"
[263] "Halsted St & Willow St"
[264] "Dauphin Ave & 103rd St"
[265] "Throop (Loomis) St & Taylor St"
[266] "Western Ave & Lunt Ave"
[267] "Broadway & Barry Ave"
[268] "Damen Ave & Grand Ave"
[269] "Ashland Ave & 63rd St"
[270] "Avers Ave & Belmont Ave"
[271] "California Ave & North Ave"
[272] "Damen Ave & Thomas St (Augusta Blvd)"
[273] "Clifton Ave & Armitage Ave"
[274] "Morgan Ave & 14th Pl"
[275] "Constance Ave & 95th St"
[276] "Southport Ave & Clybourn Ave"
[277] "Greenview Ave & Fullerton Ave"
[278] "Ravenswood Ave & Lawrence Ave"
[279] "Bernard St & Elston Ave"
[280] "Franklin St & Jackson Blvd"
[281] "Sheffield Ave & Webster Ave"
[282] "South Shore Dr & 67th St"
[283] "Vernon Ave & 75th St"
[284] "Ashland Ave & Grace St"
[285] "Kedzie Ave & Foster Ave"
[286] "State St & Randolph St"
[287] "Harper Ave & 59th St"
[288] "Damen Ave & Clybourn Ave"
[289] "Sheridan Rd & Greenleaf Ave"
[290] "Lincoln Ave & Roscoe St"
[291] "State St & Harrison St"
[292] "Dusable Harbor"
[293] "Cottage Grove Ave & 43rd St"
[294] "Broadway & Wilson Ave"
[295] "Christiana Ave & Lawrence Ave"
[296] "Clark St & Leland Ave"
[297] "Daley Center Plaza"
[298] "St. Clair St & Erie St"
[299] "Union Ave & Root St"
[300] "State St & 29th St"
[301] "Paulina St & Montrose Ave"
[302] "Halsted St & Roscoe St"
[303] "Clark St & Wellington Ave"
[304] "Broadway & Argyle St"
[305] "Michigan Ave & Pearson St"
[306] "Southport Ave & Belmont Ave"
[307] "Blue Island Ave & 18th St"
[308] "Franklin St & Chicago Ave"
[309] "Southport Ave & Irving Park Rd"
[310] "Leavitt St & Armitage Ave"
[311] "Clark St & 9th St (AMLI)"
[312] "Wentworth Ave & 24th St (Temp)"
[313] "Orleans St & Elm St"
[314] "Dodge Ave & Church St"
[315] "Budlong Woods Library"
[316] "Wabash Ave & Adams St"
[317] "Halsted St & 35th St"
[318] "Stockton Dr & Wrightwood Ave"
[319] "Artesian Ave & Hubbard St"
[320] "Racine Ave & 13th St"
[321] "State St & 123rd St"
[322] "Talman Ave & Addison St"
[323] "Albany Ave & 26th St"
[324] "Damen Ave & Cullerton St"
[325] "Eberhart Ave & 131st St"
[326] "Clark St & Wrightwood Ave"
[327] "Bennett Ave & 79th St"
[328] "Dorchester Ave & 63rd St"
[329] "State St & 35th St"
[330] "Leavitt St & North Ave"
[331] "Damen Ave & Charleston St"
[332] "Wolcott (Ravenswood) Ave & Montrose Ave"
[333] "Western Ave & Congress Pkwy"
[334] "Racine Ave & Randolph St"
[335] "Lincoln Ave & Belmont Ave"
[336] "Rush St & Hubbard St"
[337] "Drake Ave & Montrose Ave"
[338] "Damen Ave & Sunnyside Ave"
[339] "Big Marsh Park"
[340] "Sedgwick St & North Ave"
[341] "Wallace St & 35th St"
[342] "Leavitt St & Archer Ave"
[343] "Marine Dr & Ainslie St"
[344] "Halsted St & 37th St"
[345] "Central Park Ave & Ogden Ave"
[346] "Clinton St & Tilden St"
[347] "Warren Park West"
[348] "Lake Park Ave & 47th St"
[349] "Clark St & Chicago Ave"
[350] "Avondale Ave & Irving Park Rd"
[351] "Wabash Ave & 16th St"
[352] "Western Ave & Fillmore St"
[353] "Kilbourn Ave & Milwaukee Ave"
[354] "Wood St & Hubbard St"
[355] "California Ave & Division St"
[356] "Cornell Ave & Hyde Park Blvd"
[357] "Ellis Ave & 55th St"
[358] "California Ave & Altgeld St"
[359] "Benson Ave & Church St"
[360] "May St & Taylor St"
[361] "Delano Ct & Roosevelt Rd"
[362] "Morgan St & 18th St"
[363] "Wolcott Ave & Polk St"
[364] "Jeffery Blvd & 71st St"
[365] "Sedgwick St & Webster Ave"
[366] "Lakefront Trail & Wilson Ave"
[367] "Canal St & Jackson Blvd"
[368] "Glenwood Ave & Touhy Ave"
[369] "2112 W Peterson Ave"
[370] "Loomis St & Archer Ave"
[371] "Phillips Ave & 79th St"
[372] "Pulaski Rd & Lake St"
[373] "Clarendon Ave & Gordon Ter"
[374] "Central Ave & Chicago Ave"
[375] "LaSalle St & Adams St"
[376] "Rhodes Ave & 32nd St"
[377] "Western Ave & Roscoe St"
[378] "Knox Ave & Montrose Ave"
[379] "LaSalle St & Jackson Blvd"
[380] "Dearborn St & Adams St"
[381] "Broadway & Sheridan Rd"
[382] "Calumet Ave & 21st St"
[383] "Marshfield Ave & Cortland St"
[384] "Wells St & 19th St"
[385] "Clark St & Lunt Ave"
[386] "Western Ave & Monroe St"
[387] "Milwaukee Ave & Rockwell St"
[388] "Stony Island Ave & 90th St"
[389] "Cottage Grove Ave & 111th Pl"
[390] "Campbell Ave & North Ave"
[391] "Pulaski Rd & Congress Pkwy"
[392] "Elizabeth (May) St & Fulton St"
[393] "Halsted St & Archer Ave"
[394] "Eckhart Park"
[395] "Dauphin Ave & 87th St"
[396] "Prairie Ave & 43rd St"
[397] "Woodlawn Ave & 55th St"
[398] "Western Ave & Walton St"
[399] "Leavitt St & Lawrence Ave"
[400] "Racine Ave & 35th St"
[401] "Wabash Ave & Cermak Rd"
[402] "California Ave & 23rd Pl"
[403] "Stave St & Armitage Ave"
[404] "Sheffield Ave & Fullerton Ave"
[405] "California Ave & Fletcher St"
[406] "Laflin St & Cullerton St"
[407] "Shields Ave & 28th Pl"
[408] "Racine Ave & Congress Pkwy"
[409] "Princeton Ave & Garfield Blvd"
[410] "State St & Van Buren St"
[411] "Clinton St & Washington Blvd"
[412] "Damen Ave & Coulter St"
[413] "Wood St & Augusta Blvd"
[414] "Fairbanks St & Superior St"
[415] "Pulaski Rd & Eddy St (Temp)"
[416] "Clark St & Montrose Ave"
[417] "Loomis St & Jackson Blvd"
[418] "Western Ave & 24th St"
[419] "Canal St & Madison St"
[420] "Damen Ave & Pershing Rd"
[421] "California Ave & Lake St"
[422] "Jeffery Blvd & 67th St"
[423] "Ravenswood Ave & Irving Park Rd"
[424] "Spaulding Ave & Division St"
[425] "South Shore Dr & 71st St"
[426] "Morgan St & Polk St"
[427] "Lincoln Ave & Belle Plaine Ave"
[428] "Leavitt St & Chicago Ave"
[429] "State St & 95th St"
[430] "Elmwood Ave & Austin St"
[431] "Oglesby Ave & 100th St"
[432] "Dodge Ave & Mulford St"
[433] "St. Louis Ave & Balmoral Ave"
[434] "Ellis Ave & 53rd St"
[435] "Halsted St & 111th St"
[436] "Lake Park Ave & 56th St"
[437] "MLK Jr Dr & 56th St"
[438] "Halsted St & North Branch St"
[439] "Major Taylor Trail & 115th St"
[440] "Racine Ave & Wrightwood Ave"
[441] "Calumet Ave & 51st St"
[442] "Wood St & Taylor St"
[443] "Racine Ave & 15th St"
[444] "900 W Harrison St"
[445] "Bosworth Ave & Howard St"
[446] "Ashland Ave & Augusta Blvd"
[447] "Aberdeen St & Monroe St"
[448] "Western Ave & Granville Ave"
[449] "Greenwood Ave & 91st St"
[450] "Damen Ave & Foster Ave"
[451] "Michigan Ave & 71st St"
[452] "Prairie Ave & Garfield Blvd"
[453] "Stony Island Ave & 71st St"
[454] "Southport Ave & Clark St"
[455] "Damen Ave & 51st St"
[456] "Canal St & Monroe St"
[457] "Smith Park"
[458] "Manor Ave & Leland Ave"
[459] "MLK Jr Dr & Pershing Rd"
[460] "Canal St & Taylor St"
[461] "Ridge Blvd & Touhy Ave"
[462] "California Ave & Cortez St"
[463] "Central St & Girard Ave"
[464] "Central Park Ave & Bloomingdale Ave"
[465] "Jeffery Blvd & 91st St"
[466] "Ashland Ave & 13th St"
[467] "Baltimore Ave & 87th St"
[468] "WATSON TESTING - DIVVY"
[469] "Halsted St & 96th St"
[470] "Clark St & Columbia Ave"
[471] "Blackstone Ave & Hyde Park Blvd"
[472] "Damen Ave & Walnut (Lake) St"
[473] "Calumet Ave & 33rd St"
[474] "Kildare Ave & Montrose Ave"
[475] "Paulina St & Flournoy St"
[476] "Kimball Ave & Belmont Ave"
[477] "Cottage Grove Ave & 51st St"
[478] "Campbell Ave & Montrose Ave"
[479] "Wood St & Taylor St (Temp)"
[480] "Paulina St & 18th St"
[481] "Troy St & Elston Ave"
[482] "Halsted St & 104th St"
[483] "Evanston Civic Center"
[484] "Shields Ave & 43rd St"
[485] "Indiana Ave & 103rd St"
[486] "Kedzie Ave & Lake St"
[487] "Kedzie Ave & Chicago Ave"
[488] "Halsted St & Maxwell St"
[489] "Kostner Ave & Lake St"
[490] "Keystone Ave & Montrose Ave"
[491] "California Ave & 21st St"
[492] "Morgan St & 31st St"
[493] "Keystone Ave & Fullerton Ave"
[494] "Kedzie Ave & Bryn Mawr Ave"
[495] "Kedzie Ave & 24th St"
[496] "Elizabeth St & 47th St"
[497] "MLK Jr Dr & 47th St"
[498] "Austin Blvd & Chicago Ave"
[499] "Throop St & Taylor St"
[500] "Ashland Ave & Lake St"
[501] "Ravenswood Ave & Berteau Ave"
[502] "Cherry Ave & Blackhawk St"
[503] "Clark St & Ida B Wells Dr"
[504] "Lincoln Ave & Addison St"
[505] "Western Ave & Howard St"
[506] "Claremont Ave & Hirsch St"
[507] "Canal St & Harrison St"
[508] "Hoyne Ave & 47th St"
[509] "MLK Jr Dr & 83rd St"
[510] "Ashland Ave & 69th St"
[511] "Ashland Ave & Archer Ave"
[512] "Rockwell St & Eastwood Ave"
[513] "Leavitt St & Division St"
[514] "Laramie Ave & Madison St"
[515] "Hoyne Ave & Balmoral Ave"
[516] "Racine Ave & Garfield Blvd"
[517] "Woodlawn Ave & 75th St"
[518] "State St & Pershing Rd"
[519] "Western Ave & 21st St"
[520] "Central Ave & Lake St"
[521] "University Library (NU)"
[522] "Woodlawn Ave & Lake Park Ave"
[523] "Troy St & North Ave"
[524] "DuSable Museum"
[525] "Ogden Ave & Roosevelt Rd"
[526] "Elizabeth St & 92nd St"
[527] "Sangamon St & Washington Blvd"
[528] "Clinton St & 18th St"
[529] "Stewart Ave & 63rd St"
[530] "Kedzie Ave & Leland Ave"
[531] "Millard Ave & 26th St"
[532] "Wentworth Ave & 63rd St"
[533] "Prospect Sq & 91st St"
[534] "Latrobe Ave & Chicago Ave"
[535] "Valli Produce - Evanston Plaza"
[536] "Kedzie Ave & Harrison St"
[537] "Wentworth Ave & 35th St"
[538] "Central Park Ave & North Ave"
[539] "Ashland Ave & Pershing Rd"
[540] "Central Park Blvd & 5th Ave"
[541] "Conservatory Dr & Lake St"
[542] "Austin Blvd & Madison St"
[543] "Halsted St & 21st St"
[544] "Stony Island Ave & 64th St"
[545] "Ogden Ave & Congress Pkwy"
[546] "Kilbourn Ave & Irving Park Rd"
[547] "Oakley Ave & Irving Park Rd"
[548] "Cottage Grove Ave & 47th St"
[549] "Central St Metra"
[550] "Lincolnwood Dr & Central St"
[551] "South Shore Dr & 74th St"
[552] "Clinton St & Polk St"
[553] "Indiana Ave & 40th St"
[554] "Wolcott Ave & Fargo Ave"
[555] "Vincennes Ave & 75th St"
[556] "Warren Park East"
[557] "Washtenaw Ave & Ogden Ave"
[558] "Wentworth Ave & 33rd St"
[559] "Western Blvd & 48th Pl"
[560] "Cottage Grove Ave & 67th St"
[561] "Winchester (Ravenswood) Ave & Balmoral Ave"
[562] "Emerald Ave & 28th St"
[563] "Greenwood Ave & 97th St"
[564] "Vernon Ave & 107th St"
[565] "Ashland Ave & 78th St"
[566] "Wood St & 35th St"
[567] "Halsted St & Roosevelt Rd"
[568] "Greenwood Ave & 79th St"
[569] "Shields Ave & 31st St"
[570] "East End Ave & 87th St"
[571] "Calumet Ave & 35th St"
[572] "Drake Ave & Addison St"
[573] "Wabash Ave & 87th St"
[574] "Stony Island Ave & 82nd St"
[575] "State St & 54th St"
[576] "Cottage Grove Ave & 78th St"
[577] "Oakley Ave & Touhy Ave"
[578] "Marshfield Ave & 44th St"
[579] "Racine Ave & 61st St"
[580] "Avenue O & 134th St"
[581] "Malcolm X College"
[582] "Cornell Dr & Hayes Dr"
[583] "Cicero Ave & Lake St"
[584] "Ashland Ave & McDowell Ave"
[585] "Torrence Ave & 106th St"
[586] "Eggleston Ave & 92nd St"
[587] "Calumet Ave & 71st St"
[588] "Normal Ave & Archer Ave"
[589] "Karlov Ave & Madison St"
[590] "State St & 79th St"
[591] "Ashland Ave & 50th St"
[592] "Maplewood Ave & Peterson Ave"
[593] "Clark St & Touhy Ave"
[594] "Yates Blvd & 75th St"
[595] "Stewart Ave & 83rd St"
[596] "Marquette Ave & 89th St"
[597] "Central Park Ave & 24th St"
[598] "Evans Ave & 75th St"
[599] "Sacramento Blvd & Franklin Blvd"
[600] "Halsted St & 63rd St"
[601] "63rd St Beach"
[602] "Kostner Ave & Adams St"
[603] "Ashland Ave & 66th St"
[604] "State St & 76th St"
[605] "Summit Ave & 86th St"
[606] "Stony Island Ave & 67th St"
[607] "Vernon Ave & 79th St"
[608] "Laramie Ave & Kinzie St"
[609] "Central Ave & Madison St"
[610] "Stony Island Ave & South Chicago Ave"
[611] "Cottage Grove Ave & 63rd St"
[612] "Halsted St & 69th St"
[613] "Kedzie Ave & 21st St"
[614] "Halsted St & 78th St"
[615] "Houston Ave & 92nd St"
[616] "Michigan Ave & 114th St"
[617] "Eberhart Ave & 91st St"
[618] "Rainbow Beach"
[619] "Throop St & 52nd St"
[620] "MLK Jr Dr & 63rd St"
[621] "Stony Island Ave & 75th St"
[622] "Exchange Ave & 79th St"
[623] "Marshfield Ave & 59th St"
[624] "Princeton Ave & 47th St"
[625] "Perry Ave & 69th St"
[626] "Racine Ave & 65th St"
[627] "Morgan St & Pershing Rd"
[628] "Commercial Ave & 83rd St"
[629] "Halsted St & 51st St"
[630] "Ewing Ave & Burnham Greenway"
[631] "Phillips Ave & 83rd St"
[632] "Clyde Ave & 87th St"
[633] "May St & 69th St"
[634] "Damen Ave & 59th St"
[635] "Halsted St & 56th St"
[636] "Ashland Ave & Garfield Blvd"
[637] "Western Ave & 28th St"
[638] "Jeffery Blvd & 76th St"
[639] "Loomis Blvd & 84th St"
[640] "Central Ave & Harrison St"
[641] "Cicero Ave & Flournoy St"
[642] "Halsted St & 73rd St"
[643] "Cicero Ave & Quincy St"
[644] "Laramie Ave & Gladys Ave"
[645] "Ellis Ave & 83rd St"
[646] "Kenton Ave & Madison St"
[647] "California Ave & 26th St"
[648] "South Chicago Ave & Elliot Ave"
[649] "Halsted St & 59th St"
[650] "Wabash Ave & 83rd St"
[651] "Ashland Ave & 74th St"
[652] "Torrence Ave & 126th Pl"
[653] "Seeley Ave & Garfield Blvd"
[654] "Eggleston Ave & 69th St"
[655] "Rhodes Ave & 71st St"
[656] "Carpenter St & 63rd St"
[657] "Cottage Grove Ave & 71st St"
[658] "South Chicago Ave & 83rd St"
[659] "HUBBARD ST BIKE CHECKING (LBS-WH-TEST)"
[660] "Walden Pkwy & 100th St"
[661] "Burnham Greenway & 105th St"
[662] "Elizabeth St & 59th St"
[663] "Major Taylor Trail & 124th St"
[664] "Avenue O & 118th St"
[665] "N Clark St & W Elm St"
[666] "St. Louis Ave & Fullerton Ave"
[667] "New St & Illinois St"
[668] "Hale Ave & 107th St"
[669] "Bradley Park"
[670] "Commercial Ave & 130th St"
[671] "Vincennes Ave & 104th St"
[672] "Western Ave & 111th St"
[673] "Ada St & 113th St"
[674] "Lawndale Ave & 111th St"
[675] "Homewood Ave & 115th St"
[676] "Western Ave & 104th St"
[677] "Hegewisch Metra Station"
[678] "S Michigan Ave & E 118th St"
[679] "Dodge Ave & Main St"
[680] "Base - 2132 W Hubbard Warehouse"
[681] "N Green St & W Lake St"
[682] "Commercial Ave & 100th St"
[683] "N Paulina St & Lincoln Ave"
[684] "N Southport Ave & W Newport Ave"
[685] "Malcolm X College Vaccination Site"
[686] "Broadway & Wilson - Truman College Vaccination Site"
[687] "W Washington Blvd & N Peoria St"
[688] "Kedzie Ave & 110th St"
[689] "N Sheffield Ave & W Wellington Ave"
[690] "N Carpenter St & W Lake St"
[691] "Halsted & 63rd - Kennedy-King Vaccination Site"
[692] "Western & 28th - Velasquez Institute Vaccination Site"
[693] "Chicago State University"
[694] "Damen Ave & Wabansia Ave"
[695] "N Damen Ave & W Wabansia St"
[696] "S Wentworth Ave & W 111th St"
[697] "N Hampden Ct & W Diversey Ave"
[698] "Altgeld Gardens"
[699] "Hampden Ct & Diversey Ave"
[700] "Kedzie Ave & 104th St"
[701] "Avenue L & 114th St"
[702] "Calumet Park"
[703] "Elston Ave & Cortland St"
[704] "Loomis St & 89th St"
[705] "Woodlawn & 103rd - Olive Harvey Vaccination Site"
[706] "W 103rd St & S Avers Ave"
[707] "WEST CHI-WATSON"
[708] "Yates Blvd & 93rd St"
[709] "Maryland Ave & 104th St"
[710] "S Aberdeen St & W 106th St"
[711] "Lyft Driver Center Private Rack"
[712] "Cicero Ave & Grace St"
[713] "DuSable Lake Shore Dr & Belmont Ave"
[714] "DuSable Lake Shore Dr & Monroe St"
[715] "DuSable Lake Shore Dr & North Blvd"
[716] "DuSable Lake Shore Dr & Ohio St"
[717] "DuSable Lake Shore Dr & Wellington Ave"
[718] "DuSable Lake Shore Dr & Diversey Pkwy"
[719] "Kildare Ave & 26th St"
[720] "Tripp Ave & 31st St"
[721] "Halsted St & 18th St (Temp)"
[722] "Lawndale Ave & 16th St"
[723] "Spaulding Ave & 16th St"
[724] "Homan Ave & Fillmore St"
[725] "Lavergne & Fullerton"
[726] "DIVVY CASSETTE REPAIR MOBILE STATION"
[727] "Kilpatrick Ave & Parker Ave"
[728] "Central Park Ave & Douglas Blvd"
[729] "Lamon Ave & Belmont Ave"
[730] "Long Ave & Belmont Ave"
[731] "Meade Ave & Diversey Ave"
[732] "Long Ave & Belden Ave"
[733] "Tripp Ave & 15th St"
[734] "Mason Ave & Belmont Ave"
[735] "Parkside Ave & Armitage Ave"
[736] "Keeler Ave & Roosevelt Rd"
[737] "Pulaski Rd & 21st St"
[738] "Central Ave & Parker Ave"
[739] "Lawndale Ave & 30th St"
[740] "Meade Ave & Addison St"
[741] "Kilbourn & Roscoe"
[742] "Mulligan Ave & Wellington Ave"
[743] "Lockwood Ave & Wrightwood Ave"
[744] "Plainfield & Irving Park"
[745] "Narragansett Ave & School St"
[746] "Central Ave & Roscoe St"
[747] "351"
[748] "Long & Irving Park"
[749] "Komensky Ave & 31st St"
[750] "Kilbourn & Belden"
[751] "Kostner Ave & Wrightwood Ave"
[752] "North Ave & New England Ave"
[753] "Harding Ave & 26th St"
[754] "Harlem Ave & Grace St"
[755] "Oketo Ave & Addison St"
[756] "Roscoe & Harlem"
[757] "Lamon Ave & Armitage Ave"
[758] "Sayre & Diversey"
Creating a vector of station names identified as Divvy test and repair stations.
trs_name <- c("Base – 2132 W Hubbard Warehouse",
"DIVVY CASSETTE REPAIR MOBILE STATION",
"HUBBARD ST BIKE CHECKING (LBS-WH-TEST)",
"WATSON TESTING - DIVVY",
"WEST CHI-WATSON")
Looking for specific values in the start_station_id
column associated with Divvy test and repair stations.
unique(all_trips_v2$start_station_id)
[1] "52"
[2] NA
[3] "246"
[4] "24"
[5] "94"
[6] "291"
[7] "273"
[8] "145"
[9] "108"
[10] "511"
[11] "329"
[12] "315"
[13] "138"
[14] "504"
[15] "38"
[16] "485"
[17] "89"
[18] "53"
[19] "3"
[20] "35"
[21] "113"
[22] "164"
[23] "111"
[24] "140"
[25] "225"
[26] "301"
[27] "43"
[28] "21"
[29] "13"
[30] "212"
[31] "645"
[32] "287"
[33] "49"
[34] "71"
[35] "454"
[36] "195"
[37] "123"
[38] "589"
[39] "289"
[40] "250"
[41] "306"
[42] "585"
[43] "627"
[44] "168"
[45] "130"
[46] "424"
[47] "175"
[48] "126"
[49] "84"
[50] "712"
[51] "172"
[52] "673"
[53] "157"
[54] "110"
[55] "341"
[56] "492"
[57] "215"
[58] "93"
[59] "26"
[60] "255"
[61] "636"
[62] "308"
[63] "165"
[64] "199"
[65] "453"
[66] "16"
[67] "227"
[68] "120"
[69] "2"
[70] "150"
[71] "471"
[72] "451"
[73] "77"
[74] "331"
[75] "349"
[76] "134"
[77] "426"
[78] "197"
[79] "459"
[80] "268"
[81] "460"
[82] "423"
[83] "333"
[84] "288"
[85] "69"
[86] "228"
[87] "226"
[88] "672"
[89] "458"
[90] "350"
[91] "17"
[92] "190"
[93] "325"
[94] "523"
[95] "245"
[96] "76"
[97] "260"
[98] "623"
[99] "638"
[100] "243"
[101] "419"
[102] "56"
[103] "406"
[104] "133"
[105] "60"
[106] "313"
[107] "515"
[108] "251"
[109] "603"
[110] "171"
[111] "61"
[112] "198"
[113] "116"
[114] "303"
[115] "100"
[116] "142"
[117] "416"
[118] "302"
[119] "247"
[120] "48"
[121] "162"
[122] "637"
[123] "107"
[124] "181"
[125] "47"
[126] "501"
[127] "236"
[128] "153"
[129] "431"
[130] "237"
[131] "147"
[132] "507"
[133] "128"
[134] "332"
[135] "286"
[136] "520"
[137] "173"
[138] "15"
[139] "435"
[140] "514"
[141] "192"
[142] "99"
[143] "180"
[144] "66"
[145] "29"
[146] "258"
[147] "532"
[148] "59"
[149] "320"
[150] "321"
[151] "364"
[152] "46"
[153] "166"
[154] "620"
[155] "517"
[156] "28"
[157] "304"
[158] "457"
[159] "654"
[160] "328"
[161] "87"
[162] "503"
[163] "272"
[164] "294"
[165] "74"
[166] "624"
[167] "632"
[168] "186"
[169] "57"
[170] "323"
[171] "144"
[172] "112"
[173] "664"
[174] "499"
[175] "284"
[176] "249"
[177] "472"
[178] "621"
[179] "463"
[180] "346"
[181] "176"
[182] "210"
[183] "277"
[184] "41"
[185] "334"
[186] "152"
[187] "505"
[188] "7"
[189] "264"
[190] "196"
[191] "194"
[192] "92"
[193] "322"
[194] "27"
[195] "359"
[196] "436"
[197] "604"
[198] "625"
[199] "261"
[200] "500"
[201] "148"
[202] "252"
[203] "597"
[204] "461"
[205] "20"
[206] "254"
[207] "481"
[208] "231"
[209] "51"
[210] "338"
[211] "506"
[212] "219"
[213] "182"
[214] "253"
[215] "141"
[216] "305"
[217] "90"
[218] "240"
[219] "158"
[220] "319"
[221] "161"
[222] "96"
[223] "232"
[224] "339"
[225] "34"
[226] "45"
[227] "411"
[228] "98"
[229] "202"
[230] "229"
[231] "54"
[232] "73"
[233] "628"
[234] "259"
[235] "85"
[236] "660"
[237] "4"
[238] "265"
[239] "239"
[240] "220"
[241] "177"
[242] "62"
[243] "257"
[244] "484"
[245] "487"
[246] "447"
[247] "127"
[248] "178"
[249] "242"
[250] "480"
[251] "117"
[252] "106"
[253] "97"
[254] "18"
[255] "290"
[256] "114"
[257] "475"
[258] "296"
[259] "115"
[260] "224"
[261] "695"
[262] "19"
[263] "467"
[264] "300"
[265] "214"
[266] "563"
[267] "496"
[268] "276"
[269] "183"
[270] "223"
[271] "137"
[272] "701"
[273] "307"
[274] "188"
[275] "344"
[276] "640"
[277] "36"
[278] "327"
[279] "355"
[280] "571"
[281] "347"
[282] "470"
[283] "44"
[284] "425"
[285] "163"
[286] "354"
[287] "230"
[288] "5"
[289] "6"
[290] "271"
[291] "293"
[292] "474"
[293] "326"
[294] "81"
[295] "211"
[296] "408"
[297] "193"
[298] "297"
[299] "299"
[300] "156"
[301] "295"
[302] "25"
[303] "154"
[304] "129"
[305] "31"
[306] "318"
[307] "309"
[308] "394"
[309] "132"
[310] "23"
[311] "600"
[312] "468"
[313] "39"
[314] "279"
[315] "324"
[316] "376"
[317] "136"
[318] "714"
[319] "491"
[320] "444"
[321] "124"
[322] "716"
[323] "340"
[324] "578"
[325] "428"
[326] "184"
[327] "213"
[328] "310"
[329] "238"
[330] "382"
[331] "88"
[332] "131"
[333] "125"
[334] "479"
[335] "316"
[336] "717"
[337] "118"
[338] "278"
[339] "9"
[340] "465"
[341] "262"
[342] "438"
[343] "68"
[344] "450"
[345] "267"
[346] "337"
[347] "483"
[348] "72"
[349] "644"
[350] "591"
[351] "285"
[352] "216"
[353] "417"
[354] "420"
[355] "502"
[356] "596"
[357] "22"
[358] "626"
[359] "14"
[360] "342"
[361] "11"
[362] "143"
[363] "639"
[364] "75"
[365] "525"
[366] "456"
[367] "366"
[368] "579"
[369] "528"
[370] "312"
[371] "550"
[372] "40"
[373] "263"
[374] "493"
[375] "592"
[376] "283"
[377] "37"
[378] "256"
[379] "370"
[380] "58"
[381] "218"
[382] "432"
[383] "381"
[384] "222"
[385] "705"
[386] "698"
[387] "160"
[388] "535"
[389] "217"
[390] "206"
[391] "86"
[392] "706"
[393] "410"
[394] "248"
[395] "374"
[396] "311"
[397] "367"
[398] "42"
[399] "442"
[400] "185"
[401] "67"
[402] "498"
[403] "208"
[404] "401"
[405] "32"
[406] "385"
[407] "33"
[408] "91"
[409] "167"
[410] "657"
[411] "635"
[412] "488"
[413] "234"
[414] "146"
[415] "281"
[416] "174"
[417] "546"
[418] "378"
[419] "352"
[420] "244"
[421] "510"
[422] "12"
[423] "241"
[424] "298"
[425] "659"
[426] "690"
[427] "598"
[428] "697"
[429] "662"
[430] "469"
[431] "418"
[432] "711"
[433] "345"
[434] "421"
[435] "365"
[436] "713"
[437] "343"
[438] "415"
[439] "317"
[440] "274"
[441] "109"
[442] "522"
[443] "30"
[444] "80"
[445] "452"
[446] "702"
[447] "464"
[448] "674"
[449] "204"
[450] "356"
[451] "292"
[452] "554"
[453] "191"
[454] "643"
[455] "477"
[456] "179"
[457] "414"
[458] "466"
[459] "622"
[460] "602"
[461] "641"
[462] "704"
[463] "275"
[464] "693"
[465] "676"
[466] "700"
[467] "449"
[468] "121"
[469] "656"
[470] "149"
[471] "630"
[472] "383"
[473] "497"
[474] "351"
[475] "482"
[476] "205"
[477] "490"
[478] "709"
[479] "661"
[480] "409"
[481] "696"
[482] "377"
[483] "373"
[484] "282"
[485] "536"
[486] "495"
[487] "348"
[488] "280"
[489] "619"
[490] "494"
[491] "441"
[492] "553"
[493] "200"
[494] "524"
[495] "119"
[496] "314"
[497] "666"
[498] "50"
[499] "330"
[500] "527"
[501] "159"
[502] "169"
[503] "551"
[504] "586"
[505] "566"
[506] "368"
[507] "478"
[508] "658"
[509] "540"
[510] "655"
[511] "559"
[512] "569"
[513] "407"
[514] "203"
[515] "531"
[516] "605"
[517] "413"
[518] "509"
[519] "422"
[520] "434"
[521] "689"
[522] "233"
[523] "170"
[524] "649"
[525] "476"
[526] "443"
[527] "390"
[528] "684"
[529] "642"
[530] "599"
[531] "433"
[532] "405"
[533] "508"
[534] "547"
[535] "533"
[536] "518"
[537] "544"
[538] "135"
[539] "95"
[540] "122"
[541] "590"
[542] "486"
[543] "336"
[544] "601"
[545] "663"
[546] "399"
[547] "103"
[548] "201"
[549] "519"
[550] "568"
[551] "448"
[552] "437"
[553] "403"
[554] "594"
[555] "429"
[556] "462"
[557] "207"
[558] "703"
[559] "699"
[560] "683"
[561] "369"
[562] "55"
[563] "576"
[564] "402"
[565] "686"
[566] "335"
[567] "489"
[568] "595"
[569] "583"
[570] "646"
[571] "575"
[572] "526"
[573] "549"
[574] "562"
[575] "631"
[576] "653"
[577] "529"
[578] "552"
[579] "707"
[580] "691"
[581] "393"
[582] "209"
[583] "534"
[584] "573"
[585] "555"
[586] "455"
[587] "353"
[588] "396"
[589] "677"
[590] "692"
[591] "440"
[592] "570"
[593] "375"
[594] "388"
[595] "101"
[596] "545"
[597] "565"
[598] "572"
[599] "685"
[600] "102"
[601] "574"
[602] "530"
[603] "542"
[604] "577"
[605] "427"
[606] "391"
[607] "439"
[608] "681"
[609] "694"
[610] "682"
[611] "398"
[612] "556"
[613] "430"
[614] "270"
[615] "580"
[616] "560"
[617] "412"
[618] "392"
[619] "564"
[620] "548"
[621] "581"
[622] "384"
[623] "718"
[624] "582"
[625] "708"
[626] "567"
[627] "561"
[628] "386"
[629] "558"
[630] "446"
[631] "395"
[632] "687"
[633] "541"
[634] "538"
[635] "678"
[636] "539"
[637] "543"
[638] "584"
[639] "537"
[640] "445"
[641] "665"
[642] "593"
[643] "587"
[644] "679"
[645] "720"
[646] "557"
[647] "650"
[648] "652"
[649] "648"
[650] "400"
[651] "588"
[652] "671"
[653] "721"
[654] "710"
[655] "647"
[656] "715"
[657] "719"
[658] "723"
[659] "731"
[660] "722"
[661] "726"
[662] "728"
[663] "727"
[664] "730"
[665] "725"
[666] "724"
[667] "732"
[668] "13157"
[669] "TA1309000006"
[670] "KA1503000043"
[671] "TA1309000014"
[672] "TA1305000006"
[673] "13042"
[674] "TA1307000127"
[675] "TA1306000003"
[676] "TA1306000006"
[677] "TA1306000011"
[678] "SL-013"
[679] "13124"
[680] "13137"
[681] "13074"
[682] "TA1309000066"
[683] "TA1307000138"
[684] "TA1307000052"
[685] "TA1309000059"
[686] "13268"
[687] "KA1503000002"
[688] "TA1307000140"
[689] "13294"
[690] "TA1307000062"
[691] "15655"
[692] "TA1307000064"
[693] "TA1306000010"
[694] "13058"
[695] "13179"
[696] "KA1504000076"
[697] "13431"
[698] "KA1503000070"
[699] "13197"
[700] "13006"
[701] "KA1503000040"
[702] "TA1307000129"
[703] "TA1307000159"
[704] "13326"
[705] "SL-009"
[706] "TA1307000120"
[707] "13332"
[708] "TA1305000011"
[709] "TA1307000070"
[710] "TA1305000030"
[711] "TA1309000008"
[712] "15545"
[713] "13162"
[714] "TA1307000039"
[715] "13164"
[716] "KA1504000104"
[717] "13353"
[718] "13022"
[719] "13036"
[720] "13139"
[721] "KA1503000064"
[722] "16920"
[723] "13243"
[724] "13017"
[725] "TA1305000001"
[726] "13028"
[727] "TA1307000121"
[728] "TA1307000130"
[729] "SL-005"
[730] "13165"
[731] "TA1308000019"
[732] "KA1503000041"
[733] "TA1305000009"
[734] "KA1503000072"
[735] "TA1309000004"
[736] "TA1309000035"
[737] "KA1504000129"
[738] "TA1306000007"
[739] "TA1309000043"
[740] "KA1503000034"
[741] "KA1504000140"
[742] "TA1307000126"
[743] "KA1503000012"
[744] "TA1307000166"
[745] "TA1305000041"
[746] "TA1309000019"
[747] "15628"
[748] "TA1308000049"
[749] "TA1305000035"
[750] "KA1504000116"
[751] "13224"
[752] "KA1504000149"
[753] "TA1307000156"
[754] "13276"
[755] "TA1306000032"
[756] "13136"
[757] "15664"
[758] "15529"
[759] "13134"
[760] "TA1307000041"
[761] "KA1503000022"
[762] "KA1504000096"
[763] "TA1308000005"
[764] "13409"
[765] "13229"
[766] "13109"
[767] "15578"
[768] "17660"
[769] "TA1309000018"
[770] "KA1504000103"
[771] "KA1504000106"
[772] "TA1309000007"
[773] "TA1309000001"
[774] "13389"
[775] "13253"
[776] "20252.0"
[777] "13292"
[778] "KA1504000159"
[779] "20110"
[780] "KA1504000164"
[781] "15491"
[782] "13245"
[783] "15546"
[784] "TA1307000128"
[785] "TA1309000037"
[786] "13258"
[787] "RP-004"
[788] "13156"
[789] "TA1305000022"
[790] "TA1307000005"
[791] "13263"
[792] "20116"
[793] "15640"
[794] "TA1309000049"
[795] "TA1309000039"
[796] "20207"
[797] "TA1308000002"
[798] "13277"
[799] "13241"
[800] "TA1305000010"
[801] "KA1504000135"
[802] "18016"
[803] "13303"
[804] "KA1504000082"
[805] "KA1503000047"
[806] "KA1503000033"
[807] "KA1504000148"
[808] "13133"
[809] "TA1309000011"
[810] "15692"
[811] "15645"
[812] "TA1309000055"
[813] "16940"
[814] "20238"
[815] "20120"
[816] "TA1307000163"
[817] "13071"
[818] "13213"
[819] "20205"
[820] "16903"
[821] "20109"
[822] "TA1307000161"
[823] "20236"
[824] "15682"
[825] "KA1503000013"
[826] "KA1503000018"
[827] "SL-011"
[828] "TA1308000050"
[829] "TA1307000131"
[830] "13296"
[831] "13073"
[832] "TA1308000021"
[833] "13146"
[834] "TA1305000029"
[835] "TA1305000014"
[836] "13323"
[837] "TA1305000005"
[838] "13269"
[839] "TA1309000029"
[840] "13008"
[841] "15691"
[842] "KA1503000053"
[843] "13206"
[844] "TA1305000037"
[845] "KA1503000038"
[846] "13290"
[847] "16943"
[848] "15631"
[849] "20231"
[850] "KA1504000161"
[851] "TA1309000063"
[852] "TA1308000038"
[853] "15470"
[854] "13091"
[855] "15644"
[856] "20233"
[857] "KA1503000054"
[858] "TA1307000119"
[859] "20227"
[860] "13341"
[861] "TA1308000001"
[862] "TA1309000061"
[863] "18069"
[864] "KA1504000093"
[865] "15535"
[866] "TA1305000039"
[867] "TA1307000111"
[868] "TA1308000029"
[869] "KA1503000020"
[870] "KA1503000075"
[871] "KA1504000167"
[872] "18062"
[873] "15623"
[874] "KA1503000044"
[875] "15634"
[876] "20221"
[877] "KA1504000168"
[878] "15654"
[879] "20222"
[880] "13053"
[881] "15534"
[882] "16950"
[883] "651"
[884] "Hubbard Bike-checking (LBS-WH-TEST)"
[885] "KA1706005015"
[886] "18022"
[887] "TA1309000053"
[888] "KA1706005007"
[889] "15550"
[890] "15632"
[891] "13056"
[892] "15689"
[893] "13247"
[894] "TA1306000008"
[895] "KA1504000141"
[896] "KA1503000068"
[897] "KA1503000052"
[898] "15667"
[899] "KA1504000156"
[900] "15575"
[901] "15446"
[902] "20226"
[903] "E007"
[904] "KA1503000045"
[905] "E002"
[906] "KA1503000003"
[907] "13307"
[908] "15442"
[909] "13045"
[910] "TA1307000001"
[911] "13379"
[912] "15642"
[913] "15539"
[914] "TA1308000036"
[915] "15530"
[916] "TA1305000025"
[917] "TA1309000002"
[918] "KA1504000142"
[919] "TA1308000026"
[920] "16937"
[921] "E008"
[922] "15449"
[923] "20229"
[924] "16913"
[925] "15622"
[926] "KA1504000151"
[927] "KA1504000113"
[928] "15646"
[929] "TA1308000014"
[930] "TA1309000021"
[931] "TA1308000007"
[932] "13345"
[933] "13331"
[934] "TA1308000013"
[935] "16806"
[936] "KA1504000134"
[937] "15666"
[938] "KA1504000109"
[939] "TA1309000003"
[940] "TA1309000025"
[941] "TA1307000158"
[942] "15615"
[943] "TA1309000032"
[944] "KA1504000091"
[945] "13191"
[946] "20105"
[947] "16010"
[948] "TA1305000004"
[949] "E011"
[950] "KA150400009X"
[951] "KA1504000097"
[952] "13285"
[953] "TA1308000006"
[954] "KA1504000155"
[955] "KA1504000130"
[956] "LF-005"
[957] "13300"
[958] "KA1504000152"
[959] "13193"
[960] "13029"
[961] "KA1503000059"
[962] "20242"
[963] "KA1503000028"
[964] "TA1308000045"
[965] "TA1309000030"
[966] "KA1503000065"
[967] "KA1504000086"
[968] "20244"
[969] "KA1503000025"
[970] "TA1308000035"
[971] "13061"
[972] "TA1309000041"
[973] "13143"
[974] "KA1504000175"
[975] "TA1307000149"
[976] "RN-"
[977] "13216"
[978] "TA1306000002"
[979] "KA1504000090"
[980] "13256"
[981] "TA1307000160"
[982] "WL-008"
[983] "13288"
[984] "KA1504000147"
[985] "KA1503000021"
[986] "KA1503000023"
[987] "KA1503000049"
[988] "13196"
[989] "15445"
[990] "13221"
[991] "KA17018068"
[992] "15621"
[993] "13398"
[994] "TA1307000107"
[995] "13128"
[996] "TA1307000048"
[997] "TA1309000010"
[998] "13084"
[999] "TA1306000009"
[1000] "SL-006"
[1001] "KA1504000102"
[1002] "TA1305000017"
[1003] "KA1504000078"
[1004] "18025"
[1005] "KA1504000110"
[1006] "16991"
[1007] "RP-005"
[1008] "16994"
[1009] "E014"
[1010] "KA1503000007"
[1011] "TA1308000009"
[1012] "TA1309000026"
[1013] "13257"
[1014] "15686"
[1015] "13021"
[1016] "KA1503000001"
[1017] "13235"
[1018] "20246.0"
[1019] "TA1306000026"
[1020] "KA1503000019"
[1021] "13434"
[1022] "TA1307000139"
[1023] "13194"
[1024] "20104"
[1025] "KA1503000031"
[1026] "13108"
[1027] "13430"
[1028] "KA1503000011"
[1029] "KA1503000030"
[1030] "18003"
[1031] "KP1705001026"
[1032] "KA1504000146"
[1033] "13016"
[1034] "KA1504000079"
[1035] "13001"
[1036] "TA1306000013"
[1037] "TA1306000025"
[1038] "13034"
[1039] "13427"
[1040] "TA1307000115"
[1041] "KA1504000101"
[1042] "TA1309000064"
[1043] "TA1309000027"
[1044] "TA1309000036"
[1045] "13063"
[1046] "15542"
[1047] "TA1308000012"
[1048] "TA1306000015"
[1049] "WL-011"
[1050] "KA1503000029"
[1051] "KA1503000074"
[1052] "13192"
[1053] "13289"
[1054] "TA1307000136"
[1055] "TA1307000143"
[1056] "13249"
[1057] "13432"
[1058] "TA1307000142"
[1059] "TA1306000014"
[1060] "13319"
[1061] "KA1504000133"
[1062] "13068"
[1063] "15571"
[1064] "TA1307000150"
[1065] "KA1503000015"
[1066] "13150"
[1067] "13135"
[1068] "13158"
[1069] "13265"
[1070] "TA1307000151"
[1071] "13278"
[1072] "13099"
[1073] "13037"
[1074] "13075"
[1075] "TA1309000023"
[1076] "TA1305000003"
[1077] "TA1309000024"
[1078] "13138"
[1079] "13160"
[1080] "TA1309000015"
[1081] "TA1307000144"
[1082] "TA1307000006"
[1083] "TA1308000031"
[1084] "TA1305000020"
[1085] "KA1504000127"
[1086] "TA1308000047"
[1087] "RP-009"
[1088] "RP-002"
[1089] "13325"
[1090] "TA1307000134"
[1091] "TA1309000050"
[1092] "TA1306000012"
[1093] "TA1309000012"
[1094] "LP-"
[1095] "KA1504000158"
[1096] "KA1504000080"
[1097] "TA1306000016"
[1098] "TA1307000038"
[1099] "18067"
[1100] "13085"
[1101] "13242"
[1102] "RP-001"
[1103] "SL-010"
[1104] "15585"
[1105] "KA1504000114"
[1106] "13155"
[1107] "WL-012"
[1108] "18058"
[1109] "SL-007"
[1110] "13266"
[1111] "KA1504000143"
[1112] "13089"
[1113] "KA1503000066"
[1114] "13081"
[1115] "TA1308000043"
[1116] "KA1504000160"
[1117] "KA1503000046"
[1118] "KA1503000051"
[1119] "KA17018054"
[1120] "20119"
[1121] "16906"
[1122] "TA1307000124"
[1123] "13304"
[1124] "20243"
[1125] "TA1309000042"
[1126] "20234"
[1127] "20254.0"
[1128] "18017"
[1129] "KA1503000073"
[1130] "KA1503000027"
[1131] "13080"
[1132] "KA1504000128"
[1133] "13033"
[1134] "13259"
[1135] "KA1504000117"
[1136] "16933"
[1137] "16948"
[1138] "16912"
[1139] "KA1503000069"
[1140] "15651"
[1141] "TA1309000058"
[1142] "20239"
[1143] "TA1308000023"
[1144] "15687"
[1145] "15597"
[1146] "KA1503000055"
[1147] "TA1307000066"
[1148] "KA1503000071"
[1149] "RP-006"
[1150] "15544"
[1151] "16921"
[1152] "13154"
[1153] "KA1503000032"
[1154] "13354"
[1155] "KA1503000004"
[1156] "13050"
[1157] "20232"
[1158] "20206"
[1159] "16932"
[1160] "13338"
[1161] "KA1503000010"
[1162] "20121"
[1163] "20107"
[1164] "20210"
[1165] "KA1503000009"
[1166] "13420"
[1167] "13011"
[1168] "15648"
[1169] "16953"
[1170] "13083"
[1171] "13102"
[1172] "16905"
[1173] "13144"
[1174] "RP-008"
[1175] "SL-008"
[1176] "15685"
[1177] "20127"
[1178] "20223"
[1179] "TA1307000113"
[1180] "13217"
[1181] "TA1307000117"
[1182] "KA1504000139"
[1183] "TA1307000153"
[1184] "20108"
[1185] "TA1305000032"
[1186] "TA1305000002"
[1187] "13132"
[1188] "KA1503000024"
[1189] "20235"
[1190] "20131"
[1191] "15541"
[1192] "15443"
[1193] "KA1504000126"
[1194] "20218"
[1195] "RP-007"
[1196] "KA1503000005"
[1197] "TA1308000046"
[1198] "15652"
[1199] "15668"
[1200] "SL-012"
[1201] "15624"
[1202] "E006"
[1203] "TA1309000067"
[1204] "20230"
[1205] "TA1309000051"
[1206] "TA1305000034"
[1207] "TA1307000061"
[1208] "16918"
[1209] "20118"
[1210] "20129"
[1211] "TA1307000044"
[1212] "13215"
[1213] "KA1504000171"
[1214] "13059"
[1215] "13271"
[1216] "TA1308000022"
[1217] "TA1309000033"
[1218] "TA1307000164"
[1219] "15653"
[1220] "15643"
[1221] "TA1306000029"
[1222] "13163"
[1223] "KA1503000014"
[1224] "13248"
[1225] "15650"
[1226] "13096"
[1227] "KA1504000162"
[1228] "20103"
[1229] "16907"
[1230] "20203"
[1231] "16916"
[1232] "20215"
[1233] "20225"
[1234] "20253.0"
[1235] "16915"
[1236] "20257.0"
[1237] "20247.0"
[1238] "20204"
[1239] "20113"
[1240] "20130"
[1241] "20124"
[1242] "20256.0"
[1243] "16970"
[1244] "20112"
[1245] "20251.0"
[1246] "20214"
[1247] "15599"
[1248] "20245"
[1249] "20228"
[1250] "20123"
[1251] "20101"
[1252] "20208"
[1253] "20106"
[1254] "20.0"
[1255] "20211"
[1256] "20258.0"
[1257] "20128"
[1258] "20217"
[1259] "20248.0"
[1260] "20213"
[1261] "20212"
[1262] "20125"
[1263] "202480.0"
[1264] "20201"
[1265] "20220"
[1266] "20224"
[1267] "201022"
[1268] "20133"
[1269] "20202"
[1270] "20249.0"
[1271] "DIVVY 001"
[1272] "20237"
[1273] "20134"
[1274] "20126"
[1275] "20999"
[1276] "365.0"
[1277] "368.0"
[1278] "362.0"
[1279] "366.0"
[1280] "364.0"
[1281] "DIVVY CASSETTE REPAIR MOBILE STATION"
[1282] "358"
[1283] "329.0"
[1284] "363.0"
[1285] "473"
[1286] "20209"
[1287] "330.0"
[1288] "331.0"
[1289] "334.0"
[1290] "360"
[1291] "397"
[1292] "335.0"
[1293] "332.0"
[1294] "357"
Creating a vector of station ids identified as ids associated with Divvy test and repair stations.
trs_id <- c("DIVVY 001",
"DIVVY CASSETTE REPAIR MOBILE STATION",
"Hubbard Bike-checking (LBS-WH-TEST)")
Keeping only trips that are relevant for the analysis.
dim_desc(all_trips_v2)
[1] "[4,804,459 x 13]"
all_trips_v2 %>%
group_by(start_station_name, start_station_id) %>%
summarise(min_datetime = min(started_at), max_datetime = max(started_at),
count = n(),.groups = 'drop') %>%
arrange(start_station_name, min_datetime) %>%
head(30) %>%
kableExtra::kbl() %>%
kableExtra::kable_styling(c("striped", "hover", "condensed", "responsive"))
| start_station_name | start_station_id | min_datetime | max_datetime | count |
|---|---|---|---|---|
| 2112 W Peterson Ave | 456 | 2020-09-01 10:20:07 | 2020-11-30 17:57:38 | 295 |
| 2112 W Peterson Ave | KA1504000155 | 2020-12-01 20:57:23 | 2021-08-31 19:04:10 | 766 |
| 351 | 351 | 2021-08-04 16:31:29 | 2021-08-07 23:59:38 | 2 |
| 63rd St Beach | 101 | 2020-09-01 06:32:10 | 2020-11-29 09:15:38 | 645 |
| 63rd St Beach | 15491 | 2020-12-01 12:13:32 | 2021-08-31 18:59:18 | 1716 |
| 900 W Harrison St | 109 | 2020-09-01 00:10:07 | 2020-11-30 21:37:27 | 1540 |
| 900 W Harrison St | 13028 | 2020-12-01 05:57:08 | 2021-08-31 23:32:29 | 4379 |
| Aberdeen St & Jackson Blvd | 21 | 2020-09-01 05:21:41 | 2020-11-30 18:00:59 | 2762 |
| Aberdeen St & Jackson Blvd | 13157 | 2020-12-01 05:47:45 | 2021-08-31 21:53:55 | 7855 |
| Aberdeen St & Monroe St | 80 | 2020-09-01 06:26:54 | 2020-11-30 16:31:57 | 2126 |
| Aberdeen St & Monroe St | 13156 | 2020-12-01 00:36:33 | 2021-08-31 23:57:23 | 7547 |
| Aberdeen St & Randolph St | 621 | 2020-09-01 05:48:49 | 2020-11-30 21:05:51 | 1934 |
| Aberdeen St & Randolph St | 18062 | 2020-12-01 07:23:39 | 2021-08-31 22:02:47 | 6648 |
| Ada St & 113th St | 727 | 2020-10-07 19:34:30 | 2020-11-26 22:29:45 | 20 |
| Ada St & 113th St | 20129 | 2020-12-13 13:21:13 | 2021-08-26 14:36:13 | 65 |
| Ada St & Washington Blvd | 346 | 2020-09-01 04:34:53 | 2020-11-30 20:44:42 | 1928 |
| Ada St & Washington Blvd | 13353 | 2020-12-01 07:19:09 | 2021-08-31 23:42:08 | 6191 |
| Adler Planetarium | 341 | 2020-09-01 07:04:27 | 2020-11-30 15:22:52 | 3961 |
| Adler Planetarium | 13431 | 2020-12-01 15:08:23 | 2021-08-31 22:11:50 | 11668 |
| Albany Ave & 26th St | 444 | 2020-09-02 17:49:47 | 2020-11-29 13:42:10 | 104 |
| Albany Ave & 26th St | 15691 | 2020-12-03 15:37:34 | 2021-08-31 17:12:28 | 230 |
| Albany Ave & Bloomingdale Ave | 511 | 2020-09-01 08:41:29 | 2020-11-30 17:06:57 | 988 |
| Albany Ave & Bloomingdale Ave | 15655 | 2020-12-01 16:19:50 | 2021-08-31 22:50:08 | 3469 |
| Albany Ave & Montrose Ave | 480 | 2020-09-01 08:32:40 | 2020-11-30 15:48:55 | 614 |
| Albany Ave & Montrose Ave | 15621 | 2020-12-01 19:31:21 | 2021-08-31 19:36:53 | 1496 |
| Altgeld Gardens | 20212 | 2021-04-29 19:12:19 | 2021-08-24 18:21:22 | 84 |
| Archer (Damen) Ave & 37th St | 645 | 2020-09-01 22:34:37 | 2020-11-30 09:44:16 | 150 |
| Archer (Damen) Ave & 37th St | 18022 | 2020-12-01 17:30:51 | 2021-08-31 17:10:59 | 396 |
| Artesian Ave & Hubbard St | 376 | 2020-09-01 07:34:15 | 2020-11-30 20:07:33 | 886 |
| Artesian Ave & Hubbard St | 15664 | 2020-12-01 07:46:23 | 2021-08-31 16:56:55 | 1564 |
Conclusion: Divvy has changed station ids for most stations at the beginning of December 2020. This will not affect the analysis so I will leave it as is. What is important is that at the time of a ride each station has been assigned a unique id. Let’s see why this change happened.
Creating a 3-dimensional frequency table.
ftable(all_trips_v2$user_type, all_trips_v2$year_month, all_trips_v2$rideable_type)
classic_bike docked_bike electric_bike
casual 2020-09 0 166860 57251
2020-10 0 77464 63230
2020-11 0 44729 41296
2020-12 11129 4801 13526
2021-01 8141 2026 7552
2021-02 5491 1196 3077
2021-03 44734 15100 22385
2021-04 69391 23795 40221
2021-05 121322 41444 87520
2021-06 183950 49440 127428
2021-07 236632 55529 139456
2021-08 225733 43517 134755
member 2020-09 0 226706 68014
2020-10 0 152039 85355
2020-11 0 103106 65012
2020-12 58556 7660 33450
2021-01 52683 1 24681
2021-02 28540 0 9846
2021-03 105476 0 36713
2021-04 141562 0 55563
2021-05 182005 0 87425
2021-06 242527 0 109475
2021-07 260782 0 112381
2021-08 268693 0 116087
From September to November 2020 there were only two rideable types,
docked_bike and electric_bike. At the
beginning of December 2020 new rideable type is introduced, the
classic_bike, and a distinction is made between the
docked_bike and the classic_bike. Since the
beginning of 2021, casual riders can use classic and docked bikes, while
annual members only classic bikes. Therefore, we can not conclude a
preference for one rideable type over another between casuals and
members. Later on I will convert all docked bikes into classics and
compare preferences for classic or electric bikes.
all_trips_v2 %>%
group_by(start_station_id, year_month) %>%
summarise(n_distinct_start_station_name = n_distinct(start_station_name),
.groups = 'drop') %>%
filter(n_distinct_start_station_name > 1) %>%
kableExtra::kbl()
| start_station_id | year_month | n_distinct_start_station_name |
|---|---|---|
| 13074 | 2021-01 | 2 |
| 13099 | 2021-07 | 2 |
| 13221 | 2021-07 | 2 |
| 13300 | 2021-07 | 2 |
| 19 | 2020-09 | 2 |
| 26 | 2020-10 | 2 |
| 317 | 2020-09 | 2 |
| 332 | 2020-09 | 2 |
| 351 | 2021-08 | 2 |
| 503 | 2020-10 | 2 |
| 625 | 2020-11 | 2 |
| 631 | 2021-01 | 2 |
| 704 | 2020-09 | 2 |
| 709 | 2020-09 | 2 |
| 725 | 2020-10 | 2 |
| E011 | 2020-12 | 2 |
| LF-005 | 2021-07 | 2 |
| TA1305000039 | 2021-05 | 2 |
| TA1306000029 | 2021-07 | 2 |
| TA1307000041 | 2021-07 | 2 |
| TA1309000039 | 2021-07 | 2 |
| TA1309000049 | 2021-07 | 2 |
| NA | 2020-09 | 4 |
| NA | 2020-10 | 3 |
| NA | 2020-11 | 4 |
start_id <- c("13074", "13099", "13300", "19", "26", "317", "332", "351", "503",
"625", "631", "704", "709", "725", "E011", "LF-005", "TA1305000039",
"TA1306000029", "TA1307000041", "TA1309000039", "TA1309000049")
all_trips_v2 %>%
filter(start_station_id %in% start_id) %>%
group_by(start_station_id, start_station_name) %>%
summarise(min_datetime = min(started_at), max_datetime = max(started_at),
count = n(), .groups = 'drop' ) %>%
arrange(start_station_id, min_datetime) %>%
kableExtra::kbl()
| start_station_id | start_station_name | min_datetime | max_datetime | count |
|---|---|---|---|---|
| 13074 | Broadway & Wilson Ave | 2020-12-01 09:29:54 | 2021-01-26 19:50:38 | 425 |
| 13074 | Broadway & Wilson - Truman College Vaccination Site | 2021-01-27 14:35:48 | 2021-08-31 22:38:18 | 6036 |
| 13099 | Halsted St & 18th St | 2020-12-01 06:10:22 | 2021-07-28 12:51:03 | 1616 |
| 13099 | Halsted St & 18th St (Temp) | 2021-07-26 16:35:28 | 2021-08-31 23:54:30 | 509 |
| 13300 | Lake Shore Dr & Monroe St | 2020-12-01 08:26:56 | 2021-07-21 10:45:56 | 25133 |
| 13300 | DuSable Lake Shore Dr & Monroe St | 2021-07-20 19:20:12 | 2021-08-31 23:38:38 | 9220 |
| 19 | Throop (Loomis) St & Taylor St | 2020-09-01 00:06:50 | 2020-09-30 07:08:15 | 811 |
| 19 | Throop St & Taylor St | 2020-09-30 06:11:29 | 2020-11-30 17:30:36 | 1048 |
| 26 | McClurg Ct & Illinois St | 2020-09-01 05:05:44 | 2020-10-21 09:26:26 | 3877 |
| 26 | New St & Illinois St | 2020-10-18 17:00:24 | 2020-11-30 21:27:44 | 1234 |
| 317 | Wood St & Taylor St | 2020-09-01 09:42:40 | 2020-09-22 09:09:28 | 417 |
| 317 | Wood St & Taylor St (Temp) | 2020-09-02 14:44:03 | 2020-11-30 22:32:47 | 1241 |
| 317 | Long Ave & Belmont Ave | 2021-07-27 21:37:39 | 2021-08-30 11:23:10 | 34 |
| 332 | Burling St (Halsted) & Diversey Pkwy (Temp) | 2020-09-01 07:32:26 | 2020-09-23 15:16:31 | 1204 |
| 332 | Burling St & Diversey Pkwy | 2020-09-23 16:14:35 | 2020-11-30 23:05:39 | 2286 |
| 351 | Cottage Grove Ave & 51st St | 2020-09-01 12:43:12 | 2020-11-30 23:21:30 | 385 |
| 351 | Mulligan Ave & Wellington Ave | 2021-08-03 16:01:18 | 2021-08-30 17:06:17 | 41 |
| 351 | 351 | 2021-08-04 16:31:29 | 2021-08-07 23:59:38 | 2 |
| 503 | Drake Ave & Fullerton Ave | 2020-09-01 04:40:18 | 2020-10-01 13:50:08 | 447 |
| 503 | St. Louis Ave & Fullerton Ave | 2020-10-01 19:53:17 | 2020-11-30 20:20:55 | 392 |
| 625 | Chicago Ave & Dempster St | 2020-09-01 09:51:04 | 2020-11-30 21:35:09 | 731 |
| 625 | Dodge Ave & Main St | 2020-11-29 14:43:14 | 2020-11-29 15:25:01 | 3 |
| 631 | Malcolm X College | 2020-09-01 14:36:58 | 2021-01-23 18:39:19 | 311 |
| 631 | Malcolm X College Vaccination Site | 2021-01-27 19:13:29 | 2021-08-31 18:31:05 | 979 |
| 704 | Jeffery Blvd & 91st St | 2020-09-03 06:59:22 | 2020-09-20 15:05:01 | 19 |
| 704 | Avenue O & 134th St | 2020-09-23 18:40:05 | 2020-11-11 15:42:28 | 34 |
| 709 | Halsted St & 104th St | 2020-09-15 18:26:12 | 2020-09-16 08:01:57 | 8 |
| 709 | Michigan Ave & 114th St | 2020-09-17 18:27:01 | 2020-11-28 19:38:12 | 20 |
| 725 | Western Ave & 104th St | 2020-10-06 14:38:17 | 2020-10-06 14:38:17 | 1 |
| 725 | Halsted St & 104th St | 2020-10-13 13:05:17 | 2020-11-12 11:20:12 | 23 |
| E011 | Chicago Ave & Dempster St | 2020-12-01 18:39:42 | 2020-12-01 18:39:42 | 1 |
| E011 | Dodge Ave & Main St | 2020-12-20 18:35:35 | 2021-08-31 16:08:19 | 309 |
| LF-005 | Lake Shore Dr & North Blvd | 2020-12-01 07:21:59 | 2021-07-21 10:39:07 | 23613 |
| LF-005 | DuSable Lake Shore Dr & North Blvd | 2021-07-01 17:21:59 | 2021-08-31 21:30:07 | 12941 |
| TA1305000039 | Marshfield Ave & Cortland St | 2020-12-01 06:57:11 | 2021-05-26 09:06:13 | 2396 |
| TA1305000039 | Elston Ave & Cortland St | 2021-05-23 14:50:25 | 2021-08-31 22:54:49 | 3587 |
| TA1306000029 | Lake Shore Dr & Ohio St | 2020-12-01 05:10:32 | 2021-07-21 09:34:21 | 11047 |
| TA1306000029 | DuSable Lake Shore Dr & Ohio St | 2021-07-21 10:59:27 | 2021-08-31 23:47:54 | 4458 |
| TA1307000041 | Lake Shore Dr & Wellington Ave | 2020-12-01 08:32:58 | 2021-07-21 10:31:29 | 11320 |
| TA1307000041 | DuSable Lake Shore Dr & Wellington Ave | 2021-07-21 08:38:05 | 2021-08-31 21:16:41 | 5318 |
| TA1309000039 | Lake Shore Dr & Diversey Pkwy | 2020-12-01 06:19:39 | 2021-07-21 10:50:30 | 11543 |
| TA1309000039 | DuSable Lake Shore Dr & Diversey Pkwy | 2021-07-21 10:55:37 | 2021-08-31 22:12:24 | 5376 |
| TA1309000049 | Lake Shore Dr & Belmont Ave | 2020-12-01 01:39:00 | 2021-07-21 10:03:25 | 11101 |
| TA1309000049 | DuSable Lake Shore Dr & Belmont Ave | 2021-07-18 14:31:44 | 2021-08-31 22:52:17 | 5449 |
Among other changes, in July 2021 Chicago renamed the iconic Lake Shore Drive to honor its city’s ‘founder’ Jean Baptiste Point DuSable. It is now known as DuSable Lake Shore Drive. You can read the story here.
I will now recode old station names in the
start_station_name and end_station_name column
with new ones. This step is necessary if we want to get an accurate list
of the most popular stations.
all_trips_v2 <- all_trips_v2 %>%
mutate(start_station_name = recode(start_station_name,
"Broadway & Wilson Ave" = "Broadway & Wilson - Truman College Vaccination Site",
"Halsted St & 18th St" = "Halsted St & 18th St (Temp)",
"Lake Shore Dr & Monroe St" = "DuSable Lake Shore Dr & Monroe St",
"Throop (Loomis) St & Taylor St" = "Throop St & Taylor St",
"McClurg Ct & Illinois St" = "New St & Illinois St",
"Burling St (Halsted) & Diversey Pkwy (Temp)" = "Burling St & Diversey Pkwy",
"Drake Ave & Fullerton Ave" = "St. Louis Ave & Fullerton Ave",
"Malcolm X College" = "Malcolm X College Vaccination Site",
"Lake Shore Dr & North Blvd" = "DuSable Lake Shore Dr & North Blvd",
"Marshfield Ave & Cortland St" = "Elston Ave & Cortland St",
"Lake Shore Dr & Ohio St" = "DuSable Lake Shore Dr & Ohio St",
"Lake Shore Dr & Wellington Ave" = "DuSable Lake Shore Dr & Wellington Ave",
"Lake Shore Dr & Diversey Pkwy" = "DuSable Lake Shore Dr & Diversey Pkwy",
"Lake Shore Dr & Belmont Ave" = "DuSable Lake Shore Dr & Belmont Ave")) %>%
mutate(end_station_name = recode(end_station_name,
"Broadway & Wilson Ave" = "Broadway & Wilson - Truman College Vaccination Site",
"Halsted St & 18th St" = "Halsted St & 18th St (Temp)",
"Lake Shore Dr & Monroe St" = "DuSable Lake Shore Dr & Monroe St",
"Throop (Loomis) St & Taylor St" = "Throop St & Taylor St",
"McClurg Ct & Illinois St" = "New St & Illinois St",
"Burling St (Halsted) & Diversey Pkwy (Temp)" = "Burling St & Diversey Pkwy",
"Drake Ave & Fullerton Ave" = "St. Louis Ave & Fullerton Ave",
"Malcolm X College" = "Malcolm X College Vaccination Site",
"Lake Shore Dr & North Blvd" = "DuSable Lake Shore Dr & North Blvd",
"Marshfield Ave & Cortland St" = "Elston Ave & Cortland St",
"Lake Shore Dr & Ohio St" = "DuSable Lake Shore Dr & Ohio St",
"Lake Shore Dr & Wellington Ave" = "DuSable Lake Shore Dr & Wellington Ave",
"Lake Shore Dr & Diversey Pkwy" = "DuSable Lake Shore Dr & Diversey Pkwy",
"Lake Shore Dr & Belmont Ave" = "DuSable Lake Shore Dr & Belmont Ave"))
start_station_name, start_station_id,
end_station_name, and end_station_id
column.all_trips_NA2 <- all_trips_v2 %>%
filter(is.na(start_station_name) |
is.na(end_station_name) |
is.na(start_station_id) |
is.na(end_station_id))
# number of NAs in each column
colSums(is.na(all_trips_NA2))
ride_id rideable_type started_at
0 0 0
ended_at start_station_name start_station_id
0 433066 433555
end_station_name end_station_id user_type
465210 465557 0
year_month day_of_week hour
0 0 0
ride_length
0
table(all_trips_NA2$year_month, all_trips_NA2$rideable_type)
classic_bike electric_bike
2020-09 0 30366
2020-10 0 47049
2020-11 0 35629
2020-12 108 16863
2021-01 135 12485
2021-02 107 5956
2021-03 182 21691
2021-04 161 37194
2021-05 197 77127
2021-06 346 115639
2021-07 473 124787
2021-08 378 125277
# contingency table for the whole dataset
table(all_trips_v2$year_month, all_trips_v2$rideable_type)
classic_bike docked_bike electric_bike
2020-09 0 393566 125265
2020-10 0 229503 148585
2020-11 0 147835 106308
2020-12 69685 12461 46976
2021-01 60824 2027 32233
2021-02 34031 1196 12923
2021-03 150210 15100 59098
2021-04 210953 23795 95784
2021-05 303327 41444 174945
2021-06 426477 49440 236903
2021-07 497414 55529 251837
2021-08 494426 43517 250842
# A tibble: 2 × 2
user_type n
<chr> <int>
1 casual 322694
2 member 329456
summary(all_trips_NA2$ride_length)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 6.82 12.38 17.82 22.13 180.00
Deleting the observations with missing values can reduce the statistical power of the analysis. We must understand why the data is missing. The reason for missing values here is the fact that electric bikes can be parked outside of the stations within a service area. You can find more information here. In Zone 1, an out-of-station parking fee ($2) will be charged. In Zone 2, the out-of-station parking fee will be waived to account for the lower density of stations.
There is no way to substitute missing vales and nothing indicates that something is wrong with this subset. If I delete it I will lose a small percentage of rides taken with classic bikes (0.1%) and a lot of rides taken with electric bikes (42%). I will keep this observations.
rideable_type column to bike_type, and
recoding docked_bike to classic_bikeAs stated before, comparing casual riders and annual members by
rideable_type is not appropriate. Still, I would like to
compare them by the bike_type.
# A tibble: 2 × 2
bike_type n
<chr> <int>
1 classic_bike 3262760
2 electric_bike 1541699
# final dataset dimensions
dim_desc(all_trips_v2)
[1] "[4,804,459 x 8]"
[1] 0.02210694
In this step I will try to find an answer to the question “How do annual members and casual riders use Cyclistic bikes differently?” and share my key findings by analyzing the following:
# theme customization
my_theme <- theme(plot.title=element_text(size=14),
plot.subtitle=element_text(size=10),
axis.text.x=element_text(size=10),
axis.text.y=element_text(size=10),
axis.title.x=element_text(size=10),
axis.title.y=element_text(size=10),
strip.text = element_text(size=12),
legend.title=element_text(size=11),
legend.text=element_text(size=11))
my_colors <- c("#355273", "#FF3030")
Total Rides by User Type
total_rides_by_user_type <- all_trips_v2 %>%
select(user_type) %>%
group_by(user_type) %>%
summarise(total_rides = n(), .groups = 'drop') %>%
mutate(percentage = scales::percent(total_rides/sum(total_rides), accuracy = 0.1))
knitr::kable(total_rides_by_user_type)
| user_type | total_rides | percentage |
|---|---|---|
| casual | 2170121 | 45.2% |
| member | 2634338 | 54.8% |
# making a donut chart with webr package
webr::PieDonut(total_rides_by_user_type, aes(user_type, count = total_rides), r0 = 0.7, r1 = 0.9,
labelpositionThreshold = 1, showPieName = FALSE,
pieAlpha = 1) +
scale_fill_manual(values = my_colors) +
annotate(geom = 'text', x = 0, y = 0,
label = str_c("Totak Rides: ", round(sum(total_rides_by_user_type$total_rides)/1e6, 1), "M"),
size = 4.7) +
theme_void()
Total Rides by Month
total_rides_by_month <- all_trips_v2 %>%
select(user_type, year_month) %>%
group_by(user_type, year_month) %>%
summarise(total_rides = n()) %>%
mutate(percentage = scales::percent(total_rides/sum(total_rides), accuracy = 0.1)) %>%
ungroup()
knitr::kable(total_rides_by_month)
| user_type | year_month | total_rides | percentage |
|---|---|---|---|
| casual | 2020-09 | 224111 | 10.3% |
| casual | 2020-10 | 140694 | 6.5% |
| casual | 2020-11 | 86025 | 4.0% |
| casual | 2020-12 | 29456 | 1.4% |
| casual | 2021-01 | 17719 | 0.8% |
| casual | 2021-02 | 9764 | 0.4% |
| casual | 2021-03 | 82219 | 3.8% |
| casual | 2021-04 | 133407 | 6.1% |
| casual | 2021-05 | 250286 | 11.5% |
| casual | 2021-06 | 360818 | 16.6% |
| casual | 2021-07 | 431617 | 19.9% |
| casual | 2021-08 | 404005 | 18.6% |
| member | 2020-09 | 294720 | 11.2% |
| member | 2020-10 | 237394 | 9.0% |
| member | 2020-11 | 168118 | 6.4% |
| member | 2020-12 | 99666 | 3.8% |
| member | 2021-01 | 77365 | 2.9% |
| member | 2021-02 | 38386 | 1.5% |
| member | 2021-03 | 142189 | 5.4% |
| member | 2021-04 | 197125 | 7.5% |
| member | 2021-05 | 269430 | 10.2% |
| member | 2021-06 | 352002 | 13.4% |
| member | 2021-07 | 373163 | 14.2% |
| member | 2021-08 | 384780 | 14.6% |
ggplot(total_rides_by_month, aes(x = year_month, y = total_rides, fill = user_type)) +
geom_col(width = 0.65, position = position_dodge(0.75)) +
scale_y_continuous(labels = scales::comma) +
scale_fill_manual(values = my_colors) +
labs(title = "Total Rides by Month", subtitle = "September 2020 - August 2021",
x = "", y = "", fill = "User Type") +
my_theme +
theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")
It is evident that the number of rides through the months directly correlates with the weather. Weather history in Chicago (Weather Spark) for the period September 2020 - August 2021 reveals common temperatures throughout the year with the exception of February 2021 (freezing, snow) and the summer months June, July,and August 2021 (above-average temperatures).
The number of rides taken by casuals exceeded the number of rides taken by members only in June, July and August 2021, during which time casual rides account for 55.1% of total casual rides.
The number of rides by casuals in relation to members is much lower in the period from October 2020 to January 2021. The possible cause is the COVID-19 pandemic, We can see the number of new cases per capita in the following animation.
Total Rides by Day of the Week
total_rides_by_dow <- all_trips_v2 %>%
select(user_type, day_of_week) %>%
group_by(user_type, day_of_week) %>%
summarise(total_rides = n()) %>%
mutate(percentage = scales::percent(total_rides/sum(total_rides), accuracy = 0.1)) %>%
ungroup()
knitr::kable(total_rides_by_dow)
| user_type | day_of_week | total_rides | percentage |
|---|---|---|---|
| casual | Monday | 244484 | 11.3% |
| casual | Tuesday | 236599 | 10.9% |
| casual | Wednesday | 236314 | 10.9% |
| casual | Thursday | 242190 | 11.2% |
| casual | Friday | 314444 | 14.5% |
| casual | Saturday | 486516 | 22.4% |
| casual | Sunday | 409574 | 18.9% |
| member | Monday | 357796 | 13.6% |
| member | Tuesday | 393073 | 14.9% |
| member | Wednesday | 399560 | 15.2% |
| member | Thursday | 383457 | 14.6% |
| member | Friday | 388557 | 14.7% |
| member | Saturday | 381707 | 14.5% |
| member | Sunday | 330188 | 12.5% |
ggplot(total_rides_by_dow, aes(x = day_of_week, y = total_rides, fill = user_type)) +
geom_col(width = 0.65, position = position_dodge(0.75)) +
scale_y_continuous(labels = scales::comma) +
scale_fill_manual(values = my_colors) +
labs(title = "Total Rides by Day of the Week", subtitle = "September 2020 - August 2021",
x = "", y = "", fill = "User Type") +
my_theme +
theme(legend.position = "top")
Casual riders prefer Saturday rides (22.4% of total casual rides). Sunday is the second highest day (18.9%), followed by Friday (14.5%). Rides from Monday to Thursday are equally split (11%).
Members’ rides are much more evenly split (13-15%). Members took the least rides on Sundays (12.5%).
Total Rides by Hour
total_rides_by_hour <- all_trips_v2 %>%
select(user_type, hour) %>%
group_by(user_type, hour) %>%
summarise(total_rides = n()) %>%
mutate(percentage = scales::percent(total_rides/sum(total_rides), accuracy = 0.1)) %>%
ungroup()
knitr::kable(total_rides_by_hour)
| user_type | hour | total_rides | percentage |
|---|---|---|---|
| casual | 0 | 43483 | 2.0% |
| casual | 1 | 30951 | 1.4% |
| casual | 2 | 19563 | 0.9% |
| casual | 3 | 10690 | 0.5% |
| casual | 4 | 7551 | 0.3% |
| casual | 5 | 9465 | 0.4% |
| casual | 6 | 20186 | 0.9% |
| casual | 7 | 35908 | 1.7% |
| casual | 8 | 50059 | 2.3% |
| casual | 9 | 61548 | 2.8% |
| casual | 10 | 87265 | 4.0% |
| casual | 11 | 116385 | 5.4% |
| casual | 12 | 141729 | 6.5% |
| casual | 13 | 152618 | 7.0% |
| casual | 14 | 159007 | 7.3% |
| casual | 15 | 167520 | 7.7% |
| casual | 16 | 182248 | 8.4% |
| casual | 17 | 208923 | 9.6% |
| casual | 18 | 187132 | 8.6% |
| casual | 19 | 143626 | 6.6% |
| casual | 20 | 105533 | 4.9% |
| casual | 21 | 86832 | 4.0% |
| casual | 22 | 79799 | 3.7% |
| casual | 23 | 62100 | 2.9% |
| member | 0 | 24795 | 0.9% |
| member | 1 | 15890 | 0.6% |
| member | 2 | 9038 | 0.3% |
| member | 3 | 5144 | 0.2% |
| member | 4 | 6306 | 0.2% |
| member | 5 | 24432 | 0.9% |
| member | 6 | 71187 | 2.7% |
| member | 7 | 126402 | 4.8% |
| member | 8 | 139994 | 5.3% |
| member | 9 | 109507 | 4.2% |
| member | 10 | 111689 | 4.2% |
| member | 11 | 137262 | 5.2% |
| member | 12 | 160348 | 6.1% |
| member | 13 | 158130 | 6.0% |
| member | 14 | 157059 | 6.0% |
| member | 15 | 177986 | 6.8% |
| member | 16 | 224585 | 8.5% |
| member | 17 | 279870 | 10.6% |
| member | 18 | 239079 | 9.1% |
| member | 19 | 169026 | 6.4% |
| member | 20 | 110341 | 4.2% |
| member | 21 | 77320 | 2.9% |
| member | 22 | 58519 | 2.2% |
| member | 23 | 40429 | 1.5% |
ggplot(total_rides_by_hour, aes(x = hour, y = total_rides, color = user_type)) +
geom_line(aes(group = user_type), size = 1) +
scale_y_continuous(labels = scales::comma) +
scale_color_manual(values = my_colors) +
labs(title = "Total Rides by Hour", subtitle = "September 2020 - August 2021",
x = "", y = "", color = "User Type") +
expand_limits(y = 3e5) +
my_theme +
theme(legend.position = "top")
Among members we see spikes in use at 8am and 5pm with another small bump at 12 noon. Annual members are locals and frequent riders. They use bikes to commute to work or school, run errands, or get to appointments.
Among casual riders we see a spike in use at 5pm. Casual riders are one-way commuters. Overall, they tend to ride in the afternoon.
Ride Length summary statistics by user type in minutes.
all_trips_v2 %>%
select(user_type, ride_length) %>%
group_by(user_type) %>%
summarize(min = min(ride_length),
q1 = quantile(ride_length, 0.25),
median = median(ride_length),
mean = mean(ride_length),
q3 = quantile(ride_length, 0.75),
max = max(ride_length))
# A tibble: 2 × 7
user_type min q1 median mean q3 max
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 casual 1 9.88 17.2 26.1 31.2 180
2 member 1 6.12 10.4 13.8 17.8 180.
The average ride length for casuals (26 min) is almost twice as long as the average ride length for members (14 min). On average, rides by casuals last 12 minutes longer than rides by annual members.
Average Ride Length by Day of the Week
avg_ride_length_by_dow <- all_trips_v2 %>%
select(user_type, day_of_week, ride_length) %>%
group_by(user_type, day_of_week) %>%
summarise(avg_ride_length = mean(ride_length) %>% round(2)) %>%
ungroup()
knitr::kable(avg_ride_length_by_dow)
| user_type | day_of_week | avg_ride_length |
|---|---|---|
| casual | Monday | 26.39 |
| casual | Tuesday | 23.88 |
| casual | Wednesday | 23.25 |
| casual | Thursday | 22.63 |
| casual | Friday | 24.25 |
| casual | Saturday | 28.29 |
| casual | Sunday | 29.76 |
| member | Monday | 13.34 |
| member | Tuesday | 13.11 |
| member | Wednesday | 13.21 |
| member | Thursday | 13.04 |
| member | Friday | 13.48 |
| member | Saturday | 15.35 |
| member | Sunday | 15.62 |
ggplot(avg_ride_length_by_dow, aes(x = day_of_week, y = avg_ride_length, fill = user_type)) +
geom_col(width = 0.665, position = position_dodge(0.75)) +
scale_y_continuous(labels = scales::comma) +
scale_fill_manual(values = my_colors) +
labs(title = "Average Ride Length (minute) by Day of the Week",
subtitle = "September 2020 - August 2021",
x = "", y = "", fill = "User Type") +
my_theme +
theme(legend.position = "top")
Avaerage ride length for members is constant from Monday to Friday (13 min), with slight increase on Saturdays and Sundays (15 min).
Avaerage ride length for casuals varies during the week (from 22 to 30 min), Highest average ride length is on Sundays (30 min), followed by Saturdays (28 min).
Average Ride Length by Hour
avg_ride_length_by_hour <- all_trips_v2 %>%
select(user_type, hour, ride_length) %>%
group_by(user_type, hour) %>%
summarise(avg_ride_length = mean(ride_length) %>% round(2)) %>%
ungroup()
knitr::kable(avg_ride_length_by_hour)
| user_type | hour | avg_ride_length |
|---|---|---|
| casual | 0 | 23.48 |
| casual | 1 | 22.59 |
| casual | 2 | 21.83 |
| casual | 3 | 21.65 |
| casual | 4 | 19.90 |
| casual | 5 | 18.87 |
| casual | 6 | 17.03 |
| casual | 7 | 18.05 |
| casual | 8 | 20.33 |
| casual | 9 | 25.39 |
| casual | 10 | 28.84 |
| casual | 11 | 29.63 |
| casual | 12 | 29.30 |
| casual | 13 | 29.98 |
| casual | 14 | 29.98 |
| casual | 15 | 28.87 |
| casual | 16 | 26.94 |
| casual | 17 | 24.95 |
| casual | 18 | 24.19 |
| casual | 19 | 24.35 |
| casual | 20 | 24.48 |
| casual | 21 | 23.80 |
| casual | 22 | 23.28 |
| casual | 23 | 22.90 |
| member | 0 | 12.72 |
| member | 1 | 13.00 |
| member | 2 | 12.92 |
| member | 3 | 13.16 |
| member | 4 | 12.21 |
| member | 5 | 11.47 |
| member | 6 | 12.26 |
| member | 7 | 12.44 |
| member | 8 | 12.51 |
| member | 9 | 13.02 |
| member | 10 | 13.78 |
| member | 11 | 14.09 |
| member | 12 | 13.93 |
| member | 13 | 14.31 |
| member | 14 | 14.73 |
| member | 15 | 14.56 |
| member | 16 | 14.44 |
| member | 17 | 14.51 |
| member | 18 | 14.28 |
| member | 19 | 13.97 |
| member | 20 | 13.65 |
| member | 21 | 13.37 |
| member | 22 | 13.07 |
| member | 23 | 12.80 |
ggplot(avg_ride_length_by_hour, aes(x = hour, y = avg_ride_length, color = user_type)) +
geom_line(aes(group = user_type), size = 1) +
scale_y_continuous(labels = scales::comma) +
scale_color_manual(values = my_colors) +
labs(title = "Average Ride Length (minute) by Hour", subtitle = "September 2020 - August 2021",
x = "", y = "", color = "User Type") +
my_theme +
theme(legend.position = "top")
The longest rides for casuals start in late mornings and afternoons. Average ride length for members is pretty much constant during the day.
Average Ride Length by Hour and Day of the Week
all_trips_v2 %>%
group_by(user_type, day_of_week, hour) %>%
summarise(avg_ride_length = mean(ride_length), .groups = 'drop') %>%
ggplot(aes(x = hour, y = avg_ride_length, color = user_type)) +
geom_line(aes(group = user_type), size=1) +
facet_wrap(~day_of_week) +
scale_y_continuous(labels = scales::comma) +
scale_x_discrete(breaks = seq(1, 23, 2)) +
scale_color_manual(values = my_colors) +
labs(title = "Average Ride Length by Hour and Day of the Week",
subtitle = "September 2020 - August 2021",
x = "", y = "", color = "User Type") +
my_theme +
theme(legend.position = "top")
biketype_usage <- all_trips_v2 %>%
select(user_type, bike_type) %>%
group_by(user_type, bike_type) %>%
summarise(total_rides = n()) %>%
mutate(percentage = scales::percent(total_rides/sum(total_rides), accuracy = 0.1)) %>%
ungroup() %>%
pivot_wider(-total_rides, names_from = bike_type, values_from = percentage)
knitr::kable(biketype_usage)
| user_type | classic_bike | electric_bike |
|---|---|---|
| casual | 66.0% | 34.0% |
| member | 69.5% | 30.5% |
On average, casual riders took 66% of total casual rides with classic bikes and 34% with electric. Members took slightly less rides with electric bikes (30.5%) than casuals.
What is the situation like if we group the rides by month?
biketype_usage_by_month <- all_trips_v2 %>%
group_by(user_type, year_month, bike_type) %>%
summarise(total_rides = n()) %>%
mutate(percentage = scales::percent(total_rides/sum(total_rides), accuracy = 0.01))
knitr::kable(biketype_usage_by_month)
| user_type | year_month | bike_type | total_rides | percentage |
|---|---|---|---|---|
| casual | 2020-09 | classic_bike | 166860 | 74.45% |
| casual | 2020-09 | electric_bike | 57251 | 25.55% |
| casual | 2020-10 | classic_bike | 77464 | 55.06% |
| casual | 2020-10 | electric_bike | 63230 | 44.94% |
| casual | 2020-11 | classic_bike | 44729 | 52.00% |
| casual | 2020-11 | electric_bike | 41296 | 48.00% |
| casual | 2020-12 | classic_bike | 15930 | 54.08% |
| casual | 2020-12 | electric_bike | 13526 | 45.92% |
| casual | 2021-01 | classic_bike | 10167 | 57.38% |
| casual | 2021-01 | electric_bike | 7552 | 42.62% |
| casual | 2021-02 | classic_bike | 6687 | 68.49% |
| casual | 2021-02 | electric_bike | 3077 | 31.51% |
| casual | 2021-03 | classic_bike | 59834 | 72.77% |
| casual | 2021-03 | electric_bike | 22385 | 27.23% |
| casual | 2021-04 | classic_bike | 93186 | 69.85% |
| casual | 2021-04 | electric_bike | 40221 | 30.15% |
| casual | 2021-05 | classic_bike | 162766 | 65.03% |
| casual | 2021-05 | electric_bike | 87520 | 34.97% |
| casual | 2021-06 | classic_bike | 233390 | 64.68% |
| casual | 2021-06 | electric_bike | 127428 | 35.32% |
| casual | 2021-07 | classic_bike | 292161 | 67.69% |
| casual | 2021-07 | electric_bike | 139456 | 32.31% |
| casual | 2021-08 | classic_bike | 269250 | 66.65% |
| casual | 2021-08 | electric_bike | 134755 | 33.35% |
| member | 2020-09 | classic_bike | 226706 | 76.92% |
| member | 2020-09 | electric_bike | 68014 | 23.08% |
| member | 2020-10 | classic_bike | 152039 | 64.05% |
| member | 2020-10 | electric_bike | 85355 | 35.95% |
| member | 2020-11 | classic_bike | 103106 | 61.33% |
| member | 2020-11 | electric_bike | 65012 | 38.67% |
| member | 2020-12 | classic_bike | 66216 | 66.44% |
| member | 2020-12 | electric_bike | 33450 | 33.56% |
| member | 2021-01 | classic_bike | 52684 | 68.10% |
| member | 2021-01 | electric_bike | 24681 | 31.90% |
| member | 2021-02 | classic_bike | 28540 | 74.35% |
| member | 2021-02 | electric_bike | 9846 | 25.65% |
| member | 2021-03 | classic_bike | 105476 | 74.18% |
| member | 2021-03 | electric_bike | 36713 | 25.82% |
| member | 2021-04 | classic_bike | 141562 | 71.81% |
| member | 2021-04 | electric_bike | 55563 | 28.19% |
| member | 2021-05 | classic_bike | 182005 | 67.55% |
| member | 2021-05 | electric_bike | 87425 | 32.45% |
| member | 2021-06 | classic_bike | 242527 | 68.90% |
| member | 2021-06 | electric_bike | 109475 | 31.10% |
| member | 2021-07 | classic_bike | 260782 | 69.88% |
| member | 2021-07 | electric_bike | 112381 | 30.12% |
| member | 2021-08 | classic_bike | 268693 | 69.83% |
| member | 2021-08 | electric_bike | 116087 | 30.17% |
ggplot(biketype_usage_by_month, aes(x = year_month, y = total_rides, fill = bike_type)) +
geom_col(color = "black", width = 0.7, position = "fill") +
facet_wrap(~user_type) +
scale_y_continuous(labels = scales::percent) +
scale_fill_manual(breaks = c("classic_bike", "electric_bike"),
values = c("#A0CBE8", "#4E79A7")) +
labs(title = "Bike Type Usage by Month", subtitle = "September 2020 - August 2021",
x = "", y = "") +
my_theme +
theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")
We can see that from October 2020 to January 2021 more rides are taken with electric bikes than on average. Since fewer rides were achieved in those months, both groups had more electric bikes at their disposal.
Top 20 most popular start stations for casuals
top_start_casual <- all_trips_v2 %>%
filter(!is.na(start_station_name), user_type == "casual") %>%
group_by(user_type, start_station_name) %>%
summarise(total_rides = n(), .groups = 'drop') %>%
arrange(desc(total_rides)) %>%
head(20)
top_start_casual
# A tibble: 20 × 3
user_type start_station_name total_rides
<chr> <chr> <int>
1 casual Streeter Dr & Grand Ave 55539
2 casual DuSable Lake Shore Dr & Monroe St 33604
3 casual Millennium Park 30505
4 casual Michigan Ave & Oak St 27212
5 casual DuSable Lake Shore Dr & North Blvd 26677
6 casual Theater on the Lake 21516
7 casual Shedd Aquarium 20644
8 casual Wells St & Concord Ln 17111
9 casual Indiana Ave & Roosevelt Rd 16393
10 casual Clark St & Lincoln Ave 15450
11 casual Clark St & Elm St 15368
12 casual Clark St & Armitage Ave 14708
13 casual Wells St & Elm St 14695
14 casual Wabash Ave & Grand Ave 14577
15 casual Michigan Ave & Lake St 14354
16 casual Dusable Harbor 14200
17 casual Michigan Ave & Washington St 13744
18 casual New St & Illinois St 13198
19 casual Michigan Ave & 8th St 12629
20 casual Buckingham Fountain 12321
Top 20 most popular start stations for members
top_start_member <- all_trips_v2 %>%
filter(!is.na(start_station_name), user_type == "member") %>%
group_by(user_type, start_station_name) %>%
summarise(total_rides = n(), .groups = 'drop') %>%
arrange(desc(total_rides)) %>%
head(20)
top_start_member
# A tibble: 20 × 3
user_type start_station_name total_rides
<chr> <chr> <int>
1 member Clark St & Elm St 23532
2 member Wells St & Concord Ln 20947
3 member Kingsbury St & Kinzie St 20191
4 member Wells St & Elm St 19067
5 member Dearborn St & Erie St 18145
6 member Wells St & Huron St 17600
7 member DuSable Lake Shore Dr & North Blvd 17590
8 member Broadway & Barry Ave 17545
9 member St. Clair St & Erie St 17486
10 member Theater on the Lake 16401
11 member Clark St & Armitage Ave 16123
12 member Desplaines St & Kinzie St 15820
13 member Clark St & Lincoln Ave 15261
14 member Wabash Ave & Grand Ave 14926
15 member Streeter Dr & Grand Ave 14458
16 member Larrabee St & Webster Ave 13948
17 member Columbus Dr & Randolph St 13942
18 member Clinton St & Madison St 13502
19 member Green St & Madison St 13421
20 member Dearborn Pkwy & Delaware Pl 13389
I’m going to bind the top_start_casual and top_start_member dataframe and join coordinates from the divvy_stations dataframe.
top_start_stations <- bind_rows(top_start_casual, top_start_member) %>%
left_join(divvy_stations, by = c("start_station_name" = "station_name")) %>%
select(user_type, start_station_name, total_rides, latitude, longitude)
knitr::kable(top_start_stations %>% head())
| user_type | start_station_name | total_rides | latitude | longitude |
|---|---|---|---|---|
| casual | Streeter Dr & Grand Ave | 55539 | 41.89228 | -87.61204 |
| casual | DuSable Lake Shore Dr & Monroe St | 33604 | 41.88096 | -87.61674 |
| casual | Millennium Park | 30505 | 41.88103 | -87.62408 |
| casual | Michigan Ave & Oak St | 27212 | 41.90096 | -87.62378 |
| casual | DuSable Lake Shore Dr & North Blvd | 26677 | 41.91172 | -87.62680 |
| casual | Theater on the Lake | 21516 | 41.92628 | -87.63083 |
# creating a new variable to distinguish stations by number of rides
top_start_stations <- top_start_stations %>%
mutate(circle_size = case_when(total_rides>10000 & total_rides<=20000 ~ 6,
total_rides>20000 & total_rides<=30000 ~ 7,
total_rides>30000 & total_rides<=40000 ~ 8,
total_rides>40000 & total_rides<=50000 ~ 9,
TRUE ~ 10))
# subsetting top stations for casuals and members
casual <- top_start_stations %>%
filter(user_type == "casual")
member <- top_start_stations %>%
filter(user_type == "member")
# Creating a color palette
mypalette <- colorFactor(my_colors, domain = top_start_stations$user_type)
# Preparing the text for the tooltip
mytext_cas <- paste(
"Station: ", casual$start_station_name, "<br/>",
"User type: ", casual$user_type, "<br/>",
"Total rides: ", casual$total_rides, sep="") %>%
lapply(htmltools::HTML)
mytext_mem <- paste(
"Station: ", member$start_station_name, "<br/>",
"User type: ", member$user_type, "<br/>",
"Total rides: ", member$total_rides, sep="") %>%
lapply(htmltools::HTML)
# final map
leaflet(top_start_stations) %>%
addProviderTiles("CartoDB") %>%
addCircleMarkers(data = casual,
fillColor = ~mypalette(user_type),
fillOpacity = 0.7,
color = "white",
radius = ~circle_size,
stroke = FALSE,
label = mytext_cas,
labelOptions = labelOptions(style = list("font-weight"="normal",
padding = "3px 8px"), textsize = "12px", direction = "auto"),
group = "casual") %>%
addCircleMarkers(data = member,
fillColor = ~mypalette(user_type),
fillOpacity = 0.7,
color = "white",
radius = ~circle_size,
stroke = FALSE,
label = mytext_mem,
labelOptions = labelOptions(style = list("font-weight"="normal",
padding = "3px 8px"), textsize = "12px", direction = "auto"),
group = "member") %>%
addLegend(pal = mypalette,
values = ~user_type,
opacity = 0.7,
title = "User type",
position = "bottomright" ) %>%
addLayersControl(overlayGroups = c("casual", "member"),
options = layersControlOptions(collapsed = FALSE)) %>%
leaflet.extras::addResetMapButton()
Most popular stations for casual riders are Millennium Park and those located along the DuSable Lake Shore Drive. These are all localities for entertainment and leisure activities, which is indicative of the main purpose of these rides.
Most popular stations for members are located nearby or inside the business district, which is indicative of the main purpose of these rides (commuting to work or school, running errands, getting to appointments, and similar).
Note: Most popular starting and destination stations for both casuals and members don’t differ much.
Casual riders can be locals or visitors (tourists). With our new marketing campaign we should target only locals since there is little chance that visitors would buy annual membership. Unfortunately, there is no way to distinguish locals from visitors in the group of casual riders and this is the main problem with this dataset. For now, I will have to settle for the data I currently have.
My top three recommendations for the new marketing strategy aimed at
converting casual riders into annual members:
1. Conduct the
marketing campaign during the summer months (June, July, August), mostly
on weekends in the afternoon, but also on weekdays around 5pm.
2.
Use the fact that casual riders tend to ride 12+ minutes longer than
annual members.
3. Act in the areas of stations which are most
popular with casual riders.
Thank you for reaching the end of this project! 😉
If you’d like, you can also check my dashboard in Tableau Public.