Cyclistic

Shantel Shephard

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

  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?

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
Verify Date Range of Records
  • 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.

Check for Duplicates
  • 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

Check for Ride Lengths that are Less than 0 Minutes and Delete those Records
  • 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


Check for misspellings and extra spaces and trim extra spaces before and after string values

Misspellings
  • SELECT DISTINCT
  • member_casual
  • FROM
  • `rich-torus-377922.Cyclistic.bike_data_v02`

  • Results are member and casual
Checking for extra spaces before and after string values
  • 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

Trim extra spaces before and after string values
  • UPDATE
  • `rich-torus-377922.Cyclistic.bike_data_v02`
  • SET
  • ride_id= TRIM(ride_id)
  • WHERE
  • ride_id LIKE `%` OR ride_id LIKE `%`
  • This statement modified 0 rows in bike_data_v02

  • UPDATE
  • `rich-torus-377922.Cyclistic.bike_data_v02`
  • SET
  • rideable_type= TRIM(rideable_type)
  • WHERE
  • rideable_type LIKE `%` OR rideable_type LIKE `%`
  • This statement modified 0 rows in bike_data_v02

  • UPDATE
  • `rich-torus-377922.Cyclistic.bike_data_v02`
  • SET
  • start_station_name= TRIM(start_station_name)
  • WHERE
  • rideable_type LIKE `%` OR rideable_type LIKE `%`
  • This statement modified 0 rows in bike_data_v02

  • 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 `%`
  • This statement modified 180 rows in bike_data_v02

  • 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 `%`
  • This statement modified 0 rows in bike_data_v02

  • 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 `%`
  • This statement modified 182 rows in bike_data_v02

  • 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 `%`
  • This statement modified 0 rows in bike_data_v02

  • 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

Find and remove records for service repairs
  • 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%`

  • Count: 2,224 records

  • 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%`

  • This statement removed 2,224 rows from bike_data_v02

Check for null or missing values
  • 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.

Members 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 = `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

Share

Riding habits per rider type

Average Ride Length by Rider Type Total Ride Count in Percentage

Observations: Casual riders ride time is about twice the amount of time than members ride time. Cyclistic members make up almost 60% of Cyclistic’s user base and casual riders make up about 40% of the user base.

Rideable-type data

Total Ride Count Per Rider Total Number of Riders per Bike Type Percent

Observations: Cyclistic members use both classic and electric bikes at a similar rate although classic bikes are used slightly more. There is no data for members using docked bikes. Casual riders use electric bikes more often than classic bikes. Docked bikes are also used by casual riders, but at a less than 10% rate.

Monthly rider data

Amount of Rides per Month by Rider Type Average Length of Rides per Month

Observations: Casual riders spend the most time on the bikes from March through July and the least time during the winter months, November through January. The number of rides by casual riders are the highest from May-October peaking in July then they begin to slow down in the late summer, August, through late fall, October. February is the month in which casual riders use the bikes significantly less. These trends can be attributed to peak travel months along with historical Chicago weather. Cyclistic member’s ride length remains reasonably consistent throughout the year ranging 10.5-14 minutes per ride. As the weather warms up in the late spring through to the early fall,, their ride lengths peak at 14 minutes. Member’s ride frequencies are the highest for a longer duration of the year, from April- November, with their ride amounts peaking later in the year in August then slowly falling until November.

Weekly rider data

Amount of Rides per Day of the Week Averate Ride Length per Day of the Week

Observations: Casual riders are riding the bikes longer and more often during the weekends. During the work-week (Monday-Friday), they are using the bike significantly less than they do on the weekends. Cyclistic members are on the bikes for a longer time during the weekends but remain quite consistent in ride length throughout the entire week. More members use the bikes Monday- Friday than they do during the weekend.

Hourly rider data

Average Number of Rides per Hour

Observations: Casual riders start their bike rides most often from noon- 7 PM and 5 PM is the peak time that they start their rides. From 9 PM to 10 AM, casual riders start their rides less often.

3-6 PM are the most popular times for Cyclistic members to start their bike rides while 7-8 AM is the most popular starting ride time frame in the morning. Bikes are being used throughout the day time at a consistent rate while during the night time, from 11 PM to 6 AM are the times in which bikes are less used.

Top 20 starting stations

Member`s Top 20 Start Sations

Observations: The starting stations that the Cyclistic members are most often using are concentrated in and surrounding the central part of northern Chicago. These stations are more so in the city where more commercial buildings are located as well as near the University of Chicago.

Casual riders 20 starting stations

Casual Rider's Top 20 Start Sations

Observations: Causal rider’s most popular starting stations are concentrated along the coastal regions of Lake Michigan where there are more attractions such as harbors, parks and shorelines.

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.