Business Scenario
Cyclistic, a Chicago-based Bike Share innovator, invites riders to explore the city on public bikes through single-ride passes, full-day passes, or exclusive annual memberships. Recognizing the untapped potential in annual subscriptions, our data analytics director is steering the company toward profitability. To propel this shift, our marketing analytics team is delving into user behavior, crafting a strategic campaign to transition casual riders into dedicated annual subscribers seamlessly.
Business Questions
Three questions are being used to guide the marketing program:
1. How do annual members and casual riders use Cyclistic bikes differently?
2. Why would casual riders buy Cyclistic annual memberships?
3. How can Cyclistic use digital media to influence casual riders to become members?
Business Task
Develop a marketing strategy to maximize membership conversion from a casual rider to an annual subscriber by identifying variances in rider activity and an effective digital marketing medium to advertise to customers.
Data Preparation
I utilize the Divvy System Public Dataset, comprising data from the last 12 months, securely stored on my personal computer. This extensive dataset, structured longitudinally with 13 fields and over 4,000 rows, includes attributes such as ride_id, rideable_type, started_at, and more. Acquired through a Data License Agreement with Lyft Bikes and Scooters, LLC, and officially provided by the City of Chicago, this data source maintains consistency and impartiality. Adhering strictly to licensing, privacy, security, and accessibility protocols as a public access user, I employ this dataset for analytical purposes within non-commercial contexts. It is a valuable resource for examining variations in the utilization of Cyclistic bikes between annual and casual members, given its rich information on usage dates and times, location data, rideable types, and membership categories.
Opting for BigQuery for data analysis is a natural choice due to my familiarity with this Database Management System (DBMS), particularly given the substantial size of the datasets. As for data visualization and comprehensive analysis, the rich capabilities of Tableau make it the preferred tool, offering robust features to enhance the interpretation and presentation of insights.
Data Processing in EXCEL:
- Formatted the 'started_at' and 'ended_at' to 'mm/dd/yyyy hh:mm:ss' for a customized presentation.
- Standardized the format of the 'ride_id,' 'rideable_type,' 'start_station_name,' 'start_station_id,' 'end_station_name,' 'end_station_id,' 'start_lat,' 'start_lng,' 'end_lat,' 'end_lng,' 'member_casual' fields to 'General.'
- Introduced a 'ride_length' column, formatted to 'hh:mm:ss,' capturing the duration of each ride.
- Established a 'month' column for temporal categorization.
- Implemented a 'day_of_week' column for enhanced time-related insights.
- Incorporated a 'year' column to capture the temporal dimension of the dataset.
- Standardized the format of the 'ride_id,' 'rideable_type,' 'start_station_name,' 'start_station_id,' 'end_station_name,' 'end_station_id,' 'start_lat,' 'start_lng,' 'end_lat,' 'end_lng,' 'member_casual' fields to 'General.'
- Introduced a 'ride_length' column, formatted to 'hh:mm:ss,' capturing the duration of each ride.
- Established a 'month' column for temporal categorization.
- Implemented a 'day_of_week' column for enhanced time-related insights.
- Incorporated a 'year' column to capture the temporal dimension of the dataset.
Initial Observations
Upon scrutinizing the data tables, noteworthy parallels and subtle distinctions emerged in the activity patterns of members and casual users throughout the year. It's apparent that both cohorts exhibit heightened activity during the spring and summer months, coinciding with longer average ride lengths, likely influenced by warmer temperatures and increased leisure time availability. While shared preferences include a predilection for afternoon rides over evening rides, discernible behavioral divergences surface in terms of mid-week versus weekend riding preferences between the two groups.
Exploratory Data Analysis
Casual riders consistently maintain a higher average ride length than members throughout the year, peaking for both groups between April and July. Additionally, there is a shared increase in average ride length observed on weekends, specifically between Saturday and Sunday.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/24/2023
DESCRIPTION: This statement creates a table of average monthly ride lengths by membership type using an aggregate function, a LEFT JOIN clause, a GROUP BY statement, and an ORDER BY keyword.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 6/24/2023
DESCRIPTION: This statement creates a table of average monthly ride lengths by membership type using an aggregate function, a LEFT JOIN clause, a GROUP BY statement, and an ORDER BY keyword.
*/
SELECT
F.month,
F.year,
A.casual_avg,
B.member_avg,
AVG(F.ride_length) AS total_avg
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.casual_rider_avg` AS A
ON
F.month = A.month
LEFT JOIN
`bike_share_rides.member_rider_avg` AS B
ON
A.month = B.month
GROUP BY
F.month,
F.year,
A.casual_avg,
B.member_avg
ORDER BY
F.year ASC,
F.month ASC;
month year casual_avg member_avg total_avg
4 2022 0-0 0 0:23:42.701456291 0-0 0 0:11:20.368975460 0-0 0 0:15:33.146613189
5 2022 0-0 0 0:25:52.694737067 0-0 0 0:13:3.474643313 0-0 0 0:18:43.236327235
6 2022 0-0 0 0:23:55.966749222 0-0 0 0:13:39.227788218 0-0 0 0:18:35.127658633
7 2022 0-0 0 0:23:33.936068819 0-0 0 0:13:25.939047879 0-0 0 0:18:25.736440340
8 2022 0-0 0 0:22:4.131877286 0-0 0 0:13:5.058421545 0-0 0 0:17:11.245522109
9 2022 0-0 0 0:20:35.033741835 0-0 0 0:12:38.057246512 0-0 0 0:15:59.839666063
10 2022 0-0 0 0:18:58.412339464 0-0 0 0:11:32.818043255 0-0 0 0:14:19.503254988
11 2022 0-0 0 0:16:4.147706631 0-0 0 0:10:51.872904067 0-0 0 0:12:25.036387972
12 2022 0-0 0 0:14:0.844255357 0-0 0 0:10:20.761649818 0-0 0 0:11:15.107427697
1 2023 0-0 0 0:14:16.594056188 0-0 0 0:10:4.459542360 0-0 0 0:10:57.467133646
2 2023 0-0 0 0:16:37.874209596 0-0 0 0:10:28.210692677 0-0 0 0:11:51.707394299
3 2023 0-0 0 0:16:1.089001784 0-0 0 0:10:12.021651389 0-0 0 0:11:35.957425834
4 2022 0-0 0 0:23:42.701456291 0-0 0 0:11:20.368975460 0-0 0 0:15:33.146613189
5 2022 0-0 0 0:25:52.694737067 0-0 0 0:13:3.474643313 0-0 0 0:18:43.236327235
6 2022 0-0 0 0:23:55.966749222 0-0 0 0:13:39.227788218 0-0 0 0:18:35.127658633
7 2022 0-0 0 0:23:33.936068819 0-0 0 0:13:25.939047879 0-0 0 0:18:25.736440340
8 2022 0-0 0 0:22:4.131877286 0-0 0 0:13:5.058421545 0-0 0 0:17:11.245522109
9 2022 0-0 0 0:20:35.033741835 0-0 0 0:12:38.057246512 0-0 0 0:15:59.839666063
10 2022 0-0 0 0:18:58.412339464 0-0 0 0:11:32.818043255 0-0 0 0:14:19.503254988
11 2022 0-0 0 0:16:4.147706631 0-0 0 0:10:51.872904067 0-0 0 0:12:25.036387972
12 2022 0-0 0 0:14:0.844255357 0-0 0 0:10:20.761649818 0-0 0 0:11:15.107427697
1 2023 0-0 0 0:14:16.594056188 0-0 0 0:10:4.459542360 0-0 0 0:10:57.467133646
2 2023 0-0 0 0:16:37.874209596 0-0 0 0:10:28.210692677 0-0 0 0:11:51.707394299
3 2023 0-0 0 0:16:1.089001784 0-0 0 0:10:12.021651389 0-0 0 0:11:35.957425834
Both groups prefer riding bikes between Saturday and Sunday on the weekends. Casual Rider activity mid-week drops significantly more than that of Member riders, indicated by the curvature of the trendline.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/24/2023
DESCRIPTION: This statement creates a table with average ride lengths per day within the full year of data using a CREATE TABLE statement, an aggregate function, and a GROUP BY clause.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 6/24/2023
DESCRIPTION: This statement creates a table with average ride lengths per day within the full year of data using a CREATE TABLE statement, an aggregate function, and a GROUP BY clause.
*/
CREATE TABLE `bike_share_rides.daily_casual_avg_fy`
AS
SELECT
day_of_week,
AVG(ride_length) AS daily_casual_avg_fy
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
GROUP BY
day_of_week;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/24/2023
DESCRIPTION: This statement creates a table with average ride lengths per day within the full year of data using a CREATE TABLE statement, an aggregate function, and a GROUP BY clause.
*/
CREATE TABLE `bike_share_rides.daily_member_avg_fy`
AS
SELECT
day_of_week,
AVG(ride_length) AS daily_member_avg_fy
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
GROUP BY
day_of_week;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/24/2023
DESCRIPTION: This statement creates a table of average ride lengths by day, month, and membership type using an aggregate function, a LEFT JOIN clause, a GROUP BY statement, and an ORDER BY keyword.
*/
SELECT
F.day_of_week,
C.daily_casual_avg_fy AS casual,
M.daily_member_avg_fy AS member,
AVG(ride_length) AS daily_member_casual_avg
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.daily_casual_avg_fy` AS C
ON
F.day_of_week = C.day_of_week
LEFT JOIN
`bike_share_rides.daily_member_avg_fy` AS M
ON
C.day_of_week = M.day_of_week
GROUP BY
day_of_week,
C.daily_casual_avg_fy,
M.daily_member_avg_fy
ORDER BY
day_of_week;
F.day_of_week,
C.daily_casual_avg_fy AS casual,
M.daily_member_avg_fy AS member,
AVG(ride_length) AS daily_member_casual_avg
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.daily_casual_avg_fy` AS C
ON
F.day_of_week = C.day_of_week
LEFT JOIN
`bike_share_rides.daily_member_avg_fy` AS M
ON
C.day_of_week = M.day_of_week
GROUP BY
day_of_week,
C.daily_casual_avg_fy,
M.daily_member_avg_fy
ORDER BY
day_of_week;
day_of_week casual member daily_member_casual_avg
1 0-0 0 0:25:11.584917046 0-0 0 0:13:29.810395125 0-0 0 0:19:16.891142838
2 0-0 0 0:22:6.529036025 0-0 0 0:11:42.823648742 0-0 0 0:15:28.997341695
3 0-0 0 0:19:36.026296006 0-0 0 0:11:36.894500435 0-0 0 0:14:16.293785996
4 0-0 0 0:18:34.750207834 0-0 0 0:11:36.437039681 0-0 0 0:13:57.077683813
5 0-0 0 0:19:33.198922178 0-0 0 0:11:48.287998838 0-0 0 0:14:36.247404377
6 0-0 0 0:20:42.724356248 0-0 0 0:12:0.435235804 0-0 0 0:15:34.797038741
7 0-0 0 0:24:43.264173513 0-0 0 0:13:38.372609344 0-0 0 0:19:17.784396542
1 0-0 0 0:25:11.584917046 0-0 0 0:13:29.810395125 0-0 0 0:19:16.891142838
2 0-0 0 0:22:6.529036025 0-0 0 0:11:42.823648742 0-0 0 0:15:28.997341695
3 0-0 0 0:19:36.026296006 0-0 0 0:11:36.894500435 0-0 0 0:14:16.293785996
4 0-0 0 0:18:34.750207834 0-0 0 0:11:36.437039681 0-0 0 0:13:57.077683813
5 0-0 0 0:19:33.198922178 0-0 0 0:11:48.287998838 0-0 0 0:14:36.247404377
6 0-0 0 0:20:42.724356248 0-0 0 0:12:0.435235804 0-0 0 0:15:34.797038741
7 0-0 0 0:24:43.264173513 0-0 0 0:13:38.372609344 0-0 0 0:19:17.784396542
Both Groups prefer to ride bikes between Spring and Fall. Member riders show higher sustained activity throughout the year. Members ride significantly more often than Casual riders during the Fall and Winter.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/25/2023
DESCRIPTION: This statement creates a table showing casual riders' total monthly ride count using an aggregate function and a GROUP BY clause.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 6/25/2023
DESCRIPTION: This statement creates a table showing casual riders' total monthly ride count using an aggregate function and a GROUP BY clause.
*/
CREATE TABLE bike_share_rides.total_monthly_rides_casual AS
SELECT
month,
COUNT(ride_id) AS monthly_casual_rides
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
GROUP BY
month;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/25/2023
DESCRIPTION: This statement creates a table showing member riders' total monthly ride count using an aggregate function and a GROUP BY clause.
*/
CREATE TABLE bike_share_rides.total_monthly_rides_member AS
SELECT
month,
COUNT(ride_id) AS monthly_member_rides
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
GROUP BY
month;
month,
COUNT(ride_id) AS monthly_member_rides
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
GROUP BY
month;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/25/2023
DESCRIPTION: This statement creates a table showing member and casual riders' total monthly ride count in order of month and year using a LEFT JOIN keyword, an aggregate function, a GROUP BY clause, and an ORDER BY keyword.
*/
SELECT
F.month,
F.year,
C.monthly_casual_rides,
M.monthly_member_rides,
COUNT(ride_id) AS monthly_total_rides
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.total_monthly_rides_casual` AS C
ON
F.month = C.month
LEFT JOIN
`bike_share_rides.total_monthly_rides_member` AS M
ON
C.month = M.month
GROUP BY
F.month,
F.year,
C.monthly_casual_rides,
M.monthly_member_rides
ORDER BY
year ASC,
month ASC;
month year monthly_casual_rides monthly_member_rides monthly_total_rides
4 2022 126417 244832 371249
5 2022 280414 354443 634857
6 2022 369044 400148 769192
7 2022 406046 417426 823472
8 2022 358917 427000 785917
9 2022 296694 404636 701330
10 2022 208988 349693 558681
11 2022 100747 236947 337694
12 2022 44894 136912 181806
1 2023 40008 150293 190301
2 2023 43016 147428 190444
3 2023 62201 196477 258678
4 2022 126417 244832 371249
5 2022 280414 354443 634857
6 2022 369044 400148 769192
7 2022 406046 417426 823472
8 2022 358917 427000 785917
9 2022 296694 404636 701330
10 2022 208988 349693 558681
11 2022 100747 236947 337694
12 2022 44894 136912 181806
1 2023 40008 150293 190301
2 2023 43016 147428 190444
3 2023 62201 196477 258678
Member riders ride more frequently than casual riders mid-week; casual riders ride more frequently during the weekend.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/25/2023
DESCRIPTION: This statement creates a table showing casual riders' total daily ride count in order of the day, using an aggregate function, a GROUP BY clause, and an ORDER BY keyword.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 6/25/2023
DESCRIPTION: This statement creates a table showing casual riders' total daily ride count in order of the day, using an aggregate function, a GROUP BY clause, and an ORDER BY keyword.
*/
CREATE TABLE `bike_share_rides.daily_casual_ride_count_fy`
AS
SELECT
day_of_week,
COUNT(ride_id) AS daily_casual_ride_count_fy
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
GROUP BY
day_of_week
ORDER BY
day_of_week ASC;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/25/2023
DESCRIPTION: This statement creates a table showing member riders' total daily ride count in order of the day, using an aggregate function, a GROUP BY clause, and an ORDER BY keyword.
*/
CREATE TABLE `bike_share_rides.daily_member_ride_count_fy`
AS
SELECT
day_of_week,
COUNT(ride_id) AS daily_member_ride_count_fy
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
GROUP BY
day_of_week
ORDER BY
day_of_week ASC;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/25/2023
DESCRIPTION: This statement creates a table showing casual and member riders' total daily ride count in order of the day, using an aggregate function, a GROUP BY clause, and an ORDER BY keyword.
*/
SELECT
F.day_of_week,
C.daily_casual_ride_count_fy AS casual_total,
M.daily_member_ride_count_fy AS member_total,
COUNT(ride_id) AS total_daily_count
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.daily_casual_ride_count_fy` AS C
ON
F.day_of_week = C.day_of_week
LEFT JOIN
`bike_share_rides.daily_member_ride_count_fy` AS M
ON
C.day_of_week = M.day_of_week
GROUP BY
F.day_of_week,
C.daily_casual_ride_count_fy,
M.daily_member_ride_count_fy
ORDER BY
F.day_of_week;
day_of_week casual_total member_total total_daily_count
1 389433 397975 787408
2 275692 484567 760259
3 271372 544334 815706
4 276662 546225 822887
5 311740 551155 862895
6 341009 489854 830863
7 471478 452125 923603
Members show more activity during the day between 4:00 AM and 11:00 PM. Member activity peaks during rush hours between 6:00 AM and 8:00 AM and 4:00 PM and 7:00 PM.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/28/2023
DESCRIPTION: Using an EXTRACT function, a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table showing a count of casual rides in order of the hour of the day.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 6/28/2023
DESCRIPTION: Using an EXTRACT function, a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table showing a count of casual rides in order of the hour of the day.
*/
CREATE TABLE bike_share_rides.hourly_rider_traffic_casual AS
SELECT
extract(HOUR FROM started_at) AS hour_of_day,
COUNT(ride_id) AS casual_rider_traffic
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
GROUP BY
hour_of_day
ORDER BY
hour_of_day
SELECT
extract(HOUR FROM started_at) AS hour_of_day,
COUNT(ride_id) AS casual_rider_traffic
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
GROUP BY
hour_of_day
ORDER BY
hour_of_day
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/28/2023
DESCRIPTION: Using an EXTRACT function, a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table showing a count of member rides in order of the hour of the day.
*/
CREATE TABLE bike_share_rides.hourly_rider_traffic_member AS
SELECT
extract(HOUR FROM started_at) AS hour_of_day,
COUNT(ride_id) AS member_rider_traffic
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
GROUP BY
hour_of_day
ORDER BY
hour_of_day
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/28/2023
DESCRIPTION: Using an EXTRACT function, a COUNT function, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table showing a count of total rides in order of the hour of the day.
*/
CREATE TABLE bike_share_rides.hourly_rider_traffic_total AS
SELECT
extract(HOUR FROM started_at) AS hour_of_day,
COUNT(ride_id) AS total_hourly_rider_traffic
FROM
`bike_share_rides.full_year`
GROUP BY
hour_of_day
ORDER BY
hour_of_day
/*
CREATED BY: Jeremy Bosse
CREATED ON: 6/28/2023
DESCRIPTION: Using a LEFT JOIN keyword, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table showing a count of casual rides per hour, a count of member rides per hour, and a count of total rides per hour in order of the hour of the day.
*/
SELECT
F.hour_of_day,
C.casual_rider_traffic,
M.member_rider_traffic,
F.total_hourly_rider_traffic
FROM
`bike_share_rides.hourly_rider_traffic_total` AS F
LEFT JOIN
`bike_share_rides.hourly_rider_traffic_casual` AS C
ON
F.hour_of_day = C.hour_of_day
LEFT JOIN
`bike_share_rides.hourly_rider_traffic_member` AS M
ON
C.hour_of_day = M.hour_of_day
GROUP BY
F.hour_of_day,
F.total_hourly_rider_traffic,
C.casual_rider_traffic,
M.member_rider_traffic
ORDER BY
F.hour_of_day
hour_of_day casual_rider_traffic member_rider_traffic total_hourly_rider_traffic
0 46673 37129 83802
1 30146 22692 52838
2 18750 13246 31996
3 11105 8090 19195
4 7716 9137 16853
5 12834 32791 45625
6 30789 96387 127176
7 53499 179918 233417
8 72001 215787 287788
9 73766 151008 224774
10 93952 141086 235038
11 122230 167891 290121
12 144424 192861 337285
13 150779 192047 342826
14 160479 191089 351568
15 178857 230387 409244
16 199424 303726 503150
17 221099 363340 584439
18 197290 292886 490176
19 151781 211932 363713
20 112410 148801 261211
21 96241 116782 213023
22 86575 88907 175482
23 64566 58315 122881
Both groups prefer to ride bikes during the afternoon. Member riders show more activity throughout the day.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION:
*/
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION:
*/
CREATE TABLE bike_share_rides.member_casual_use_by_hour AS
SELECT
extract(HOUR FROM started_at) AS hour_of_day,
member_casual
FROM
`bike_share_rides.full_year`
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a SUM function wrapped around a CASE statement, this query produces a table of a count of casual rides in the morning, a count of casual rides in the afternoon, a count of member rides in the morning, and a count of member rides in the afternoon. In addition, this statement features a COUNT function which produces a count of total rides.
*/
SELECT
SUM(CASE WHEN hour_of_day BETWEEN 0 AND 11 AND member_casual = 'casual' THEN 1 ELSE 0 END) AS casual_morning_rides,
SUM(CASE WHEN hour_of_day BETWEEN 12 AND 23 AND member_casual = 'casual' THEN 1 ELSE 0 END) AS casual_afternoon_rides,
SUM(CASE WHEN hour_of_day BETWEEN 0 AND 11 AND member_casual = 'member' THEN 1 ELSE 0 END) AS member_morning_rides,
SUM(CASE WHEN hour_of_day BETWEEN 12 AND 23 AND member_casual = 'member' THEN 1 ELSE 0 END) AS member_afternoon_rides,
COUNT(member_casual) AS total_rides
FROM
`bike_share_rides.member_casual_use_by_hour`
casual_morning_rides casual_afternoon_rides member_morning_rides member_afternoon_rides total_rides
573461 1763925 1075162 2391073 5803621
Member riders show higher activity across all rideable types except "Docked Bike," where members show no activity.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, and a GROUP BY clause, this statement creates a table with a count of casual rides by rideable type.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, and a GROUP BY clause, this statement creates a table with a count of casual rides by rideable type.
*/
CREATE TABLE bike_share_rides.casual_rideable_type AS
SELECT
rideable_type,
COUNT(ride_id) AS casual_users
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
GROUP BY
rideable_type;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, and a GROUP BY clause, this statement creates a table with a count of member rides by rideable type.
*/
CREATE TABLE bike_share_rides.member_rideable_type AS
SELECT
rideable_type,
COUNT(ride_id) AS member_users
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
GROUP BY
rideable_type;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a LEFT JOIN keyword, and a GROUP BY clause, this statement creates a table with a count of casual rides by rideable type, member rides by rideable type, and total rides by rideable type.
*/
SELECT
F.rideable_type,
C.casual_users,
M.member_users,
COUNT(ride_id) AS rides_per_bike
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.casual_rideable_type` AS C
ON
F.rideable_type = C.rideable_type
LEFT JOIN
`bike_share_rides.member_rideable_type` AS M
ON
C.rideable_type = M.rideable_type
GROUP BY
rideable_type,
C.casual_users,
M.member_users;
rideable_type casual_users member_users rides_per_bike
electric_bike 1273764 1716578 2990342
classic_bike 889875 1749657 2639532
docked_bike 173747 173747
Casual riders consistently show more activity between Spring and Fall. Activity drops significantly during the winter months. Member riders did not use docked bikes.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of casual riders using the docked bike in order of the month and year.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of casual riders using the docked bike in order of the month and year.
*/
CREATE TABLE bike_share_rides.docked_bike_casual AS
SELECT
month,
year,
rideable_type,
COUNT(ride_id) AS rideable_type_trend_casual
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
AND
rideable_type = 'docked_bike'
GROUP BY
month,
year,
rideable_type
ORDER BY
year ASC,
month ASC;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of member riders using the docked bike in order of the month and year.
*/
CREATE TABLE bike_share_rides.docked_bike_member AS
SELECT
month,
year,
rideable_type,
COUNT(ride_id) AS rideable_type_trend_member
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
AND
rideable_type = 'docked_bike'
GROUP BY
month,
year,
rideable_type
ORDER BY
year ASC,
month ASC;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a LEFT JOIN keyword, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this table results in a count of casual riders, a count of member riders, and total riders who used a docked bike in order of the month and year.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a LEFT JOIN keyword, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this table results in a count of casual riders, a count of member riders, and total riders who used a docked bike in order of the month and year.
*/
SELECT
F.rideable_type,
F.month,
F.year,
C.rideable_type_trend_casual AS casual_use,
M.rideable_type_trend_member AS member_use,
COUNT(ride_id) AS total_use
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.docked_bike_casual` AS C
ON
F.month = C.month
AND
F.year = C.year
LEFT JOIN
`bike_share_rides.docked_bike_member` AS M
ON
C.month = M.month
AND
C.year = M.year
WHERE
F.rideable_type = 'docked_bike'
GROUP BY
F.rideable_type,
F.month,
F.year,
C.rideable_type_trend_casual,
M.rideable_type_trend_member
ORDER BY
F.year ASC,
F.month ASC
rideable_type month year casual_use member_use total_use
docked_bike 4 2022 12116 12116
docked_bike 5 2022 26409 26409
docked_bike 6 2022 30640 30640
docked_bike 7 2022 31055 31055
docked_bike 8 2022 26323 26323
docked_bike 9 2022 19826 19826
docked_bike 10 2022 12614 12614
docked_bike 11 2022 5886 5886
docked_bike 12 2022 1925 1925
docked_bike 1 2023 1738 1738
docked_bike 2 2023 2195 2195
docked_bike 3 2023 3020 3020
Member riders show higher preference than Casual riders who also use the Classic bike.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of casual riders using the classic bike in order of the month and year.
*/
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of casual riders using the classic bike in order of the month and year.
*/
CREATE TABLE bike_share_rides.classic_bike_casual AS
SELECT
month,
year,
rideable_type,
COUNT(ride_id) AS rideable_type_trend_casual
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
AND
rideable_type = 'classic_bike'
GROUP BY
month,
year,
rideable_type
ORDER BY
year ASC,
month ASC;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of member riders using the classic bike in order of the month and year.
*/
CREATE TABLE bike_share_rides.classic_bike_member AS
SELECT
month,
year,
rideable_type,
COUNT(ride_id) AS rideable_type_trend_member
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
AND
rideable_type = 'classic_bike'
GROUP BY
month,
year,
rideable_type
ORDER BY
year ASC,
month ASC;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a LEFT JOIN keyword, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this table results in a count of casual riders, a count of member riders, and total riders who used a classic bike in order of the month and year.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a LEFT JOIN keyword, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this table results in a count of casual riders, a count of member riders, and total riders who used a classic bike in order of the month and year.
*/
SELECT
F.rideable_type,
F.month,
F.year,
C.rideable_type_trend_casual AS casual_use,
M.rideable_type_trend_member AS member_use,
COUNT(ride_id) AS total_use
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.classic_bike_casual` AS C
ON
F.month = C.month
AND
F.year = C.year
LEFT JOIN
`bike_share_rides.classic_bike_member` AS M
ON
C.month = M.month
AND
C.year = M.year
WHERE
F.rideable_type = 'classic_bike'
GROUP BY
F.rideable_type,
F.month,
F.year,
C.rideable_type_trend_casual,
M.rideable_type_trend_member
ORDER BY
F.year ASC,
F.month ASC
rideable_type month year casual_use member_use total_use
classic_bike 4 2022 47543 119169 166712
classic_bike 5 2022 126075 197971 324046
classic_bike 6 2022 169996 236664 406660
classic_bike 7 2022 156089 217074 373163
classic_bike 8 2022 128634 215415 344049
classic_bike 9 2022 105375 200766 306141
classic_bike 10 2022 61568 151991 213559
classic_bike 11 2022 33044 111543 144587
classic_bike 12 2022 12652 60698 73350
classic_bike 1 2023 13909 76385 90294
classic_bike 2 2023 15534 74354 89888
classic_bike 3 2023 19456 87627 107083
Electric bikes attract more casual riders in peak summer, while members exhibit increased activity compared to casual riders during summer to winter. This shift in group activity is likely influenced by the heightened demand for electric bikes in warmer weather.
Query & Query Output
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of casual riders using the electric bike in order of the month and year.
*/
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of casual riders using the electric bike in order of the month and year.
*/
CREATE TABLE bike_share_rides.electric_bike_casual AS
SELECT
month,
year,
rideable_type,
COUNT(ride_id) AS rideable_type_trend_casual
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'casual'
AND
rideable_type = 'electric_bike'
GROUP BY
month,
year,
rideable_type
ORDER BY
year ASC,
month ASC;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this statement creates a table with a count of member riders using the electric bike in order of the month and year.
*/
CREATE TABLE bike_share_rides.electric_bike_member AS
SELECT
month,
year,
rideable_type,
COUNT(ride_id) AS rideable_type_trend_member
FROM
`bike_share_rides.full_year`
WHERE
member_casual = 'member'
AND
rideable_type = 'electric_bike'
GROUP BY
month,
year,
rideable_type
ORDER BY
year ASC,
month ASC;
/*
CREATED BY: Jeremy Bosse
CREATED ON: 7/3/2023
DESCRIPTION: Using a COUNT function, a LEFT JOIN keyword, a WHERE clause, a GROUP BY clause, and an ORDER BY keyword, this table results in a count of casual riders, a count of member riders, and total riders who used an electric bike in order of the month and year.
*/
SELECT
F.rideable_type,
F.month,
F.year,
C.rideable_type_trend_casual AS casual_use,
M.rideable_type_trend_member AS member_use,
COUNT(ride_id) AS total_use
FROM
`bike_share_rides.full_year` AS F
LEFT JOIN
`bike_share_rides.electric_bike_casual` AS C
ON
F.month = C.month
AND
F.year = C.year
LEFT JOIN
`bike_share_rides.electric_bike_member` AS M
ON
C.month = M.month
AND
C.year = M.year
WHERE
F.rideable_type = 'electric_bike'
GROUP BY
F.rideable_type,
F.month,
F.year,
C.rideable_type_trend_casual,
M.rideable_type_trend_member
ORDER BY
F.year ASC,
F.month ASC
rideable_type month year casual_use member_use total_use
electric_bike 4 2022 66758 125663 192421
electric_bike 5 2022 127930 156472 284402
electric_bike 6 2022 168408 163484 331892
electric_bike 7 2022 218902 200352 419254
electric_bike 8 2022 203960 211585 415545
electric_bike 9 2022 171493 203870 375363
electric_bike 10 2022 134806 197702 332508
electric_bike 11 2022 61817 125404 187221
electric_bike 12 2022 30317 76214 106531
electric_bike 1 2023 24361 73908 98269
electric_bike 2 2023 25287 73074 98361
electric_bike 3 2023 39725 108850 148575
Analysis Summary
Through my analysis, I have deduced that casual riders exhibit distinct preferences when utilizing Cyclistic bikes compared to member riders. Specifically, casual riders engage in longer rides on average during the spring and summer, favor weekends more than their member counterparts, demonstrate peak rider activity earlier in the summer, show a preference for afternoon rides, and exhibit a higher preference for electric bikes over other rideable types.
Recommendations
- Advertise to casual users promotional incentives during their peak season between Spring and Summer, and encourage enrollment into an annual subscription.
- Advertise to Casual riders promotional incentives for enrolling in an annual subscription between Saturday and Sunday.
- Advertise to Casual riders promotional incentives for enrolling in an annual subscription in the afternoon between 4:00 PM and 7:00 PM daily.
- Advertise to Casual riders promotional incentives for enrolling in an annual subscription whenever an electric bike is used.
- Utilize the email addresses of casual riders who sign up for a single or full-day pass using a landing page during ride activation.
- Create an email campaign with email addresses obtained through email capture to convert casual riders to member riders.