Overview
How Does a Bike-Share Navigate Speedy Success?
This is my Capstone Project for the Google Data Analytics Certificate. In this study, I am simulating working at a fictitious company, Cyclistic, a bike-sharing company located in Chicago, Illinois. I joined the Cyclistic marketing analytics team six months ago and have been busy learning about Cyclistic’s mission and business goals — as well as how I, as a junior data analyst, can help Cyclistic achieve them.
Company Overview
About the Company
In 2016, Cyclistic launched a successful bike-share offering. Since then, the program has grown to a fleet of 5,824 bicycles that are geotracked and locked into a network of 692 docking stations across Chicago. The bikes can be unlocked from one station and returned to any other station in the system anytime. Until now, Cyclistic`s marketing strategy relied on building general awareness and appealing to broad consumer segments. One approach that helped make these things possible was the flexibility of its pricing plans: single-ride passes, full-day passes, and annual memberships. Customers who purchase single-ride or full-day passes are referred to as casual riders. Customers who purchase annual memberships are Cyclistic members. Cyclistic has made available several options for the bike riding experience. This includes the standard classic bike, the electric bike and docked bikes as well as reclining bikes, hand tricycles and cargo bikes. This offers people with disabilities and riders who can’t use a standard two-wheeled bike additional accessibility. The majority of riders opt for traditional bikes; about 8% of riders use the assistive options. Cyclistic users are more likely to ride for leisure, but about 30% use them to commute to work each day.
Keeping Communities Moving
Ask
Business Task
Cyclistic’s finance analysts have concluded that annual members are much more profitable than casual riders. Lily Moreno, the director of marketing, believes that maximizing the number of annual members will be key to future growth. Rather than creating a marketing campaign that targets all-new customers, Moreno believes there is a very good chance to convert casual riders into members.
The main focus of this case is to analyze how casual riders and annual members use Cyclistic bikes differently. From these insights, the marketing analytics team will design a new marketing strategy to convert casual riders into annual members in order to maximize Cyclistic’s number of annual memberships.
Stakeholders
- Lily Moreno: The director of marketing and my manager. Moreno is responsible for the development of campaigns and initiatives to promote the bike-share program. These may include email, social media, and other channels.
- Cyclistic marketing analytics team: A team of data analysts who are responsible for collecting, analyzing, and reporting data that helps guide Cyclistic marketing strategy.
- Cyclistic executive team: The notoriously detail-oriented executive team will decide whether to approve the recommended marketing program.
Questions to Answer
- 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?
Prepare
Dataset Information
The data has been made available here by Motivate International Inc. under the bike-share company name, Divvy. For the purposes of this exercise, the company has been renamed Cyclistic.
Accessibility and Privacy of Data
This is public data that can be used to explore how different customer types are using Cyclistic bikes. The datasets have data-privacy parameters that prohibit access to rider’s personally identifiable information. This means that I will not be able to connect past purchases to credit card numbers to determine if casual riders live in the Cyclistic service area or if they have purchased multiple single passes.
Data Organization and Verification
I will use Cyclistic’s historical trip data to analyze and identify trends. I downloaded the previous 12 months, from February 2022 - January 2023, of Cyclistic trip data. The following files have been selected for analysis:
- 2022-02_divvy_trip-data.csv
- 2022-03_divvy_trip-data.csv
- 2022-04_divvy_trip-data.csv
- 2022-05_divvy_trip-data.csv
- 2022-06_divvy_trip-data.csv
- 2022-07_divvy_trip-data.csv
- 2022-08_divvy_trip-data.csv
- 2022-09_divvy_trip-data.csv
- 2022-10_divvy_trip-data.csv
- 2022-11_divvy_trip-data.csv
- 2022-12_divvy_trip-data.csv
- 2023-01_divvy_trip-data.csv
Each file contains a table with 13 columns and hundreds of thousands of observations. Each column is represented as the following fields:
- ride_id
- rideable_type
- started_at
- ended_at
- start_station_name
- start_station_id
- end_station_name
- end_station_id
- start_lat
- start_lng
- end_lat
- end_lng
- member_casual
In order to store and process the datasets into my relational database of choice, SQL, I had to split some months (May 2022-October 2022) into two separate CSV files due to the maximum upload file size of 100 MB.
Data Credibility and Integrity
A credible data source with integrity can be defined by the acronym: ROCCC (Reliable, Original, Comprehensive, Current, and Cited.) Our datasets are described as the following:
- Reliable - Public data than contains hundreds of thousands of reports of historical bike trips
- Original - This is first-party data collected by the bike-share company from its users
- Comprehensive - Relevant to the task at hand providing in depth information of time, date, and location of bike trips
- Current - Data is current and up to date from February 2022- January 2023
- Cited - Provided by Divvy customers located in the City of Chicago and is deemed public data by a government source
Limitations of the Dataset
The datasets do not contain information on the sample’s demographics such as age, gender, occupation, or income. Furthermore, I am unable to connect past purchases to credit card numbers to determine if casual riders live in the Cyclistic service area or if they have purchased multiple single passes.
Process
I will use BigQuery SQL to prepare, process and analyze the data due to the large amount of data.
Importing Datasets and Verifying Import
First, I will upload the selected (divvy_trip-data.csv) files to BigQuery SQL after splitting the files that are larger than 100 MB through Gigasheet.
After uploading, I will observe and familiarize myself with the data by reviewing the structure of the data frames.
Merging Datasets
Create a new table, bike_data, to store the combined dataset
- CREATE TABLE
- `rich-torus-377922.Cyclistic.bike_data`
- (ride_id string,
- rideable_type string,
- started_at timestamp,
- ended_at timestamp,
- start_station_name string,
- start_station_id string,
- end_station_name string,
- end_station_id string,
- start_lat FLOAT64,
- start_lng FLOAT64,
- end_lat FLOAT64,
- end_lng FLOAT64,
- member_casual string)
- Combine all the files into one dataset and store in the bike_data table
- INSERT INTO
- `rich-torus-377922.Cyclistic.bike_data`
- SELECT *
- FROM
- (SELECT *
- FROM
- `rich-torus-377922.Cyclistic.jan2023`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-37792.Cyclistic.dec2022`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.nov2022`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.oct2022-2`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.oct2022-1`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.sep2022-2`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.sep2022-1`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.aug2022-2`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.aug2022-1`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.jul2022-2`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.jul2022-1`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.jun2022-2`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.jun2022-1`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.may2022-2`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.may2022-1`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.apr2022`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.mar2022`
- UNION ALL
- SELECT *
- FROM
- `rich-torus-377922.Cyclistic.feb2022`)
- The merged table has a total of 5,754,248 records
Formatting and Cleaning Datasets
I need to create three new columns to compare to the existing 13 attributes: length of ride, day of week, and month
- SELECT
- ride_id,
- rideable_type,
- started_at,
- ended_at,
- ROUND(TIMESTAMP_DIFF(ended_at, started_at, second)/60, 1) AS ride_length_minutes,
- EXTRACT(DAYOFWEEK FROM started_at) AS day_of_week,
- EXTRACT(MONTH FROM started_at) AS month,
- start_station_name,
- start_station_id,
- end_station_name,
- end_station_id,
- start_lat,
- start_lng,
- end_lat,
- end_lng,
- member_casual
- FROM
- `rich-torus-377922.Cyclistic.bike_data`
- Saved table as bike_data_v02
- Next, I will perform the following cleaning processes:
- Verify date range of records
- Check for duplicates
- Check for ride lengths that are less than 0 minutes and delete those records
- Check for misspellings extra spaces and trim extra spaces before and after string values
- Find and remove records for service repairs
- Check for null or missing values
- SELECT
- MIN(started_at) AS start_date,
- MAX(started_at) AS end_date
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
The minimum start date is 2022-02-01 00:03:18 UTC and the maximum end date is 2023-01-31 23:56:09.
- SELECT COUNT
- (ride_id)
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- GROUP BY
- ride_id
- HAVING COUNT
- (ride_id) >1
There are no duplicates in the combined dataset
- SELECT COUNT(*) AS ride_length_less_than_0
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- WHERE
- ride_length_minutes < 0
- Count: 96 records
- DELETE FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- WHERE
- ride_length_minutes < 0
This statement removed 96 rows from bike_data_v02
- SELECT DISTINCT
- member_casual
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- Results are member and casual
- SELECT COUNT (*)
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- WHERE
- `ride_id LIKE `%` OR ride_id LIKE `%`
- OR rideable_type LIKE `%` OR rideable_type LIKE `%`
- OR start_station_name LIKE `%` OR start_station_name LIKE `%`
- OR start_station_id LIKE `%` OR start_station_id LIKE `%`
- OR end_station_name LIKE `%` OR end_station_name LIKE `%`
- OR end_station_id LIKE `%` OR end_station_id LIKE `%`
- OR member_casual LIKE `%` OR member_casual LIKE `%`
Count: 341 records
- UPDATE
- `rich-torus-377922.Cyclistic.bike_data_v02`
- SET
- ride_id= TRIM(ride_id)
- WHERE
- ride_id LIKE `%` OR ride_id LIKE `%`
- UPDATE
- `rich-torus-377922.Cyclistic.bike_data_v02`
- SET
- rideable_type= TRIM(rideable_type)
- WHERE
- rideable_type LIKE `%` OR rideable_type LIKE `%`
- UPDATE
- `rich-torus-377922.Cyclistic.bike_data_v02`
- SET
- start_station_name= TRIM(start_station_name)
- WHERE
- rideable_type LIKE `%` OR rideable_type LIKE `%`
- UPDATE
- `rich-torus-377922.Cyclistic.bike_data_v02`
- SET
- start_station_name= TRIM(start_station_name)
- WHERE
- start_station_name LIKE `%` OR start_station_name LIKE `%`
- UPDATE
- `rich-torus-377922.Cyclistic.bike_data_v02`
- SET
- start_station_id= TRIM(start_station_id)
- WHERE
- start_station_id LIKE `%` OR start_station_id LIKE `%`
- UPDATE
- `rich-torus-377922.Cyclistic.bike_data_v02`
- SET
- end_station_name= TRIM(end_station_name)
- WHERE
- end_station_name LIKE `%` OR end_station_name LIKE `%`
- UPDATE
- `rich-torus-377922.Cyclistic.bike_data_v02`
- SET
- end_station_id= TRIM(end_station_id)
- WHERE
- end_station_id LIKE `%` OR end_station_id LIKE `%`
- UPDATE
- `rich-torus-377922.Cyclistic.bike_data_v02`
- SET
- member_casual= TRIM(member_casual)
- WHERE
- member_casual LIKE `%` OR member_casual LIKE `%`
This statement modified 0 rows in bike_data_v02
This statement modified 0 rows in bike_data_v02
This statement modified 0 rows in bike_data_v02
This statement modified 180 rows in bike_data_v02
This statement modified 0 rows in bike_data_v02
This statement modified 182 rows in bike_data_v02
This statement modified 0 rows in bike_data_v02
This statement modified 0 rows in bike_data_v02
- SELECT COUNT(*)
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- WHERE
- start_station_name LIKE`%test%` OR
- start_station_name LIKE `%TEST%` OR
- start_station_name LIKE `%Test%` OR
- start_station_name LIKE `%repair%` OR
- start_station_name LIKE `%REPAIR%` OR
- start_station_name LIKE `%REPAIR%` OR
- start_station_name LIKE `%service%` OR
- start_station_name LIKE `%SERVICE%` OR
- start_station_name LIKE `%Service%` OR
- start_station_id LIKE `%test%` OR
- start_station_id LIKE `%TEST%` OR
- start_station_id LIKE `%Test%` OR
- start_station_id LIKE `%repair%` OR
- start_station_id LIKE `%REPAIR%` OR
- start_station_id LIKE `%Repair%` OR
- start_station_id LIKE `%service%` OR
- start_station_id LIKE `%SERVICE%` OR
- start_station_id LIKE `%Service%` OR
- end_station_name LIKE `%test%` OR
- end_station_name LIKE `%TEST%` OR
- end_station_name LIKE `%Test%` OR
- end_station_name LIKE `%repair%` OR
- end_station_name LIKE `%REPAIR%` OR
- end_station_name LIKE `%Repair%` OR
- end_station_name LIKE `%service%` OR
- end_station_name LIKE `%SERVICE%` OR
- end_station_name LIKE `%Service%` OR
- end_station_id LIKE `%test%` OR
- end_station_id LIKE `%TEST%` OR
- end_station_id LIKE `%Test%` OR
- end_station_id LIKE `%repair%` OR
- end_station_id LIKE `%REPAIR%` OR
- end_station_id LIKE `%Repair%` OR
- end_station_id LIKE `%service%` OR
- end_station_id LIKE `%SERVICE%` OR
- end_station_id LIKE `%Service%`
- DELETE FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- WHERE
- start_station_name LIKE`%test%` OR
- start_station_name LIKE `%TEST%` OR
- start_station_name LIKE `%Test%` OR
- start_station_name LIKE `%repair%` OR
- start_station_name LIKE `%REPAIR%` OR
- start_station_name LIKE `%REPAIR%` OR
- start_station_name LIKE `%service%` OR
- start_station_name LIKE `%SERVICE%` OR
- start_station_name LIKE `%Service%` OR
- start_station_id LIKE `%test%` OR
- start_station_id LIKE `%TEST%` OR
- start_station_id LIKE `%Test%` OR
- start_station_id LIKE `%repair%` OR
- start_station_id LIKE `%REPAIR%` OR
- start_station_id LIKE `%Repair%` OR
- start_station_id LIKE `%service%` OR
- start_station_id LIKE `%SERVICE%` OR
- start_station_id LIKE `%Service%` OR
- end_station_name LIKE `%test%` OR
- end_station_name LIKE `%TEST%` OR
- end_station_name LIKE `%Test%` OR
- end_station_name LIKE `%repair%` OR
- end_station_name LIKE `%REPAIR%` OR
- end_station_name LIKE `%Repair%` OR
- end_station_name LIKE `%service%` OR
- end_station_name LIKE `%SERVICE%` OR
- end_station_name LIKE `%Service%` OR
- end_station_id LIKE `%test%` OR
- end_station_id LIKE `%TEST%` OR
- end_station_id LIKE `%Test%` OR
- end_station_id LIKE `%repair%` OR
- end_station_id LIKE `%REPAIR%` OR
- end_station_id LIKE `%Repair%` OR
- end_station_id LIKE `%service%` OR
- end_station_id LIKE `%SERVICE%` OR
- end_station_id LIKE `%Service%`
Count: 2,224 records
This statement removed 2,224 rows from bike_data_v02
- SELECT COUNT(*)
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- WHERE
- ride_id IS NULL OR ride_id = ``
- OR rideable_type IS NULL OR rideable_type = ``
- OR started_at IS NULL
- OR ended_at IS NULL
- OR start_station_name IS NULL OR start_station_name = ``
- OR start_station_id IS NULL OR start_station_id = ``
- OR end_station_name IS NULL OR end_station_name = ` `
- OR end_station_id IS NULL OR end_station_id = ``
- OR start_lat IS NULL
- OR start_lng IS NULL
- OR end_lat IS NULL
- OR end_lng IS NULL
- OR member_casual IS NULL OR member_casual= ``
- COUNT: 1,315,917
This is a substantial amount of data (22.8%) that could potentially be discarded from the analysis. After further research, I found that every record has a start and end latitude and longitude which I can assume that each ride was a legitimate ride. In a real-world situation, I would inform my project manager of the start and end stations null values and relate it to the lack of missing longitudinal and longitudinal values. I believe that the start and end stations id’s may have not been recorded because of the small differences in the latitude and longitude values. For this reason, I will keep the null and missing data in the final dataset and continue on to the analysis phase.
My cleaned dataset has 5,752,024 records for analysis
Analyze
Riding Habits Per Rider Type
Calculate the minimum and maximum ride length and total rides grouped by member or casual rider.
- SELECT
- member_casual,
- AVG(ride_length_minutes) AS avg,
- MIN(ride_length_minutes) AS min,
- MAX(ride_length_minutes) AS max,
- COUNT(*) as total_rides
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- GROUP BY
- member_casual
Row | member_casual | avg | min | max | total_rides |
---|---|---|---|---|---|
1 | member | 12.629851023362049 | 0.0 | 1559.9 | 3409595 |
2 | casual | 28.997343290922572 | 0.0 | 41387.3 | 2342334 |
Rideable-type data
This query will calculate the average ride length in minutes for each type of bicycle offered by Cyclistic: docked, electric, or classic.
- SELECT
- rideable_type,
- member_casual,
- COUNT(*) amount_of_rides
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- GROUP BY
- rideable_type, member_casual
Row | rideable_type | member_casual | amount_of_rides |
---|---|---|---|
1 | electric_bike | casual | 1265741 |
2 | electric_bike | member | 1671629 |
3 | docked_bike | casual | 178235 |
4 | classic_bike | member | 1737966 |
5 | classic_bike | casual | 898358 |
Monthly rider data
This query will calculate the average ride length in minutes and total number of rides per month for both members and casual riders.
- SELECT
- month,
- member_casual,
- AVG(ride_length_minutes) AS avg_length_month,
- COUNT(*) AS rides_per_month
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- GROUP BY
- `rich-torus-377922.Cyclistic.bike_data_v02`
- GROUP BY
- member_casual, month
- ORDER BY
- member_casual, month
row | month | member_casual | avg_length_month | rides_per_month |
---|---|---|---|---|
1 | 1 | casual | 22.916716656668672 | 40008 |
2 | 2 | casual | 26.68491492146596 | 21392 |
3 | 3 | casual | 31.866251363929905 | 89814 |
4 | 4 | casual | 29.439448451690044 | 126299 |
5 | 5 | casual | 30.860481178115808 | 280312 |
6 | 5 | casual | 32.1108676851338 | 368855 |
Load more
Weekly rider data
This query will calculate the average ride length in minutes and total number of rides per weekday (1-sunday, 7-saturday) for both members and casual riders.
- SELECT
- day_of_week,
- member_casual,
-
- COUNT(*) AS rides_per_day_of_week
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- GROUP BY
- member_casual, day_of_week
- ORDER BY
- member_casual, day_of_week
row | day_of_week | member_casual | avg_ride_length | rides_per_day_of_week |
---|---|---|---|---|
1 | 1 | casual | 24.931847540598277 | 391396 |
2 | 2 | casual | 22.209678617605647 | 279978 |
3 | 3 | casual | 19.448353280531528 | 267289 |
4 | 4 | casual | 18.77122260606523 | 277023 |
5 | 5 | casual | 19.400259638308039 | 310817 |
Load more
Hourly rider data
This query will calculate the total number of rides per hour of the day for both members and casual riders.
- SELECT
- EXTRACT(hour FROM started_at) AS hour,
- COUNT(*) AS rides_taken,
- member_casual
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- GROUP BY
- member_casual, hour
- ORDER BY
- member_casual, hour
row | hour | rides_taken | member_casual |
---|---|---|---|
1 | 0 | 46554 | casual |
2 | 1 | 30135 | casual |
3 | 2 | 18664 | casual |
4 | 3 | 11055 | casual |
5 | 4 | 7660 | casual |
Load more
Top 20 starting stations
These queries will calculate the top 20 most popular starting locations for both members and for casual riders and I will filter out the null start station values.
- SELECT
- start_station_name,
- COUNT(*) AS rides_taken,
- start_lat,
- start_lng,
- member_casual
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- WHERE
- start_station_name IS NOT NULL
- AND
- member_casual = `member`
- GROUP BY
- start_station_name, member_casual, start_lng, start_lat
- ORDER BY
- rides_taken DESC
- LIMIT 20
row | start_station_name | rides_taken | start_lat | start_lng | member_casual |
---|---|---|---|---|---|
1 | University Ave & 57th St | 15903 | 41.791478 | -87.599861 | member |
2 | Ellis Ave & 60th St | 15739 | 41.78509714636 | -87.6010727606 | member |
3 | Kingsbury St & Kinzie St | 15417 | 41.88917683258 | -87.6385057718 | member |
4 | Clark St & Elm St | 14436 | 41.902973 | -87.63128 | member |
5 | Wells St & Concord Ln | 13054 | 41.912133 | -87.634656 | member |
Load more
Casual riders top 20 stations
- SELECT
- start_station_name,
- COUNT(*) AS rides_taken,
- start_lat,
- start_lng,
- member_casual
- FROM
- `rich-torus-377922.Cyclistic.bike_data_v02`
- WHERE
- start_station_name IS NOT NULL
- AND
- member_casual = `casual`
- GROUP BY
- start_station_name, member_casual, start_lng, start_lat
- ORDER BY
- rides_taken DESC
- LIMIT 20
row | start_station_name | rides_taken | start_lat | start_lng | member_casual |
---|---|---|---|---|---|
1 | Streeter Dr & Grand Ave | 41016 | 41.892278 | -87.612043 | casual |
2 | DuSable Lake Shore Dr & Monroe St | 22364 | 41.880958 | -87.616743 | casual |
3 | DuSable Lake Shore Dr & North Blvd | 16453 | 41.911722 | -87.626804 | casual |
4 | Theater on the Lake | 13085 | 41.926277 | -87.630834 | casual |
5 | Michigan Ave & Oak St | 12896 | 41.90096039 | -87.62377664 | casual |
Load more
Each of these query results were saved as .CSV files to be uploaded and visualized in Tableau
Act
Key Findings
- There are more Cyclistic members than casual riders but casual riders are using the bikes for a longer duration.
- Cyclistic members use classic bikes slightly more often than electric bikes while casual riders prefer electric bikes over classic bikes.
- Cyclistic members use their bikes consistently throughout the year besides the peak winter months while casual riders take advantage of riding during the more tolerable weather in the spring and early summer.
- Cyclistic members are using their bikes more often throughout the work-week and stay consistent during the weekends while causal riders use their bikes much more often during the weekends than they do during the weekdays.
- Cyclistic members use the bikes more often during business hours while casual riders are using the bikes longer and more often during the afternoon and the evening.
- Cyclist members start their rides in the city near commercial buildings and the University while causal riders start their rides near tourists areas and the coastal regions.
Observations: The data suggests that Cyclistic users can be characterized as a Chicago resident who uses the bikeshare primarily for everyday transportation purposes or a tourist who uses the service for Chicago’s local attractions.
Recommendations
Create additional annual membership packages and discounts:
- Summer membership: Promote season annual memberships pertaining to the most popular time of year, the summertime, to encourage casual riders to switch to an annual membership that aligns with their current usage patterns.
- Weekend membership: Saturday and Sunday has shown to be the most prominent days of bikeshare usage for casual riders. A weekend annual membership offering unlimited usage of the bikes on Saturdays and Sundays for a reasonable price could increase the demand of Cyclistic’s bike share options and product loyalty.
- Discounts: Offer discounts for long rides through the annual membership option to promote sightseeing opportunities when exploring the city by bike.
Launch new marketing campaigns and events:
- Location based advertisements: Increase advertisements for annual memberships at the top locations for casual riders. By exposing these users to the new types of annual memberships offered in the previous recommendations, they may be more willing to become a Cyclistic annual member.
- Season based advertisements: Increase advertisements for each of the annual membership options available from May-September as casual riders are mostly active during those months.
- Time based advertisements: Increase advertisements for new annual membership options during causal riders most active times which is from noon to 7 PM.
Welcoming tourist as a part of the Chicago’s community:
- Create a community section on the Cyclistic App to encourage leisure cycling as an opportunity for community members to connect with others.
- Offering online Chicago influencers incentives to promote Cyclistic usage through social media platforms.
- Launching consistent community events focused on health and wellness, environmental awareness, tourism, and leisure activities for Cyclistic members.
For additional customer feedback:
- Cyclistic could benefit in creating a user survey through social media, after the bikeshare is completed or in the app to collect feedback from users regarding their satisfactions with choosing Cyclistic and/or Cyclistic’s deficiencies.