Librerias:

library(kableExtra)
library(tidyverse)
library(lubridate)
library(knitr)
library(DT)

1 : Leer el fichero comptagevelo2017.csv como un dataframe

# Leer el archivo CSV y eliminar la segunda columna
datos_bicicletas_2017 <- read_csv("comptagevelo2017.csv", show_col_types = FALSE) %>%
  select(-2)  # Eliminamos la columna sin nombre (timestamp)
head(datos_bicicletas_2017)

2 : Eliminar la columna 2 del dataframe

# Eliminar la segunda columna del dataframe (timestamp o cualquier columna innecesaria)
datos_bicicletas_2017 <- datos_bicicletas_2017 %>%
  select(-2)

# Verificar el resultado mostrando las primeras filas del dataframe
head(datos_bicicletas_2017)

3 : Identificar las variables y transformar el dataframe

## Ejercicio 3: Identificar las variables y transformar el dataframe

# Cargar el archivo CSV y eliminar la columna 2 directamente
datos_bicicletas_2017 <- read_csv("comptagevelo2017.csv", show_col_types = FALSE) %>%
  select(-2)

# Transformar el dataframe al formato "largo" y guardarlo en Datos_Unico
Datos_Unico <- datos_bicicletas_2017 %>%
  pivot_longer(
    cols = -Date,               # Excluir la columna "Date"
    names_to = "Distrito",       # Nueva columna para los nombres de los distritos
    values_to = "Num_Ciclistas"  # Nueva columna para los valores de conteo de ciclistas
  )

# Verificar el resultado
head(Datos_Unico)

4 : Crear variables de día, mes y año

# Crear las variables Día, Mes y Año en el dataframe Datos_Unico
Datos_Unico <- Datos_Unico %>%
  mutate(
    Año = year(dmy(Date)),
    Mes = month(dmy(Date)),
    Día = day(dmy(Date))
  )

# Mostrar la tabla con datatable
datatable(head(Datos_Unico), caption = "Tabla interactiva con variables de Día, Mes y Año")

5 : Convertir la columna Date a tipo Date

library(lubridate)

# Convertir la columna Date a tipo Date
Datos_Unico <- Datos_Unico %>%
  mutate(Date = dmy(Date))

# Verificar el cambio de tipo de la columna Date
str(Datos_Unico)
## tibble [6,935 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Date         : Date[1:6935], format: "2017-01-01" "2017-01-01" ...
##  $ Distrito     : chr [1:6935] "Berri1" "Boyer" "Boyer 2" "Brébeuf" ...
##  $ Num_Ciclistas: num [1:6935] 38 35 NA 20 NA 60 58 38 12 10 ...
##  $ Año          : num [1:6935] 2017 2017 2017 2017 2017 ...
##  $ Mes          : num [1:6935] 1 1 1 1 1 1 1 1 1 1 ...
##  $ Día          : int [1:6935] 1 1 1 1 1 1 1 1 1 1 ...

6 : Modificar la columna de los distritos para eliminar los espacios alrededor de “/”

# Eliminar los espacios alrededor de "/" en la columna Distrito
Datos_Unico <- Datos_Unico %>%
  mutate(Distrito = str_replace_all(Distrito, " / ", "/"))

# Verificar el resultado mostrando los nombres únicos de la columna Distrito
unique(Datos_Unico$Distrito)
##  [1] "Berri1"                      "Boyer"                      
##  [3] "Boyer 2"                     "Brébeuf"                    
##  [5] "Christophe-Colomb"           "CSC (Côte Sainte-Catherine)"
##  [7] "Eco-Totem - Métro Laurier"   "Maisonneuve_2"              
##  [9] "Maisonneuve_3"               "Notre-Dame"                 
## [11] "Parc"                        "PierDup"                    
## [13] "Pont Jacques-Cartier"        "Rachel/Hôtel de Ville"      
## [15] "Rachel/Papineau"             "René-Lévesque"              
## [17] "Saint-Antoine"               "Saint-Laurent/Bellechasse"  
## [19] "Saint-Urbain"

7 : Calcular el porcentaje de días en los que faltan datos para cada uno de los distritos

# Calcular el porcentaje de días con datos faltantes para cada distrito
porcentaje_faltantes <- Datos_Unico %>%
  group_by(Distrito) %>%
  summarize(Porcentaje_Faltantes = mean(is.na(Num_Ciclistas)) * 100)

# Verificar el resultado
porcentaje_faltantes

8 : Calcular el total de ciclistas que pasa por cada uno de los distritos a lo largo de todo el año

# Calcular el total de ciclistas por distrito a lo largo del año
total_ciclistas <- Datos_Unico %>%
  group_by(Distrito) %>%
  summarize(Total_Ciclistas = sum(Num_Ciclistas, na.rm = TRUE))

# Verificar el resultado
total_ciclistas

9 : ¿Cuáles son los cinco distritos con más número de ciclistas?

# Ordenar los distritos por Total_Ciclistas en orden descendente y seleccionar los cinco primeros
top_5_distritos <- total_ciclistas %>%
  arrange(desc(Total_Ciclistas)) %>%
  slice_head(n = 5)

# Mostrar el resultado
top_5_distritos

10 : Gráfico de barras horizontales con el total de ciclistas por distrito

library(ggplot2)

# Crear el gráfico de barras horizontales
ggplot(total_ciclistas, aes(x = Total_Ciclistas, y = reorder(Distrito, Total_Ciclistas))) +
  geom_bar(stat = "identity") +
  labs(
    title = "Total de Ciclistas por Distrito en 2017",
    x = "Total de Ciclistas",
    y = "Distrito"
  ) +
  theme_minimal()

Ejercicio 11: Gráfico de líneas con la evolución mensual de ciclistas para cada distrito

# Calcular el total de ciclistas por mes y distrito
ciclistas_mensual <- Datos_Unico %>%
  group_by(Distrito, Mes) %>%
  summarize(Total_Mensual = sum(Num_Ciclistas, na.rm = TRUE))

# Crear el gráfico de líneas para cada distrito
ggplot(ciclistas_mensual, aes(x = Mes, y = Total_Mensual, color = Distrito, group = Distrito)) +
  geom_line() +
  labs(
    title = "Evolución Mensual de Ciclistas por Distrito en 2017",
    x = "Mes",
    y = "Total de Ciclistas"
  ) +
  scale_x_continuous(breaks = 1:12, labels = month.abb) + # Etiquetas de meses abreviadas
  theme_minimal() +
  theme(legend.position = "right")

12 : Ordenar las barras del gráfico de mayor a menor según el número de ciclistas

library(ggplot2)

# Crear el gráfico de barras horizontales
ggplot(total_ciclistas, aes(x = Total_Ciclistas, y = reorder(Distrito, Total_Ciclistas))) +
  geom_bar(stat = "identity") +
  labs(
    title = "Total de Ciclistas por Distrito en 2017",
    x = "Total de Ciclistas",
    y = "Distrito"
  ) +
  theme_minimal()

Ejercicio 13: Añadir una línea de color azul y más ancha que el resto con la media de ciclistas por mes

# Calcular la media mensual de ciclistas
media_mensual <- ciclistas_mensual %>%
  group_by(Mes) %>%
  summarize(Media_Ciclistas = mean(Total_Mensual, na.rm = TRUE))

# Crear gráfico de líneas con la evolución mensual de ciclistas y la línea de media mensual
ggplot() +
  geom_line(data = ciclistas_mensual, aes(x = Mes, y = Total_Mensual, color = Distrito, group = Distrito)) +
  geom_line(data = media_mensual, aes(x = Mes, y = Media_Ciclistas), color = "blue", size = 1.2) + # Línea de media mensual
  labs(
    title = "Evolución Mensual de Ciclistas por Distrito en 2017",
    x = "Mes",
    y = "Total de Ciclistas"
  ) +
  scale_x_continuous(breaks = 1:12, labels = month.abb) +
  theme_minimal() +
  theme(legend.position = "right")

14 : Gráfico de Barras del Número de Ciclistas por Día de la Semana en los Cinco Distritos con Más Ciclistas

# Leer el archivo CSV y eliminar la columna de timestamp
datos_bicicletas_2017 <- read_csv("comptagevelo2017.csv", show_col_types = FALSE) %>%
  select(-2)

# Transformar el dataframe a formato largo
Datos_Unico <- datos_bicicletas_2017 %>%
  pivot_longer(
    cols = -Date,
    names_to = "Distrito",
    values_to = "Num_Ciclistas"
  )

# Crear variables de Año, Mes, Día y Día_de_Semana en el dataframe
Datos_Unico <- Datos_Unico %>%
  mutate(
    Año = year(dmy(Date)),
    Mes = month(dmy(Date)),
    Día = day(dmy(Date)),
    Día_de_Semana = wday(dmy(Date), label = TRUE, abbr = TRUE),  # Abreviado para día de la semana
    Date = dmy(Date),
    Distrito = str_replace_all(Distrito, " / ", "/")
  )

# Calcular el total de ciclistas por distrito y seleccionar los cinco distritos con más ciclistas
top_5_distritos <- Datos_Unico %>%
  group_by(Distrito) %>%
  summarize(Total_Ciclistas = sum(Num_Ciclistas, na.rm = TRUE)) %>%
  arrange(desc(Total_Ciclistas)) %>%
  slice_head(n = 5) %>%
  pull(Distrito)

# Filtrar los datos para los cinco distritos con más ciclistas
Datos_Top5 <- Datos_Unico %>%
  filter(Distrito %in% top_5_distritos)

# Crear gráfico de barras del número de ciclistas por día de la semana para cada distrito usando facetas
ggplot(Datos_Top5, aes(x = Día_de_Semana, y = Num_Ciclistas, fill = Día_de_Semana)) +
  geom_bar(stat = "identity") +
  labs(
    title = "Número de Ciclistas por Día de la Semana en los Cinco Distritos con Más Ciclistas",
    x = "Día de la Semana",
    y = "Número de Ciclistas"
  ) +
  facet_wrap(~ Distrito, scales = "free_y") +  # Facetas por distrito con escalas adaptativas en Y
  theme_minimal() +
  theme(legend.position = "none")  # Eliminar la leyenda redundante

15 : Completar los missing values de la columna que representa el número de ciclistas con la media del resto de datos de esa variable pero agrupado por distrito y mes

# Leer el archivo CSV y eliminar la columna de timestamp
datos_bicicletas_2017 <- read_csv("comptagevelo2017.csv", show_col_types = FALSE) %>%
  select(-2)

# Transformar el dataframe a formato largo para que cada columna represente una única variable
Datos_Unico <- datos_bicicletas_2017 %>%
  pivot_longer(
    cols = -Date,            
    names_to = "Distrito",    
    values_to = "Num_Ciclistas" 
  )

# Crear columnas Año, Mes, y Día en el dataframe Datos_Unico
Datos_Unico <- Datos_Unico %>%
  mutate(
    Año = year(dmy(Date)),
    Mes = month(dmy(Date)),
    Día = day(dmy(Date)),
    Date = dmy(Date),
    Distrito = str_replace_all(Distrito, " / ", "/")
  )

# Calcular la media de ciclistas por cada Distrito y Mes
medias_por_distrito_mes <- Datos_Unico %>%
  group_by(Distrito, Mes) %>%
  summarize(Media_Ciclistas = mean(Num_Ciclistas, na.rm = TRUE), .groups = "drop")

# Unir la media al dataframe original y rellenar los valores faltantes
Datos_Completos <- Datos_Unico %>%
  left_join(medias_por_distrito_mes, by = c("Distrito", "Mes")) %>%
  mutate(
    Num_Ciclistas = ifelse(is.na(Num_Ciclistas), Media_Ciclistas, Num_Ciclistas)
  ) %>%
  select(-Media_Ciclistas)  # Eliminar la columna auxiliar de medias

# Verificar el resultado
head(Datos_Completos)

16 : Leer el fichero localisationcompteursvelo2015.csv. Importante: la codificación del fichero no es UTF-8 sino ISO-8859-1

# Cargar las librerías necesarias
library(tidyverse)

# Leer el archivo con la codificación ISO-8859-1
localizacion_datos <- read_csv("localisationcompteursvelo2015.csv", locale = locale(encoding = "ISO-8859-1"))

# Verificar la estructura del archivo
glimpse(localizacion_datos)
## Rows: 21
## Columns: 8
## $ id             <dbl> 1, 2, 4, 5, 6, 7, 8, 10, 12, 14, 15, 17, 19, 22, 23, 29…
## $ nom            <chr> "St-Urbain_1", "Brebeuf_1", "Maisonneuve_1", "Maisonneu…
## $ nom_comptage   <chr> "Saint-Urbain", "Brébeuf", "Maisonneuve_1", "Maisonneuv…
## $ Etat           <chr> "Existant", "Existant", "À réinstaller", "Existant", "E…
## $ Type           <chr> "compteur", "compteur", "compteur", "compteur", "compte…
## $ Annee_implante <dbl> 2014, 2009, 2008, 2008, 2007, 2013, 2010, 2011, 2010, 2…
## $ coord_X        <dbl> -73.58888, -73.57398, -73.56159, -73.57508, -73.56965, …
## $ coord_Y        <dbl> 45.51955, 45.52741, 45.51479, 45.50054, 45.53036, 45.50…
head(localizacion_datos)

17 : Realizar un gráfico de puntos de las columnas coord X (eje x) y coord Y (eje y), con el color de los puntos representando la variable Type y la forma la variable Etat

# Leer el archivo con la codificación ISO-8859-1
localizacion_datos <- read_csv("localisationcompteursvelo2015.csv", locale = locale(encoding = "ISO-8859-1"))


names(localizacion_datos)   
## [1] "id"             "nom"            "nom_comptage"   "Etat"          
## [5] "Type"           "Annee_implante" "coord_X"        "coord_Y"
# Crear gráfico de puntos
ggplot(localizacion_datos, aes(x = coord_X, y = coord_Y, color = Type, shape = Etat)) +
  geom_point(size = 3) +
  labs(
    title = "Distribución de Coordenadas de Contadores de Bicicletas",
    x = "Coordenada X",
    y = "Coordenada Y",
    color = "Tipo",
    shape = "Estado"
  ) +
  theme_minimal()

18 : Hacer un join de los dos dataframes por las columnas con los nombres del districto en el primer dataframe y “nom comptage” en el segundo

# Cargar las librerías necesarias
library(tidyverse)

# Leer el archivo comptagevelo2017.csv
datos_bicicletas_2017 <- read_csv("comptagevelo2017.csv", show_col_types = FALSE) %>%
  select(-2) %>%
  pivot_longer(cols = -Date, names_to = "Distrito", values_to = "Num_Ciclistas")

# Crear las columnas Año, Mes, y Día en el dataframe de bicicletas
datos_bicicletas_2017 <- datos_bicicletas_2017 %>%
  mutate(
    Año = year(dmy(Date)),
    Mes = month(dmy(Date)),
    Día = day(dmy(Date)),
    Date = dmy(Date),
    Distrito = str_replace_all(Distrito, " / ", "/")  # Ajustar formato de Distrito
  )

# Leer el archivo localisationcompteursvelo2015.csv con codificación ISO-8859-1
localizacion_datos <- read_csv("localisationcompteursvelo2015.csv", locale = locale(encoding = "ISO-8859-1"))

# Verificar los nombres de las columnas en localizacion_datos
names(localizacion_datos)
## [1] "id"             "nom"            "nom_comptage"   "Etat"          
## [5] "Type"           "Annee_implante" "coord_X"        "coord_Y"
# Renombrar la columna correspondiente para facilitar el join (asegúrate de usar el nombre correcto)
localizacion_datos <- localizacion_datos %>%
  rename(Distrito = nom_comptage)

# Realizar el join de los dos dataframes usando la columna "Distrito" en ambos
datos_combinados <- datos_bicicletas_2017 %>%
  left_join(localizacion_datos, by = "Distrito")

# Verificar el resultado
glimpse(datos_combinados)
## Rows: 6,935
## Columns: 13
## $ Date           <date> 2017-01-01, 2017-01-01, 2017-01-01, 2017-01-01, 2017-0…
## $ Distrito       <chr> "Berri1", "Boyer", "Boyer 2", "Brébeuf", "Christophe-Co…
## $ Num_Ciclistas  <dbl> 38, 35, NA, 20, NA, 60, 58, 38, 12, 10, 13, 9, 0, 42, 7…
## $ Año            <dbl> 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2…
## $ Mes            <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ Día            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ id             <dbl> 3, 29, NA, 2, NA, NA, NA, 5, 17, 19, 22, 12, 10, 23, 6,…
## $ nom            <chr> "Berri_1", "Boyer_1", NA, "Brebeuf_1", NA, NA, NA, "Mai…
## $ Etat           <chr> "Existant", "Existant", NA, "Existant", NA, NA, NA, "Ex…
## $ Type           <chr> "compteur", "compteur", NA, "compteur", NA, NA, NA, "co…
## $ Annee_implante <dbl> 2008, 2013, NA, 2009, NA, NA, NA, 2008, 2013, 2013, 201…
## $ coord_X        <dbl> -73.56284, -73.60523, NA, -73.57398, NA, NA, NA, -73.57…
## $ coord_Y        <dbl> 45.51613, 45.53840, NA, 45.52741, NA, NA, NA, 45.50054,…
datatable(head(datos_combinados), caption = "Tabla interactiva")

19 : ¿Ver qué districtos del primer dataframe no se encuentran en el segundo?

# Leer el archivo comptagevelo2017.csv y transformar el dataframe
datos_bicicletas_2017 <- read_csv("comptagevelo2017.csv", show_col_types = FALSE) %>%
  select(-2) %>%
  pivot_longer(cols = -Date, names_to = "Distrito", values_to = "Num_Ciclistas") %>%
  mutate(
    Año = year(dmy(Date)),
    Mes = month(dmy(Date)),
    Día = day(dmy(Date)),
    Date = dmy(Date),
    Distrito = str_replace_all(Distrito, " / ", "/")  # Ajustar formato de Distrito
  )

# Leer el archivo localisationcompteursvelo2015.csv con codificación ISO-8859-1
localizacion_datos <- read_csv("localisationcompteursvelo2015.csv", locale = locale(encoding = "ISO-8859-1"))

# Renombrar la columna correspondiente para hacer el join
localizacion_datos <- localizacion_datos %>%
  rename(Distrito = nom_comptage)

# Identificar los distritos en datos_bicicletas_2017 que no están en localizacion_datos
distritos_no_encontrados <- datos_bicicletas_2017 %>%
  anti_join(localizacion_datos, by = "Distrito") %>%
  distinct(Distrito)  # Obtener distritos únicos sin correspondencia

# Verificar el resultado
head(distritos_no_encontrados)

20 : Realizar un gráfico de puntos del dataframe resultante del ejercicio 18 de las columnas coord X (eje x) y coord Y (eje y), donde el tamaño de los puntos representa el número total de ciclistas que pasaron por ese districto a lo largo de todo el año.

# Leer y transformar los datos del archivo comptagevelo2017.csv
datos_bicicletas_2017 <- read_csv("comptagevelo2017.csv", show_col_types = FALSE) %>%
  select(-2) %>%
  pivot_longer(cols = -Date, names_to = "Distrito", values_to = "Num_Ciclistas") %>%
  mutate(
    Año = year(dmy(Date)),
    Mes = month(dmy(Date)),
    Día = day(dmy(Date)),
    Date = dmy(Date),
    Distrito = str_replace_all(Distrito, " / ", "/")  # Ajustar formato de Distrito
  )

# Leer el archivo localisationcompteursvelo2015.csv con codificación ISO-8859-1
localizacion_datos <- read_csv("localisationcompteursvelo2015.csv", locale = locale(encoding = "ISO-8859-1"))

# Renombrar la columna "nom_comptage" para hacer el join
localizacion_datos <- localizacion_datos %>%
  rename(Distrito = nom_comptage)

# Realizar el join de los dos dataframes usando la columna "Distrito" en ambos
datos_combinados <- datos_bicicletas_2017 %>%
  left_join(localizacion_datos, by = "Distrito")

# Calcular el total de ciclistas por distrito
totales_distrito <- datos_combinados %>%
  group_by(Distrito, coord_X, coord_Y) %>%
  summarize(Total_Ciclistas = sum(Num_Ciclistas, na.rm = TRUE), .groups = "drop")

# Crear el gráfico de puntos
ggplot(totales_distrito, aes(x = coord_X, y = coord_Y, size = Total_Ciclistas)) +
  geom_point(alpha = 0.7, color = "blue") +
  labs(
    title = "Total de Ciclistas por Distrito a lo Largo del Año",
    x = "Coordenada X",
    y = "Coordenada Y",
    size = "Total Ciclistas"
  ) +
  theme_minimal()