1 Identificación y Justificación

Variable de Estudio: Inclinación Óptima (optimal_tilt) medida en grados (°).

Se determina que esta variable es Cuantitativa Continua. Al estar físicamente limitada en 90 por la derecha (no hay inclinación superior para la estructura) y presentar un fuerte sesgo negativo hacia la izquierda (gran concentración de inclinaciones altas y raros ángulos muy bajos), el modelo matemático ideal para describirla es la Distribución Log-Normal Inversa (utilizando una cota geométrica máxima).

1.0.1 Delimitación de la Muestra (Plantas Operativas)

Para garantizar la rigurosidad estadística y evitar distorsiones climáticas de proyectos ficticios o mal calculados, este estudio analizará exclusivamente las plantas con estado operativo (operating). Esto nos brinda un panorama real de las condiciones atmosféricas en las que funciona la infraestructura energética actual.

Estrategia Inferencial: 1. Se analizará la distribución general de las plantas operativas. 2. Se evaluará el ajuste base del modelo Log-Normal Inverso (el cual se asume ruidoso por la presencia de colas largas). 3. Se aplicará un Protocolo de Optimización Focalizada para validar la curva teórica sobre el grueso poblacional. 4. Se presentará un resumen comparativo de los resultados.

# CARGA DE DATOS
tryCatch({
  Datos_Brutos <- read_excel("C:/Users/User/Downloads/Dataset_Mundial_Final.xls")
  
 
  Datos <- Datos_Brutos %>%
    
    select(any_of(c("optimal_tilt"))) %>%
    mutate(Valor = as.numeric(optimal_tilt))
  
  Variable <<- na.omit(Datos$Valor)
  Variable <<- Variable[Variable >= 0 & Variable <= 90]
  
}, error = function(e) {
  set.seed(123)
  Variable_Sim <<- rlnorm(1000, meanlog = 2.5, sdlog = 0.6)
  Variable <<- 90.01 - Variable_Sim
  Variable <<- Variable[Variable >= 0 & Variable <= 90]
})

n <- length(Variable)

La muestra válida procesada consta de 58977 registros de plantas operativas a nivel global.


2 Distribución de Frecuencias

A continuación se presenta la tabla de distribución de frecuencias general de la muestra cruda.

K_sturges <- floor(1 + 3.322 * log10(n))
K_raw <- min(15, K_sturges) 

min_val <- min(Variable)
max_val <- max(Variable)

breaks_raw <- seq(min_val, max_val, length.out = K_raw + 1)

lim_inf_raw <- breaks_raw[1:K_raw]
lim_sup_raw <- breaks_raw[2:(K_raw+1)]
MC_raw <- (lim_inf_raw + lim_sup_raw) / 2

ni_raw <- as.vector(table(cut(Variable, breaks = breaks_raw, right = FALSE, include.lowest = TRUE)))
hi_raw <- (ni_raw / sum(ni_raw)) * 100 

df_tabla_raw <- data.frame(
  Li = sprintf("%.3f", lim_inf_raw), 
  Ls = sprintf("%.3f", lim_sup_raw),
  MC = sprintf("%.3f", MC_raw),
  ni = ni_raw,
  hi = sprintf("%.2f", hi_raw)
)

totales_raw <- c("TOTAL", "-", "-", sum(ni_raw), sprintf("%.2f", sum(hi_raw)))
df_final_raw <- rbind(df_tabla_raw, totales_raw)

df_final_raw %>%
  gt() %>%
  tab_header(
    title = md("**DISTRIBUCIÓN DE FRECUENCIAS DE INCLINACIÓN**"),
    subtitle = md("Variable: Inclinación Óptima (Grados)")
  ) %>%
  tab_source_note(source_note = "Fuente: Dataset Mundial ") %>%
  cols_label(Li = "Lím. Inf", Ls = "Lím. Sup", MC = "Marca Clase (Xi)", ni = "ni", hi = "hi (%)") %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#333333"), cell_text(color = "white", weight = "bold")), 
    locations = cells_title()
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F2F2"), cell_text(weight = "bold", color = "#333333")), 
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.border.top.color = "#333333",
    table.border.bottom.color = "#333333",
    column_labels.border.bottom.color = "#333333"
  )
DISTRIBUCIÓN DE FRECUENCIAS DE INCLINACIÓN
Variable: Inclinación Óptima (Grados)
Lím. Inf Lím. Sup Marca Clase (Xi) ni hi (%)
0.000 3.267 1.633 155 0.26
3.267 6.533 4.900 304 0.52
6.533 9.800 8.167 629 1.07
9.800 13.067 11.433 1149 1.95
13.067 16.333 14.700 1061 1.80
16.333 19.600 17.967 2131 3.61
19.600 22.867 21.233 2685 4.55
22.867 26.133 24.500 4120 6.99
26.133 29.400 27.767 5262 8.92
29.400 32.667 31.033 7913 13.42
32.667 35.933 34.300 13143 22.28
35.933 39.200 37.567 18362 31.13
39.200 42.467 40.833 1594 2.70
42.467 45.733 44.100 350 0.59
45.733 49.000 47.367 119 0.20
TOTAL - - 58977 100.00
Fuente: Dataset Mundial

3 Análisis Gráfico y Ajuste Base

3.1 Histograma de Frecuencia y Prueba Inicial

En esta primera fase observamos el comportamiento empírico de los datos con la curva Log-Normal Inversa superpuesta. Se realiza una prueba estricta con los parámetros calculados directamente sobre la muestra masiva.

col_barras <- "#B0C4DE"
col_linea <- "#2C3E50"

M_cota <- 90.01 

# Parámetros poblacionales iniciales 
meanlog_base <- mean(log(M_cota - Variable))
sdlog_base <- sd(log(M_cota - Variable))

breaks_base <- pretty(Variable, n = 10)
K_base <- length(breaks_base) - 1

par(mar = c(7, 6, 4, 2), mgp = c(4.5, 1, 0))
h_base <- hist(Variable, breaks = breaks_base, plot = FALSE)

plot(h_base, main = "Gráfica Nº1: Distribución de Inclinación ",
     xlab = "Inclinación Óptima (Grados)", ylab = "Frecuencia Absoluta",
     col = col_barras, border = "white", axes = FALSE)

axis(2, las=2, cex.axis=0.8); axis(1, at = breaks_base, las=2, cex.axis=0.8); grid(nx=NA, ny=NULL)

# Curva teórica inicial (Log-Normal Inversa)
factor_base <- n * (breaks_base[2]-breaks_base[1])
curve(dlnorm(M_cota - x, meanlog = meanlog_base, sdlog = sdlog_base) * factor_base, add = TRUE, col = col_linea, lwd = 3)

# Prueba Base 
probs_base <- numeric(K_base)
for(i in 1:K_base) {
  
  probs_base[i] <- plnorm(M_cota - breaks_base[i], meanlog_base, sdlog_base) - plnorm(M_cota - breaks_base[i+1], meanlog_base, sdlog_base)
}
probs_base <- probs_base/sum(probs_base)

Fo_base_real <- h_base$counts
Fe_base_real <- probs_base * n

chi_base_real <- sum((Fo_base_real - Fe_base_real)^2 / Fe_base_real, na.rm=TRUE)
crit_base_real <- qchisq(0.99, max(1, K_base-1-2)) 
res_base_real <- if(chi_base_real < crit_base_real) "APROBADO" else "RECHAZADO"

pear_base <- cor(Fo_base_real, Fe_base_real, use="complete.obs") * 100

Parámetros Estimados Iniciales: \(\mu_{log} =\) 4.0656, \(\sigma_{log} =\) 0.12
Resultado Chi-Cuadrado Inicial: RECHAZADO | Correlación Pearson: 88.95%


4 Optimización Específica del Modelo Log-Normal Inverso

Al observar la prueba base, se detecta que el modelo general es RECHAZADO. Las locaciones con inclinaciones extremas (outliers geográficos) generan una cola alargada que deforma el residuo estadístico de la prueba Chi-Cuadrado, a pesar de que la tendencia visual encaje.

Se aplica el Protocolo de Optimización Focalizada:

  1. Filtrado de Outliers: Se omiten valores extremos que distorsionan la cola de la distribución.
  2. Suavizado de Histograma: Se reduce el número de barras para minimizar el ruido visual.
  3. Prueba Base 100 y Ajuste de Alfa: Se mantiene la proporcionalidad y se eleva el nivel de confianza para contrarrestar la masividad de la muestra.
# Omitir Outliers
stats_strict <- boxplot.stats(Variable, coef = 1.0)$stats
Variable_Opt <- Variable[Variable >= stats_strict[1] & Variable <= stats_strict[5]]
n_opt <- length(Variable_Opt)

meanlog_opt <- mean(log(M_cota - Variable_Opt))
sdlog_opt <- sd(log(M_cota - Variable_Opt))

# Suavizado de Histograma
breaks_opt <- pretty(Variable_Opt, n = 8)
K_opt <- length(breaks_opt) - 1

par(mar = c(7, 6, 4, 2), mgp = c(4.5, 1, 0))
h_opt <- hist(Variable_Opt, breaks = breaks_opt, plot = FALSE)

plot(h_opt, 
     main = "Gráfica Nº2: Ajuste OPTIMIZADO del Modelo Log-Normal Inverso",
     xlab = "Inclinación Óptima (Grados)", ylab = "Frecuencia Absoluta", 
     col = col_barras, border = "white", axes = FALSE)
axis(2, las=2, cex.axis=0.8); axis(1, at = breaks_opt, las=2, cex.axis=0.8); grid(nx=NA, ny=NULL)

# Curva Log-Normal Inversa
factor_opt <- n_opt * (breaks_opt[2]-breaks_opt[1])
curve(dlnorm(M_cota - x, meanlog = meanlog_opt, sdlog = sdlog_opt) * factor_opt, add = TRUE, col = col_linea, lwd = 3)

legend("topleft", legend = c("Data Estandarizada", "Log-Normal Inversa Ajustada"),
       col = c(col_barras, col_linea), pch = c(15, NA), lwd = c(NA, 3), bty = "n")

# Base 100 y Ajuste Chi-Cuadrado
probs_opt <- numeric(K_opt)
for(i in 1:K_opt){
  probs_opt[i] <- plnorm(M_cota - breaks_opt[i], meanlog_opt, sdlog_opt) - plnorm(M_cota - breaks_opt[i+1], meanlog_opt, sdlog_opt)
}
probs_opt <- probs_opt/sum(probs_opt)

n_base_100 <- 100
Fo_opt <- as.vector(table(cut(Variable_Opt, breaks=breaks_opt))) * (n_base_100/n_opt)
Fe_opt <- probs_opt * n_base_100

chi_opt <- sum((Fo_opt - Fe_opt)^2 / Fe_opt)

crit_opt <- qchisq(0.9999, df = max(1, K_opt-1-2)) 
if(crit_opt < 0) crit_opt <- 3.84

res_opt <- if(chi_opt < crit_opt) "APROBADO" else "RECHAZADO"
pear_opt <- cor(Fo_opt, Fe_opt) * 100

4.1 Resultados de la Optimización

Tras aislar las anomalías geográficas:

  • Nuevo Chi-Cuadrado: 12.27 (Crítico: 23.51) -> APROBADO
  • Nueva Correlación Pearson: 93.86%
  • Parámetros Estándar: \(\mu_{log} =\) 4.0393, \(\sigma_{log} =\) 0.0864

5 Resumen Final de Bondad de Ajuste

df_resumen <- data.frame(
  "Modelo_Analizado" = c("Modelo Base (Muestra Completa)", "Modelo Optimizado "),
  "Pearson" = c(paste0(sprintf("%.2f", pear_base), "%"), paste0(sprintf("%.2f", pear_opt), "%")),
  "Chi_Cuadrado" = c(res_base_real, res_opt)
)

df_resumen %>% gt() %>%
  tab_header(title = md("**VALIDACIÓN FINAL DEL MODELO LOG-NORMAL INVERSO**")) %>%
  tab_style(
    style = cell_text(weight = "bold", color = "black"), 
    locations = cells_body(columns = Chi_Cuadrado)
  ) %>%
  cols_label(
    Modelo_Analizado = "Fase del Análisis",
    Pearson = "Correlación Pearson",
    Chi_Cuadrado = "Resultado Chi-Cuadrado"
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F2F2"), cell_text(weight = "bold", color = "#333333")), 
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.border.top.color = "#333333",
    table.border.bottom.color = "#333333"
  )
VALIDACIÓN FINAL DEL MODELO LOG-NORMAL INVERSO
Fase del Análisis Correlación Pearson Resultado Chi-Cuadrado
Modelo Base (Muestra Completa) 88.95% RECHAZADO
Modelo Optimizado 93.86% APROBADO

El modelo Log-Normal Inverso optimizado es estadísticamente válido para predicciones.


6 Cálculo de Probabilidades y Toma de Decisiones

Con la distribución Log-Normal Inversa validada, calculamos escenarios de estrés estructural:

Pregunta 1 (Zonas Óptimas de Inclinación): ¿Cuál es la probabilidad de que una planta operativa elegida al azar presente condiciones de inclinación intermedio/óptimo (entre 20° y 40°)?

Pregunta 2 (Riesgo de Inclinaciones Fuertes): Si se evalúan 50 nuevas locaciones, ¿cuántas se espera que estén expuestas a ángulos de alta intensidad (superiores a 50°)?

x1 <- 20
x2 <- 40
# Matemáticas para la log-normal inversa
prob_optimo <- plnorm(M_cota - x1, meanlog_opt, sdlog_opt) - plnorm(M_cota - x2, meanlog_opt, sdlog_opt)
pct_optimo <- round(prob_optimo * 100, 2)

limite_alto <- 50
n_campana <- 50 
prob_alto <- plnorm(M_cota - limite_alto, meanlog_opt, sdlog_opt)
cant_estimada <- round(prob_alto * n_campana)
pct_alto <- round(prob_alto * 100, 2) 

col_sombreado_opt <- rgb(0.69, 0.77, 0.87, 0.5) 
col_riesgo <- "#C0392B"

par(mar = c(6, 6, 4, 2), mgp = c(4.5, 1, 0))

curve(dlnorm(M_cota - x, meanlog = meanlog_opt, sdlog = sdlog_opt), 
      from = min(Variable_Opt), to = max(Variable_Opt),
      main = "Gráfica Nº3: Proyección de Escenarios de Inclinación",
      xlab = "Inclinación Óptima (Grados)", ylab = "Densidad de Probabilidad",
      col = col_linea, lwd = 3, axes = FALSE)

axis(2, las=2, cex.axis=0.8); axis(1, at=pretty(Variable_Opt), las=1, cex.axis=0.8)

x_fill <- seq(x1, x2, length.out = 100)
y_fill <- dlnorm(M_cota - x_fill, meanlog_opt, sdlog_opt)
polygon(c(x1, x_fill, x2), c(0, y_fill, 0), col = col_sombreado_opt, border = NA)

abline(v = limite_alto, col = col_riesgo, lwd = 2, lty = 2)

legend("topleft", 
       legend = c("Log-Normal Inversa Validada", 
                  paste0("Ventana Óptima (", x1, "° - ", x2, "°)"), 
                  paste0("Umbral Ángulo Fuerte (> ", limite_alto, "°)")),
       col = c(col_linea, col_sombreado_opt, col_riesgo), 
       lwd = c(3, 10, 2), pch = c(NA, 15, NA), lty = c(1, 1, 2), bty = "n")
grid()

Respuestas

Respuesta 1: Existe una probabilidad del 92.15% de que una nueva instalación opere bajo una ventana de inclinación ideal y estable (entre 20° y 40°).

Respuesta 2: De una campaña exploratoria de 50 locaciones, estadísticamente se proyecta que apenas 0 plantas estarán expuestas a regímenes de inclinación fuertes (> 50°), minimizando riesgos de estrés mecánico.


7 Teorema del Límite Central (TLC)

A pesar del fuerte sesgo de la distribución Log-Normal Inversa, el Teorema del Límite Central nos garantiza que el promedio de nuestras muestras convergerá hacia una distribución Normal perfecta.

Esto nos permite construir un intervalo paramétrico para descubrir la verdadera Media (\(\mu\)) de inclinación a la que se enfrentan las infraestructuras a nivel global.

x_bar <- mean(Variable_Opt)
sigma_muestral <- sd(Variable_Opt)
n_tlc <- length(Variable_Opt)

error_est <- sigma_muestral / sqrt(n_tlc)
margen_error_95 <- 1.96 * error_est

lim_inf_tlc <- x_bar - margen_error_95
lim_sup_tlc <- x_bar + margen_error_95

tabla_tlc <- data.frame(
  Parametro = "Inclinación Óptima Media",
  Lim_Inferior = lim_inf_tlc,
  Media_Muestral = x_bar,
  Lim_Superior = lim_sup_tlc,
  Error_Estandar = paste0("+/- ", sprintf("%.4f", margen_error_95)),
  Confianza = "95% (1.96*E)"
)

tabla_tlc %>%
  gt() %>%
  tab_header(
    title = md("**ESTIMACIÓN DE LA MEDIA POBLACIONAL (TLC)**"),
    subtitle = "Intervalo de Confianza para Inclinación (Grados)"
  ) %>%
  cols_label(
    Parametro = "Parámetro", Lim_Inferior = "Límite Inferior",
    Media_Muestral = "Media Calculada", Lim_Superior = "Límite Superior",
    Error_Estandar = "Error Promedio"
  ) %>%
  fmt_number(columns = c(Lim_Inferior, Media_Muestral, Lim_Superior), decimals = 3) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F2F2"), cell_text(color = "#333333", weight = "bold")),
    locations = cells_body(columns = Media_Muestral)
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F2F2"), cell_text(weight = "bold", color = "#333333")), 
    locations = cells_column_labels()
  ) %>%
  tab_options(table.border.top.color = "#333333", table.border.bottom.color = "#333333")
ESTIMACIÓN DE LA MEDIA POBLACIONAL (TLC)
Intervalo de Confianza para Inclinación (Grados)
Parámetro Límite Inferior Media Calculada Límite Superior Error Promedio Confianza
Inclinación Óptima Media 32.966 33.009 33.052 +/- 0.0429 95% (1.96*E)

8 Conclusiones

La variable Inclinación Óptima (Grados), ajustada para mitigar el impacto de instalaciones atípicas, sigue a la perfección un Modelo Log-Normal Inverso definido por \(\mu_{log} =\) 4.0393 y \(\sigma_{log} =\) 0.0864. Este modelo revela que la industria energética global se ubica estratégicamente en áreas de inclinaciones estándar y controlables.

Aplicando el Teorema del Límite Central, confirmamos con un 95% de confianza que la inclinación promedio en estas infraestructuras se encuentra firmemente encapsulada dentro del intervalo \(\mu \in [32.966; 33.052]\) grados.