Анализ Данных Велопроката В Нью-Йорке Во Время COVID-19

🇺🇸 ENGLISH-LANGUAGE VERSION | 🇺🇸 АНГЛОЯЗЫЧНАЯ ВЕРСИЯ


Обложка публикации под названием "Анализ Данных Велопроката В Нью-Йорке Во Время COVID-19".
(Эта обложка публикации от Влада Дорохина доступна по лицензии CC BY-SA 4.0)

Содержание

  1. Предисловие
  2. О Компании
  3. Дорожная Карта Исследовательского Проекта
  4. Вопрос
  5. Подготовка
  6. Процесс
  7. Анализ
  8. Распространение
  9. Действие
  10. Примечания

1. Предисловие

Этот профессиональный исследовательский проект является частью моего портфолио как аналитика данных — надеюсь, он будет вам полезен и интересен!

2. О Компании

«Citi Bike» — это частная общественная система проката велосипедов, обслуживающая Нью-Йорк (штат Нью-Йорк), а также Джерси-Сити (штат Нью-Джерси) и Хобокен (штат Нью-Джерси).

В октябре 2017 года общее количество поездок достигло 50 миллионов, а в июле 2020 года — 100 миллионов. По состоянию на июль 2019 года число пользователей с годовой подпиской составляло 169 тысяч человек в год. Среднемесячное количество пассажиров впервые превысило 100 тысяч в июне 2021 года.

3. Дорожная Карта Исследовательского Проекта

Проект следует шестиэтапному процессу анализа данных:

  1. Вопрос
  2. Подготовка
  3. Процесс
  4. Анализ
  5. Распространение
  6. Действие

4. Вопрос

Этот шаг будет состоять из следующих задач:

  • Постановка эффективных вопросов по системе SMART.
  • Обобщение данных.
  • Управление ожиданиями команды и заинтересованных сторон.

4.1. Цель

Цель — помочь разработать новую маркетинговую стратегию, которая позволит превратить любителей в пользователей с годовой подпиской.

Три вопроса могут помочь определить будущую возможную маркетинговую программу:

  1. Как отличается использование велосипедов «Citi Bike» пользователями без подписки и пользователями с годовой подпиской?
  2. Для чего обычные пользователи могли бы купить годовую подписку от «Citi Bike»?
  3. Как «Citi Bike» может побудить обычных пользователей стать подписчиками?
  4. Как «Citi Bike» может побудить пользователей с годовой подпиской пользоваться её услугами ещё больше?

5. Подготовка

Этот шаг будет состоять из следующих ключевых задач:

  • Обозначить проблемы предвзятости и достоверности данных, обеспечить соблюдение этических норм для обработки данных.
  • Получить доступ к базам данных и импортировать данные.
  • Организовать и защитить данные.

5.1. Организация Данных

Для анализа и выявления различных тенденций были использованы исторические данные о поездках «Citi Bike» с марта 2021 года по март 2022 года. Данные хранились в отдельном каталоге, и для каждого набора данных были сделаны копии.

5.2. Проверка Данных И Доступность

  • Предоставленные данные были взяты с веб-сайта компании. Набор данных является общедоступным и доступен для использования всеми желающими.
  • Данные были обработаны с целью исключения поездок, совершенных сотрудниками, а также любых поездок, продолжительность которых составляла менее 60 секунд.
  • Данные предоставлены в соответствии с Политикой использования данных «Citi Bike».

5.3. Конфиденциальность Данных

В целях конфиденциальности данных, я не буду использовать персональные идентификационные данные пассажиров, и это не позволит мне определить, совершил ли один и тот же пользователь/пассажир несколько поездок. Все идентификаторы поездок (ride_id) в этом наборе данных уникальны.

5.4. Код, Используемый Для Этапа «Подготовка»

Сначала я загрузил необходимые для проекта пакеты R в «RStudio» — интегрированную среду разработки (IDE) для «R» . Все эти пакеты, ранее отсутствовавшие в системе, были установлены с помощью команды: install.packages(“имя пакета”)

# Load the project-related packages

install.packages()
library(tidyverse)
library(janitor)
library(ggmap)
library(geosphere)
library(lubridate)
library(gridExtra)

Затем я скачал соответствующие наборы данных с 03.2021 по 03.2022 с сайта «Citi Bike» и импортировал их в «RStudio». Переменные, представляющие эти наборы данных, имеют понятные имена — например, tripdata202103 или tripdata202203 .

# Import the datasets to RStudio

tripdata202103 <- read_csv("202103-citibike-tripdata.csv")
tripdata202104 <- read_csv("202104-citibike-tripdata.csv")
tripdata202105 <- read_csv("202105-citibike-tripdata.csv")
tripdata202106 <- read_csv("202106-citibike-tripdata.csv")
tripdata202107 <- read_csv("202107-citibike-tripdata.csv")
tripdata202108 <- read_csv("202108-citibike-tripdata.csv")
tripdata202109 <- read_csv("202109-citibike-tripdata.csv")
tripdata202110 <- read_csv("202110-citibike-tripdata.csv")
tripdata202111 <- read_csv("202111-citibike-tripdata.csv")
tripdata202112 <- read_csv("202112-citibike-tripdata.csv")
tripdata202201 <- read_csv("202201-citibike-tripdata.csv")
tripdata202202 <- read_csv("202202-citibike-tripdata.csv")
tripdata202203 <- read_csv("202203-citibike-tripdata.csv")

Поскольку не было необходимости работать с импортированными наборами данных по одному, я решил объединить их все в единый набор данных под названием tripdata и работать с ним в дальнейшем.

# Merge individual monthly datasets into a single large dataset

tripdata <- bind_rows(tripdata202103, tripdata202104, tripdata202105, tripdata202106, tripdata202107, tripdata202108, tripdata202109, tripdata202110, tripdata202111, tripdata202112, tripdata202201, tripdata202202, tripdata202203)

К сожалению, мне не удалось создать переменную tripdata из-за разных типов данных в столбце end_station_id в импортированных наборах данных. Это сообщение об ошибке, которое я получил, содержит дополнительную информацию:

One or more parsing issues, see `problems()` for details 
> tripdata <- bind_rows(tripdata202103, tripdata202104, tripdata202105, tripdata202106, tripdata202107, tripdata202108, tripdata202109, tripdata202110, tripdata202111, tripdata202112, tripdata202201, tripdata202202, tripdata202203)
Error in `bind_rows()`:
 ! Can't combine `end_station_id` <double> and `end_station_id` <character>.
Run `rlang::last_error()` to see where the error occurred.

Поэтому мне нужно было преобразовать все данные в числовой тип в столбце end_station_id во всех импортированных наборах данных. Я просмотрел столбцы каждого набора данных и обнаружил, что только в tripdata202110 end_station_id был отформатирован как символьный тип.

# A review of column types of the tripdata202110 dataset

str(tripdata202110)

Я изменил столбец end_station_id этого набора данных на числовой тип и попытался объединить отдельные ежемесячные наборы данных (tripdata202103, tripdata202104, tripdata202105 и т. д.) в один большой набор данных, снова называемый tripdata.

# Change end_station_id to the numeric type for the tripdata202110 dataset

tripdata202110 <- mutate(tripdata202110, end_station_id = as.numeric(end_station_id))
# Merge individual monthly datasets into a single large dataset, attempt no. 2

tripdata <- bind_rows(tripdata202103, tripdata202104, tripdata202105, tripdata202106, tripdata202107, tripdata202108, tripdata202109, tripdata202110, tripdata202111, tripdata202112, tripdata202201, tripdata202202, tripdata202203)

После того как вторая попытка увенчалась успехом и набор данных tripdata был создан, я смог увидеть список названий столбцов, первые строки, статистическую сводку и другие данные. Мне было это нужно, чтобы лучше понять данные, с которыми я работаю.

# View of the merged dataset in a table form

View(tripdata)
# Check the merged dataset
## See a list of column names

print("A list of column names:")
colnames(tripdata)

## See the first 6 rows

print("The first 6 rows:")
head(tripdata)

## See a list of columns and data types (numeric, character, etc.)

print("A list of columns and data types (numeric, character, etc.):")
str(tripdata)

## Glimpse of data

print("Glimpse:")
glimpse(tripdata)

## Statistical summary of data

print("Summary:")
summary(tripdata)

6. Процесс

Этот шаг будет состоять из следующих ключевых задач:

  • Связка бизнес-целей с анализом данных.
  • Очистка маленьких и больших наборов данных с помощью языка программирования «R».
  • Документирование процесса очистки данных.

6.1. Код, Используемый Для Этапа «Процесс»

Чтобы получить непредвзятые выводы из набора данных tripdata , с которым я работаю, мне необходимо его предварительно очистить. Для этого я удалил из него все пустые значения (NA, null и т. д.) и поместил «очищенный» результат в переменную tripdata_clean.

# Clean the tripdata database to be able to properly work with it
## Drop all NA (null = empty values)

tripdata_clean <- drop_na(tripdata)

## View the merged clean database in a table form

View(tripdata_clean)

7. Анализ

Этот шаг будет состоять из следующих ключевых задач:

  • Сортировка, фильтрация, преобразование и форматирование данных с помощью языка программирования «R».
  • Обоснование процесса анализа данных.
  • Поиск обратной связи и поддержки у других в ходе анализа данных.

7.1. Код, Используемый Для Этапа «Анализ»

Я изменил тип данных в строке даты на подходящий для расчётов и выделил значения месяца, дня, года и дня недели в отдельные строки. Это было необходимо для удобства анализа набора данных tripdata_clean и для дальнейшей обработки данных.

# Create new columns
## Change the type of data in the date row to an appropriate one for calculations

tripdata_clean$date <- as.Date(tripdata_clean$started_at)

## Separate the dates into month

tripdata_clean$month <- format(as.Date(tripdata_clean$date), "%m")

## Separate the dates into day

tripdata_clean$day <- format(as.Date(tripdata_clean$date), 
"%d")

## Separate the dates into year

tripdata_clean$year <- format(as.Date(tripdata_clean$date), "%Y")

## Separate the dates into day of a week

tripdata_clean$day_of_week <- format(as.Date(tripdata_clean$date), "%A")

Дополнительно, я создал новые столбцы: продолжительность поездки (в секундах), пройденное расстояние поездки (в километрах) и скорость поездки (в км/ч).

# Create new columns
## Duration of the ride length in seconds

tripdata_clean$ride_length <- difftime(tripdata_clean$ended_at, tripdata_clean$started_at)
## Ride distance traveled in kilometers
tripdata_clean$ride_distance <- distGeo(matrix(c(tripdata_clean$start_lng, tripdata_clean$start_lat), ncol = 2), matrix(c(tripdata_clean$end_lng, tripdata_clean$end_lat), ncol = 2))
tripdata_clean$ride_distance <- tripdata_clean$ride_distance / 1000

## Ride speed in km/h

tripdata_clean$ride_speed = c(tripdata_clean$ride_distance) / as.numeric(c(tripdata_clean$ride_length), units="hours")

Поскольку набор данных tripdata_clean мог содержать ненужные значения, когда велосипеды вывозились из доков и проверялись на качество сотрудниками «Citi Bike» (т.е. не среднестатистическими пользователями) или когда ride_length был отрицательным, мне нужно было убедиться, что они не повлияют на моё исследование и не сделают результаты предвзятыми.

# Double-check there will be no values when bikes were taken out of docks and checked for quality by Citi Bike employees or when ride_length was negative

tripdata_clean <- tripdata_clean[!(tripdata_clean$start_station_name == "HQ QR" | tripdata_clean$ride_length < 0),]

После подготовки набора данных tripdata_clean я рассчитал среднее расстояние и длину поездки как для обычных пользователей, так и для пользователей-подписчиков, чтобы узнать, кто активнее пользуется велосипедами «Citi Bike».

# Calculate the average distance for both the casual and member type users

member_casual_mean <- tripdata_clean %>%
  group_by(member_casual) %>%
  summarise(mean_time = mean(ride_length), mean_distance = mean(ride_distance))

## Build a table with the results

View(member_casual_mean)

Вот таблица member_casual_mean, которую я получил:

  • Как видно из таблицы, средняя продолжительность поездки для обычного пользователя составляет 1551,085 секунды (25,851 минуты), а средняя дальность поездки — 2,027 километра.
  • Для пользователя-подписчика средняя продолжительность поездки составляет 810,361 секунды (13,506 минут), а средняя дальность поездки — 1,8207 километра.

Это означает, что дальность поездки обычного пользователя в среднем почти в два раза больше, чем у подписчика! Более того, дальность поездки обычного пользователя также больше.

Для лучшего понимания приведенных выше результатов я построил два разных графика (среднее время в пути, среднее расстояние поездки) и объединил их на третьем графике, который представлен ниже.

# Build a plot of mean travel time by user type

member_casual_mean_time <- ggplot(member_casual_mean) + 
  geom_col(mapping = aes(x = member_casual, y = mean_time, fill = member_casual), show.legend = TRUE) +
  labs(title = "Mean travel time by user type: Member / Casual", x = "User type", y = "Mean time in sec", caption = "Data by Citi Bike. Plot by Vlad Dorokhin")

## Build a graph with the results

print(member_casual_mean_time)

Вот первый полученный мною график:

# Build a plot of mean travel distance by user type

member_casual_mean_distance <- ggplot(userType_means) + 
  geom_col(mapping = aes(x = member_casual, y = mean_distance, fill = member_casual), show.legend = TRUE) +
  labs(title = "Mean travel distance by user type: Member / Casual", x = "User type", y = "Mean distance in km", caption = "Data by Citi Bike. Plot by Vlad Dorokhin")

## Build a graph with the results

print(member_casual_mean_distance)

Вот второй полученный мною график:

# Combine two recent plots (mean travel time and mean travel distance) together

grid.arrange(member_casual_mean_time, member_casual_mean_distance, ncol = 2)

Вот объединенные графики (2 графика выше), которые я получил:

Определив среднее время в пути и среднее расстояние поездок для обычных пользователей и подписчиков, я проверил количество поездок по типу пользователя в течение недели, чтобы лучше понять активность пользователей.

# Check the number of rides by user type during a week
## Build a tibble of the data

member_casual_rides_week <- tripdata_clean %>% 
    mutate(weekday = wday(started_at, label = TRUE)) %>% 
    group_by(member_casual, weekday) %>% 
    summarise(number_of_rides = n(), average_duration = mean(ride_length), .groups = 'drop') %>% 
    arrange(member_casual, weekday)
print(member_casual_rides_week)

Вот полученный мной тибл (англ. tibble) (фрейм данных) размером 14 x 4:

## Build a plot of the data

tripdata_clean %>% 
  mutate(weekday = wday(started_at, label = TRUE)) %>% 
  group_by(member_casual, weekday) %>% 
  summarise(number_of_rides = n(), average_duration = mean(ride_length), .groups = 'drop') %>% 
  arrange(member_casual, weekday)  %>% 
  ggplot(aes(x = weekday, y = number_of_rides, fill = member_casual)) +
  geom_col(position = "dodge") +
  labs(title = "Number of rides by user type during the week", x = "Days of the week", y = "Number of rides", caption = "Data by Citi Bike. Plot by Vlad Dorokhin", fill = "User type") +
  theme(legend.position = "top")

Вот какой график у меня получился:

Как видно из графика, подписчики совершают значительно больше велопрогулок в течение недели, чем обычные пользователи. Кроме того, можно сделать следующие выводы:

  • Больше всего поездок подписчики совершают по средам (середине рабочей недели), а меньше всего — по воскресеньям. В целом, подписчики совершают больше поездок в будние дни, чем в выходные.
  • У обычных пользователей результаты иные: больше всего поездок они совершают по субботам и воскресеньям (то есть в выходные). В будни обычные пользователи совершают поездки значительно реже, а понедельник для них — наименее активный день.

Проверив количество поездок по типу пользователей за неделю, я создал новый набор данных, содержащий только классические велосипеды и электровелосипеды в столбце rideable_type. Я назвал его tripdata_clean_classic_electric. Используя этот набор данных, я смог проверить использование типа велосипеда (классический/электрический) по типу пользователей (подписчик / обычный пользователь) и построить соответствующий график с результатами.

# Create a new data set with only classic bikes and electric bikes in the rideable_type column

tripdata_clean_classic_electric <- tripdata_clean %>%
  filter(rideable_type == "classic_bike" | rideable_type == "electric_bike")
# Check the bike type usage by user type
## Build a tibble of the data

member_casual_classic_electric <- tripdata_clean_classic_electric %>%
  group_by(member_casual, rideable_type) %>%
  summarise(totals=n(), .groups="drop")
print(member_casual_classic_electric)

Вот полученный мной тибл (англ. tibble) (фрейм данных) размером 4 x 3:

## Build a plot of the data

tripdata_clean_classic_electric %>%
  group_by(member_casual, rideable_type) %>%
  summarise(totals=n(), .groups="drop")  %>%
  ggplot() +
  geom_col(aes(x = member_casual, y = totals, fill = rideable_type), position = "dodge") + 
  labs(title = "Bike type usage by user type: Classic Bike / Electric Bike", x = "User type", y = NULL, fill = "Bike type", caption = "Data by Citi Bike. Plot by Vlad Dorokhin") +
  scale_fill_manual(values = c("classic_bike" = "#ffa600", "electric_bike" = "#bc5090")) +
  theme_minimal() +
  theme(legend.position = "top")

Вот какой график у меня получился:

Как видно из графика:

  • Как обычные пользователи, так и подписчики используют классические велосипеды гораздо чаще, чем электровелосипеды!
  • Подписчики используют как электровелосипеды, так и классические велосипеды гораздо чаще, чем обычные пользователи.

После этого я проверил использование типа велосипеда (классический велосипед / электровелосипед) обоими типами пользователей (участник + случайный пользователь) в течение недели и построил соответствующий график с результатами.

# Check the bike types usage by both user types during a week
## Build a tibble of the data

member_casual_classic_electric_week <- tripdata_clean_classic_electric %>%
  mutate(weekday = wday(started_at, label = TRUE)) %>% 
  group_by(member_casual, rideable_type, weekday) %>%
  summarise(totals=n(), .groups="drop")
print(member_casual_classic_electric_week)

Вот полученный мной тибл (англ. tibble) (фрейм данных) размером 28 x 4:

## Build a plot of the data

tripdata_clean_classic_electric %>%
  mutate(weekday = wday(started_at, label = TRUE)) %>% 
  group_by(member_casual, rideable_type, weekday) %>%
  summarise(totals=n(), .groups="drop") %>%
  ggplot(aes(x = weekday, y = totals, fill = rideable_type)) +
  geom_col(position = "dodge") + 
  facet_wrap(~member_casual) +
  labs(title = "Bike type usage by user type during a week", x = "User type", y = NULL, caption = "Data by Citi Bike. Plot by Vlad Dorokhin") +
  scale_fill_manual(values = c("classic_bike" = "#ffa600", "electric_bike" = "#bc5090")) +
  theme_minimal() +
  theme(legend.position="top")

Вот какой график у меня получился:

Как видно из графика:

  • Как обычные пользователи, так и подписчики используют классические велосипеды гораздо чаще, чем электровелосипеды, каждый день недели.
  • Подписчики чаще используют как классические велосипеды, так и электровелосипеды по сравнению с обычными пользователями.
  • Чаще всего обычные пользователи катаются на классических велосипедах по субботам, а затем по воскресеньям. Использование электровелосипедов среди обычных пользователей более-менее стабильно в течение всей недели.
  • Чаще всего подписчики используют классические велосипеды по средам (середина рабочей недели), за ней следуют четверг и вторник. Эти же дни (в том же порядке) также являются наиболее популярными для использования электровелосипедов подписчиками.

После проверки использования типа велосипеда (классический велосипед / электровелосипед) обоими типами пользователей (подписчик + обычный пользователь) в течение недели, я проверил данные координат поездок по самым популярным маршрутам — тем, которые использовались > 1000 раз и > 500 раз.

# Check the coordinates data of the rides
## Create a table only for the top 1 most popular routes (used > 1000 times)

tripdata_coordinates_1000 <- tripdata_clean %>% 
  filter(start_lng != end_lng & start_lat != end_lat) %>%
  group_by(start_lng, start_lat, end_lng, end_lat, member_casual, rideable_type) %>%
  summarise(total = n(), .groups="drop") %>%
  filter(total > 1000)
print(tripdata_coordinates_1000)

Вот тибл (англ. tibble) (фрейм данных) размером 226 x 7, который я получил для tripdata_coordinates_1000 :

## Create 2 sub-tables for each user type for the top 1 most popular routes (used > 1000 times)

casual_1000 <- tripdata_coordinates_1000 %>% filter(member_casual == "casual")
member_1000 <- tripdata_coordinates_1000 %>% filter(member_casual == "member")
print(casual_1000)
print(member_1000)

Вот тибл (англ. tibble) (фрейм данных) размером 20 x 7, который я получил для casual_1000 :

Вот тибл (англ. tibble) (фрейм данных) размером 206 x 7, который я получил для member_1000 :

## Create a table only for the top 2 most popular routes (used > 500 times)

tripdata_coordinates_500 <- tripdata_clean %>% 
  filter(start_lng != end_lng & start_lat != end_lat) %>%
  group_by(start_lng, start_lat, end_lng, end_lat, member_casual, rideable_type) %>%
  summarise(total = n(), .groups="drop") %>%
  filter(total > 500)
print(tripdata_coordinates_500)

Вот тибл (англ. tibble) (фрейм данных) размером 1596 x 7, который я получил для tripdata_coordinates_500 :

## Create 2 sub-tables for each user type for the top 2 most popular routes (used > 500 times)

casual_500 <- tripdata_coordinates_500 %>% filter(member_casual == "casual")
member_500 <- tripdata_coordinates_500 %>% filter(member_casual == "member")
print(casual_500)
print(member_500)

Вот тибл (англ. tibble) (фрейм данных) размером 89 x 7, который я получил для casual_500 :

Вот тибл (англ. tibble) (фрейм данных) размером 1507 x 7, который я получил для member_500 :

В конце я построил 4 графика координатных данных поездок по самым популярным маршрутам: 2 графика для поездок, совершённых > 1000 раз, и 2 графика для поездок, совершённых > 500 раз.

# Store bounding box coordinates for ggmap

nyc_bounding_box <- c(
  left = -74.15,
  bottom = 40.5774,
  right = -73.7004,
  top = 40.9176
)
# Store the stamen map of NYC

nyc_stamen_map <- get_stamenmap(
  bbox = nyc_bounding_box,
  zoom = 12,
  maptype = "toner"
)
# Plot of the data by casual users on the map (for routes used > 1000 times)

ggmap(nyc_stamen_map, darken = c(0.8, "white")) +
  geom_curve(casual_1000, mapping = aes(x = start_lng, y = start_lat, xend = end_lng, yend = end_lat, alpha = total, color = rideable_type), size = 0.5, curvature = .2, arrow = arrow(length = unit(0.2, "cm"), ends = "first", type = "closed")) +
  coord_cartesian() +
  labs(title = "Most popular routes by casual users (for routes used > 1000 times)", x = NULL, y = NULL, color = "User type", caption = "Data by Citi Bike. Plot by Vlad Dorokhin") +
  theme(legend.position="right")

Вот график, который я получил для самых популярных маршрутов среди обычных пользователей (для маршрутов, использованных > 1000 раз):

Как видно из графика:

# Plot of the data by casual users on the map (for routes used > 500 times)

ggmap(nyc_stamen_map, darken = c(0.8, "white")) +
  geom_curve(casual_500, mapping = aes(x = start_lng, y = start_lat, xend = end_lng, yend = end_lat, alpha = total, color = rideable_type), size = 0.5, curvature = .2, arrow = arrow(length = unit(0.2, "cm"), ends = "first", type = "closed")) +
  coord_cartesian() +
  labs(title = "Most popular routes by casual users (for routes used > 500 times)", x = NULL, y = NULL, color = "User type", caption = "Data by Citi Bike. Plot by Vlad Dorokhin") +
  theme(legend.position="right")

Вот график, который я получил для самых популярных маршрутов среди обычных пользователей (для маршрутов, использованных > 500 раз):

Интересный факт:

  • Как видно из графика, популярных маршрутов (использованных > 1000 или даже > 500 раз) для электровелосипедов среди обычных пользователей не существует.
# Plot of the data by annual members on the map (for routes used > 1000 times)

ggmap(nyc_stamen_map, darken = c(0.8, "white")) +
  geom_curve(member_1000, mapping = aes(x = start_lng, y = start_lat, xend = end_lng, yend = end_lat, alpha = total, color = rideable_type), size = 0.5, curvature = .2, arrow = arrow(length = unit(0.2,"cm"), ends="first", type = "closed")) +  
  coord_cartesian() +
  labs(title = "Most popular routes by annual members (for routes used > 1000 times)", x = NULL,y = NULL, caption = "Data by Citi Bike. Plot by Vlad Dorokhin") +
  theme(legend.position="right")

Вот график, который я получил для самых популярных маршрутов среди пользователей с годовой подпиской (для маршрутов, использованных > 1000 раз):

Как видно из графика:

# Plot of the data by annual members on the map (for routes used > 500 times)

ggmap(nyc_stamen_map, darken = c(0.8, "white")) +
  geom_curve(member_500, mapping = aes(x = start_lng, y = start_lat, xend = end_lng, yend = end_lat, alpha = total, color = rideable_type), size = 0.5, curvature = .2, arrow = arrow(length = unit(0.2,"cm"), ends="first", type = "closed")) +  
  coord_cartesian() +
  labs(title = "Most popular routes by annual members (for routes used > 500 times)", x = NULL,y = NULL, caption = "Data by Citi Bike. Plot by Vlad Dorokhin") +
  theme(legend.position="right")

Вот график, который я получил для самых популярных маршрутов среди пользователей с годовой подпиской (для маршрутов, использованных > 500 раз):

Интересные факты:

  • Как видно на графике данных по пользователям с годовой подпиской на карте (для самого популярного маршрута, использованного более 1000 раз), на нём нет маршрутов, используемых для электровелосипедов.
  • Однако если посмотреть на карту данных по пользователям с годовой подпиской на карте (для 2 самых популярных маршрутов, использованных > 500 раз), то самые популярные маршруты для электровелосипедов расположены у моста Пуласки, в районе Гармент и в районе Файненшл-дистрикт неподалёку от One New York Plaza.

8. Распространение

Этот шаг будет состоять из следующих задач:

  • Создание визуализаций и информационных панелей (все они показаны выше).
  • Рассказ истории на основе данных.
  • Представление данных для других и ответы на соответствующие вопросы.

8.1. Среднее Расстояние И Длина Поездки

В результате расчета среднего расстояния и длительности поездок (как для обычных пользователей, так и для пользователей с годовой подпиской) я выяснил, что:

  • Средняя продолжительность поездки для обычного пользователя составляет 1551,085 секунды (25,851 минуты), а средняя дальность поездки — 2,027 километра.
  • Средняя продолжительность поездки для подписчика составляет 810,361 секунды (13,506 минут), а средняя дальность поездки — 1,8207 километра.

Это означает, что дальность поездки обычного пользователя в среднем почти в два раза больше, чем у подписчика! Более того, дальность поездки обычного пользователя также больше.

Вот соответствующие таблица и график:

8.2. Количество Поездок По Типу Пользователей В Течение Недели

Проверив количество поездок по типу пользователя (обычные пользователи / пользователи с годовой подпиской) в течение недели, я обнаружил, что:

  • Подписчики совершают гораздо больше поездок на велосипеде в течение недели по сравнению с обычными пользователями.
  • Больше всего поездок подписчики совершают по средам (середине рабочей недели), а меньше всего — по воскресеньям. В целом, подписчики совершают больше поездок в будние дни, чем в выходные.
  • У случайных пользователей результаты иные: больше всего поездок они совершают по субботам и воскресеньям (то есть в выходные). В будни случайные пользователи совершают поездки значительно реже, а понедельник для них — наименее активный день.

Вот соответствующий график:

8.3. Использование Велосипедов По Типу Пользователей

Проверив тип использования велосипеда (классический велосипед / электровелосипед) по типу пользователя (подписчик / обычный пользователь), я обнаружил, что:

  • Как обычные пользователи, так и подписчики используют классические велосипеды гораздо чаще, чем электровелосипеды!
  • Подписчики используют как электровелосипеды, так и классические велосипеды гораздо чаще, чем обычные пользователи.

Вот соответствующий график:

8.4. Использование Велосипедов Обоими Типами Пользователей В Течение Недели

Проверив использование типа велосипеда (классический велосипед / электровелосипед) обоими типами пользователей (подписчик + обычный пользователь) в течение недели, я обнаружил, что:

  • Как обычные пользователи, так и подписчики используют классические велосипеды гораздо чаще, чем электровелосипеды, каждый день недели.
  • Подписчики чаще используют как классические велосипеды, так и электровелосипеды по сравнению с обычными пользователями.
  • Чаще всего обычные пользователи катаются на классических велосипедах по субботам, а затем по воскресеньям. Использование электровелосипедов среди обычных пользователей более-менее стабильно в течение всей недели.
  • Чаще всего обычные пользователи используют классические велосипеды по средам (середина рабочей недели), затем следуют четверг и вторник. Эти же дни (в том же порядке) также являются наиболее популярными для использования электровелосипедов подписчиками.

Вот соответствующий график:

8.5. Самые Популярные Маршруты У Пользователей Без Подписки (использованные > 1000 раз (1) и использованные > 500 раз (2))

Построив график наиболее популярных маршрутов среди обычных пользователей (для маршрутов, использованных > 1000 раз), я обнаружил, что:

(1) Вот соответствующий график:

Добавив к графику выше маршруты, наиболее популярные у обычных пользователей (использованные > 500 раз), я обнаружил, что:

  • Популярных маршрутов (использованных более 1000 или даже более 500 раз) для электровелосипедов среди обычных пользователей не существует.

(2) Вот соответствующий обновлённый график:

8.6. Самые Популярные Маршруты У Пользователей С Годовой Подпиской (использованные > 1000 раз (1) и использованные > 500 раз (2))

Построив график наиболее популярных маршрутов среди обычных пользователей (для маршрутов, использованных > 1000 раз), я обнаружил, что:

(1) Вот соответствующий график:

Добавив к графику выше маршруты, наиболее популярные у обычных пользователей (использованные > 500 раз), я обнаружил, что:

(2) Вот соответствующий обновлённый график:

8.7. Предложения По Вопросам, Определяющим Будущую Маркетинговую Программу Для «Citi Bike»

Используя представленные выше данные, я смог дать свои предложения по 4 вопросам, определяющим возможную будущую маркетинговую программу для «Citi Bike»:

  1. Как отличается использование велосипедов «Citi Bike» обычными пользователями и пользователями с годовой подпиской?
  2. Для чего обычные пользователи могли бы купить годовую подписку от «Citi Bike»?
  3. Как «Citi Bike» может побудить обычных пользователей стать подписчиками?
  4. Как «Citi Bike» может побудить пользователей с годовой подпиской пользоваться её услугами ещё больше?

8.7.1. Как отличается использование велосипедов «Citi Bike» обычными пользователями и пользователями с годовой подпиской?

1. Обычные пользователи:
  • Совершают поездки на большие расстояния и в среднем в 2 раза длиннее.
  • Совершают наибольшее количество поездок по субботам и воскресеньям (т.е. в выходные дни).
  • Совершают гораздо меньше поездок в течение рабочей недели (понедельник — пятница), причём понедельник для них — наименее активный день.
  • Пользуются классическими велосипедами гораздо чаще, чем электровелосипедами, каждый день недели.
  • Чаще всего велосипеды используются в субботу, затем в воскресенье. Использование электровелосипедов среди любителей велосипедов более-менее стабильно в течение всей недели.
  • Самые популярные маршруты для парковки велосипедов находятся в Центральном парке , особенно со стороны W 59th St.
  • Самые популярные маршруты для классических велосипедов расположены на острове Говернорс, особенно рядом с туннелем Бруклин — Бэттери.
  • Известный и популярный маршрут для классических велосипедов расположен на Западной улице со стороны парка реки Гудзон.
  • За пределами Манхэттена, самые популярные маршруты также расположены у Бруклинского моста и в парке Четырёх Свобод имени Франклина Д. Рузвельта для классических велосипедов, а также в Проспект-парке (Бруклин) на стороне Prospect Park West для припаркованных велосипедов.
  • Популярных маршрутов (использованных > 1000 или даже > 500 раз) для электровелосипедов нет.
2. Пользователи с годовой подпиской:
  • Совершают поездки на меньшие расстояния и в среднем в 2 раза короче по продолжительности.
  • Совершают намного больше поездок на велосипеде в течение недели.
  • Совершают наибольшее количество поездок по средам (середина рабочей недели), наименьшее — по воскресеньям.
  • Совершают больше поездок в течение рабочей недели, а не в выходные дни.
  • Пользуются классическими велосипедами гораздо чаще, чем электровелосипедами, каждый день недели.
  • Используют электровелосипеды и классические велосипеды гораздо чаще, чем это делают обычные пользователи.
  • Чаще всего велосипеды используются по средам (середина рабочей недели), затем по четвергам и вторникам. В эти же дни (в том же порядке) подписчики чаще всего катаются и на электровелосипедах.
  • Самые популярные маршруты для классических велосипедов расположены в Нижнем Ист-Сайде около моста Уильямсбург, в районе Кипс-Бей, в районе Челси, у тоннеля Линкольна и в Восточном Гарлеме.
  • Самые популярные маршруты для парковки велосипедов расположены в районах Челси и Йорквилл. Несколько довольно популярных маршрутов для парковки велосипедов также расположены в районе Центрального парка.
  • За пределами Манхэттена самые популярные маршруты также расположены в Квинсбридже, районе Уильямсбург, на острове Говернорс (особенно со стороны туннеля Хью Л. Кэри) и в парке «Четыре свободы» имени Франклина Д. Рузвельта для классических велосипедов. Для велосипедов, припаркованных на причале, это Проспект-парк (Бруклин) со стороны Проспект-парка Вест.
  • Самые популярные маршруты для электровелосипедов (использованные > 500 раз) расположены у моста Пуласки, в районе Гармент и в районе Файненшл-дистрикт неподалёку от One New York Plaza.

8.7.2. Для чего обычные пользователи могли бы купить годовую подписку от «Citi Bike»?

Обычные пользователи могли бы приобрести годовую подписку, чтобы:

  • Сэкономить деньги.
  • Повысить удобство пользования велосипедами от «Citi Bike».
  • Перестать думать о том, чтобы снова и снова платить за каждую отдельную поездку.
  • Для возможного доступа к дополнительной статистике (сколько сожжённых калорий, какие маршруты чаще всего используются и т. д.) с элементами геймификации (ежедневные достижения, локальные задачи и т. д.)

8.7.3. Как «Citi Bike» может побудить обычных пользователей стать подписчиками?

«Citi Bike» может побуждать обычных пользователей становиться подписчиками через следующие способы:

  • Предлагать еженедельные и ежемесячные планы подписки в дополнение к дневному абонементу и годовой подписке; «Citi Bike»
    в настоящее время должен мотивировать случайных пользователей чаще пользоваться услугами «Citi Bike» в течение рабочей недели (т.е. с понедельника по пятницу).
  • Предлагать специальные тарифные планы, предусматривающие только электровелосипеды, которые будут дешевле «полных» планов
    (классические велосипеды + электровелосипеды) — поскольку обычные пользователи катаются на классических велосипедах гораздо чаще, чем на электровелосипедах, каждый день недели.
  • Предлагать скидку за подписку на еженедельный/ежемесячный/годовой тарифный план, ставший стандартной практикой для сервисов с подпиской. Чем больше подписка, тем больше должна быть скидка!
  • Предоставление подробной статистики еженедельным/ежемесячным/годовым подписчикам «Citi Bike»: сколько калорий они сожгли, маршруты, которые они проезжают чаще всего и т.д. Обычные пользователи ездят на большие расстояния и в среднем в 2 раза дольше — следовательно, им может быть предоставлено больше такой статистики, и «Citi Bike» может получить больше данных от этих пользователей!
  • Предлагать еженедельным/ежемесячным/годовым членам «Citi Bike» возможности для общения и экономии: групповые велопрогулки с другими подписчиками «Citi Bike», скидки в партнерских магазинах и т.д. Например, поскольку самые популярные маршруты для припаркованных велосипедов находятся в Центральном парке, почему бы не подумать о взаимном партнёрстве с сервисами знакомств типа «Tinder», «Bumble» или «Hinge» на лето?

8.7.4. Как «Citi Bike» может побудить пользователей с годовой подпиской пользоваться её услугами ещё больше?

«Citi Bike» может повлиять на пользователей с годовой подпиской, чтобы они пользовались его услугами ещё больше, через следующие способы:

  • Предлагать специальные игровые элементы в выходные дни (например, достижения / бонусы за использование несколько дней подряд), поскольку пользователи с годовой подпиской совершают наименьшее количество поездок по воскресеньям и субботам.
  • Предлагать промо-приглашения на недорогие дневные/недельные абонементы для друзей и/или членов семьи владельца годовой подписки. Эти приглашения могут мотивировать владельцев годовой подписки кататься с друзьями/семьей по выходным (т.е. чаще пользоваться услугами «Citi Bike»). Кроме того, это также мотивирует этих друзей и/или членов семьи начать пользоваться услугами «Citi Bike» еженедельно и рассмотреть возможность оплаты подписки.
  • Предлагать специальные игровые элементы, предназначенные только для электровелосипедов (например, достижения / бонусы за использование несколько дней подряд) и акции от партнёров, поскольку пользователи с годовой подпиской используют классические велосипеды гораздо чаще, чем электровелосипеды, в каждый день недели.
  • Периодически рассылать пользователям с годовой подпиской письма с информацией о преимуществах использования электровелосипедов по сравнению с классическими велосипедами. Поскольку пользователи с годовой подпиской используют классические велосипеды гораздо чаще, чем электровелосипеды, в каждый день недели, это сокращает срок службы последних, и «Citi Bike» неэффективно расходует бюджет на их восстановление и замену аккумуляторов.
  • Увеличивать количество велосипедов «Citi Bike» и присутствие рекламы в парке реки Гудзон, на Бруклинском мосту (за пределами
    Манхэттена), в парке Четырех Свобод Франклина Д. Рузвельта и в Проспект-парке (Бруклин), поскольку эти зоны пользуются большой популярностью у обоих типов пользователей — как обычных, так и тех, у кого есть годовая подписка.
  • Тестировать присутствие рекламы в Бруклине в его крупнейших парках: Проспект-парк (Бруклин) (кроме части Prospect Park West), Сансет-парк, парк и поле для гольфа Дайкер-Бич, Луна-парк (Кони-Айленд), Марин Парк, Хайленд-парк и т.д.

9. Действие

Этот шаг состоит из задач, которые я уже выполнил выше (8. Распространение) :

  • Подготовка окончательной версии отчёта по анализу данных для заинтересованных сторон.
  • Проведение отчёта об анализе данных для заинтересованных сторон.

10. Примечания

  1. Обложка публикации, созданная Владом Дорохиным, доступна по лицензии CC BY-SA 4.0
  2. Чёрно-белое изображение людей на велосипедах доступно по лицензии общественного достояния.

🇺🇸 ENGLISH-LANGUAGE VERSION | 🇺🇸 АНГЛОЯЗЫЧНАЯ ВЕРСИЯ