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.

1 Cargar datos

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

2 Tabla de Frecuencia

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

3 Histograma de Cantidad Absoluta

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)

4 Histograma de Cantidad Absoluta

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)

5 Histograma de Cantidad Relativa

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)

6 Histograma de Cantidad Relativa

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)

7 Ojivas Combinadas

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)

8 Diagrama de caja

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

9 Tabla Estadístico

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

10 Valores atipicos

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

11 Conclusión

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.