# Paquetes necesarios
packages <- c("tidyverse","lubridate","survival","survminer","tableone",
              "mice","VIM","ggplot2","gridExtra","broom","MASS","car")
new.packages <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)
lapply(packages, require, character.only = TRUE)
## [[1]]
## [1] TRUE
## 
## [[2]]
## [1] TRUE
## 
## [[3]]
## [1] TRUE
## 
## [[4]]
## [1] TRUE
## 
## [[5]]
## [1] TRUE
## 
## [[6]]
## [1] TRUE
## 
## [[7]]
## [1] TRUE
## 
## [[8]]
## [1] TRUE
## 
## [[9]]
## [1] TRUE
## 
## [[10]]
## [1] TRUE
## 
## [[11]]
## [1] TRUE
## 
## [[12]]
## [1] TRUE
options(dplyr.print_min = 6)
# Ajustamos a ruta
df <- read_csv("new_york_city.csv", guess_max = 10000)
## New names:
## Rows: 300000 Columns: 9
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," chr
## (6): Start Time, End Time, Start Station, End Station, User Type, Gender dbl
## (3): ...1, Trip Duration, Birth Year
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
glimpse(df)
## Rows: 300,000
## Columns: 9
## $ ...1            <dbl> 33, 47, 49, 55, 76, 81, 89, 129, 138, 179, 217, 224, 2…
## $ `Start Time`    <chr> "01/01/2024 00:13", "01/01/2024 00:17", "01/01/2024 00…
## $ `End Time`      <chr> "01/01/2024 00:52", "01/01/2024 00:32", "01/01/2024 00…
## $ `Trip Duration` <dbl> 2325, 919, 1471, 718, 1142, 285, 2339, 146, 659, 306, …
## $ `Start Station` <chr> "8 Ave & W 31 St", "W 27 St & 7 Ave", "Grand Army Plaz…
## $ `End Station`   <chr> "S 5 Pl & S 4 St", "E 17 St & Broadway", "Clinton Ave …
## $ `User Type`     <chr> "Subscriber", "Customer", "Customer", "Subscriber", "S…
## $ Gender          <chr> "Female", NA, NA, "Male", "Female", "Male", "Male", "M…
## $ `Birth Year`    <dbl> 1980, NA, NA, 1963, 1982, 1942, 1970, 1996, 1976, 1994…
str(df)
## spc_tbl_ [300,000 × 9] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ ...1         : num [1:300000] 33 47 49 55 76 81 89 129 138 179 ...
##  $ Start Time   : chr [1:300000] "01/01/2024 00:13" "01/01/2024 00:17" "01/01/2024 00:17" "01/01/2024 00:17" ...
##  $ End Time     : chr [1:300000] "01/01/2024 00:52" "01/01/2024 00:32" "01/01/2024 00:41" "01/01/2024 00:29" ...
##  $ Trip Duration: num [1:300000] 2325 919 1471 718 1142 ...
##  $ Start Station: chr [1:300000] "8 Ave & W 31 St" "W 27 St & 7 Ave" "Grand Army Plaza & Plaza St West" "E 85 St & 3 Ave" ...
##  $ End Station  : chr [1:300000] "S 5 Pl & S 4 St" "E 17 St & Broadway" "Clinton Ave & Flushing Ave" "E 75 St & 3 Ave" ...
##  $ User Type    : chr [1:300000] "Subscriber" "Customer" "Customer" "Subscriber" ...
##  $ Gender       : chr [1:300000] "Female" NA NA "Male" ...
##  $ Birth Year   : num [1:300000] 1980 NA NA 1963 1982 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   ...1 = col_double(),
##   ..   `Start Time` = col_character(),
##   ..   `End Time` = col_character(),
##   ..   `Trip Duration` = col_double(),
##   ..   `Start Station` = col_character(),
##   ..   `End Station` = col_character(),
##   ..   `User Type` = col_character(),
##   ..   Gender = col_character(),
##   ..   `Birth Year` = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
summary(df)
##       ...1          Start Time          End Time         Trip Duration      
##  Min.   :     33   Length:300000      Length:300000      Min.   :     61.0  
##  1st Qu.:1707416   Class :character   Class :character   1st Qu.:    368.0  
##  Median :3405756   Mode  :character   Mode  :character   Median :    609.0  
##  Mean   :3407026                                         Mean   :    899.7  
##  3rd Qu.:5108762                                         3rd Qu.:   1054.0  
##  Max.   :6816152                                         Max.   :2155775.0  
##                                                                             
##  Start Station      End Station         User Type            Gender         
##  Length:300000      Length:300000      Length:300000      Length:300000     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##    Birth Year   
##  Min.   :1885   
##  1st Qu.:1970   
##  Median :1981   
##  Mean   :1978   
##  3rd Qu.:1988   
##  Max.   :2001   
##  NA's   :28220
# Mostrar las primeras filas
head(df, 10)
## # A tibble: 10 × 9
##     ...1 `Start Time`   `End Time` `Trip Duration` `Start Station` `End Station`
##    <dbl> <chr>          <chr>                <dbl> <chr>           <chr>        
##  1    33 01/01/2024 00… 01/01/202…            2325 8 Ave & W 31 St S 5 Pl & S 4…
##  2    47 01/01/2024 00… 01/01/202…             919 W 27 St & 7 Ave E 17 St & Br…
##  3    49 01/01/2024 00… 01/01/202…            1471 Grand Army Pla… Clinton Ave …
##  4    55 01/01/2024 00… 01/01/202…             718 E 85 St & 3 Ave E 75 St & 3 …
##  5    76 01/01/2024 00… 01/01/202…            1142 3 St & Prospec… S Portland A…
##  6    81 01/01/2024 00… 01/01/202…             285 Clark St & Hen… Schermerhorn…
##  7    89 01/01/2024 00… 01/01/202…            2339 5 Ave & E 78 St E 25 St & 1 …
##  8   129 01/01/2024 00… 01/01/202…             146 Clinton St & C… Columbia St …
##  9   138 01/01/2024 00… 01/01/202…             659 E 61 St & Park… 1 Ave & E 78…
## 10   179 01/01/2024 00… 01/01/202…             306 Broadway & E 1… W 18 St & 6 …
## # ℹ 3 more variables: `User Type` <chr>, Gender <chr>, `Birth Year` <dbl>
head(df)
## # A tibble: 6 × 9
##    ...1 `Start Time`    `End Time` `Trip Duration` `Start Station` `End Station`
##   <dbl> <chr>           <chr>                <dbl> <chr>           <chr>        
## 1    33 01/01/2024 00:… 01/01/202…            2325 8 Ave & W 31 St S 5 Pl & S 4…
## 2    47 01/01/2024 00:… 01/01/202…             919 W 27 St & 7 Ave E 17 St & Br…
## 3    49 01/01/2024 00:… 01/01/202…            1471 Grand Army Pla… Clinton Ave …
## 4    55 01/01/2024 00:… 01/01/202…             718 E 85 St & 3 Ave E 75 St & 3 …
## 5    76 01/01/2024 00:… 01/01/202…            1142 3 St & Prospec… S Portland A…
## 6    81 01/01/2024 00:… 01/01/202…             285 Clark St & Hen… Schermerhorn…
## # ℹ 3 more variables: `User Type` <chr>, Gender <chr>, `Birth Year` <dbl>
### eliminé los renglones que contenían na, porque justo tenían na en las variables que nos interesan, y eso marca sesgos y deja huellas en las gráficas 
df_sin_na <- drop_na(df)
head(df_sin_na)
## # A tibble: 6 × 9
##    ...1 `Start Time`    `End Time` `Trip Duration` `Start Station` `End Station`
##   <dbl> <chr>           <chr>                <dbl> <chr>           <chr>        
## 1    33 01/01/2024 00:… 01/01/202…            2325 8 Ave & W 31 St S 5 Pl & S 4…
## 2    55 01/01/2024 00:… 01/01/202…             718 E 85 St & 3 Ave E 75 St & 3 …
## 3    76 01/01/2024 00:… 01/01/202…            1142 3 St & Prospec… S Portland A…
## 4    81 01/01/2024 00:… 01/01/202…             285 Clark St & Hen… Schermerhorn…
## 5    89 01/01/2024 00:… 01/01/202…            2339 5 Ave & E 78 St E 25 St & 1 …
## 6   129 01/01/2024 00:… 01/01/202…             146 Clinton St & C… Columbia St …
## # ℹ 3 more variables: `User Type` <chr>, Gender <chr>, `Birth Year` <dbl>
####   =================== TIEMPO  DE  VIAJE   ================


### estadistica descriptiva de la duración del viaje, marca minimo, mediana, media, primer y tercer cuartil y máximo

summary(df_sin_na$`Trip Duration`)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##      61.0     352.0     571.0     799.8     956.0 2155775.0
### Se detectaron valores atípicos en la variable duración del viaje, con registros superiores a 24 días, lo cual no es realista para el uso de bicicletas. Por ello, se aplicó un filtro utilizando el método del Rango Intercuartílico (IQR) para depurar los datos y obtener estadísticas más representativas

Q1 <- quantile(df_sin_na$`Trip Duration`, 0.25, na.rm = TRUE)
Q3 <- quantile(df_sin_na$`Trip Duration`, 0.75, na.rm = TRUE)
IQR_val <- IQR(df_sin_na$`Trip Duration`, na.rm = TRUE)

limite_superior <- Q3 + 1.5 * IQR_val
limite_inferior <- Q1 - 1.5 * IQR_val

limite_superior
##  75% 
## 1862
sum(df_sin_na$`Trip Duration` > limite_superior, na.rm = TRUE)
## [1] 13754
datos_limpios <- df_sin_na[df_sin_na$`Trip Duration` <= limite_superior, ]

summary(datos_limpios$`Trip Duration`)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    61.0   342.0   545.0   651.5   874.0  1862.0
ggplot(datos_limpios, aes(y = `Trip Duration`)) +
  geom_boxplot(fill = "#3498DB", color = "white") +
  labs(
    title = "Distribución de la duración de los viajes",
    y = "Duración del viaje (segundos)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

ggplot(datos_limpios, aes(x = `Trip Duration`)) +
  geom_histogram(fill = "#2ECC71", bins = 30, color = "white") +
  labs(
    title = "Histograma de la duración de los viajes",
    x = "Duración del viaje (segundos)",
    y = "Frecuencia"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

# Antes
ggplot(df_sin_na, aes(y = `Trip Duration`)) +
  geom_boxplot(fill = "tomato") +
  labs(title = "Antes de eliminar outliers") +
  theme_minimal()

# Después
ggplot(datos_limpios, aes(y = `Trip Duration`)) +
  geom_boxplot(fill = "steelblue") +
  labs(title = "Después de eliminar outliers") +
  theme_minimal()

#CONCLUSIÓN DEL TIEMPOI DE VIAJE
#Se identificaron valores atípicos en la variable duración del viaje mediante el método del rango intercuartílico (IQR). Tras eliminar observaciones superiores al límite Q3 + 1.5·IQR, la distribución resultante presenta una forma más compacta y representativa del comportamiento real de los usuarios.
# ================== TIPO DE USUARIO =====================
## tipo de usuario, cuantos de cada tipo
table(datos_limpios$`User Type`)
## 
##   Customer Subscriber 
##       3591     252757
prop.table(table(datos_limpios$`User Type`))
## 
##   Customer Subscriber 
##  0.0140083  0.9859917
# Crear tabla
tabla_usuario <- as.data.frame(table(datos_limpios$`User Type`))
colnames(tabla_usuario) <- c("Tipo", "Frecuencia")

# Calcular porcentajes
tabla_usuario$Porcentaje <- round(tabla_usuario$Frecuencia / sum(tabla_usuario$Frecuencia) * 100, 1)

# Gráfica de pastel
etiquetas <- paste0(
  ifelse(tabla_usuario$Tipo == "Customer", "Cliente", "Suscriptor"),
  " (", tabla_usuario$Porcentaje, "%)"
)

ggplot(tabla_usuario, aes(x = "", y = Frecuencia, fill = Tipo)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y") +
  labs(
    title = "Distribución de tipos de usuario"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  ) +
  scale_fill_manual(
    values = c("Customer" = "#85C1E9",   # color para Cliente
               "Subscriber" = "#1B4F72"), # color para Suscriptor
    labels = etiquetas
    )

### CONCLUSIONES TIPO DE USUARIO
#La gran mayoría de los viajes son realizados por usuarios con modalidad de suscripción, lo que indica que el servicio es utilizado principalmente por clientes recurrentes y no por usuarios esporádicos. Esto sugiere un alto nivel de fidelización del servicio, así como una dependencia importante de ingresos recurrentes por suscripción. En contraste, el bajo porcentaje de usuarios tipo Customer indica que existe una oportunidad para fortalecer estrategias de captación de usuarios ocasionales, como promociones temporales o planes de corto plazo.
### ================ Género =====================

## género, cuantos de cada género
table(datos_limpios$Gender)
## 
## Female   Male 
##  62082 194266
tabla_genero <- datos_limpios %>% 
  count(Gender) %>% 
  filter(!is.na(Gender)) %>%
  mutate(
    Genero = ifelse(Gender == "Male", "Masculino", "Femenino"),
    Porcentaje = round(n / sum(n) * 100, 1)
  )

ggplot(tabla_genero, aes(x = Genero, y = n, fill = Genero)) +
  geom_bar(stat = "identity", width = 0.6) +
  geom_text(aes(label = paste0(Porcentaje, "%")), 
            vjust = -0.3, size = 4, fontface = "bold") +
  scale_fill_manual(values = c("Femenino" = "#F1948A", 
                               "Masculino" = "#85C1E9")) +
  labs(
    title = "Distribución por género",
    x = "Género",
    y = "Número de usuarios"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    legend.position = "none"
  )

## CONCLUSIÓN GÉNERO
#La arrendadora presenta una marcada predominancia de usuarios masculinos. Esto sugiere que el servicio tiene una mayor penetración entre hombres, lo que puede estar relacionado con factores como hábitos de movilidad, percepción de seguridad o patrones de traslado en la ciudad. Existe una oportunidad para diseñar estrategias que incentiven el uso del servicio entre mujeres y equilibren la participación por género.
### ================= VIAJES POR ESTACIÓN =============================
### viajes por estación de inicio (el top 10)

sort(table(datos_limpios$`Start Station`), decreasing = TRUE)[1:10]
## 
## Pershing Square North    E 17 St & Broadway    Broadway & E 22 St 
##                  2814                  1883                  1873 
##       W 21 St & 6 Ave       8 Ave & W 31 St       8 Ave & W 33 St 
##                  1872                  1603                  1535 
## West St & Chambers St      W 20 St & 11 Ave       W 41 St & 8 Ave 
##                  1495                  1488                  1458 
##       W 38 St & 8 Ave 
##                  1373
### viajes por estación de final (el top 10)

sort(table(datos_limpios$`End Station`), decreasing = TRUE)[1:10]
## 
##   Pershing Square North      Broadway & E 22 St      E 17 St & Broadway 
##                    2876                    2114                    2065 
##         W 21 St & 6 Ave         8 Ave & W 31 St        W 20 St & 11 Ave 
##                    1919                    1672                    1634 
##         8 Ave & W 33 St         W 38 St & 8 Ave   West St & Chambers St 
##                    1560                    1511                    1433 
## University Pl & E 14 St 
##                    1424
# Top 10 estaciones de inicio (más se vacían)
top_inicio <- as.data.frame(sort(table(datos_limpios$`Start Station`), decreasing = TRUE)[1:10])
colnames(top_inicio) <- c("Estacion", "Viajes")
top_inicio$Tipo <- "Origen (se vacían)"

# Top 10 estaciones de fin (más se llenan)
top_fin <- as.data.frame(sort(table(datos_limpios$`End Station`), decreasing = TRUE)[1:10])
colnames(top_fin) <- c("Estacion", "Viajes")
top_fin$Tipo <- "Destino (se llenan)"

# Unir ambas tablas
top_estaciones <- rbind(top_inicio, top_fin)
ggplot(top_estaciones, aes(x = reorder(Estacion, Viajes), 
                           y = Viajes, 
                           fill = Tipo)) +
  geom_bar(stat = "identity", position = "dodge") +
  coord_flip() +
  labs(
    title = "Comparación de estaciones: las que más se vacían vs las que más se llenan",
    x = "Estación",
    y = "Número de viajes"
  ) +
  scale_fill_manual(values = c("#5DADE2", "#F5B041")) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

ggplot(top_inicio, aes(x = reorder(Estacion, Viajes), y = Viajes)) +
  geom_bar(stat = "identity", fill = "#5DADE2") +
  coord_flip() +
  labs(
    title = "Top 10 estaciones que más se vacían",
    x = "Estación de inicio",
    y = "Número de viajes (salidas)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

ggplot(top_fin, aes(x = reorder(Estacion, Viajes), y = Viajes)) +
  geom_bar(stat = "identity", fill = "#F5B041") +
  coord_flip() +
  labs(
    title = "Top 10 estaciones que más se llenan",
    x = "Estación de destino",
    y = "Número de viajes (llegadas)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

#CONCLUSIONES ESTACIONES: 
#La estación Pershing Square North aparece como la más importante tanto en salidas como en llegadas, lo que indica que es un punto clave de alta rotación en la red. Funciona como un nodo central con alta demanda constante.

#Algunas estaciones tienen más salidas que llegadas, por ejemplo:
#West St & Chambers St
#W 41 St & 8 Ave
#Esto indica que estas estaciones pierden bicicletas con mayor frecuencia, por lo que son candidatas a necesitar reabastecimiento frecuente por parte del operador.

#En el ranking de estaciones de llegada aparece:
#University Pl & E 14 St
#que no figura en el top de salidas, lo que sugiere que esta estación tiende a acumular bicicletas y puede requerir descarga periódica para evitar saturación.
### ================ VIAJES POR HORA DEL DÍA ==============================
### convertimos el tiempo

datos_limpios$Start_Time <- as.POSIXct(
  datos_limpios$`Start Time`,
  format = "%m/%d/%Y %H:%M"
)


datos_limpios$hora <- format(datos_limpios$Start_Time, "%H")

# Verificar resultado
head(datos_limpios$hora)
## [1] "00" "00" "00" "00" "00" "00"
table(datos_limpios$hora)
## 
##    00    01    02    03    04    05    06    07    08    09    10    11    12 
##   751   377   198   145   159   704  2529  5244  9092  6827  4181  4084  4800 
##    13    14    15    16    17    18    19    20    21    22    23 
##  4925  5318  5583  6761 10244 10004  6959  4473  3087  2206  1370
barplot(table(datos_limpios$hora),
        main = "Viajes por hora del día",
        xlab = "Hora",
        ylab = "Número de viajes")

tabla_hora <- as.data.frame(table(datos_limpios$hora))
colnames(tabla_hora) <- c("Hora", "Viajes")

ggplot(tabla_hora, aes(x = Hora, y = Viajes)) +
  geom_bar(stat = "identity", fill = "#2E86C1", color = "white") +
  labs(
    title = "Viajes por hora del día",
    x = "Hora",
    y = "Número de viajes"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 0)
  )

ggplot(tabla_hora, aes(x = Hora, y = Viajes, fill = Viajes)) +
  geom_bar(stat = "identity") +
  scale_fill_gradient(low = "#85C1E9", high = "#1B4F72") +
  labs(
    title = "Viajes por hora del día",
    x = "Hora",
    y = "Número de viajes"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

datos_plot <- datos_limpios[!is.na(datos_limpios$hora), ]
library(ggplot2)

ggplot(datos_plot, aes(x = hora, fill = `User Type`)) +
  geom_bar(position = "dodge") +
  labs(
    title = "Viajes por hora y tipo de usuario",
    x = "Hora del día",
    y = "Número de viajes",
    fill = "Tipo de usuario"
  ) +
  scale_fill_manual(
    values = c("Customer" = "#1B4F72", "Subscriber" = "#85C1E9"),
    labels = c("Customer" = "Cliente",
               "Subscriber" = "Suscriptor")
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

tabla_hora <- datos_plot %>%
  mutate(
    Start_Time = as.POSIXct(`Start Time`, format = "%m/%d/%Y %H:%M"),
    Hora = format(Start_Time, "%H")
  ) %>%
  group_by(Hora, `User Type`) %>%
  summarise(Viajes = n(), .groups = "drop")
ggplot(subset(tabla_hora, `User Type` == "Customer"),
       aes(x = Hora, y = Viajes, fill = Viajes)) +
  geom_bar(stat = "identity") +
  scale_fill_gradient(low = "#85C1E9", high = "#1B4F72") +
  labs(
    title = "Viajes por hora del día - Clientes",
    x = "Hora",
    y = "Número de viajes"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

ggplot(subset(tabla_hora, `User Type` == "Subscriber"),
       aes(x = Hora, y = Viajes, fill = Viajes)) +
  geom_bar(stat = "identity") +
  scale_fill_gradient(low = "#85C1E9", high = "#1B4F72") +
  labs(
    title = "Viajes por hora del día - Suscriptores",
    x = "Hora",
    y = "Número de viajes"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold")
  )

# data frame solo con la duración del viaje
D1 <- datos_plot %>%
  mutate(
    duracion = as.numeric(`Trip Duration`)
  ) %>%
  filter(!is.na(duracion), duracion > 0)

# Kaplan–Meier 
f3 <- survfit(Surv(D1$duracion) ~ 1, conf.int = 0.90)

# plo
plot(f3,
     main  = "Función de supervivencia - Duración de viajes en bici",
     xlab  = "Duración del viaje (segundos)",
     ylab  = "Probabilidad de supervivencia",
     col   = "steelblue",
     lwd   = 3
)

grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

#La función de supervivencia estimada muestra que la duración de los viajes en bicicleta se concentra en intervalos cortos, ya que la curva presenta una caída rápida en los primeros minutos. La mediana de duración se encuentra aproximadamente entre 8 y 10 minutos, lo que indica que el 50% de los viajes duran menos de este tiempo. Asimismo, la probabilidad de que un viaje exceda los 20 minutos es baja, cercana al 10%, lo cual sugiere que los viajes prolongados son poco frecuentes.
D1 <- datos_plot %>%
  mutate(
    duracion = as.numeric(`Trip Duration`)
  ) %>%
  filter(!is.na(duracion), duracion > 0)

# 2) Kaplan–Meier 
f3 <- survfit(Surv(duracion) ~ 1, data = D1, conf.int = 0.90)

# 3) Gráfica
plot(f3,
     main  = "Función de supervivencia - Duración de viajes en bici",
     xlab  = "Duración del viaje (segundos)",
     ylab  = "Probabilidad de supervivencia",
     col   = "steelblue",
     lwd   = 3
)

grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

na_fit <- survfit(coxph(Surv(duracion) ~ 1, data = D1))

# Gráfica de la hazard acumulada
plot(na_fit,
     fun  = "cumhaz",
     main = "Hazard acumulada (Nelson–Aalen)",
     xlab = "Duración del viaje (segundos)",
     ylab = "Riesgo acumulado",
     col  = "firebrick",
     lwd  = 3
)

grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

#La hazard acumulada muestra que los viajes en bicicleta tienen un aumento progresivo en el riesgo de finalización conforme transcurre el tiempo. Durante los primeros minutos, este aumento es gradual, lo que indica que los viajes tienden a una duración relativamente estable. Sin embargo, para duraciones extremadamente largas, el riesgo de terminación se incrementa de manera abrupta, lo que sugiere que estos casos corresponden a viajes atípicos o poco frecuentes.
#El sistema de bicicletas parece estar dominado por viajes cortos y medianos 
#==aqui metemos la propuesta de la reducción de tiempo libre
###H₀ (hipótesis nula):
#La duración de los viajes es igual para Subscribers y Customers.

#H₁ (alternativa):
#La duración de los viajes es diferente entre ambos grupos.



#####colnames(datos_surv)
#####Sobj <- Surv(time = datos_surv$duracion)
#####logrank <- survdiff(Sobj ~ datos_surv$`User Type`)
#####logrank

#estoa fueron los resultados pero no me deja pasarlo a pdf no se pq jasjdjasdj


# [1] "...1"          "Start Time"    "End Time"      "Trip Duration" "Start Station" "End Station"   "User Type"    
# [8] "Gender"        "Birth Year"    "Start_Time"    "hora"          "duracion"     
#Call:
#survdiff(formula = Sobj ~ datos_surv$`User Type`)

 #                                     N Observed Expected (O-E)^2/E (O-E)^2/V
#datos_surv$`User Type`=Customer    1213     1213     2447     622.3       643
#datos_surv$`User Type`=Subscriber 98808    98808    97574      15.6       643

 #Chisq= 643  on 1 degrees of freedom, p= <2e-16 
### La prueba de Log-Rank arrojó un valor p < 2×10⁻¹⁶, lo que indica evidencia estadísticamente significativa de que las funciones de supervivencia difieren entre los tipos de usuario. Esto sugiere que la duración de los viajes no sigue el mismo patrón temporal entre suscriptores y usuarios ocasionales.
###Subscribers: comportamiento más estable y predecible en la duración de los viajes.

###Customers: mayor variabilidad y mayor tendencia a viajes más cortos o irregulares.
exp_fit  <- survreg(Surv(duracion) ~ 1, data = D1, dist = "exponential")
wei_fit  <- survreg(Surv(duracion) ~ 1, data = D1, dist = "weibull")
lnorm_fit <- survreg(Surv(duracion) ~ 1, data = D1, dist = "lognormal")

AIC(exp_fit, wei_fit, lnorm_fit)
##           df     AIC
## exp_fit    1 1495060
## wei_fit    2 1456790
## lnorm_fit  2 1454133
### La comparación entre modelos paramétricos mediante el Criterio de Información de Akaike (AIC) mostró que el modelo Log-normal presentó el mejor ajuste a los datos de duración de los viajes, en comparación con los modelos Exponencial y Weibull. Esto sugiere que la duración de los viajes no sigue una tasa de riesgo constante, y que el comportamiento temporal presenta una distribución asimétrica, con mayor concentración de viajes cortos y una cola larga de viajes más extensos

###La mayoría de los viajes son cortos, pero existe un grupo más pequeño de viajes mucho más largos, lo que genera una distribución sesgada hacia la derecha. Por ello, la distribución Log-normal describe mejor el comportamiento real de los usuarios.

### aqui se incluye la segmentación por customer o subscirber


###Los resultados del análisis de supervivencia muestran un patrón claro de viajes cortos con una proporción menor de viajes prolongados, lo que abre oportunidades para el diseño de esquemas tarifarios dinámicos, segmentación de clientes más rentable y optimización logística de las estaciones de bicicletas.