1 Case 1: How Does a Bike-Share Navigate Speed Success?

Este caso de estudio es el proyecto final que realicé en RStudio para el Certificado Profesional de Análisis de Datos de Google.

2 Introduccion

Este caso de estudio se utilizará para mostrar una tarea del mundo real de un analista de datos junior como se enseña en el certificado. Para responder preguntas comerciales clave, seguiremos los pasos del proceso de análisis de datos: preguntar, preparar, procesar, analizar, compartir y actuar.

La empresa de este estudio es ficticia y los datos utilizados están disponibles a través de Motivate International Inc.

2.1 Escenario

Soy un analista de datos junior que trabaja en el equipo de analistas de marketing de Cyclistic, una empresa de bicicletas compartidas en Chicago. El director de marketing cree que el éxito futuro de la empresa depende de maximizar el número de membresías anuales. Por lo tanto, su equipo quiere comprender cómo los ciclistas ocasionales y los miembros anuales usan las bicicletas ciclistas de manera diferente. A partir de estos conocimientos, su equipo diseñará una nueva estrategia de marketing para convertir a los pasajeros ocasionales en miembros anuales. Pero primero, los ejecutivos de Cyclistic deben aprobar sus recomendaciones, por lo que deben estar respaldadas con información convincente y visualizaciones de datos profesionales.

2.2 Personajes y equipos

  • Ciclista: un programa de bicicletas compartidas que cuenta con más de 5.800 bicicletas y 600 estaciones de acoplamiento. La empresa se distingue por ofrecer también varios tipos de bicicletas, lo que hace que las bicicletas compartidas sean más inclusivas para las personas con discapacidades y los ciclistas que no pueden utilizar bicicletas estándar de dos ruedas. La mayoría de los ciclistas prefieren las bicicletas tradicionales y alrededor del 8% de los ciclistas utilizan las opciones de asistencia. Los usuarios de bicicletas son más propensos a viajar por placer, pero el 30% los utiliza para ir al trabajo todos los días.

  • Lily Moreno: la directora de marketing y mi manager. Es responsable del desarrollo de campañas e iniciativas para promover el programa de bicicletas compartidas. Estos pueden incluir correo electrónico, redes sociales y otros canales.

  • Equipo de análisis y marketing: un equipo de analistas de datos que son responsables de recopilar, analizar e informar datos que ayudan a guiar la estrategia de marketing ciclista. Me uní hace seis meses.

  • Equipo ejecutivo: el notorio equipo ejecutivo orientado a los detalles decidirá si aprueba el programa de marketing recomendado.

2.3 Sobre la empresa

Cyclistic es una empresa que comenzó en 2016. Actualmente, hay 5824 bicicletas y 692 estaciones en todo Chicago. Las bicicletas se pueden desbloquear en una estación y devolverse a cualquier otra estación del sistema, en cualquier momento.

Hasta ahora, la estrategia de marketing de la empresa se basaba en generar conciencia general y atraer a amplios segmentos de consumidores con enfoques como flexibilidad en los planes de precios: pases de viaje único, pases de día completo y membresías anuales. Los clientes que compran pases de un solo viaje o de día completo se denominan cliente casual. Los clientes que compran membresías anuales son miembros Cyclistic o miembros anuales.

Los analistas financieros de Cyclistic han llegado a la conclusión de que los miembros anuales son mucho más rentables que los ciclistas ocasionales. Aunque la flexibilidad de precios ayuda a atraer más clientes, Moreno cree que maximizar el número de miembros anuales será la clave para el crecimiento futuro. En lugar de crear una campaña de marketing dirigida a clientes completamente nuevos, cree que existe una muy buena posibilidad de convertir a los pasajeros ocasionales en miembros anuales.

Moreno se ha fijado un objetivo claro: diseñar estrategias de marketing destinadas a convertir a los pasajeros ocasionales en miembros anuales. Sin embargo, para lograrlo, el equipo de analistas de marketing necesita comprender mejor en qué se diferencian los usuarios ocasionales y los miembros anuales. Moreno y su equipo están interesados en analizar los datos históricos de viajes en bicicleta para identificar tendencias.

3 Preguntar

En este paso, aclaramos el problema y la tarea comercial y hacemos preguntas para comprender lo que se debe hacer.

3.1 El Objetivo

Estamos buscando una manera de obtener más beneficios para la empresa.

3.2 La tarea empresarial

Diseñar estrategias de marketing destinadas a convertir a los clientes casuales en miembros anuales.

Este análisis se realizará sobre la hipótesis de que los miembros anuales son más rentables que los clientes casuales, por lo que necesitamos aumentar el número de miembros anuales convirtiendo a los clientes casuales.

Para ayudar a guiar el programa de marketing utilizamos tres preguntas:

  • ¿En qué se diferencian la forma que usan las bicicletas los miembros anuales de los ciclistas casuales ?

  • ¿Por qué los ciclistas casuales comprarían membresías anuales de Cyclistic?

  • ¿Cómo puede Cyclistic utilizar los medios digitales para influir en los ciclistas casuales para que se conviertan en miembros?

3.3 Stakeholders principales

  • Equipo ejecutivo de Cyclist: este equipo decidirá si aprueba el programa de marketing recomendado;

  • Lily Moreno: directora de marketing, responsable del desarrollo de campañas e iniciativas para promover el programa de bicicletas compartidas.

  • Ciclistas de Cyclist: tanto miembros anuales o clietes casuales que usen las bicicletas de cyclist son importantes para el analisis y posterior campaña de marketing a emplear.

4 Preparar

En este paso, determinamos todas las fuentes de datos necesarias para el análisis.

4.1 Fuente de datos

Los datos se pueden descargar desde Divvy Data.

Estamos utilizando los datos de los últimos 12 meses a partir de la fecha de julio de 2022 a junio de 2023. Los datos se encuentran en archivos .csv separados por cada mes, por lo que habran 12 archivos (uno para cada mes) que luego tendran que unirse para poder realizar el análisis.

Para los fines de este caso de estudio, los conjuntos de datos son apropiados y permitirán responder a las preguntas comerciales.

4.2 Licencia

Los datos han sido puestos a disposición por Motivate International Inc. bajo esta licencia.

Está prohibido utilizar la información de identificación personal del pasajero. Esto significa que no podremos utilizar información como nombres, número de tarjetas, la dirección de residencia o cualquier informacion que pueda identificar a los clientes para el análisis.

5 Procesar

Para este análisis se utilizra es el lenguaje de programación R y la herramienta RStudio debido a la necesidad de realizar diversos cálculos así como a la posibilidad de crear visualizaciones con mayor facilidad.

5.0.1 Setup

Instalación y carga de los paquetes necesarios para el caso de estudio.

library(tidyverse)  #helps wrangle data
library(lubridate)  #helps wrangle date attributes
library(ggplot2)  #helps visualize data
library(skimr) 
library(summarytools)#for viewing and skimming data

5.0.2 Importando datos

Se importan los datos de cada mes en una variable distinta.

##se guarda los datos del mes de julio del 2022 en la varible jul_2022
jul_2022<-read_csv("202207-divvy-tripdata.csv") 
ago_2022<-read_csv("202208-divvy-tripdata.csv")
sep_2022<-read_csv("202209-divvy-tripdata.csv")
oct_2022<-read_csv("202210-divvy-tripdata.csv")
nov_2022<-read_csv("202211-divvy-tripdata.csv")
dec_2022<-read_csv("202212-divvy-tripdata.csv")
jan_2023<-read_csv("202301-divvy-tripdata.csv")
feb_2023<-read_csv("202302-divvy-tripdata.csv")
mar_2023<-read_csv("202303-divvy-tripdata.csv")
abr_2023<-read_csv("202304-divvy-tripdata.csv")
may_2023<-read_csv("202305-divvy-tripdata.csv")
jun_2023<-read_csv("202306-divvy-tripdata.csv")

Luego, para cada conjunto de datos, verificamos los nombres de cada columna y que tipo de variable son. Para estos datos, podemos confirmar que cada conjunto de datos tiene exactamente los mismos nombres de columna y el mismo tipo de variable para cada una. Esto es esencial para poder unir la data de cada mes en un conjunto de datos unico que contenga la data de los doce meses, lo que facilita su analisis.

str(jul_2022)
str(ago_2022)
str(sep_2022)
str(oct_2022)
str(nov_2022)
str(dec_2022)
str(jan_2023)
str(feb_2023)
str(mar_2023)
str(abr_2023)
str(may_2023)
str(jun_2023)

Después de esto, combinamos todos los datos en un solo data frame (conjuto de datos) llamado all_trips.

all_trips<-bind_rows(jul_2022,ago_2022,sep_2022,oct_2022,nov_2022,dec_2022,jan_2023,feb_2023,
                     mar_2023,abr_2023,may_2023,jun_2023)

Con todos los datos en un solo lugar, podemos consultar una descripción general de ellos con dfSummary

dfSummary(all_trips, 
         plain.ascii  = FALSE, 
         style        = "grid", 
         graph.magnif = 0.75, 
         valid.col    = FALSE,
         tmp.img.dir  = "/tmp")
## temporary images written to 'C:\tmp'

5.0.3 Data Frame Summary

5.0.3.1 all_trips

Dimensions: 5779444 x 13
Duplicates: 0

No Variable Stats / Values Freqs (% of Valid) Graph Missing
1 ride_id
[character]
1. 00000179CF2C4FB5
2. 0000038F578A7278
3. 0000047373295F85
4. 000004C3185FDDE9
5. 000005B1F6F86B03
6. 0000085FE82E5429
7. 0000089D36728778
8. 00000B26583EB490
9. 00000E408DED6BFB
10. 0000140539E54BF2
[ 5779434 others ]
1 ( 0.0%)
1 ( 0.0%)
1 ( 0.0%)
1 ( 0.0%)
1 ( 0.0%)
1 ( 0.0%)
1 ( 0.0%)
1 ( 0.0%)
1 ( 0.0%)
1 ( 0.0%)
5779434 (100.0%)
0
(0.0%)
2 rideable_type
[character]
1. classic_bike
2. docked_bike
3. electric_bike
2495320 (43.2%)
141535 ( 2.4%)
3142589 (54.4%)
0
(0.0%)
3 started_at
[POSIXct, POSIXt]
min : 2022-07-01 00:00:01
med : 2022-11-02 06:55:44
max : 2023-06-30 23:59:56
range : 11m 29d 23H 59M 55S
4862473 distinct values 0
(0.0%)
4 ended_at
[POSIXct, POSIXt]
min : 2022-07-01 00:06:23
med : 2022-11-02 07:06:49
max : 2023-07-10 20:26:44
range : 1y 0m 9d 20H 20M 21S
4875344 distinct values 0
(0.0%)
5 start_station_name
[character]
1. Streeter Dr & Grand Ave
2. DuSable Lake Shore Dr & M
3. Michigan Ave & Oak St
4. DuSable Lake Shore Dr & N
5. Wells St & Concord Ln
6. Clark St & Elm St
7. Kingsbury St & Kinzie St
8. Millennium Park
9. Theater on the Lake
10. Wells St & Elm St
[ 1810 others ]
70041 ( 1.4%)
40133 ( 0.8%)
38681 ( 0.8%)
37759 ( 0.8%)
36776 ( 0.7%)
35514 ( 0.7%)
34442 ( 0.7%)
33132 ( 0.7%)
31548 ( 0.6%)
30913 ( 0.6%)
4532645 (92.1%)
857860
(14.8%)
6 start_station_id
[character]
1. 13022
2. 13300
3. 13042
4. LF-005
5. TA1308000050
6. TA1307000039
7. KA1503000043
8. 13008
9. TA1308000001
10. KA1504000135
[ 1488 others ]
70041 ( 1.4%)
40133 ( 0.8%)
38681 ( 0.8%)
37759 ( 0.8%)
36776 ( 0.7%)
35514 ( 0.7%)
34442 ( 0.7%)
33132 ( 0.7%)
31548 ( 0.6%)
30913 ( 0.6%)
4532513 (92.1%)
857992
(14.8%)
7 end_station_name
[character]
1. Streeter Dr & Grand Ave
2. DuSable Lake Shore Dr & N
3. Michigan Ave & Oak St
4. DuSable Lake Shore Dr & M
5. Wells St & Concord Ln
6. Clark St & Elm St
7. Millennium Park
8. Kingsbury St & Kinzie St
9. Theater on the Lake
10. Broadway & Barry Ave
[ 1811 others ]
70525 ( 1.5%)
39836 ( 0.8%)
39114 ( 0.8%)
38632 ( 0.8%)
37027 ( 0.8%)
34846 ( 0.7%)
33654 ( 0.7%)
33501 ( 0.7%)
31749 ( 0.7%)
30522 ( 0.6%)
4474383 (92.0%)
915655
(15.8%)
8 end_station_id
[character]
1. 13022
2. LF-005
3. 13042
4. 13300
5. TA1308000050
6. TA1307000039
7. 13008
8. KA1503000043
9. TA1308000001
10. 13137
[ 1488 others ]
70525 ( 1.5%)
39836 ( 0.8%)
39114 ( 0.8%)
38632 ( 0.8%)
37027 ( 0.8%)
34846 ( 0.7%)
33654 ( 0.7%)
33501 ( 0.7%)
31749 ( 0.7%)
30522 ( 0.6%)
4474242 (92.0%)
915796
(15.8%)
9 start_lat
[numeric]
Mean (sd) : 41.9 (0)
min < med < max:
41.6 < 41.9 < 42.1
IQR (CV) : 0 (0)
772920 distinct values 0
(0.0%)
10 start_lng
[numeric]
Mean (sd) : -87.6 (0)
min < med < max:
-87.9 < -87.6 < -87.5
IQR (CV) : 0 (0)
730228 distinct values 0
(0.0%)
11 end_lat
[numeric]
Mean (sd) : 41.9 (0.1)
min < med < max:
0 < 41.9 < 42.4
IQR (CV) : 0 (0)
13720 distinct values 5795
(0.1%)
12 end_lng
[numeric]
Mean (sd) : -87.6 (0.1)
min < med < max:
-88.2 < -87.6 < 0
IQR (CV) : 0 (0)
13834 distinct values 5795
(0.1%)
13 member_casual
[character]
1. casual
2. member
2244252 (38.8%)
3535192 (61.2%)
0
(0.0%)

La descripción general muestra un número total de 5779444 filas y 13 columnas.

Ademas de valores faltantes y strings vacías. Tambien se ven datos fuera de los rangos aceptados. Estos datos erroneos sera corregidos en la fase de limpieza de datos mas adelante.

5.0.4 Agregando y corrigiendo las columnas para el análisis

Para este estudio,se agragaron nuevas columnas para guardar el año, mes, dia y nombre del dia de la semana, como también agregaremos una nueva columna para calcular la duración de cada viaje en minutos.

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

#variable donde se guarda el mes
all_trips$month <- format(as.Date(all_trips$date), "%m") 

#variable donde se guardia el dia
all_trips$day <- format(as.Date(all_trips$date), "%d") 

#variable donde se guarda el año
all_trips$year <- format(as.Date(all_trips$date), "%Y") 

#variable donde se guarda el nombre del dia
all_trips$day_of_week <- format(as.Date(all_trips$date), "%A") 

#variable donde se guarda la duracion del viaje en minutos
all_trips$ride_length <- difftime(all_trips$ended_at,all_trips$started_at,units = "mins") 
#Se convierta la variable donde se guarda la duracion del viaje en una variable numerica
#Antes estaba como caracter
all_trips$ride_length <- as.numeric(as.character(all_trips$ride_length))
is.numeric(all_trips$ride_length)
## [1] TRUE

Los dias de la semana estan en desorden por lo cual se convierten en factores y se les asigna un orden.

all_trips$day_of_week <- ordered(all_trips$day_of_week, 
                                    levels=c("lunes", "martes", "miercoles", "jueves", "viernes", "sabado" , "domingo"))

Luego se agrega una columna para saber si el dia de semana es fin de semana o no

all_trips_v2<-all_trips %>% 
  mutate(is_weekday = if_else(day_of_week == "sabado" | day_of_week == "domingo",FALSE,TRUE))
#Si el nombre del dia de la semana es sabado o domingo a la variable is_weekday se le asigna un valor de false
#Si es cualquier otro dia (lunes, martes,etc.) se le asigna el valor de true
head(all_trips_v2$day_of_week)
## [1] martes    martes    domingo   domingo   miercoles viernes  
## 7 Levels: lunes < martes < miercoles < jueves < viernes < ... < domingo
head(all_trips_v2$is_weekday)
## [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE

Los meses tambien estan en desorden y se realizo el mismo proceso

all_trips_v2$month<-ordered(all_trips_v2$month, levels = c("Julio","Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre", "Enero", "Febrero","Marzo", "Abril", "Mayo", "Junio"))

#El orden empieza en julio porque de Julio a Diciembre son datos del anio 2022.

5.0.5 Limpieza de datos

Al saber qué tipo de errores tienen nuestros datos, podemos empezar a limpiar los datos más fácilmente. Primero comenzamos eliminando los valores que no estan dentro de los parametros establecidos.

5.0.5.1 Eliminar valores erroneos

Debido a que los clientes casuales utilizan el pase diario, podemos considerar que los viajes de más de 24 horas (1.440 minutos) no son útiles para este análisis, también consideraremos los viajes de menos de 1 minuto como no válidos porque pueden provenir de volver a dejar la bicicleta en la estación y utilizar otra distinta, como los viajes iniciados en la estacion HQ QR que son realizado por empleados de la empresa.

all_trips_v2 <- all_trips_v2[!(all_trips$start_station_name == "HQ QR" | all_trips$ride_length<1),]
all_trips_v3 <- all_trips_v2 %>% 
  filter((member_casual == "casual" & ride_length < 1440) | (member_casual == "member"))

5.0.5.2 Eliminando valores nulos

Todos los valores nulos o faltantes son eliminados del dataframe.

all_trips_v4 <- drop_na(all_trips_v3) 

5.0.5.3 Eliminando datos duplicados

Se verifica que hay 4318012 entradas únicas.

nrow(all_trips_v4)
## [1] 4318012

Que son el numero de filas con las que cuenta el dataframe por lo que es seguro decir que no hay ningun dato duplicado.

Los datos han sido limpiados.

6 Análisis

En esta sección, crearemos visualizaciones y tablas para comprobar cómo los usuarios casuales y los miembros usan el servicio de manera diferente y sacaremos conclusiones basadas en ellas.

6.1 Cantidad de viajes realizado por tipo de cliente

Primero vamos a analizar cuantos viajes realizo cada tipo de cliente en este periodo de 12 meses.

all_trips_v4 %>%
  group_by(member_casual) %>%
  summarise(ride_count = n()) %>% 
  ggplot(aes(x = member_casual, y = ride_count, fill = member_casual)) +
  geom_col() +
  scale_y_continuous(breaks = seq(0, 3000000, 250000), labels = scales::comma) +
  labs(title = "Total de viajes por tipo de usuario", x = "Casuales vs Miembros", y = "Numero de Clientes", caption="Grafico 1",subtitle = "De Julio 2022 a Junio 2023") +
  geom_text(aes(label = ride_count), vjust = 1.5) +
  geom_text(aes(label = paste0(round(ride_count/nrow(all_trips_v4)*100,2), "%"), vjust = 2.7)) +
  scale_x_discrete(labels = c("Clientes Casuales", "Miembros Anules")) +
  scale_fill_discrete(name = "Tipo de Cliente", labels = c("Clientes Casuales", "Miembros Anuales"))

El gráfico 1 muestran que durante el período de 12 meses de observación, el 62% del total de viajes fueron realizados por miembros anuales y los clientes casuales representaron solo el 38%.

6.2 Número de viajes y duracion promedio por día de la semana

Ahora analizaremos la cantidad de viajes que realiza cada tipo de cliente por dia

all_trips_v4 %>% 
  mutate(weekday = wday(started_at, label = TRUE)) %>% 
  group_by(member_casual, weekday) %>% 
  summarise(number_of_rides = n()
            ,average_duration = mean(ride_length)) %>% 
  arrange(member_casual, weekday)  %>% 
  ggplot(aes(x = weekday, y = number_of_rides, fill = member_casual)) +
  geom_col(position = "dodge") +
  labs(title = "Total de viajes por tipo de usuario", x = "Casuales vs Miembros", 
       y = "Numbero de viajes", caption="Grafico 2", subtitle = "De Julio 2022 a Junio 2023") +
  scale_y_continuous(breaks = c(0,50000,100000,150000,200000,250000,300000,350000,400000,450000), 
                      labels = scales::comma) +
  scale_x_discrete(labels = c("Domingo", "Lunes","Martes","Miercoles","Jueves","Viernes","Sabado")) +
  scale_fill_discrete(name = "Tipo de cliente", labels = c("Usuario casual", "Miembro anules")) +
  coord_flip() +
  geom_text(aes(label = number_of_rides), position = position_dodge(0.9), 
            vjust = 0, size = 3.0)

Luego analizaremos la duración promedio por viaje que realizan al dia cada tipo de cliente en minutos

all_trips_v4 %>% 
  mutate(weekday = wday(started_at, label = TRUE)) %>% 
  group_by(member_casual, weekday) %>% 
  summarise(number_of_rides = n()
            ,average_duration = mean(ride_length)) %>% 
  arrange(member_casual, weekday)  %>% 
  ggplot(aes(x = weekday, y = average_duration, fill = member_casual)) +
  geom_col(position = "dodge") +
  labs(title = "Duracion promedio de viaje por tipo de usuario en minutos", x = "Casuales vs Miembros", 
       y = "Duracion promedio de viaje",caption="Grafico 3",subtitle = "De Julio 2022 a Junio 2023") +
  scale_x_discrete(labels = c("Domingo", "Lunes","Martes","Miercoles","Jueves","Viernes","Sabado")) +
  scale_fill_discrete(name = "Tipo de cliente", labels = c("Usuario casual", "Miembro anules")) +
  geom_text(aes(label = round(average_duration,2)), size = 2.5,vjust = -0.7,
            position = position_dodge(width = 1)) + coord_flip()

weekday_label <- c("Dia de semana", "Fin de semana")
names(weekday_label) <- c("TRUE", "FALSE")

all_trips_v4 %>%
  group_by(member_casual, is_weekday) %>%
  summarise(ride_count = n()) %>%
  ggplot(aes(x = member_casual, y = ride_count, fill = member_casual)) +
  geom_col() +
  facet_wrap(~is_weekday, labeller = labeller(is_weekday = weekday_label)) + 
  scale_y_continuous(breaks = seq(0, 2000000, 250000), labels = scales::comma) +
  labs(title = "Numero de viajes por tipo de cliente", x = "Casual vs Miembros", y = "Numero de viajes",   caption="Grafico 4",subtitle = "De Julio 2022 a Junio 2023") +
  geom_text(aes(label = ride_count), vjust = 1.5) +
  geom_text(aes(label = paste0(round(ride_count/nrow(all_trips_v4)*100,2), "%"), vjust = 2.7)) +
  scale_x_discrete(labels = c("Cliente Casual", "Miembro Anual")) +
  scale_fill_discrete(name = "Tipo de cliente", labels = c("Cliente Casual", "Miembro Anual"))

En el gráfico 2 se observa que los miembros anuales suelen utilizar el servicio más durante los dias de semana (llegando a ser el 47% del total de viajes realizados). Caso contrario a los usuarios casuales que lo suelen utilizar mas durante los fines de semana, llegando incluso a igualar la cantidad de miembros anuales (ambos con 14%).

En el gráfico 3 se observa que los usuarios casuales, en promedio, usan más el servicio de bicicleta por viaje que los miembros anuales.

6.3 Número de viajes y duracion promedio por mes

Ahora analizaremos la cantidad de viajes realizado por cada tipo de cliente al mes.

all_trips_v4 %>% group_by(member_casual,month) %>%
  summarise(num_of_rides = n(), average_duration = mean(ride_length)) %>%
  ggplot(aes(x=month,y=num_of_rides,fill=member_casual)) +
  geom_col(position = "dodge") +
  labs(title = "Viajes por mes", x = "Mes", y = "Numero de viajes por mes",caption="Grafico 5",subtitle = "De Julio 2022 a Junio 2023") +
  scale_y_continuous(breaks = seq(0, 4e+05, 25000)) + scale_fill_discrete(name = "Tipo de Cliente",
                                                                          labels = c("Cliente Casual", "Miembro Anual")) + 
  theme(axis.text.x = element_text(angle = 25)) +
  scale_x_discrete(labels = c("Julio 22", "Agosto 22", "Septiembre 22", "Octubre 22",
                              "Noviembre 22", "Diciembre 22", "Enero 23", "Febrero 23", "Marzo 23", "Abril 23",
                              "Mayo 23", "Junio 23")) + 
  geom_text(aes(label = round(num_of_rides,2)), size = 2.5,vjust = 0.7,
            position = position_dodge(width = 1))+
  coord_flip()

Luego la duración promedio por viaje que realizan al mes cada tipo de cliente en minutos.

all_trips_v4 %>% group_by(member_casual,month) %>%
  summarise(num_of_rides = n(), average_duration = mean(ride_length)) %>%
  ggplot(aes(x=month,y=average_duration,fill=member_casual)) +
  geom_col(position = "dodge") +
  labs(title = "Tiempo promedio por viaje por mes", x = "Mes", y = "Tiempo promedio en minutos", caption="Grafico 6",subtitle = "De Julio 2022 a Junio 2023") +
  scale_x_discrete(labels = c("Jul 22", "August 22", "September 22", "October 22",
                              "November 22", "December 22", "January 23", "February 23", "March 23", "April 23",
                              "May 23", "June 23")) +
  geom_text(aes(label = round(average_duration,2)), size = 2.5,vjust = -0.7,
            position = position_dodge(width = 1))+
   coord_flip()

A partir del gráfico 5, podemos establecer que el servicio tiene su pico de uso durante la temporada de verano, de mayo a septiembre, y su uso más bajo durante el invierno, de noviembre a febrero, mientras que en los otros meses hay un aumento o disminución regular. Entonces podemos suponer que la gente prefiere andar en bicicleta durante las estaciones cálidas, lo que se correlaciona con su aumento de tiempos libres o vacaciones. También podemos ver que incluso durante el invierno, los miembros anuales no bajan tanto como los usuarios casuales.

Del gráfico 6 podemos concluir que los usuarios casuales suelen viajar durante más tiempo que los miembros anuales, esto puede deberse al costo de los pases de viaje, ya que los miembros anuales pueden acoplar la bicicleta en cualquier estación entre viajes, mientras que los usuarios casuales tienen que comprar un pase para cada viaje.

También podemos ver que durante todo el año, la duración del viaje de los miembros anuales se mantiene estancada entre 10 y 14 minutos, mientras que los usuarios casuales permanecen entre 20 y 25 minutos durante las estaciones cálidas y caen a alrededor de 15 minutos durante la temporada de invierno, lo que puede deberse a por el clima que hará que los casuales eviten estar demasiado tiempo afuera.

6.4 Numero de viajes por tipo de bicicleta

all_trips_v4 %>% group_by(member_casual,rideable_type) %>%
  summarise(ride_count = n()) %>%
  ggplot(aes(x = rideable_type, y = ride_count, fill = member_casual)) + geom_col(position = "dodge") +
  geom_text(aes(label = ride_count), position = position_dodge(width = 0.85), vjust = 1.5) +
  labs(title = "Numero de viajes por tipo de bicicleta",x = "Tipo de bicicleta", y = "Numero de viajes", caption="Grafico 7",subtitle = "De Julio 2022 a Junio 2023") +
  scale_fill_discrete(name = "Tipo de cliente", labels = c("Cliente Casual", "Miembro Anual")) +
  scale_x_discrete(labels = c("Traditional Bike", "Electric Bike", "Docked Bike")) +
  scale_y_continuous(breaks = seq(0, 2e+06, 150000))

Del gráfico 7 podemos observar que los miembros anuales prefieren utilizar mucho más las bicicletas tradicionales a cualquier otro tipo de bicicleta. Tambien se ve que los únicos que utilizn las bicicletas electricas con los usuarios casuales.

6.5 Estacion mas utilizada durante el dia de semana

Por el análisis previo se pudo concluir que los miembres anuales usan más el servicio durante los dias de semana. En este grafco se visualizara las ocho estaciones con mayor frecuencia utilizada por los dos tipos de clientes, durante los dias de semana.

z<-all_trips_v4 %>% group_by(member_casual,start_station_name, is_weekday) %>%
  summarise(ride_count = n()) %>% filter(is_weekday==TRUE)

z<-head(z[order(z$ride_count,decreasing=TRUE),],8)


ggplot(z, aes(x=reorder(start_station_name,ride_count),y=ride_count, color=member_casual)) +
  geom_segment( aes(x=reorder(start_station_name,ride_count), xend=reorder(start_station_name,ride_count), y=0, yend=ride_count)) +
  geom_point(size=4, alpha=0.6) +
  theme_light() +
  coord_flip() +
  geom_text(aes(label = round(ride_count,2)), size = 2.9,vjust = -0.7,
            position = position_dodge(width = 2))+
  labs(title = "Estaciones con mayor numero de viajes por tipo de cliente
       durante los dias de semana", x = "Estacion", 
       y = "Numero de viajes",caption="Grafico 8",subtitle = "De Julio 2022 a Junio 2023") +
  scale_color_discrete(name = "Tipo de cliente", labels = c("Cliente Casual", "Miembro Anual")) +
  theme_light() +
  theme(
    panel.grid.major.y = element_blank()
  )
## Warning: `position_dodge()` requires non-overlapping x intervals

El gráfico 8 muestra que, a pesar que los miembros anuales son los que usan el servicio con mayor regularidad los dias de semana, la estacion Streeter Dr recibe una gran catidad de clientes casuales, siendo casi el doble que el resto de estaciones.

7 Compartir y Actuar

A través de estos pasos de análisis de datos, compartimos nuestros conocimientos con las partes interesadas y damos recomendaciones basadas en nuestros hallazgos para ayudar con la tarea empresarial.

En el último paso, creamos 8 visualizaciones que podemos usar en la presentación a las partes interesadas (stakeholders).

7.1 Descubrimientos

Con los datos que tenemos de los últimos 12 meses podemos concluir:

  • Los miembros anuales representaron el 62 % del total de viajes en comparación con el 38 % de los clientes casuales.

  • Durante los fines de semana, los clientes casuales y los miembros anuales tienden a tener la misma cantidad de viajes, mientras que durante los días de semana, los miembros anuales tienen aproximadamente el doble de viajes que los casuales. Podemos inferir que los miembros anuales utilizan el servicio de viaje al trabajo los dias de semana, mientras que los clientes casuales suelen utilizar más el servicio en sus tiempos libres y fines de semana.

  • Ambos tipos de clientes prefieren utilizar bicicletas tradicionales siendo los miembros anuales los que más lo prefieren. Las bicicletas electricas solo son utilizdas por los clientes casuales.

  • Los viajes totales del año alcanzan su punto máximo durante las estaciones cálidas (mayo a septiembre), durante el invierno (noviembre a febrero) hay una caída significativa, especialmente para los clientes casuales, esto posiblemente debido al clima y las condiciones exteriores. Los clientes anuales tienen una caida en los meses de invierno, pero no es tan significativa.

  • La duración del viaje para todos los clientes tiende a ser menor durante la estación fría, pero esto tiene un mayor impacto en los clientes casuales.

  • Los usuarios casuales suelen viajar durante más tiempo que los miembros anuales, esto puede deberse al costo de los pases de viaje, ya que los miembros anuales pueden acoplar la bicicleta en cualquier estación entre viajes, mientras que los usuarios ocasionales tienen que comprar un pase para cada viaje o comprar el pase por día.

  • A pesar de que los dias de semana la mayoria de clientes suelen ser miembros anuales, las estaciones Streeter Dr y DuSable Lake son de las más utilizadas y lo son por clientes casuales.

Las disparidades en el comportamiento de los pasajeros ocasionales a los miembros anuales parecen provenir de los objetivos de los viajes. El aumento similar en la duración y el número de viajes durante los fines de semana significa que ambos tipos de miembros disfrutan usando las bicicletas para paseos de ocio. Mientras que el mayor número de miembros anuales durante los días laborables puede significar el uso de bicicletas para desplazarse al trabajo.

7.2 Recomendaciones

  • Determine a los clientes casuales que tienden a utilizar el servicio para viajes de trabajo y presénteles la membresía, ya que estos tienen mayores posibilidades de registrarse. Ponerle gran interes a las estaciones Streeter Dr y DuSable Lake para este fin.

  • Ofrecer paquetes de membresia especiales para los usos del servicio solo durante los dias de semana, porque la gran mayoria lo utiliza como medio de transporte para ir al trabajo.

  • Oferecer paquetes de membresia con descuento para los que solo utilizan las bicicletas electricas, ya que en su totalidad son clientes casuales.

  • Ofrecer paquetes de membresia de temporada para aquellos que prefieren andar en bicicleta solo durante la temporada cálida o para turistas, incluyendo el beneficio de utilizar el servicio por más de un solo viaje por dia.

  • Poder registrar la cantidad de viajes que hace cada cliente. Esto con el fin de saber cuales son los clientes casuales que mas utilizan el servicio y ofrecerles una membresia anual.