library(readxl)
library(dplyr)
library(ggplot2)
library(lubridate)

datos <- read_excel("Calidad_Servicio_Iluminacion.xlsx", 
                    col_types = c("numeric", "date", "text", "text", "text", 
                                  "text", "date", "text", "text", "text", 
                                  "numeric", "text", "text", "text", "numeric", 
                                  "text", "text", "text", "text", "text"))
head(datos)
## # A tibble: 6 × 20
##   `No\r\nRECLAMO` `FECHA DE RECLAMO`  PROCEDENCIA DISTRITO PQRs     
##             <dbl> <dttm>              <chr>       <chr>    <chr>    
## 1               1 2024-02-29 00:00:00 AMSS        1        Apagada  
## 2               2 2024-02-29 00:00:00 AMSS        1        Solicitud
## 3               3 2024-02-29 00:00:00 AGM         4        Directa  
## 4               4 2024-02-29 00:00:00 AGM         4        Directa  
## 5               5 2024-02-29 00:00:00 AGM         4        Directa  
## 6               6 2024-02-29 00:00:00 AGM         4        Apagada  
## # ℹ 15 more variables: `UBICACIÓN DE FALLA` <chr>, `FECHA REVISIÓN` <dttm>,
## #   LINIERO <chr>, MOTORISTA <chr>, `CÓDIGO \r\nDE LUMINARIA` <chr>,
## #   WATTS <dbl>, `FALLA ENCONTRADA` <chr>, `FALLA ESPECIFICA` <chr>,
## #   `CÓD LAMPARA\r\n NUEVA` <chr>, POT <dbl>, CON <chr>, FOT <chr>,
## #   MATERIAL <chr>, CANT <chr>, Observaciones <chr>
summary(datos)
##    No\r\nRECLAMO  FECHA DE RECLAMO                 PROCEDENCIA       
##  Min.   :  1.00   Min.   :2024-02-20 00:00:00.00   Length:342        
##  1st Qu.: 86.25   1st Qu.:2024-03-06 00:00:00.00   Class :character  
##  Median :182.50   Median :2024-03-12 00:00:00.00   Mode  :character  
##  Mean   :178.97   Mean   :2024-03-12 21:53:41.04                     
##  3rd Qu.:267.75   3rd Qu.:2024-03-20 00:00:00.00                     
##  Max.   :353.00   Max.   :2024-03-27 00:00:00.00                     
##                                                                      
##    DISTRITO             PQRs           UBICACIÓN DE FALLA
##  Length:342         Length:342         Length:342        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
##                                                          
##  FECHA REVISIÓN                     LINIERO           MOTORISTA        
##  Min.   :2024-03-01 00:00:00.00   Length:342         Length:342        
##  1st Qu.:2024-03-07 00:00:00.00   Class :character   Class :character  
##  Median :2024-03-13 00:00:00.00   Mode  :character   Mode  :character  
##  Mean   :2024-03-13 17:45:15.78                                        
##  3rd Qu.:2024-03-20 00:00:00.00                                        
##  Max.   :2024-03-28 00:00:00.00                                        
##                                                                        
##  CÓDIGO \r\nDE LUMINARIA     WATTS        FALLA ENCONTRADA   FALLA ESPECIFICA  
##  Length:342              Min.   : 20.00   Length:342         Length:342        
##  Class :character        1st Qu.: 30.00   Class :character   Class :character  
##  Mode  :character        Median : 60.00   Mode  :character   Mode  :character  
##                          Mean   : 67.97                                        
##                          3rd Qu.: 90.00                                        
##                          Max.   :210.00                                        
##                                                                                
##  CÓD LAMPARA\r\n NUEVA      POT             CON                FOT           
##  Length:342            Min.   : 27.00   Length:342         Length:342        
##  Class :character      1st Qu.: 40.00   Class :character   Class :character  
##  Mode  :character      Median : 60.00   Mode  :character   Mode  :character  
##                        Mean   : 69.83                                        
##                        3rd Qu.: 90.00                                        
##                        Max.   :210.00                                        
##                        NA's   :214                                           
##    MATERIAL             CANT           Observaciones     
##  Length:342         Length:342         Length:342        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
str(datos)
## tibble [342 × 20] (S3: tbl_df/tbl/data.frame)
##  $ No
## RECLAMO          : num [1:342] 1 2 3 4 5 6 7 8 9 10 ...
##  $ FECHA DE RECLAMO       : POSIXct[1:342], format: "2024-02-29" "2024-02-29" ...
##  $ PROCEDENCIA            : chr [1:342] "AMSS" "AMSS" "AGM" "AGM" ...
##  $ DISTRITO               : chr [1:342] "1" "1" "4" "4" ...
##  $ PQRs                   : chr [1:342] "Apagada" "Solicitud" "Directa" "Directa" ...
##  $ UBICACIÓN DE FALLA     : chr [1:342] "Colonia la rabida pasaje freumd" "Colonia la campiña 37 calle oriente" "Ave del Torogoz sur pasaje los pericos" "Recidencial villas de san pachicio , pasaje del guarumo" ...
##  $ FECHA REVISIÓN         : POSIXct[1:342], format: "2024-03-01" "2024-03-01" ...
##  $ LINIERO                : chr [1:342] "Carlos" "Carlos" "Carlos" "Carlos" ...
##  $ MOTORISTA              : chr [1:342] "Carlos O" "Carlos O" "Carlos O" "Carlos O" ...
##  $ CÓDIGO 
## DE LUMINARIA: chr [1:342] "BRD572" "BRC1953" "BRC5903" "BRB1156" ...
##  $ WATTS                  : num [1:342] 60 40 40 30 40 60 40 27 40 60 ...
##  $ FALLA ENCONTRADA       : chr [1:342] "Fotocelda" "Peticion por alcaldia" "Fotocelda" "Fotocelda" ...
##  $ FALLA ESPECIFICA       : chr [1:342] "Se cambió fotocelda" "Se cambió fotocelda" "Se cambió fotocelda" "Se cambió fotocelda" ...
##  $ CÓD LAMPARA
##  NUEVA  : chr [1:342] NA NA NA NA ...
##  $ POT                    : num [1:342] NA NA NA NA NA 60 NA NA NA NA ...
##  $ CON                    : chr [1:342] NA NA NA NA ...
##  $ FOT                    : chr [1:342] "1F" "1F" "1F" "1F" ...
##  $ MATERIAL               : chr [1:342] "Fotocelda" "Fotocelda" "Fotocelda" "Fotocelda" ...
##  $ CANT                   : chr [1:342] "1F" "1F" "1F" "1F" ...
##  $ Observaciones          : chr [1:342] "Luminaria con fotocelda quemada" "Fotocelda estaba dañada, queda en perfecto funcionamiento." "Fotocelda dañada" "Luminaria directa.. se le cambio fotocelda" ...
# Ajustar nombres de columnas para facilitar el manejo
names(datos) <- c("NoReclamo", "FechaReclamo", "Procedencia", "Distrito", "PQRs", "UbicacionFalla", "FechaRevision", "Liniero", "Motorista", "CodigoLuminaria", "Watts", "FallaEncontrada", "FallaEspecifica", "CodLamparaNueva", "Pot", "Con", "Fot", "Material", "Cant", "Observaciones")
# Conversión de fechas
datos$FechaReclamo <- as.Date(datos$FechaReclamo)
datos$FechaRevision <- as.Date(datos$FechaRevision)
# Análisis descriptivo
summary_datos <- datos %>%
  summarise(
    ReclamosTotales = n(),
    DuracionPromedio = mean(as.numeric(FechaRevision - FechaReclamo), na.rm = TRUE)
  )

print(summary_datos)
## # A tibble: 1 × 2
##   ReclamosTotales DuracionPromedio
##             <int>            <dbl>
## 1             342            0.827
# Visualización de reclamos por distrito
ggplot(data = datos, aes(x = Distrito)) +
  geom_bar(stat = "count", fill = "blue", width = 0.7) +  # Dibuja las barras
  geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5, color = "blue") +  # Agrega etiquetas de texto con el conteo de cada barra
  labs(title = "Reclamos por Distrito",
       x = "Distrito",
       y = "Número de Reclamos") +
  theme_minimal()  # Aplicar un tema minimalista

# Visualización de tipos de fallas encontradas
# Convertir la columna relevante a factor si no lo es
datos$FallaEncontrada <- factor(datos$FallaEncontrada)

# Crear gráfico de barras
ggplot(data = datos, aes(x = FallaEncontrada)) +
  geom_bar(fill = "red", width = 0.7) +  # Dibuja las barras
  geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5, color = "black") +  # Agrega etiquetas de texto con el conteo de cada barra
  labs(title = "Distribución Fallas Encontrada",
       x = "Falla Encontrada",
       y = "Número de Ocurrencias") +
  theme_minimal() +  # Aplicar un tema minimalista
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Rotar las etiquetas del eje X

#Análisis de Tiempo de Respuesta por Distrito (Cantidad: cantidad de reclamos por distrito)
datos %>%
  group_by(Distrito) %>%
  summarise(
    PromedioDias = mean(as.numeric(FechaRevision - FechaReclamo), na.rm = TRUE),
    MedianaDias = median(as.numeric(FechaRevision - FechaReclamo), na.rm = TRUE),
    Cantidad = n()
  ) %>%
  arrange(desc(PromedioDias))
## # A tibble: 7 × 4
##   Distrito PromedioDias MedianaDias Cantidad
##   <chr>           <dbl>       <dbl>    <int>
## 1 6               2.16            1       25
## 2 5               1.48            1       46
## 3 4               0.821           0       67
## 4 2               0.739           0       46
## 5 1               0.547           1       95
## 6 3               0.405           0       37
## 7 CH              0.192           0       26
#Frecuencia de Materiales Usados (Distritos unicos: cuantos distritos diferentes estan involucrados en el uso de cada material), UsoTotal: uso de cada material
datos %>%
  group_by(Material) %>%
  summarise(
    UsoTotal = n(),
    DistritosUnicos = n_distinct(Distrito)
  ) %>%
  arrange(desc(UsoTotal))
## # A tibble: 7 × 3
##   Material             UsoTotal DistritosUnicos
##   <chr>                   <int>           <int>
## 1 <NA>                      228               7
## 2 Fotocelda                  82               7
## 3 Conectores                 13               5
## 4 conectores/Fotocelda        7               5
## 5 Conector                    6               3
## 6 Conectores/Acometida        5               2
## 7 conectores/Acometida        1               1
# Asegúrarse que 'datos' está cargado y listo para usar
datos$FallaEspecifica <- factor(datos$FallaEspecifica)  # Convertir a factor si aún no lo es

# Crear gráfico de barras para la distribución de tipos de fallas
ggplot(data = datos, aes(x = FallaEspecifica)) +
  geom_bar(fill = "green", width = 0.7) +  # Dibuja las barras
  geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5, color = "black") +  # Agregar etiquetas de texto con el conteo de cada barra
  labs(title = "Distribución Falla Específica",
       x = "Falla Específica",
       y = "Número de Ocurrencias") +
  theme_minimal() +  # Aplicar un tema minimalista
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Rotar las etiquetas del eje X para mejor legibilidad

#Análisis de PQRs
resultado_pqrs <- datos %>%
  group_by(PQRs) %>%
  summarise(Total = n())

# Crear el gráfico de barras con etiquetas
ggplot(resultado_pqrs, aes(x = PQRs, y = Total, fill = PQRs)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = Total), vjust = -0.3, color = "black") +  # Añade etiquetas de texto justo encima de las barras
  labs(title = "Distribución de Tipos de PQRs", x = "Tipo de PQR", y = "Total") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Ajusta la orientación de las etiquetas del eje x para mejorar la legibilidad

#Evaluación del Tiempo de Respuesta por Tipo de PQRs
datos %>%
  mutate(Duracion = as.numeric(difftime(FechaRevision, FechaReclamo, units = "days"))) %>%
  group_by(PQRs) %>%
  summarise(PromedioDias = mean(Duracion, na.rm = TRUE)) %>%
  ggplot(aes(x = PQRs, y = PromedioDias, fill = PQRs)) +
  geom_col() +  # Dibuja las barras de la gráfica
  geom_text(aes(label = round(PromedioDias, 1)), vjust = -0.5, color = "black") +  # Añade etiquetas con los días promedio redondeados a un decimal
  labs(title = "Tiempo de Respuesta por Tipo de PQR", x = "Tipo de PQR", y = "Días Promedio") +
  theme_minimal()  # Aplicar un tema minimalista

resultado_watts <- datos %>%
  summarise(PromedioWatts = mean(Watts, na.rm = TRUE),
    MedianaWatts = median(Watts, na.rm = TRUE),
    DesviacionStdWatts = sd(Watts, na.rm = TRUE),
    MaxWatts = max(Watts, na.rm = TRUE),
    MinWatts = min(Watts, na.rm = TRUE)
  )

# Mostrar los resultados
print(resultado_watts)
## # A tibble: 1 × 5
##   PromedioWatts MedianaWatts DesviacionStdWatts MaxWatts MinWatts
##           <dbl>        <dbl>              <dbl>    <dbl>    <dbl>
## 1          68.0           60               46.0      210       20
#Relación entre Falla Específica y Material Utilizado
datos %>%
  group_by(FallaEspecifica, Material) %>%
  summarise(Usos = n()) %>%
  filter(Usos > 1) %>%
  arrange(desc(Usos))
## # A tibble: 15 × 3
## # Groups:   FallaEspecifica [9]
##    FallaEspecifica        Material              Usos
##    <fct>                  <chr>                <int>
##  1 Se cambió luminaria    <NA>                   104
##  2 Se cambió fotocelda    Fotocelda               52
##  3 Se verificó luminaria  <NA>                    52
##  4 Se reconectó luminaria <NA>                    42
##  5 Se cambió luminaria    Fotocelda               23
##  6 Faltante de acometida  <NA>                    18
##  7 Se reconectó luminaria Conectores              11
##  8 Se instaló acometida   Conectores/Acometida     5
##  9 Se reconectó luminaria Conector                 5
## 10 Se ajustó fotocelda    <NA>                     4
## 11 Se instaló fotocelda   Fotocelda                4
## 12 Daños por terceros     <NA>                     3
## 13 Se cambió luminaria    conectores/Fotocelda     3
## 14 Se reconectó luminaria Fotocelda                3
## 15 Se cambió fotocelda    <NA>                     2
datos %>%
  group_by(Motorista, Liniero) %>%
  summarise(TotalIntervenciones = n()) %>%
  arrange(desc(TotalIntervenciones))
## # A tibble: 7 × 3
## # Groups:   Motorista [6]
##   Motorista Liniero  TotalIntervenciones
##   <chr>     <chr>                  <int>
## 1 Luis      Carlos                   160
## 2 Amilcar   Héctor                   135
## 3 Carlos O  Carlos                    21
## 4 José      Eriberto                  11
## 5 William   Pedro                     11
## 6 carlos    Héctor                     3
## 7 Amilcar   Hector                     1
# Contar el número de intervenciones por Motorista y Liniero
datos_agrupados <- datos %>% 
  count(Motorista, Liniero)

# Crear el gráfico de barras agrupadas con etiquetas de valor
ggplot(datos_agrupados, aes(x = Motorista, y = n, fill = Liniero)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = n), vjust = -0.5, position = position_dodge(width = 0.9), color = "black") + # Añade etiquetas de texto con el conteo de cada barra
  labs(title = "Distribución de Intervenciones por Motorista y Liniero",
       x = "Motorista",
       y = "Número de Intervenciones",
       fill = "Liniero") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Contar el número de intervenciones por Motorista, Liniero y Procedencia
datos_agrupados <- datos %>% 
  count(Motorista, Liniero, Procedencia)

# Crear el gráfico de barras agrupadas con facetas por Procedencia
ggplot(datos_agrupados, aes(x = Motorista, y = n, fill = Liniero)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = n), vjust = -0.5, position = position_dodge(width = 0.9), color = "black") + # Añade etiquetas de texto con el conteo de cada barra
  facet_wrap(~ Procedencia, scales = "free_x") + # Usar facetas para dividir por Procedencia
  labs(title = "Distribución de Intervenciones por Motorista, Liniero y Procedencia",
       x = "Motorista",
       y = "Número de Intervenciones",
       fill = "Liniero") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

library(stringr)

# Crear una nueva columna en el dataframe para las categorías agrupadas
datos <- datos %>%
  mutate(
    CategoriaUbicacion = case_when(
      str_detect(UbicacionFalla, regex("residencial|recidencial|condominio", ignore_case = TRUE)) ~ "Residencial",
      str_detect(UbicacionFalla, regex("colonia|comunidad|barrio|pje|pasaje", ignore_case = TRUE)) ~ "Comunidad/Colonia",
      str_detect(UbicacionFalla, regex("parque|plaza|jardines", ignore_case = TRUE)) ~ "Parque/Plaza",
      str_detect(UbicacionFalla, regex("avenida|boulevard|calle", ignore_case = TRUE)) ~ "Calles/Avenidas",
      str_detect(UbicacionFalla, regex("centro|plaza|mercado|fuente", ignore_case = TRUE)) ~ "Centro Urbano",
      TRUE ~ "Otros"
    )
  )

# Verificar cómo quedó la distribución de categorías
table(datos$CategoriaUbicacion)
## 
##   Calles/Avenidas     Centro Urbano Comunidad/Colonia             Otros 
##               123                15                89                79 
##      Parque/Plaza       Residencial 
##                11                25
# Vamos a calcular el conteo de intervenciones por categoría agrupada
conteo_categorias <- datos %>%
  group_by(CategoriaUbicacion) %>%
  summarise(NumeroDeIntervenciones = n()) %>%
  arrange(desc(NumeroDeIntervenciones))

# Crear un gráfico de barras con etiquetas de valor
ggplot(conteo_categorias, aes(x = CategoriaUbicacion, y = NumeroDeIntervenciones, fill = CategoriaUbicacion)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = NumeroDeIntervenciones), vjust = -0.5, color = "black") + # Añade etiquetas numéricas encima de cada barra
  labs(title = "Distribución de Intervenciones por Categoría de Ubicación",
       x = "Categoría de Ubicación",
       y = "Número de Intervenciones") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Paired")  # Usar una paleta de colores para diferenciar las categorías

# Calcular el conteo de intervenciones por categoría agrupada y los porcentajes
conteo_categorias <- datos %>%
  group_by(CategoriaUbicacion) %>%
  summarise(NumeroDeIntervenciones = n()) %>%
  mutate(Percent = (NumeroDeIntervenciones / sum(NumeroDeIntervenciones) * 100))  # Calcula los porcentajes

# Crear un gráfico de barras con etiquetas de porcentaje
ggplot(conteo_categorias, aes(x = CategoriaUbicacion, y = NumeroDeIntervenciones, fill = CategoriaUbicacion)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(Percent, 1), "%")), vjust = -0.5, color = "black") +  # Añade etiquetas de porcentaje encima de cada barra
  labs(title = "Distribución de Intervenciones por Categoría de Ubicación (Porcentajes)",
       x = "Categoría de Ubicación",
       y = "Número de Intervenciones") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_brewer(palette = "Paired")  # Usar una paleta de colores para diferenciar las categorías

library(tm)
library(wordcloud)
library(RColorBrewer)

# Suponemos que 'datos' es tu dataframe y 'observaciones' es la columna con el texto
corpus <- Corpus(VectorSource(datos$Observaciones))
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeWords, stopwords("spanish"))
corpus <- tm_map(corpus, stripWhitespace)

# Crear una matriz de términos del documento
tdm <- TermDocumentMatrix(corpus)
m <- as.matrix(tdm)
word_freqs <- sort(rowSums(m), decreasing = TRUE)
df <- data.frame(word = names(word_freqs), freq = word_freqs)

# Hacer un wordcloud
wordcloud(words = df$word, freq = df$freq, min.freq = 1,
          max.words = 200, random.order = FALSE, rot.per = 0.35, 
          colors = brewer.pal(8, "Dark2"))