This analysis examines Indego Bike Share ridership during Q2 of 2024, highlighting total ridership by station and average trip duration.
# Q.1 Number of starts per station
starts_counts_with_names <- combined_data %>%
group_by(start_station) %>%
summarize(num_starts = n(), .groups = 'drop') %>%
left_join(station_name, by = c("start_station" = "Station_ID"))
top_stations_starts <- starts_counts_with_names %>%
arrange(desc(num_starts)) %>%
slice_head(n = 15)
write.csv(top_stations_starts, "top_stations_starts.csv", row.names = FALSE)
bottom_stations_starts <- starts_counts_with_names %>%
arrange(num_starts) %>%
slice_head(n = 10)
ends_with_names <- combined_data %>%
group_by(end_station) %>%
summarize(num_ends = n(), .groups = 'drop') %>%
left_join(station_name, by = c("end_station" = "Station_ID"))
write.csv(bottom_stations_starts, "bottom_stations_starts.csv", row.names = FALSE)
#MOST USED IN TOTAL
# Merge start and end counts by station
station_activity <- starts_counts_with_names %>%
full_join(ends_with_names, by = c("start_station" = "end_station")) %>%
rename(Station_ID = start_station) %>%
replace_na(list(num_starts = 0, num_ends = 0)) %>% # Replace NAs with 0
mutate(total_activity = num_starts + num_ends) %>% # Calculate total activity
arrange(desc(total_activity)) # Sort by highest total activity
# Get the top 15 most active stations
top_stations_activity <- station_activity %>%
slice_head(n = 15)
write.csv(top_stations_activity, "top_stations_activity.csv", row.names = FALSE)
bottom_stations_activity <- station_activity %>%
arrange(total_activity) %>%
slice_head(n = 15)
write.csv(bottom_stations_activity, "bottom_stations_activity.csv", row.names = FALSE)
#Q.2
ends_count <- combined_data %>%
group_by(end_station) %>%
summarize(num_ends = n(), .groups = 'drop')
ends_with_names <- ends_count %>%
left_join(station_name, by = c("end_station" = "Station_ID"))
top_end_stations <- ends_with_names %>%
arrange(desc(num_ends)) %>%
slice_head(n = 15)
write.csv(top_end_stations, "top_end_stations2.csv", row.names = FALSE)
bottom_end_stations <- ends_with_names %>%
arrange(num_ends) %>%
slice_head(n = 10)
Figure 1: Indego Bike Share station usage, represented by circle size
Figure 2: Most active stations
Figure 3: Least active stations
The spatial distribution of Indego bike share activity in Philadelphia shows a strong concentration of usage in Center City and University City, where population density, tourism, and educational activity are higher than anywhere else in the city. Stations in these busy areas recorded the highest total rides, with the ten most frequently used stations exceeding 7,000 trips during Q2 2024. In contrast, the stations located in the northern and western neighborhoods exhibit significantly lower usage, with the least active stations recording fewer than 350 trips over the same time period.
Figure 4: Indego Bike Share ridership in Center City. Circle size corresponds to ridership volume
Zooming into Center City (figure 4), shows how Philadelphia's bike share usage closely follows the city's protected bike lane network. The station with the highest volume of uses is on 15th and Spruce, a very dense area in Center City, where two protected bike lanes intersect. In contrast, the station with the fewest uses, despite its proximity to Center City, is 5th & Willow. The low ridership could be due to several factors: the station is not positioned on a protected bike lane or designated bike lane, fewer nearby workplaces, less foot traffic, and no tourism. Even with Indego's concentration and strategic placement of stations in Center City and University City, station usage is heavily influenced by its proximity to a protected bike lane network and major work, tourist, and education hubs.
#need to make sure all duration data is numeric
combined_data <- combined_data %>%
mutate(duration = as.numeric(duration))
#Find average duration
avg_duration <- combined_data %>%
group_by(start_station) %>%
summarize(avg_trip_duration = mean(duration, na.rm = TRUE), .groups = 'drop')
avg_duration_with_names <- avg_duration %>%
left_join(station_name, by = c("start_station" = "Station_ID"))
#Find longest average durations
longest_avg_durations <- avg_duration_with_names %>%
arrange(desc(avg_trip_duration)) %>%
slice_head(n = 5)
#Find shortest average durations
shortest_avg_durations <- avg_duration_with_names %>%
arrange(avg_trip_duration) %>%
slice_head(n = 5)
Figure 5: Stations with the longest average trip durations
Figure 6: Stations with the shortest average trip durations
Average trip times range from just 5 minutes to 67 minutes. The stations with the longest average trip durations (figure 5), including 50th & Woodland, 12th & Cambria, and Broad & Allegheny, are located in neighborhoods far from Center City. These longer travel times suggest that riders starting from these areas may be using Indego bikes to reach more distant destinations, possibly Center City, where many jobs are. Stations with the shortest average durations (figure 6), such as 52nd Street Station, 18th & Christian, and 24th & Seybert, are situated in areas closer to key destinations or in neighborhoods with more dense station networks. In these areas, riders may be using Indego for quicker, more convenient trips.
Indego Bike Share usage in Q2 2024 was concentrated in Center City and University City, where population, tourism, employment, and education institutions are highest. The stations in these areas saw the most trips, while those in quieter, more residential northern and western neighborhoods had much lower activity. Generally, ridership closely followed the protected bike lane network, highlighting the importance of safe cycling infrastructure in encouraging bike use in the city. Typically, shorter trips were near Center City, while longer trips were from outer neighborhoods, suggesting riders use Indego for commuting to central areas and transportation connections. Overall, access to safe bike lanes and job centers strongly influence ridership patterns, highlighting the need to expand safe biking infrastructure in Philadelphia.
Data sources: