Foreword
In September 2021, I completed the Google Data Analytics Professional Certificate 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 was my first encounter with databases and analytics tools. I really enjoyed it very much, and I have to say, it made some useful corrections to my analytical mind. I am very grateful for that and highly recommend it!
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 case study to showcase what I have learned. In terms of analytics, this was my very first project and I hope you’ll enjoy it!
Introduction
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:
- How do annual members and casual riders use Cyclistic bikes differently?
- Why would casual riders buy Cyclistic annual memberships?
- How can Cyclistic use digital media to influence casual riders to become members?
Lily Moreno, the director of marketing and my manager has assigned me the first question to answer.
✨ PART I: Ask
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
- Lily Moreno: the Director of Marketing and my manager
- Cyclistic Executive Team: the notoriously detail-oriented executive team who will decide whether to approve the recommended marketing program.
Secondary Stakeholders
- Cyclistic Marketing Analytics Team: a team of data analysts who are responsible for collecting, analyzing, and reporting data that helps guide Cyclistic marketing strategy (my team)
✨ PART II: Prepare
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.
Data dictionary
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 date and time |
4 | ended_at |
Date & Time | Trip end date 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
, andelectric_bike
.classic_bike
is actually a classic dockless bike,docked_bike
is a classic docked bike, andelectric_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 at the traditional Divvy stations.member_casual
- there are two possible values for this variable:casual
andmember
, 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 an Annual Membership (unlimited 45-min rides). This is important because, in the cleaning step of the analysis, I will filter out all trips with a ride length longer than 3 hours.
Data issues
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 reason for this is that electric bikes can be parked outside of the stations within a service area. The following maps made in Tableau on just one month of data serve to illustrate this issue:
Therefore, we’ll additionally use the publicly available CSV 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. We’ll also use it to check current station names.
Setting up the programming environment
# loading packages
library(tidyverse)
library(lubridate)
library(janitor)
library(skimr)
library(leaflet)
library(reactable)
library(htmltools)
# ggplot theme
theme_set(theme_classic())
Reading the datasets
Let’s see what’s in the data directory.
<- "data"
data_dir
::dir_ls(data_dir) fs
data/202009-divvy-tripdata.csv data/202010-divvy-tripdata.csv
data/202011-divvy-tripdata.csv data/202012-divvy-tripdata.csv
data/202101-divvy-tripdata.csv data/202102-divvy-tripdata.csv
data/202103-divvy-tripdata.csv data/202104-divvy-tripdata.csv
data/202105-divvy-tripdata.csv data/202106-divvy-tripdata.csv
data/202107-divvy-tripdata.csv data/202108-divvy-tripdata.csv
data/Divvy_Bicycle_Stations.csv
We’ll combine dir_ls()
, map_dfr()
and read_csv()
to find data files with monthly trip data in the directory and read them all together into a single data frame. Columns start_station_id
and end_station_id
in the first three datasets (2020-Sep to 2020-Nov) are of the numeric data type, and all the rest are of characters. To make row binding possible, we’ll give an instruction to read them all as characters.
# monthly trip data
<- data_dir %>%
all_trips ::dir_ls(regexp = "tripdata") %>%
fsmap_dfr(read_csv,
col_types = cols("start_station_id" = col_character(),
"end_station_id" = col_character()))
# current Divvy stations with coordinates
<- read_csv("data/Divvy_Bicycle_Stations.csv") %>%
divvy_stations clean_names()
Data overview
Monthly trip data
# data dimensions (rows x columns)
dim_desc(all_trips)
[1] "[4,913,072 x 13]"
It’s a large dataset with almost 5 million rows and 13 columns.
glimpse(all_trips)
Rows: 4,913,072
Columns: 13
$ ride_id <chr> "2B22BD5F95FB2629", "A7FB70B4AFC6CAF2", "86057FA01B…
$ rideable_type <chr> "electric_bike", "electric_bike", "electric_bike", …
$ started_at <dttm> 2020-09-17 14:27:11, 2020-09-17 15:07:31, 2020-09-…
$ ended_at <dttm> 2020-09-17 14:44:24, 2020-09-17 15:07:45, 2020-09-…
$ start_station_name <chr> "Michigan Ave & Lake St", "W Oakdale Ave & N Broadw…
$ start_station_id <chr> "52", NA, NA, "246", "24", "94", "291", NA, NA, NA,…
$ end_station_name <chr> "Green St & Randolph St", "W Oakdale Ave & N Broadw…
$ end_station_id <chr> "112", NA, NA, "249", "24", NA, "256", NA, NA, NA, …
$ start_lat <dbl> 41.88669, 41.94000, 41.94000, 41.95606, 41.89186, 4…
$ start_lng <dbl> -87.62356, -87.64000, -87.64000, -87.66892, -87.621…
$ end_lat <dbl> 41.88357, 41.94000, 41.94000, 41.96398, 41.89135, 4…
$ end_lng <dbl> -87.64873, -87.64000, -87.64000, -87.63822, -87.620…
$ member_casual <chr> "casual", "casual", "casual", "casual", "casual", "…
::paged_table(head(all_trips)) rmarkdown
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"
Datetimes are stored in the UTC timezone, which is good considering I’m in Europe.
Current Divvy stations with corresponding coordinates
dim_desc(divvy_stations)
[1] "[785 x 8]"
::paged_table(head(divvy_stations)) rmarkdown
✨ PART III - Process
In this step, we are going to explore the data further and finally clean it.
Right now we can aggregate data only at the ride level, so we’ll 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.
<- all_trips %>%
all_trips mutate(year_month = format(started_at, "%Y-%m") %>% as_factor(),
day_of_week = wday(started_at, label = TRUE,
week_start = getOption("lubridate.week.start", 1)),
hour = hour(started_at) %>% as_factor())
Calculating and creating a new column ride_length
in minutes, then converting it to a numeric data type and rounding to 2 decimal places
<- all_trips %>%
all_trips mutate(ride_length = difftime(ended_at, started_at, units="mins") %>%
as.numeric() %>% round(2))
Checking if everything is OK.
::paged_table(sample_n(all_trips, 10)) rmarkdown
All is good! Let’s see the summary statistics.
%>% skim_without_charts() all_trips
Name | Piped data |
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 issues that need to be addressed:
- The number of unique ride IDs doesn’t match the number of observations - duplicate rows,
- Missing values (NAs) in the
start_station_name
,start_station_id
,end_station_name
, andend_station_id
columns, - Number of station IDs doesn’t match the number of stations - it is almost twice as big,
- Name of the
member_casual
column is vague, we’ll rename it touser_type
, - 5015 missing values (NAs) in the
end_lat
andend_lng
columns, - The minimum value for the
ride_length
column is -20.2 days, the maximum value is 38.9 days.
🛠️Removing duplicated records based on the ride_id
column
Each row represents one observation (trip). Based on the previous summary, there are a total of 4,913,072 rows and 4,912,863 unique ride_id
values, meaning there are 209 rows of duplicated data.
<- all_trips %>%
dupes get_dupes(ride_id)
%>% rmarkdown::paged_table() dupes
These are all trips taken with docked bikes. They started on two different dates, 2020-11-25 and 2020-12-15, and ended on 2020-11-25. Since trips started on 2020-12-15 have negative ride lengths, we’re going to remove them and create a new dataframe.
<-
all_trips_cln setdiff(all_trips,
%>% select(-dupe_count) %>% filter(date(started_at) == "2020-12-15")) dupes
Number of removed records.
nrow(all_trips) - nrow(all_trips_cln)
[1] 209
🛠️ Renaming column member_casual
to user_type
<- all_trips_cln %>% rename(user_type = member_casual) all_trips_cln
🛠️ Removing observations with missing values in the end_lat
and end_lng
columns
Every ride has to end somewhere. The average ride length is unusually high for this subset (you don’t see it here; I want to spare you the details). Traffic accident, malfunction? We’ll remove those trips.
We won’t need the columns with coordinates anymore, so we’ll remove them to make the dataframe lighter. Later on, we’ll join the coordinates from the divvy_stations
dataframe.
<- all_trips_cln %>%
all_trips_cln filter(!is.na(end_lat), !is.na(end_lng)) %>%
select(-c(start_lat, start_lng, end_lat, end_lng))
🛠️ Removing trips
- associated with Divvy test and repair stations
- with negative ride length (the end of the trip precedes the start)
- with ride length between 0 and 1 min (potentially false starts or users trying to re-dock a bike to ensure it was secure)
- with a ride length longer than 180 minutes (3 hours)
Looking for specific values in the start_station_name
column associated with Divvy test and repair stations.
Unique start station names
unique(all_trips_cln$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.
<- c("Base – 2132 W Hubbard Warehouse",
trs_name "DIVVY CASSETTE REPAIR MOBILE STATION",
"HUBBARD ST BIKE CHECKING (LBS-WH-TEST)",
"WEST CHI-WATSON")
Looking for specific values in the start_station_id
column associated with Divvy test and repair stations.
Unique start station IDs
unique(all_trips_cln$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.
<- c("DIVVY 001",
trs_id "DIVVY CASSETTE REPAIR MOBILE STATION",
"Hubbard Bike-checking (LBS-WH-TEST)")
Keeping only trips that are relevant for the analysis.
<- all_trips_cln %>%
all_trips_cln filter(!start_station_name %in% trs_name &
!end_station_name %in% trs_name &
!start_station_id %in% trs_id &
!end_station_id %in% trs_id &
between(ride_length, 1, 180))
dim_desc(all_trips_cln)
[1] "[4,804,481 x 13]"
🔍 Inspecting the difference between the number of station IDs and the number of station names
%>%
all_trips_cln 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(20) %>%
::kable() knitr
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 |
Conclusion: Divvy changed station IDs for most stations at the beginning of December 2020. This will not affect the analysis, so we’ll 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_cln$user_type, all_trips_cln$year_month, all_trips_cln$rideable_type)
classic_bike docked_bike electric_bike
casual 2020-09 0 166860 57264
2020-10 0 77464 63239
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, a 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 can only use classic bikes. Therefore, we cannot conclude a preference for one rideable type over another between casuals and members. Only when it comes to electric bikes.
🔍 🛠️ Checking if any station has changed its name at some point
%>%
all_trips_cln 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) %>%
::kable() knitr
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 |
<- c("13074", "13099", "13300", "19", "26", "317", "332", "351", "503",
start_id "625", "631", "704", "709", "725", "E011", "LF-005", "TA1305000039",
"TA1306000029", "TA1307000041", "TA1309000039", "TA1309000049")
%>%
all_trips_cln 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) %>%
::kable() knitr
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.
We’ll now replace old station names in the start_station_name
and end_station_name
columns with new ones. This step is necessary if we want to get an accurate list of the most popular stations.
<- all_trips_cln %>%
all_trips_cln 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"))
🔍 Inspecting observations with missing values (NAs) in the start_station_name
, start_station_id
, end_station_name
, and end_station_id
columns
<- all_trips_cln %>%
all_trips_NA 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_NA))
ride_id rideable_type started_at ended_at
0 0 0 0
start_station_name start_station_id end_station_name end_station_id
433066 433555 465223 465570
user_type year_month day_of_week hour
0 0 0 0
ride_length
0
# contingency table for the subset with NAs
table(all_trips_NA$year_month, all_trips_NA$rideable_type)
classic_bike electric_bike
2020-09 0 30374
2020-10 0 47054
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_cln$year_month, all_trips_cln$rideable_type)
classic_bike docked_bike electric_bike
2020-09 0 393566 125278
2020-10 0 229503 148594
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
%>%
all_trips_NA count(user_type)
# A tibble: 2 × 2
user_type n
<chr> <int>
1 casual 322707
2 member 329456
summary(all_trips_NA$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) is charged. In Zone 2, the out-of-station parking fee is waived to account for the lower density of stations.
There is no way to substitute missing values, and nothing indicates that something is wrong with this subset. If we delete it, we will lose a small percentage of rides taken with classic bikes (0.1%) and a lot of rides taken with electric bikes (42%). We’ll keep these observations.
✅ Final dataset ready for analysis
# selecting columns needed for analysis
<- all_trips_cln %>%
al_trips_cln select(start_station_name, end_station_name, user_type, year_month, day_of_week,
hour, ride_length, rideable_type)
# final dataset dimensions
dim_desc(al_trips_cln)
[1] "[4,804,481 x 8]"
# proportion of trips removed
nrow(all_trips) - nrow(all_trips_cln)) / nrow(all_trips) (
[1] 0.02210246
✨ PART V: Act
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 will buy an annual membership. Unfortunately, there is no way to distinguish locals from visitors in the group of casual riders. We’ll have to settle for the data we currently have.
My top three recommendations for the new marketing strategy aimed at converting casual riders into annual members are::
1. Conduct the marketing campaign during the summer months (June, July, August), mostly on weekends in the afternoon but also on weekdays around 5 p.m.
2. Use the fact that casual riders tend to ride 12+ minutes longer than annual members.
3. Act in the areas of stations that are most popular with casual riders.
You’ve reached the end of this project. Thank you for reading! Dream big. Bye! 🖐