...

1 IDENTIFICACION Y JUSTIFICACIÓN DE LA VARIABLE

“La variable Estado Operacional se define como una variable cualitativa ordinal, puesto que sus categorías no solo clasifican el estatus de las plantas solares, sino que se organizan siguiendo una secuencia lógica y jerárquica basada en el ciclo de vida del proyecto (desde la fase de anuncio y pre-construcción hasta la etapa operativa o de retiro).”

2 CARGAR DATOS

Importamos el archivo “Mundial.csv” desde una ruta local y lo almacena en el objeto datos, usando espacios o tabulaciones como separador.

# Importación de datos

## setwd("C:/Users/ronal/OneDrive/Desktop")

datos <- read.csv("Mundial.csv", header = TRUE, sep = ",", dec = ".")
View(datos)

3 EXTRAER LA VARIABLE

Extraemos la variable estado operacional, omitimos las celdas en blanco o valores iguales a cero y verificamos el tamaño muestral

# 1. Eliminar valores nulos (NAs) de la variable de estado operativo
operational_status <- na.omit(datos$operational_status)

# 2. Eliminar celdas vacías o registros sin texto
operational_status <- operational_status[operational_status != ""]

# 3. Contar el total de registros válidos para esta variable
n_operativo <- length(operational_status)

# 4. Mostrar el resultado en el reporte
cat("Registros válidos de operational_status:", n_operativo)
## Registros válidos de operational_status: 58978

4 TABLA DE FRECUENCIA

En este apartado se cuantifican los estados operacionales de las plantas solares a nivel mundial y se asigna un identificador numérico (\(X_i\)) a cada subtipo de estado operacional.

# 1. Extraer y limpiar la variable directamente del archivo
operativo_limpio <- datos$operational_status[!is.na(datos$operational_status) & datos$operational_status != ""]

# 2. Convertir en Factor usando los nombres exactos detectados en el CSV
operativo_factor <- factor(operativo_limpio, 
                      levels = c(
                        "operating",
                        "construction",
                        "pre-construction",
                        "announced",
                        "shelved",
                        "shelved - inferred 2 y",
                        "cancelled",
                        "cancelled - inferred 4 y",
                        "mothballed",
                        "retired"
                      ),
                      labels = c(
                        "OPERATIVA",
                        "EN CONSTRUCCIÓN",
                        "PRE-CONSTRUCCIÓN",
                        "ANUNCIADA",
                        "SUSPENDIDA",
                        "SUSPENDIDA (INF. 2A)",
                        "CANCELADA",
                        "CANCELADA (INF. 4A)",
                        "EN RESERVA",
                        "RETIRO / CERRADA"
                      ))

# 3. Cálculo de frecuencias ni y hi
ni_op <- table(operativo_factor)
hi_op <- prop.table(ni_op) * 100

# 4. Construcción de la tabla base con ID (Xi)
tabla_op_base <- data.frame(
  ID = 1:length(ni_op),  
  Estado_Operativo = names(ni_op),
  ni = as.vector(ni_op),
  hi = round(as.vector(hi_op), 2)
)

# 5. Fila de TOTAL
fila_total_op <- data.frame(
  ID = NA, 
  Estado_Operativo = "TOTAL", 
  ni = sum(tabla_op_base$ni), 
  hi = round(sum(tabla_op_base$hi), 0)
)

# 6. Consolidación
tabla_final_op <- rbind(tabla_op_base, fila_total_op)

# 7. Mostrar la tabla
knitr::kable(tabla_final_op, 
             col.names = c("Valor (Xi)", "Estado Operativo", "Frecuencia (ni)", "Porcentaje (hi %)"),
             caption = "Tabla 1: Distribución por Estado Operativo",
             align = "clcc")
Tabla 1: Distribución por Estado Operativo
Valor (Xi) Estado Operativo Frecuencia (ni) Porcentaje (hi %)
1 OPERATIVA 47538 80.60
2 EN CONSTRUCCIÓN 2005 3.40
3 PRE-CONSTRUCCIÓN 6246 10.59
4 ANUNCIADA 1382 2.34
5 SUSPENDIDA 246 0.42
6 SUSPENDIDA (INF. 2A) 530 0.90
7 CANCELADA 564 0.96
8 CANCELADA (INF. 4A) 426 0.72
9 EN RESERVA 9 0.02
10 RETIRO / CERRADA 32 0.05
NA TOTAL 58978 100.00

4.1 Nuebla tabla de frecuencias

“La decisión de agrupar las categorías originales de la variable Estado Operacional responde criterios fundamentales como Corrección de la Asimetría Extrema: La base de datos original presentaba una distribución altamente desequilibrada, donde la categoría ‘Operativa’ concentraba la gran mayoría de las observaciones, mientras que las demas representaban mucho menos.

# 1. Crear la nueva columna agrupada
datos <- datos %>%
  mutate(Estado_5_Grupos = case_when(
    operational_status == "operating" ~ "1. OPERATIVA",
    operational_status %in% c("construction", "pre-construction") ~ "2. EN CONSTRUCCIÓN",
    operational_status == "announced" ~ "3. PLANIFICADA / ANUNCIADA",
    operational_status %in% c("shelved", "shelved - inferred 2 y", "mothballed") ~ "4. SUSPENDIDA / EN RESERVA",
    operational_status %in% c("cancelled", "cancelled - inferred 4 y", "retired") ~ "5. CANCELADA / RETIRADA",
    TRUE ~ "6. OTROS"
  ))

# 2. Calcular frecuencias
ni_op <- table(datos$Estado_5_Grupos)
hi_op <- prop.table(ni_op) * 100

# 3. Construir la tabla base con Xi
tabla_op_5 <- data.frame(
  ID = 1:length(ni_op),
  Estado_Operativo = names(ni_op),
  ni = as.vector(ni_op),
  hi = round(as.vector(hi_op), 2)  
)

# 4. Fila de TOTAL 
fila_total_op <- data.frame(
  ID = NA,
  Estado_Operativo = "**TOTAL**",
  ni = sum(tabla_op_5$ni),
  hi = 100 
)

tabla_final_op <- rbind(tabla_op_5, fila_total_op)

# 5. Renderizar tabla con formato profesional
knitr::kable(tabla_final_op, 
             caption = "Tabla 2: Tabla de Distribución por Estado Operativo ",
             col.names = c("Xi", "Estado del Proyecto", "Frecuencia (ni)", "Porcentaje (hi %)"),
             align = "clcc",
             digits = 2) 
Tabla 2: Tabla de Distribución por Estado Operativo
Xi Estado del Proyecto Frecuencia (ni) Porcentaje (hi %)
1 1. OPERATIVA 47538 80.60
2 2. EN CONSTRUCCIÓN 8251 13.99
3 3. PLANIFICADA / ANUNCIADA 1382 2.34
4 4. SUSPENDIDA / EN RESERVA 785 1.33
5 5. CANCELADA / RETIRADA 1022 1.73
NA TOTAL 58978 100.00

5 GRÁFICA DE BARRAS

# Filtramos el TOTAL
grafico_op_data <- tabla_final_op[!is.na(tabla_final_op$ID), ]

ggplot(grafico_op_data, aes(x = factor(ID), y = ni)) +
  geom_bar(stat = "identity", fill = "skyblue", color = "#5D6D7E") +
  theme_minimal() +
  labs(title = "Gráfica N° 1:Distribución general por estado operacional",
       x = "Estado Operacional (Xi)", y = "Cantidad")

6 CONJETURA DE MODELO GEOMÉTRICO

Se seleccionó el modelo geométrico debido a que la distribución de frecuencias presenta un decaimiento constante y sucesivo. Este comportamiento visual, donde cada barra es proporcionalmente menor a la anterior, constituye la firma característica de una distribución geométrica.

# 1. Filtramos la fila de TOTAL para realizar los cálculos
tabla_modelo_op <- tabla_final_op[!is.na(tabla_final_op$ID), ]

# 2. Estimación del parámetro p basado en la media observada
media_observada_op <- sum(tabla_modelo_op$ID * tabla_modelo_op$ni) / sum(tabla_modelo_op$ni)
p_estimado_op <- 1 / media_observada_op

# 3. Cálculo de frecuencias relativas teóricas (Modelo %)
# Fórmula: P(X=k) = p * (1-p)^(k-1)
tabla_modelo_op$hi_modelo <- (p_estimado_op * (1 - p_estimado_op)^(tabla_modelo_op$ID - 1)) * 100

# 4. Preparación de datos para la comparación (Uso de tidyr)
library(tidyr)
df_comparativo_op <- pivot_longer(tabla_modelo_op, 
                                  cols = c("hi", "hi_modelo"), 
                                  names_to = "Origen", 
                                  values_to = "Valor")

# Ajuste de etiquetas para la leyenda coincidiendo con tu ejemplo
df_comparativo_op$Origen <- ifelse(df_comparativo_op$Origen == "hi", "Realidad", "Modelo")

# 5. Generación de la Gráfica
ggplot(df_comparativo_op, aes(x = factor(ID), y = Valor, fill = Origen)) +
  geom_bar(stat = "identity", position = "dodge", color = "black") +
  
  # Colores exactos: skyblue para modelo y dodgerblue4 para realidad
  scale_fill_manual(values = c("Modelo" = "skyblue", "Realidad" = "dodgerblue4")) +
  
  theme_minimal() +
  labs(
    title = "Gráfica N°2 : Modelo de probabilidad geométrico de estado operacional",
    subtitle = paste("Parámetro p (Éxito) estimado =", round(p_estimado_op, 4)),
    x = "Estado Operacional (Xi)",
    y = "Probabilidad",
    fill = "Leyenda"
  ) +
  theme(
    panel.grid.minor = element_blank(),
    panel.grid.major.x = element_blank()
  )

7 TEST DE PEARSON

Mide la correlación entre las frecuencias observadas (Realidad) y las esperadas (Modelo). Una correlación cercana al 100% indica que la tendencia de los datos sigue fielmente la progresión geométrica.

# 1. Definir Fo (Frecuencias Observadas - Realidad)
Fo_op <- tabla_modelo_op$hi

# 2. Definir Fe (Frecuencias Esperadas - Modelo Geométrico)
Fe_op <- tabla_modelo_op$hi_modelo

# 3. Cálculo de la Correlación de Pearson
Correlacion_Op <- cor(Fo_op, Fe_op) * 100

# 4. Mostrar el resultado
cat("La correlación de Pearson (afinidad) entre la Realidad y el Modelo es:", 
    round(Correlacion_Op, 2), "%")
## La correlación de Pearson (afinidad) entre la Realidad y el Modelo es: 99.77 %

8 TEST CHI-CUADRADO

El test Chi-Cuadrado determina si las diferencias entre la realidad y el modelo son estadísticamente significativas.

# 1. Definición de parámetros básicos
k_op <- length(tabla_modelo_op$ni) 
n_total_op <- sum(tabla_modelo_op$ni)

# 2. Grados de libertad (k - 1 - número de parámetros estimados)
grados_lib_op <- k_op - 2 

# 3. Nivel de significancia
nivel_sign_op <- 0.00001

# 4. Preparación de Frecuencias (Fo y Fe)
Fo_op_porc <- tabla_modelo_op$hi
Fe_op_porc <- tabla_modelo_op$hi_modelo

# 5. Cálculo del estadístico Chi-Cuadrado (x2)
x2_op <- sum((Fe_op_porc - Fo_op_porc)^2 / Fe_op_porc)

# 6. Determinación del Umbral (Valor Crítico)
umbral_op <- qchisq(1 - nivel_sign_op, grados_lib_op)

# 7. Resultado del Test
modelo_aceptado_op <- x2_op < umbral_op

# --- Visualización de Resultados ---
cat("Estadístico Chi-Cuadrado calculado:", round(x2_op, 4), "\n")
## Estadístico Chi-Cuadrado calculado: 12.7946
cat("Umbral de Aceptación (Valor Crítico):", round(umbral_op, 4), "\n")
## Umbral de Aceptación (Valor Crítico): 25.9017
cat("¿El modelo es aceptado bajo este umbral?:", modelo_aceptado_op, "\n")
## ¿El modelo es aceptado bajo este umbral?: TRUE

9 CÁLCULO DE PROBABILIDADES

Para demostrar la utilidad práctica del análisis realizado sobre la infraestructura energética, se plantean y resuelven dos interrogantes clave basadas en el comportamiento de los proyectos:

Pregunta A: ¿Cuál es la probabilidad teórica de que una nueva planta registrada en la base de datos se encuentre en estado OPERATIVA?

# La probabilidad teórica del primer estado (ID 1) es p
prob_teorica_op <- p_estimado_op

cat("Respuesta: La probabilidad teórica es del", round(prob_teorica_op * 100, 2), "%")
## Respuesta: La probabilidad teórica es del 77.16 %

Pregunta B: Si se proyecta la construcción de 500 nuevas plantas solares y se mantiene la distribución observada, ¿cuántas de ellas se espera que estén actualmente en fase de EN CONSTRUCCIÓN?

# Obtenemos la frecuencia relativa real (hi) para el ID 2 (En Construcción)
hi_construccion <- tabla_modelo_op$hi[tabla_modelo_op$ID == 2]

# Cálculo de la cantidad esperada para una muestra de N = 500
n_proyeccion_op <- 500
cantidad_esperada_op <- (hi_construccion / 100) * n_proyeccion_op

cat("Respuesta: Se esperarían aproximadamente", round(cantidad_esperada_op, 0), "proyectos en fase de construcción.")
## Respuesta: Se esperarían aproximadamente 70 proyectos en fase de construcción.

10 CONCLUSIONES

La variable Estado Operacional presenta un comportamiento que se ajusta a una distribución geométrica decreciente. Mediante un parámetro estimado(posibilidad de exito). Esta estructura permite predecir; por ejemplo, ¿Cuál es la probabilidad teórica de que una nueva planta registrada en la base de datos se encuentre en estado OPERATIVA? .

La probabilidad sería de 77.16 %