Justificación de la variable
La variable “Mes de reinicio” se clasifica como cuantitativa discreta y representa el periodo mensual en que un sistema recupera su operatividad tras un fallo. Su análisis es fundamental para identificar patrones de estacionalidad y ciclos de recurrencia, permitiendo determinar si existen épocas del año con mayor vulnerabilidad. Al estudiar la distribución de los reinicios mes a mes, la organización puede realizar una planificación preventiva de recursos y personal técnico, optimizando los tiempos de respuesta y ajustando las estrategias de mantenimiento según el comportamiento histórico de la infraestructura en periodos críticos.
En esta fase, se extraen los registros de la columna Restart Date del archivo “database-1.csv”. Se realiza una limpieza exhaustiva eliminando celdas vacías y valores no numéricos, transformando los datos crudos a un formato temporal estándar (POSIXct) para permitir cálculos matemáticos precisos sobre la línea del tiempo.
database <- read.csv("database-_1_.csv", header = TRUE, sep = ",", dec = ".", check.names = FALSE)
raw_dates <- database$`Restart Date/Time`
raw_dates <- raw_dates[raw_dates != ""]
raw_dates <- na.omit(raw_dates)
# Transformación a formato mes
fechas_obj <- as.POSIXct(raw_dates, format = "%m")
amperaje <- as.numeric(fechas_obj)
amperaje <- na.omit(amperaje)
fechas_obj <- fechas_obj[!is.na(amperaje)]
Se procede a la discretización de la variable continua mediante la regla de Sturges para determinar el número óptimo de intervalos. Esta tabla organiza cronológicamente los reinicios, permitiendo observar la distribución de frecuencias absolutas y acumuladas a lo largo de los años de registro.
# Cargar librerías necesarias
library(dplyr)
library(rmarkdown)
# 1. CARGA DE DATOS
# check.names = FALSE evita que R ponga puntos en los nombres con espacios
datos <- read.csv("database-_1_.csv", stringsAsFactors = FALSE, check.names = FALSE)
# 2. EXTRACCIÓN Y LIMPIEZA DE LA VARIABLE (MES DE REINICIO)
raw_dates <- datos$`Restart Date/Time`
raw_dates <- raw_dates[raw_dates != ""]
fechas <- as.POSIXct(raw_dates, format="%m/%d/%Y %H:%M")
fechas[is.na(fechas)] <- as.POSIXct(raw_dates[is.na(fechas)], format="%m/%d/%Y")
meses_limpios <- as.numeric(format(fechas, "%m"))
meses_limpios <- meses_limpios[!is.na(meses_limpios)]
# 3. CREACIÓN DE LA TABLA DE FRECUENCIAS DISCRETA
tabla_base <- table(meses_limpios)
ni <- as.vector(tabla_base)
# Esta será tu única columna para el mes (1, 2, 3... hasta 12)
Mes <- names(tabla_base)
hi <- round(ni / sum(ni) * 100, 2)
diferencia <- 100 - sum(hi)
if(diferencia != 0){
indice_max <- which.max(ni)
hi[indice_max] <- hi[indice_max] + diferencia
}
# 4. CÁLCULO DE FRECUENCIAS ACUMULADAS
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_dsc <- rev(cumsum(rev(hi)))
# 5. CONSTRUCCIÓN DEL DATAFRAME FINAL
TDFMesFin <- data.frame(
"Mes" = Mes,
"ni" = ni,
"hi (%)" = hi,
"Ni Asc" = Ni_asc,
"Ni Dsc" = Ni_dsc,
"Hi Asc" = Hi_asc,
"Hi Dsc" = Hi_dsc,
check.names = FALSE
)
# 6. MOSTRAR TABLA
paged_table(TDFMesFin, options = list(rows.print = 6))
Esta gráfica proyecta el volumen total de reinicios ocurridos durante todo el histórico. Permite identificar de manera macroscópica si existen picos de actividad operativa o si el restablecimiento de los sistemas se mantiene constante a través del tiempo.
# Cargar la librería necesaria para graficar
library(ggplot2)
# Convertimos 'Mes' a factor para asegurar que se ordene correctamente del 1 al 12
TDFMesFin$Mes <- factor(TDFMesFin$Mes, levels = as.character(1:12))
total_reinicios <- sum(TDFMesFin$ni)
p_ni <- ggplot(TDFMesFin, aes(x = Mes, y = ni)) +
geom_col(fill = "steelblue", color = "black", alpha = 0.8, linewidth = 0.5) +
# Ajuste del límite en el eje Y hasta 2795 (corrigiendo el 1500)
scale_y_continuous(limits = c(0, 2795),
expand = expansion(mult = c(0, 0.05))) +
labs(title = "Gráfica No 1: Distribución de los Reinicios Globales",
x = "Mes",
y = "Cantidad") +
theme_classic() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 13),
axis.text.x = element_text(angle = 0, hjust = 0.5, color = "black"), # Ángulo 0 para lectura recta
axis.text.y = element_text(color = "black"),
axis.line = element_line(linewidth = 0.5, color = "black")
)
print(p_ni)
Al observar el comportamiento local, se analizan los intervalos específicos de mayor frecuencia. Esta visualización ayuda a detectar periodos de “core operativo” donde la frecuencia de reinicios es más alta, facilitando la planificación de recursos humanos y técnicos.
# Cargar la librería necesaria para graficar
library(ggplot2)
# Convertimos 'Mes' a factor para asegurar que se ordene correctamente del 1 al 12
TDFMesFin$Mes <- factor(TDFMesFin$Mes, levels = as.character(1:12))
p_ni_local_barras <- ggplot(TDFMesFin, aes(x = Mes, y = ni)) +
geom_col(fill = "steelblue", color = "black", alpha = 0.8, linewidth = 0.5) +
# Se elimina scale_x_continuous porque el eje X ahora es texto categórico (los meses)
# Mantenemos solo el expand en el eje Y para que se autoajuste a los datos locales
scale_y_continuous(expand = expansion(mult = c(0, 0.05))) +
labs(title = "Gráfica No 2: Distribución de reinicio local",
x = "Mes",
y = "Cantidad") +
theme_classic() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 13),
axis.text.x = element_text(angle = 0, hjust = 0.5, color = "black"), # Ángulo 0 para lectura recta
axis.text.y = element_text(color = "black"),
axis.line = element_line(linewidth = 0.5, color = "black")
)
print(p_ni_local_barras)
La normalización de los datos mediante porcentajes permite evaluar la probabilidad empírica de ocurrencia. Esta gráfica muestra qué proporción del total de reinicios pertenece a cada periodo temporal, eliminando el sesgo del conteo bruto.
# Cargar la librería necesaria para graficar
library(ggplot2)
TDFMesFin$Mes <- factor(TDFMesFin$Mes, levels = as.character(1:12))
p_hi <- ggplot(TDFMesFin, aes(x = Mes, y = `hi (%)`)) +
geom_col(fill = "steelblue", color = "black", alpha = 0.8, linewidth = 0.5) +
scale_y_continuous(expand = expansion(mult = c(0, 0.05)),
labels = function(x) paste0(x, "%")) +
labs(title = "Gráfica No 3: Distribución Porcentual de reinicio local",
x = "Mes",
y = "Porcentaje") +
theme_classic() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 13),
axis.text.x = element_text(angle = 0, hjust = 0.5, color = "black"), # Ángulo 0 para lectura recta
axis.text.y = element_text(color = "black"),
axis.line = element_line(linewidth = 0.5, color = "black")
)
print(p_hi)
Esta representación focaliza el análisis porcentual en los sub-periodos, permitiendo verificar si la intensidad de los reinicios es proporcional a lo largo del sexenio o si existen anomalías temporales donde el porcentaje de recuperación se acelera.
# Cargar la librería necesaria para graficar
library(ggplot2)
TDFMesFin$Mes <- factor(TDFMesFin$Mes, levels = as.character(1:12))
p_hi <- ggplot(TDFMesFin, aes(x = Mes, y = `hi (%)`)) +
geom_col(fill = "steelblue", color = "black", alpha = 0.8, linewidth = 0.5) +
scale_y_continuous(expand = expansion(mult = c(0, 0.05)),
labels = function(x) paste0(x, "%"),
limits = c(0, 100),
breaks = seq(0, 100, by = 20)) +
labs(title = "Gráfica No 4: Distribución Porcentual de reinicio global",
x = "Mes",
y = "Porcentaje") +
theme_classic() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 13),
axis.text.x = element_text(angle = 0, hjust = 0.5, color = "black"), # Ángulo 0 para lectura recta
axis.text.y = element_text(color = "black"),
axis.line = element_line(linewidth = 0.5, color = "black")
)
print(p_hi)
El análisis de las ojivas permite determinar el punto exacto del tiempo donde se alcanza la mediana de los datos (la intersección entre la curva ascendente y descendente). Visualiza cómo se van completando los reinicios totales a medida que transcurre el calendario.
library(ggplot2)
# Asegurarnos de que el Mes se grafique en orden numérico (del 1 al 12)
TDFMesFin$Mes <- factor(TDFMesFin$Mes, levels = as.character(1:12))
p_ojiva_replicada <- ggplot(data = TDFMesFin) +
# Ojiva Ascendente por CANTIDAD (Ni Asc)
geom_line(aes(x = Mes, y = `Ni Asc`, color = "Ascendente", linetype = "Ascendente", group = 1), linewidth = 0.8) +
geom_point(aes(x = Mes, y = `Ni Asc`, color = "Ascendente"), size = 2) +
# Ojiva Descendente por CANTIDAD (Ni Dsc)
geom_line(aes(x = Mes, y = `Ni Dsc`, color = "Descendente", linetype = "Descendente", group = 1), linewidth = 0.8) +
geom_point(aes(x = Mes, y = `Ni Dsc`, color = "Descendente"), size = 2) +
# Eje X: Meses como números del 1 al 12
scale_x_discrete(breaks = as.character(1:12)) +
# --- EJE Y: AJUSTADO PARA MOSTRAR 1000, 2000, ETC. ---
scale_y_continuous(breaks = seq(0, 5000, by = 1000)) +
# Colores y tipos de línea
scale_color_manual(name = NULL,
values = c("Ascendente" = "black", "Descendente" = "steelblue")) +
scale_linetype_manual(name = NULL,
values = c("Ascendente" = "longdash", "Descendente" = "solid")) +
# Títulos y etiquetas
labs(title = "Gráfica No 5: Ojivas de reinicio por Mes",
x = "Mes",
y = "Cantidad") +
# Tema visual
theme_bw() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
legend.position = c(0.85, 0.85),
legend.background = element_rect(color = "black", fill = "white", linewidth = 0.5)
)
print(p_ojiva_replicada)
El diagrama de caja o boxplot ofrece una vista resumida de la dispersión de los reinicios. Permite identificar visualmente el rango intercuartílico (donde ocurre el 50% de los reinicios) y observar si el proceso de restablecimiento está sesgado hacia fechas tempranas o tardías.
# 1. Extraer meses y limpiar vacíos
meses <- na.omit(as.numeric(format(f, "%m")))
# 2. Boxplot y Eje X numérico
boxplot(meses, horizontal = TRUE, col = "steelblue",
main = "Gráfica No 7: Distribución del Reinicio por Mes",
xlab = "Mes", xaxt = "n")
axis(1, at = 1:12)
grid(nx = 12, ny = NA, col = "lightgray", lty = "dotted")
A continuación se presentan los estimadores de tendencia central y de forma. Estos valores permiten caracterizar matemáticamente el comportamiento del “río del tiempo” para la variable de reinicio, midiendo su simetría y el grado de concentración de los dato.
# Cargar librerías necesarias
library(knitr)
library(moments)
##
## Adjuntando el paquete: 'moments'
## The following objects are masked from 'package:e1071':
##
## kurtosis, moment, skewness
# 1. EXTRAER SOLO EL MES COMO NÚMERO (1 al 12)
meses <- as.numeric(format(f, "%m"))
meses <- na.omit(meses) # Quitamos vacíos para cálculos perfectos
# ==========================================
# CÁLCULOS ESTADÍSTICOS (SOLO PARA EL MES)
# ==========================================
# 1. Rango
ri <- min(meses)
rs <- max(meses)
# 2. Mediana y Media
mediana <- median(meses)
media_aritmetica <- mean(meses)
# 3. Moda
t <- table(meses)
Mo <- as.numeric(names(t)[which.max(t)])
# 4. Dispersión
desviacion_estandar <- sd(meses)
coeficiente_variabilidad <- (desviacion_estandar / media_aritmetica) * 100
# 5. Forma
As <- round(skewness(meses), 2)
curtosis_val <- round(kurtosis(meses), 2)
# 6. Construcción de la Tabla
Variable <- "Mes de Reinicio"
S_texto <- paste(round(desviacion_estandar, 2))
Tabla_indicadores <- data.frame(
Variable,
ri, # Mes mínimo
rs, # Mes máximo
round(media_aritmetica, 2),
round(mediana, 2),
Mo,
S_texto,
round(coeficiente_variabilidad, 2),
round(As, 2),
round(curtosis_val, 2)
)
# Asignar los nombres a las columnas tal como lo pediste
colnames(Tabla_indicadores) <- c("Variable","Mínimo","Máximo","x","Me","Mo","S","Cv (%)","As","K")
# Imprimir la tabla estilizada
kable(Tabla_indicadores, format = "markdown", caption = "Tabla No. 2: Indicadores estadísticos del Mes")
| Variable | Mínimo | Máximo | x | Me | Mo | S | Cv (%) | As | K |
|---|---|---|---|---|---|---|---|---|---|
| Mes de Reinicio | 1 | 12 | 6.52 | 7 | 9 | 3.46 | 53.12 | 0 | 1.79 |
Se aplica el criterio analítico para detectar reinicios anómalos que ocurren fuera del comportamiento estándar del sistema. Estos puntos representan eventos donde el tiempo de reinicio fue excepcionalmente temprano o tardío en comparación con el resto de la muestra.
# 1. Extraemos los valores atípicos (outliers) de la variable 'meses'
stats_outliers <- boxplot.stats(meses)$out
num_outliers <- length(stats_outliers)
# 2. Calculamos el mes mínimo y máximo entre los atípicos (solo si existen)
minimooutliers <- if(num_outliers > 0) min(stats_outliers) else NA
maximooutliers <- if(num_outliers > 0) max(stats_outliers) else NA
# 3. Formateamos la salida (ya no hay conversión a fecha, es texto directo)
minimooutliers_mes <- if(!is.na(minimooutliers)) as.character(minimooutliers) else "Ninguno"
maximooutliers_mes <- if(!is.na(maximooutliers)) as.character(maximooutliers) else "Ninguno"
# 4. Imprimimos el resumen en consola
cat("Número de valores atípicos detectados:", num_outliers, "\n")
## Número de valores atípicos detectados: 0
cat("Mes del outlier inferior:", minimooutliers_mes, "\n")
## Mes del outlier inferior: Ninguno
cat("Mes del outlier superior:", maximooutliers_mes, "\n")
## Mes del outlier superior: Ninguno
La variable “Mes de reinicio” fluctúa entre los valores 1 y 12, con un valor promedio de 6.52 y una mediana de 7, alcanzando su pico de mayor frecuencia de ocurrencia en el mes 9. Presenta una distribución perfectamente simétrica y una curtosis de 1.79. Su desviación estándar es de 3.46 meses con un coeficiente de variación del 53.12%, lo cual refleja una dispersión moderada a alta en los tiempos en que ocurren los eventos. Por todo lo anterior, el comportamiento típico de la variable evidencia que los procesos de reinicio se distribuyen de manera simétrica y regular a lo largo del año, aunque con una variabilidad temporal considerable y una frecuencia máxima puntual en el mes de septiembre, sin evidenciar sesgos extremos hacia el inicio o el final del ciclo anual.