#Se importa el archivo “Dataset_Mundial_(FINAL).csv” al entorno de R, #utilizando espacios o tabulaciones como delimitador para estructurar #la base de datos global de instalaciones solares. # Importación de datos # Carga de librerías necesarias
library(readr)
library(gt)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(knitr)
library(ggplot2)
datos <- read_delim("C:/Users/USER/Downloads/CODIGOS/Data_Mundial_Final.csv",
delim = ";",
show_col_types = FALSE)
#Se selecciona la variable elevacion, eliminando registros nulos #y valores no positivos para depurar la muestra física de la altitud #de los paneles a nivel mundial.
All.Elev <- as.numeric(gsub(",", ".", datos$elevation))
All.Elev <- na.omit(All.Elev[All.Elev > 0])
n_total <- length(All.Elev)
#4. TABLA DE FRECUENCIA #Determinamos la distribución de frecuencias de la elevación global #mediante la regla de Sturges, calculando el rango y la amplitud #para organizar los datos de los paneles solares en intervalos de clase precisos.
xmin <- min(All.Elev)
xmax <- max(All.Elev)
# Aplicación de la Regla de Sturges
#para n = 58,979
K <- floor(1 + 3.322 * log10(n_total))
A_orig <- (xmax - xmin) / K
# Creación de cortes
cortes_orig <- seq(xmin, xmax, length.out = K + 1)
#Construcción de la Tabla de Distribución de Frecuencias (TDF)
TDF_Original <- data.frame(
Li = round(head(cortes_orig, -1), 2),
Ls = round(tail(cortes_orig, -1), 2)
) %>%
mutate(
MC = round((Li + Ls) / 2, 2),
ni = as.vector(table(cut(All.Elev, breaks = cortes_orig, include.lowest = TRUE))),
hi = round((ni / n_total) * 100, 2),
Hi_asc = round(cumsum(hi), 2)
)
kable(TDF_Original, caption = "Tabla No. 1: Distribución de Frecuencias Original (Elevación m.s.n.m.)")
| Li | Ls | MC | ni | hi | Hi_asc |
|---|---|---|---|---|---|
| 1.00 | 354.44 | 177.72 | 40991 | 70.26 | 70.26 |
| 354.44 | 707.88 | 531.16 | 8840 | 15.15 | 85.41 |
| 707.88 | 1061.31 | 884.60 | 3426 | 5.87 | 91.28 |
| 1061.31 | 1414.75 | 1238.03 | 2242 | 3.84 | 95.12 |
| 1414.75 | 1768.19 | 1591.47 | 1260 | 2.16 | 97.28 |
| 1768.19 | 2121.62 | 1944.90 | 584 | 1.00 | 98.28 |
| 2121.62 | 2475.06 | 2298.34 | 301 | 0.52 | 98.80 |
| 2475.06 | 2828.50 | 2651.78 | 154 | 0.26 | 99.06 |
| 2828.50 | 3181.94 | 3005.22 | 276 | 0.47 | 99.53 |
| 3181.94 | 3535.38 | 3358.66 | 83 | 0.14 | 99.67 |
| 3535.38 | 3888.81 | 3712.10 | 69 | 0.12 | 99.79 |
| 3888.81 | 4242.25 | 4065.53 | 50 | 0.09 | 99.88 |
| 4242.25 | 4595.69 | 4418.97 | 36 | 0.06 | 99.94 |
| 4595.69 | 4949.12 | 4772.40 | 23 | 0.04 | 99.98 |
| 4949.12 | 5302.56 | 5125.84 | 7 | 0.01 | 99.99 |
| 5302.56 | 5656.00 | 5479.28 | 1 | 0.00 | 99.99 |
#4.1 NUEVA TABLA DE DISTRIBUCIÓN DE FRECUENCIA #Se seleccionó el rango de elevación correspondiente al 90% de los datos para eliminar valores atípicos y mejorar la legibilidad de las gráficas. Esta nueva estructura utiliza límites enteros, lo que facilita la interpretación técnica de los intervalos en metros sobre el nivel del mar (m.s.n.m.) y garantiza marcas de clase exactas para el análisis probabilístico.
# Identificamos el umbral del 90% (Percentil 90)
umbral_90 <- quantile(All.Elev, 0.90)
datos_zoom <- All.Elev[All.Elev <= umbral_90]
n_z <- length(datos_zoom)
# Configuración de Límites Enteros (Redondeo a base 100 para claridad)
xmin_z <- floor(min(datos_zoom) / 100) * 100
xmax_z <- ceiling(max(datos_zoom) / 100) * 100
K_z <- floor(1 + 3.322 * log10(n_z))
# Rango y Amplitud ENTERA
R_z <- xmax_z - xmin_z
A_z <- ceiling(R_z / K_z)
# Creación de cortes exactos
cortes_z <- seq(from = xmin_z, to = xmin_z + (K_z * A_z), by = A_z)
# Definición de límites y Marcas de Clase
Li_z <- cortes_z[1:K_z]
Ls_z <- cortes_z[2:(K_z + 1)]
TDF_Inf <- data.frame(
Li = Li_z,
Ls = Ls_z,
MC = (Li_z + Ls_z) / 2,
ni = as.vector(table(cut(datos_zoom, breaks = cortes_z, include.lowest = TRUE, right = FALSE)))
) %>%
mutate(
hi = round((ni / n_z) * 100, 2),
Ni_asc = cumsum(ni),
Hi_asc = round(cumsum(hi), 2)
)
kable(TDF_Inf, caption = "Tabla No. 2: Nueva Distribución Ajustada (Límites Enteros)")
| Li | Ls | MC | ni | hi | Ni_asc | Hi_asc |
|---|---|---|---|---|---|---|
| 0 | 63 | 31.5 | 17311 | 32.97 | 17311 | 32.97 |
| 63 | 126 | 94.5 | 8706 | 16.58 | 26017 | 49.55 |
| 126 | 189 | 157.5 | 5512 | 10.50 | 31529 | 60.05 |
| 189 | 252 | 220.5 | 4173 | 7.95 | 35702 | 68.00 |
| 252 | 315 | 283.5 | 3615 | 6.88 | 39317 | 74.88 |
| 315 | 378 | 346.5 | 2465 | 4.69 | 41782 | 79.57 |
| 378 | 441 | 409.5 | 2055 | 3.91 | 43837 | 83.48 |
| 441 | 504 | 472.5 | 2070 | 3.94 | 45907 | 87.42 |
| 504 | 567 | 535.5 | 1503 | 2.86 | 47410 | 90.28 |
| 567 | 630 | 598.5 | 1244 | 2.37 | 48654 | 92.65 |
| 630 | 693 | 661.5 | 966 | 1.84 | 49620 | 94.49 |
| 693 | 756 | 724.5 | 867 | 1.65 | 50487 | 96.14 |
| 756 | 819 | 787.5 | 703 | 1.34 | 51190 | 97.48 |
| 819 | 882 | 850.5 | 630 | 1.20 | 51820 | 98.68 |
| 882 | 945 | 913.5 | 526 | 1.00 | 52346 | 99.68 |
| 945 | 1008 | 976.5 | 164 | 0.31 | 52510 | 99.99 |
#5GRÁFICAS #Una vez generada la Tabla de Distribución de Frecuencias, procedemos a visualizar los datos. Esta gráfica es fundamental para identificar la asimetría positiva de la variable continua de elevación y justificar el uso de modelos probabilísticos posteriores.
ggplot(TDF_Inf, aes(x = MC, y = hi)) +
geom_bar(stat = "identity",
fill = "#FFCC99",
color = "black",
alpha = 0.8,
width = A_z) +
geom_line(color = "red", linewidth = 1) +
geom_point(color = "red", size = 2) +
scale_x_continuous(breaks = c(Li_z, Ls_z[length(Ls_z)]),
labels = scales::comma) +
scale_y_continuous(labels = function(x) paste0(x, "%"),
limits = c(0, max(TDF_Inf$hi) * 1.1),
expand = c(0, 0)) +
labs(
title = "Gráfica No. 1: Histograma Distribución Porcentual de Elevación",
x = "Elevación (m.s.n.m.)",
y = "Porcentaje (%)"
) +
theme_classic() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 12),
axis.text.x = element_text(angle = 45, hjust = 1)
)
#5.1 SEGMENTACIÓN #Con el fin de optimizar el ajuste estadístico, la
visualización se fragmenta en dos estratos: el primero analizado bajo
una distribución exponencial para representar las elevaciones bajas y
medias donde se concentra la mayor densidad de proyectos, y el segundo
mediante una distribución log-normal diseñada para caracterizar el
segmento final de la muestra, donde residen las instalaciones situadas
en altitudes extremas de mayor complejidad técnica.
# Configuración de Clases y Amplitud
K_total <- 12
A_hibrido <- (xmax_z - xmin_z) / K_total
cortes_h <- seq(xmin_z, xmin_z + (K_total * A_hibrido), length.out = K_total + 1)
# Definición del Punto de Corte (Límite superior de la barra 7)
punto_corte <- cortes_h[8]
# Verificación de resultados en consola
cat("Punto de corte definido en:", round(punto_corte, 2), "m.s.n.m.\n")
## Punto de corte definido en: 583.33 m.s.n.m.
# Separación de datos para frecuencia
ni_h <- as.vector(table(cut(datos_zoom, breaks = cortes_h, include.lowest = TRUE)))
hi_h <- (ni_h / length(datos_zoom)) * 100
MC_h <- (cortes_h[1:K_total] + cortes_h[2:(K_total + 1)]) / 2
# Creación del data frame para las primeras 7 clases
df_primeras_7 <- data.frame(MC = MC_h, hi = hi_h)[1:7, ]
# Generación de la gráfica
ggplot(df_primeras_7, aes(x = MC, y = hi)) +
geom_bar(stat = "identity", fill = "#FFCC99", color = "black", alpha = 0.8, width = A_hibrido) +
scale_x_continuous(breaks = round(cortes_h[1:8], 0)) +
scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.1))) +
labs(
title = "Gráfica No. 2: Histograma porcentual del Segmento Inicial de Elevación",
subtitle = "Visualización de las primeras 7 clases de frecuencia",
x = "Elevación (m.s.n.m.)",
y = "Porcentaje (%)"
) +
theme_classic() +
theme(plot.title = element_text(face = "bold", size = 12),
axis.text.x = element_text(angle = 45, hjust = 1))
# Definición del rango para el segmento final
inicio <- 8
fin <- K_total
df_final <- data.frame(MC = MC_h, hi = hi_h)[inicio:fin, ]
# Generación de la gráfica
ggplot(df_final, aes(x = MC, y = hi)) +
geom_bar(stat = "identity", fill = "#FFCC99", color = "black", alpha = 0.8, width = A_hibrido) +
scale_x_continuous(breaks = round(cortes_h[inicio:(fin + 1)], 0)) +
scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.1))) +
labs(
title = "Gráfica No. 3: Histograma porcentual del Segmento Final de Elevación",
subtitle = "Visualización del estrato superior de altitudes",
x = "Elevación (m.s.n.m.)",
y = "Porcentaje (%)"
) +
theme_classic() +
theme(plot.title = element_text(face = "bold", size = 12),
axis.text.x = element_text(angle = 45, hjust = 1))
#6 CONJETURA DE MODELO (PRIMER SEGMENTO) #6.1 MODELO EXPONCIAL
#Se seleccionó el modelo exponencial para este segmento porque visualmente las barras muestran un decaimiento constante. Este comportamiento “en escalera descendente” es la firma visual característica de una función exponencial, indicando que la mayoría de los proyectos solares se concentran en elevaciones bajas.
# Filtrado de datos para el primer segmento
punto_corte_7 <- cortes_h[8]
datos_segmento_exp <- datos_zoom[datos_zoom <= punto_corte_7]
# Estimación de parámetros del modelo
media_exp <- mean(datos_segmento_exp)
lambda_exp <- 1 / media_exp
# Verificación de resultados en consola (Aparecerá en tu ePub)
cat("Análisis de tendencia para el segmento inicial:\n")
## Análisis de tendencia para el segmento inicial:
cat("Media de elevación del estrato:", round(media_exp, 2), "m.s.n.m.\n")
## Media de elevación del estrato: 161.53 m.s.n.m.
cat("Parámetro Lambda (tasa):", lambda_exp, "\n")
## Parámetro Lambda (tasa): 0.006190846
# Generación de la curva teórica
x_vals <- seq(min(df_primeras_7$MC), max(df_primeras_7$MC), length.out = 100)
# Ajuste de escala para que la curva coincida con los porcentajes del histograma
y_vals <- dexp(x_vals, rate = lambda_exp) * A_hibrido * 100
df_curva_exp <- data.frame(x = x_vals, y = y_vals)
# Construcción de la gráfica de conjetura
ggplot(df_primeras_7, aes(x = MC, y = hi)) +
geom_bar(stat = "identity", fill = "#FFCC99", color = "black", alpha = 0.7, width = A_hibrido) +
# Superposición de la curva de conjetura (Modelo Rojo)
geom_line(data = df_curva_exp, aes(x = x, y = y), color = "red", linewidth = 1.2) +
# Formatos de ejes y etiquetas profesionales
scale_x_continuous(breaks = round(cortes_h[1:8], 0)) +
scale_y_continuous(labels = function(x) paste0(x, "%"),
expand = expansion(mult = c(0, 0.1))) +
labs(
title = "Gráfica No. 4: Modelo de probabilidad exponencial para elevación",
x = "Elevación (m.s.n.m.)",
y = "Porcentaje (%)"
) +
theme_classic() +
theme(
plot.title = element_text(face = "bold", size = 13),
axis.text.x = element_text(angle = 45, hjust = 1)
)
#6.2 TEST DE PERSON
# 1. Definir Frecuencia Observada
Fo <- ni_h[1:7]
# 2. Calcular Probabilidades Teóricas del Modelo
h_segmento <- 7
P <- numeric(h_segmento)
for (i in 1:h_segmento) {
P[i] <- pexp(cortes_h[i+1], rate = lambda_exp) -
pexp(cortes_h[i], rate = lambda_exp)
}
# 3. Calcular Frecuencia Esperada
n_segmento <- length(datos_segmento_exp)
Fe <- P * n_segmento
# 4. Cálculo de Correlación de Pearson
Correlacion_Exp <- cor(Fo, Fe) * 100
cat("--- CONCLUSIÓN DE LA CONJETURA EXPONENCIAL ---\n")
## --- CONCLUSIÓN DE LA CONJETURA EXPONENCIAL ---
cat("Tamaño de la muestra segmentada:", n_segmento, "instalaciones\n")
## Tamaño de la muestra segmentada: 47774 instalaciones
cat("Correlación del modelo exponencial:", round(Correlacion_Exp, 2), "%\n")
## Correlación del modelo exponencial: 97.73 %
#6.3 TEST CHI-CUADRADO
# 1. Grados de libertad (k - 1 - parámetros estimados)
# k=7 intervalos, estimamos 1 parámetro (lambda), por eso restamos 2
grados_libertad <-h_segmento-1-1
nivel_significancia <- 0.000001
# 3. Preparación de Frecuencias Porcentuales
Fo_porc <- (ni_h[1:7] / n_segmento) * 100
Fe_porc <- P * 100
# 4. Cálculo del estadístico Chi-Cuadrado
x2 <- sum((Fe_porc - Fo_porc)^2 / Fe_porc)
# 5. Determinación del Valor Crítico (Umbral)
umbral_aceptacion <- qchisq(1 - nivel_significancia, grados_libertad)
# 6.Resultados
modelo_aceptado <- x2 < umbral_aceptacion
cat("Estadístico Chi-Cuadrado calculado:", round(x2, 4), "\n")
## Estadístico Chi-Cuadrado calculado: 7.0932
cat("Umbral de aceptación (Valor Crítico):", round(umbral_aceptacion, 4), "\n")
## Umbral de aceptación (Valor Crítico): 35.8882
cat("¿El modelo es aceptado estadísticamente?:", ifelse(modelo_aceptado, "SÍ", "NO"), "\n")
## ¿El modelo es aceptado estadísticamente?: SÍ
#7 CONJETURA DE MODELO(SEGMENTO FINAL) #7.1 MODELO LOG-NORMAL #“El modelo Log-Normal describe exitosamente el comportamiento de la elevación en el segmento final. A diferencia del primer estrato, aquí la frecuencia de proyectos se estabiliza antes de desaparecer en altitudes extremas, permitiendo un ajuste matemático preciso de la ‘cola’ de la distribución geográfica de los datos.”
# 1. Filtrado y estimación de parámetros logarítmicos
datos_intermedios <- datos_zoom[datos_zoom >= cortes_h[inicio] & datos_zoom <= cortes_h[fin + 1]]
ulog_int <- mean(log(datos_intermedios))
sigmalog_int <- sd(log(datos_intermedios))
# 2. Cálculo de Frecuencias Esperadas y Probabilidades
inicio <- 8
fin <- K_total
df_intermedio <- data.frame(MC = MC_h[inicio:fin], hi = hi_h[inicio:fin])
h_int <- nrow(df_intermedio)
P_ln <- numeric(h_int)
for (i in 1:h_int) {
P_ln[i] <- plnorm(cortes_h[inicio + i], ulog_int, sigmalog_int) -
plnorm(cortes_h[inicio + i - 1], ulog_int, sigmalog_int)
}
# 3. Ajuste de proporción para la curva
proporcion_segmento <- sum(df_intermedio$hi) / 100
# 4. Preparación de la curva teórica
x_curva_ln <- seq(min(cortes_h[inicio]), max(cortes_h[fin + 1]), length.out = 200)
y_curva_ln <- dlnorm(x_curva_ln, ulog_int, sigmalog_int) * A_hibrido * proporcion_segmento * 100
df_curva_ln <- data.frame(x = x_curva_ln, y = y_curva_ln)
# 5. Generación de la Gráfica de Elevación
ggplot(df_intermedio, aes(x = MC, y = hi)) +
geom_bar(stat = "identity", fill = "#FFCC99", color = "black", alpha = 0.6, width = A_hibrido) +
geom_line(data = df_curva_ln, aes(x = x, y = y), color = "red", linewidth = 1.1) +
scale_x_continuous(breaks = round(seq(min(cortes_h[inicio]), max(cortes_h[fin+1]), length.out = 5), 0)) +
scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.2))) +
labs(
title = "Gráfica No. 5: Modelo de probabilidad Log-Normal para Elevación",
subtitle = paste("Parámetros: mu =", round(ulog_int, 2), "| sigma =", round(sigmalog_int, 2)),
x = "Elevación (m.s.n.m.)",
y = "Porcentaje (%)"
) +
theme_classic() +
theme(
plot.title = element_text(face = "bold", size = 12),
axis.text.x = element_text(angle = 45, hjust = 1)
)
#7.2 TEST DE PEARSON
# 1. Definición de Frecuencia Observada
Fo_int <- ni_h[inicio:fin]
# 2. Cálculo de Frecuencia Esperada
n_int <- length(datos_intermedios)
Fe_int <- P_ln * n_int
# 3. Cálculo de Correlación de Pearson
Correlacion_LN <- cor(Fo_int, Fe_int) * 100
cat("--- VALIDACIÓN DEL MODELO LOG-NORMAL ---\n")
## --- VALIDACIÓN DEL MODELO LOG-NORMAL ---
cat("Variable analizada: Elevación (Estrato Superior)\n")
## Variable analizada: Elevación (Estrato Superior)
cat("Tamaño del segmento analizado:", n_int, "instalaciones solares\n")
## Tamaño del segmento analizado: 4736 instalaciones solares
cat("Correlación de Pearson:", round(Correlacion_LN, 2), "%\n")
## Correlación de Pearson: 73.35 %
#7.3 TEST CHI-CUADRADO
# 1. Determinación de Grados de Libertad (k - 1 - parámetros)
grados_libertad_ln <- (length(Fo_int) - 1 - 2)
grados_libertad_ln <- max(1, grados_libertad_ln)
# 2. Definición del Nivel de Significancia (Alfa)
nivel_significancia_ln <- 0.0001
# 3. Preparación de Frecuencias Porcentuales para la prueba
Fo_ln_porc <- (Fo_int / sum(Fo_int)) * 100
Fe_ln_porc <- (P_ln / sum(P_ln)) * 100
# 4. Cálculo del estadístico Chi-Cuadrado (x2)
x2_ln <- sum((Fe_ln_porc - Fo_ln_porc)^2 / Fe_ln_porc)
# 5. Determinación del Valor Crítico (Umbral)
umbral_aceptacion_ln <- qchisq(1 - nivel_significancia_ln, grados_libertad_ln)
# 6. Evaluación de la Hipótesis final
aceptacion_final <- x2_ln < umbral_aceptacion_ln
cat("Estadístico Chi-Cuadrado (Calculado):", round(x2_ln, 4), "\n")
## Estadístico Chi-Cuadrado (Calculado): 10.2491
cat("Valor Crítico (Tabla):", round(umbral_aceptacion_ln, 4), "\n")
## Valor Crítico (Tabla): 18.4207
cat("¿Se acepta la conjetura Log-Normal?:", ifelse(aceptacion_final, "SÍ (Aceptado)", "NO (Rechazado)"), "\n")
## ¿Se acepta la conjetura Log-Normal?: SÍ (Aceptado)
#8.Integración del Modelo Híbrido
# 1. PREPARACIÓN DE SEGMENTOS
df_exp_final <- data.frame(MC = MC_h[1:7], hi = hi_h[1:7], Modelo = "Zona Exponencial")
df_ln_final <- data.frame(MC = MC_h[inicio:fin], hi = hi_h[inicio:fin], Modelo = "Zona Log-Normal")
df_grafica <- rbind(df_exp_final, df_ln_final)
# 2. PREPARACIÓN DE LAS CURVAS TEÓRICAS
df_curva_exp <- data.frame(x = x_vals, y = y_vals)
df_curva_ln <- data.frame(x = x_curva_ln, y = y_curva_ln)
# 3. GENERACIÓN DE LA GRÁFICA INTEGRAL
ggplot() +
# CAPA DE BARRAS: Usando tu color crema/naranja solicitado (#FFCC99)
geom_bar(data = df_grafica, aes(x = MC, y = hi, fill = Modelo),
stat = "identity", color = "black", alpha = 0.8, width = A_hibrido) +
# Capa Línea Exponencial (Azul para que resalte sobre el crema)
geom_line(data = df_curva_exp, aes(x = x, y = y),
color = "blue", linewidth = 1.2) +
# Capa Línea Log-Normal (Roja para diferenciar el segundo modelo)
geom_line(data = df_curva_ln, aes(x = x, y = y),
color = "red", linewidth = 1.2) +
scale_fill_manual(values = c("Zona Exponencial" = "#FFCC99",
"Zona Log-Normal" = "#FFCC99")) +
scale_x_continuous(labels = function(x) paste0(round(x,0), " m")) +
scale_y_continuous(labels = function(x) paste0(x, "%"),
expand = expansion(mult = c(0, 0.1))) +
labs(title = "Gráfica N° 6: Modelado híbrido de probabilidad para Elevación",
subtitle = "Ajuste Híbrido: Azul (Exponencial) | Rojo (Log-Normal)",
x = "Elevación (m.s.n.m.)",
y = "Densidad de probabilidad (%)",
fill = "Segmento de Análisis") +
theme_minimal() +
theme(legend.position = "none", # Quitamos la leyenda porque el color es el mismo
plot.title = element_text(face = "bold", size = 14),
axis.text.x = element_text(angle = 45, hjust = 1))
#9. TABLA DE RESUMEN
# 1. Definición de los segmentos analizados
Segmentos <- c("Modelo Exponencial (Baja Altitud)", "Modelo Log-Normal (Alta Altitud)")
# 2. Creación del Dataframe
tabla_resumen <- data.frame(
Variable = Segmentos,
Pearson = c(round(Correlacion_Exp, 2), round(Correlacion_LN, 2)),
Chi_Sq = c(round(x2, 2), round(x2_ln, 2)),
Umbral = c(round(umbral_aceptacion, 2), round(umbral_aceptacion_ln, 2))
)
# 3. Asignación de nombres de columnas específicos para Elevación
colnames(tabla_resumen) <- c("Segmento de Elevación", "Test Pearson (%)", "Chi Cuadrado", "Umbral de Aceptación")
# 4. Generación de la tabla
knitr::kable(tabla_resumen,
format = "markdown",
align = "lccc",
caption = "Tabla Nro. 3: Resumen de test de bondad al modelo de probabilidad híbrido (Exponencial y Log-Normal)")
| Segmento de Elevación | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación |
|---|---|---|---|
| Modelo Exponencial (Baja Altitud) | 97.73 | 7.09 | 35.89 |
| Modelo Log-Normal (Alta Altitud) | 73.35 | 10.25 | 18.42 |
#10. CÁLCULO DE PROBABILIDADES #¿Cuál es la probabilidad de que una nueva planta solar se instale a una elevación menor a 500 m.s.n.m.?
# 1. Definición del umbral de interés (500 metros)
elevacion_limite <- 500
# 2. Cálculo de la probabilidad acumulada P(X <= 500)
prob_menor_500m <- pexp(elevacion_limite, rate = lambda_exp)
# 3. Visualización de resultados
cat("PROBABILIDAD DE INSTALACIONES EN TIERRAS BAJAS (< 500 m.s.n.m.) \n")
## PROBABILIDAD DE INSTALACIONES EN TIERRAS BAJAS (< 500 m.s.n.m.)
cat("La probabilidad de que una futura planta solar se ubique a una \n","elevación menor a 500 metros es del:", round(prob_menor_500m * 100, 2), "%\n")
## La probabilidad de que una futura planta solar se ubique a una
## elevación menor a 500 metros es del: 95.47 %
#De las próximas 100 instalaciones, ¿cuántas se espera que se ubiquen en zonas de alta montaña (superiores a 2500 m.s.n.m.)?
# 1. Determinación del peso del segmento Log-Normal
peso_segmento_log <- sum(hi_h[inicio:fin]) / 100
# 2. Cálculo de la Probabilidad Condicional P(X > 2500 | Segmento Log-Normal)
prob_cond_alta <- plnorm(2500, meanlog = ulog_int, sdlog = sigmalog_int, lower.tail = FALSE)
# 3. Probabilidad Real Combinada
prob_real_alta <- prob_cond_alta * peso_segmento_log
# 4. Proyección de Frecuencia Esperada para 100 casos
cantidad_proyectada <- 100 * prob_real_alta
cat("ANÁLISIS DE ALTITUD EXTREMA: MAYOR A 2,500 m.s.n.m.\n")
## ANÁLISIS DE ALTITUD EXTREMA: MAYOR A 2,500 m.s.n.m.
cat("Probabilidad real de encontrar proyectos en esta altitud:", round(prob_real_alta * 100, 2), "%\n")
## Probabilidad real de encontrar proyectos en esta altitud: 0 %
cat("Expectativa estadística en las próximas 100 plantas:", round(cantidad_proyectada, 0), "instalaciones.\n")
## Expectativa estadística en las próximas 100 plantas: 0 instalaciones.
#11.CÁLCULO GRÁFICO DE PROBABILIDADES
# 1. CÁLCULO DE PONDERACIÓN DE CADA SEGMENTO
peso_exp <- sum(df_exp_final$hi) / 100
peso_ln <- sum(df_ln_final$hi) / 100
# 2. PREPARACIÓN DE ÁREAS (Usando tus metros: 500m y 2500m)
# Sombreado Rojo (Zona de llanura < 500m)
df_sombra_exp <- data.frame(x = seq(min(cortes_h), 500, length.out = 100))
df_sombra_exp$y <- dexp(df_sombra_exp$x, rate = lambda_exp) * A_hibrido * peso_exp * 100
# Sombreado Verde (Alta montaña > 2500m)
df_sombra_ln <- data.frame(x = seq(2500, max(cortes_h), length.out = 100))
df_sombra_ln$y <- dlnorm(df_sombra_ln$x, meanlog = ulog_int, sdlog = sigmalog_int) * A_hibrido * peso_ln * 100
# 3. LÍNEAS DE TENDENCIA
df_curva_exp$y <- dexp(df_curva_exp$x, rate = lambda_exp) * A_hibrido * peso_exp * 100
df_curva_ln$y <- dlnorm(df_curva_ln$x, meanlog = ulog_int, sdlog = sigmalog_int) * A_hibrido * peso_ln * 100
# 4. GENERACIÓN DE LA GRÁFICA MAESTRA
ggplot() +
geom_bar(data = df_grafica, aes(x = MC, y = hi, fill = Modelo),
stat = "identity", color = "black", alpha = 0.3, width = A_hibrido) +
# Áreas de Probabilidad (geom_ribbon como en tu guía)
geom_ribbon(data = df_sombra_exp, aes(x = x, ymin = 0, ymax = y), fill = "red", alpha = 0.5) +
geom_ribbon(data = df_sombra_ln, aes(x = x, ymin = 0, ymax = y), fill = "#228B22", alpha = 0.5) +
# Curvas de los modelos
geom_line(data = df_curva_exp, aes(x = x, y = y), color = "red", linewidth = 1.1) +
geom_line(data = df_curva_ln, aes(x = x, y = y), color = "#228B22", linewidth = 1.1) +
# ESCALAS EN METROS (Quitamos los dólares)
scale_fill_manual(values = c("Zona Exponencial" = "#FFCC99", "Zona Log-Normal" = "#FFCC99")) +
scale_x_continuous(labels = function(x) paste0(round(x,0), " m")) +
scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.1))) +
labs(title = "Cálculo de Probabilidades sobre el Modelo Híbrido de Elevación",
x = "Elevación (m.s.n.m.)", y = "Densidad de probabilidad (%)") +
theme_minimal() +
theme(legend.position = "none", plot.title = element_text(face = "bold", size = 14))
cat(" INFERENCIA PROBABILÍSTICA (VALORES REALES DE ELEVACIÓN)\n","1. Probabilidad P(Elevación < 500 m):", round(prob_menor_500m * 100, 2), "%\n")
## INFERENCIA PROBABILÍSTICA (VALORES REALES DE ELEVACIÓN)
## 1. Probabilidad P(Elevación < 500 m): 95.47 %
cat("2. Probabilidad P(Elevación > 2500 m):", round(prob_real_alta * 100, 2), "%\n")
## 2. Probabilidad P(Elevación > 2500 m): 0 %
#12. TEOREMA DEL LÍMITE CENTRAL (TLC) #Tras validar los modelos híbridos, aplicamos el Teorema del Límite Central para obtener una estimación global de la elevación poblacional. Esta tabla consolida el valor esperado de la altitud de una planta solar y su margen de error estadístico. A diferencia del análisis segmentado (Híbrido), esta estimación proporciona un marco de referencia global de la industria.
# 1. Cálculo de estadísticos descriptivos
n_total_e <- length(All.Elev)
x_bar_e <- mean(All.Elev)
sd_e <- sd(All.Elev)
# 2. Parámetros para el Teorema del Límite Central
z_95 <- 1.96
error_estandar_e <- sd_e / sqrt(n_total_e)
margen_error_95_e <- z_95 * error_estandar_e
# 3. Estimación de la Media Poblacional (Intervalos de Confianza)
lim_inf_e <- x_bar_e - margen_error_95_e
lim_sup_e <- x_bar_e + margen_error_95_e
# 4. Crear el dataframe para la tabla
tabla_elev_tlc <- data.frame(
Parametro = "Elevación Promedio de Plantas Solares",
Lim_Inferior = lim_inf_e,
Media_Muestral = x_bar_e,
Lim_Superior = lim_sup_e,
Error_Estandar = paste0("+/- ", round(margen_error_95_e, 2), " m"),
Confianza = "95% (Z=1.96)"
)
# 5. Generar la tabla con formato GT
tabla_final_tlc <- tabla_elev_tlc %>%
gt() %>%
tab_header(
title = md("**ESTIMACIÓN DE LA MEDIA POBLACIONAL DE ELEVACIÓN**"),
subtitle = "Inferencia Global basada en el Teorema del Límite Central"
) %>%
cols_label(
Parametro = "Parámetro",
Lim_Inferior = "Límite Inferior (m)",
Media_Muestral = "Elevación Promedio (m)",
Lim_Superior = "Límite Superior (m)",
Error_Estandar = "Margen de Error"
) %>%
# Formato numérico para metros
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
tab_style(
style = list(cell_fill(color = "#FBEEE6"), cell_text(color = "#A04000", weight = "bold")),
locations = cells_body(columns = Media_Muestral)
)
# Mostrar tabla en el R Markdown
tabla_final_tlc
| ESTIMACIÓN DE LA MEDIA POBLACIONAL DE ELEVACIÓN | |||||
| Inferencia Global basada en el Teorema del Límite Central | |||||
| Parámetro | Límite Inferior (m) | Elevación Promedio (m) | Límite Superior (m) | Margen de Error | Confianza |
|---|---|---|---|---|---|
| Elevación Promedio de Plantas Solares | 352.60 | 356.88 | 361.17 | +/- 4.29 m | 95% (Z=1.96) |