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"))
