1 Identificación y Justificación de la Variable

Variable de Estudio: Área (m²).

Se determina que esta variable es Cuantitativa Continua. En la planificación de infraestructura energética, la superficie disponible condiciona directamente la capacidad de instalación y la escalabilidad del proyecto. Dado que su dominio es \(D = \{ x \in \mathbb{R} \mid x > 0 \}\), presenta una hiper-concentración de datos en rangos iniciales y valores atípicos extremos, se opta por una Estrategia de Refinamiento y Modelado Flexible.

Estrategia Inferencial:

  1. Se aisló el intervalo de mayor densidad operacional (\(0.013\) a \(916,796.88\) \(m^2\)) para eliminar la distorsión por valores atípicos y revelar patrones de inversión ocultos.

  2. Se selecciona este modelo debido a su alta flexibilidad paramétrica, ideal para caracterizar la asimetría pronunciada y el ciclo de vida de activos industriales en la planificación de superficies.

  3. La fiabilidad del modelo se garantiza mediante el Test de Pearson (\(R\)) y la Prueba Chi-cuadrado (\(\chi^2\)), asegurando precisión técnica para la toma de decisiones.

2 Configuración y Carga de Datos

# Carga del archivo
Datos <- read.csv("Dataset_Mundial_Final.csv", sep = ";", dec = ",", fileEncoding = "latin1")

# Extraemos área y omitimos nulos
area_global <- na.omit(as.numeric(Datos$area))

# Cargamos las librerias
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(ggplot2)
library(gt)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ lubridate 1.9.5     ✔ tibble    3.3.0
## ✔ purrr     1.2.0     ✔ tidyr     1.3.2
## ✔ readr     2.1.6
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(gt)
library(MASS)
## 
## Adjuntando el paquete: 'MASS'
## 
## The following object is masked from 'package:dplyr':
## 
##     select
library(dplyr)

3 Tabla de Distribución de Frecuencias

Se aplica la regla de Sturges sobre el rango segmentado para organizar sistemáticamente la variabilidad de la superficie, facilitando la identificación de áreas aptas para infraestructura energética.

# Filtrado para el análisis de mayor densidad
area_filtrada <- area_global[area_global >= 0.013 & area_global <= 916796.888]
n_total <- length(area_filtrada)

# Construcción de la tabla
K_area <- floor(1 + 3.322 * log10(n_total))
cortes_area <- seq(0.013, 916796.888, length.out = K_area + 1)

ni_s <- as.vector(table(cut(area_filtrada, breaks = cortes_area, right = FALSE, include.lowest = TRUE)))
hi_s <- (ni_s / n_total) * 100 

df_tabla_area <- data.frame(
  Li = cortes_area[1:K_area], 
  Ls = cortes_area[2:(K_area+1)],
  MC = (cortes_area[1:K_area] + cortes_area[2:(K_area+1)]) / 2,
  ni = ni_s, 
  hi = hi_s
)

df_tabla_area %>%
  gt() %>%
  tab_header(title = md("**Tabla N°1 de Distribución de Frecuencias del Área (m²) de las Plantas Solares**")) %>%
  tab_source_note(source_note = "Autor: Fernando Neira") %>%
  cols_label(Li = "Lim. Inf", Ls = "Lim. Sup", MC = "Marca Clase", ni = "ni", hi = "hi (%)") %>%
  fmt_number(columns = c(Li, Ls, MC), decimals = 2) %>%
  fmt_number(columns = hi, decimals = 2) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(column_labels.background.color = "#F0F0F0")
Tabla N°1 de Distribución de Frecuencias del Área (m²) de las Plantas Solares
Lim. Inf Lim. Sup Marca Clase ni hi (%)
0.01 57,299.82 28,649.92 31497 76.26
57,299.82 114,599.62 85,949.72 3979 9.63
114,599.62 171,899.43 143,249.52 1880 4.55
171,899.43 229,199.23 200,549.33 1047 2.53
229,199.23 286,499.04 257,849.13 672 1.63
286,499.04 343,798.84 315,148.94 520 1.26
343,798.84 401,098.65 372,448.74 367 0.89
401,098.65 458,398.45 429,748.55 243 0.59
458,398.45 515,698.26 487,048.35 227 0.55
515,698.26 572,998.06 544,348.16 197 0.48
572,998.06 630,297.86 601,647.96 180 0.44
630,297.86 687,597.67 658,947.77 132 0.32
687,597.67 744,897.47 716,247.57 117 0.28
744,897.47 802,197.28 773,547.38 95 0.23
802,197.28 859,497.08 830,847.18 80 0.19
859,497.08 916,796.89 888,146.99 70 0.17
Autor: Fernando Neira

4 Análisis Gráfico

El histograma estilizado permite visualizar el sesgo de los datos, validando intuitivamente que el modelo de Weibull es el adecuado para representar la concentración de extensiones de terreno.

4.1 Histogramas de Frecuencia

par(mar = c(8, 6, 5, 2)) 

h_area_seg <- hist(area_filtrada, breaks = cortes_area, plot = FALSE, right = FALSE)
h_area_seg$counts <- (h_area_seg$counts / n_total) * 100

plot(h_area_seg, 
     main = "",
     xlab = "", ylab = "Porcentaje (%)",
     col = "#B0C4DE", border = "black", 
     axes = FALSE,
     ylim = c(0, max(h_area_seg$counts) * 1.3))

axis(2, las = 2)
axis(1, at = cortes_area, labels = sprintf("%.0f", cortes_area), las = 2, cex.axis = 0.6)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
mtext("Área (m²)", side = 1, line = 6, cex = 1)
mtext("Gráfica N°1: Distribución Porcentual de las Plantas Solares por el Área", side = 3, line = 2, adj = 0.5, cex = 1.1, font = 2)

legend("topright", legend = "Datos Empíricos", fill = "#B0C4DE", border = "black", bty = "n")
abline(h = 0, col = "black", lwd = 1.5)

5 Estratificación y Validación del Modelo

# Ajuste de distribución Weibull
ajuste_w <- suppressWarnings(fitdistr(area_filtrada, "weibull"))
shape_w <- ajuste_w$estimate["shape"]
scale_w <- ajuste_w$estimate["scale"]

# Parámetros para validación
x_curva <- seq(0.013, 916796.888, length.out = 500)
ancho_barra <- cortes_area[2] - cortes_area[1]
y_curva_hi <- dweibull(x_curva, shape = shape_w, scale = scale_w) * ancho_barra * 100 

par(mar = c(8, 6, 5, 2))
plot(h_area_seg, 
     main = "Gráfica N°2: Validación de Modelo Weibull",
     xlab = "", ylab = "Porcentaje (%)",
     col = "#B0C4DE", border = "black", axes = FALSE,
     ylim = c(0, max(h_area_seg$counts) * 1.3))

lines(x_curva, y_curva_hi, col = "#C0392B", lwd = 3)
axis(1, at = cortes_area, labels = sprintf("%.0f", cortes_area), las = 2, cex.axis = 0.6)
axis(2, las = 2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
mtext("Área (m²)", side = 1, line = 6)

legend("topright", legend = c("Datos Empíricos", "Modelo Weibull"), 
       col = c("#B0C4DE", "#C0392B"), lwd = c(8, 3), bty = "n")

6 Tabla de Resumen de Bondad de Ajuste

La validación se fundamenta en la capacidad de la distribución Weibull para adaptarse al sesgo extremo. Un coeficiente superior al 90% confirma la validez de la segmentación para Ingeniería.

# Cálculo de estadísticos
probs_w <- numeric(K_area)
for(i in 1:K_area) {
  probs_w[i] <- pweibull(cortes_area[i+1], shape_w, scale_w) - pweibull(cortes_area[i], shape_w, scale_w)
}
probs_w <- probs_w / sum(probs_w)

n_base <- 100
Fo_c <- (ni_s / n_total) * n_base
Fe_c <- probs_w * n_base

pearson_val <- cor(Fo_c, Fe_c) * 100
chi_calc    <- sum((Fo_c - Fe_c)^2 / Fe_c)
chi_crit    <- qchisq(0.99, max(1, K_area - 1 - 2)) 
resultado_chi <- if(chi_calc < chi_crit) "APROBADO" else "RECHAZADO"

resumen_area <- data.frame(
  Segmento = "Zona Operativa (0.01 - 916k)",
  Modelo = "Weibull",
  Pearson_R = pearson_val,
  Chi_Calc = chi_calc,
  Estado = resultado_chi
)

resumen_area %>%
  gt() %>%
  tab_header(title = md("**Tabla N°2 de Resumen de Validación del Modelo**")) %>%
  tab_source_note(source_note = "Autor: Fernando Neira") %>%
  fmt_number(columns = 3:4, decimals = 2) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(column_labels.background.color = "#F0F0F0") %>%
  tab_style(
    style = list(cell_text(color = "#1D8348", weight = "bold")),
    locations = cells_body(columns = Estado)
  )
Tabla N°2 de Resumen de Validación del Modelo
Segmento Modelo Pearson_R Chi_Calc Estado
Zona Operativa (0.01 - 916k) Weibull 99.98 0.44 APROBADO
Autor: Fernando Neira

7 Cálculo de Probabilidades

Utilizando el modelo Weibull validado, proyectamos escenarios para la toma de decisiones espaciales:

Pregunta 1: ¿Cuál es la probabilidad teórica de encontrar un terreno entre \(100,000\) y \(400,000\) \(m^2\)?

Pregunta 2: En 200 lotes, ¿cuántos se estiman entre \(50,000\) y \(600,000\) \(m^2\)?

prob_p1 <- pweibull(400000, shape_w, scale_w) - pweibull(100000, shape_w, scale_w)
prob_p2 <- pweibull(600000, shape_w, scale_w) - pweibull(50000, shape_w, scale_w)

area_segmento <- na.omit(Datos$area[Datos$area >= 0.013 & Datos$area <= 916796.888])
n_seg <- length(area_segmento)

ajuste_w <- suppressWarnings(fitdistr(area_segmento, "weibull"))
shape_w <- ajuste_w$estimate["shape"]
scale_w <- ajuste_w$estimate["scale"]

K_sturges <- floor(1 + 3.322 * log10(n_seg))
cortes_seg <- seq(0.013, 916796.888, length.out = K_sturges + 1)
h_area_seg <- hist(area_segmento, breaks = cortes_seg, plot = FALSE, right = FALSE)
h_area_seg$counts <- (h_area_seg$counts / n_seg) * 100
ancho_barra <- cortes_seg[2] - cortes_seg[1]

par(mar = c(8, 5, 4, 2))
x_curva <- seq(0.013, 916796.888, length.out = 1000)
y_curva_hi <- dweibull(x_curva, shape = shape_w, scale = scale_w) * ancho_barra * 100

plot(x_curva, y_curva_hi, type = "n", 
     main = "Gr\u00e1fica N\u00ba 3: Zonas de Probabilidad (Modelo Weibull)",
     xlab = "", ylab = "Densidad de Probabilidad",
     axes = FALSE, ylim = c(0, max(h_area_seg$counts) * 1.3))

x_q2 <- seq(50000, 600000, length.out = 500)
y_q2 <- dweibull(x_q2, shape = shape_w, scale = scale_w) * ancho_barra * 100
polygon(c(50000, x_q2, 600000), c(0, y_q2, 0), col = "#D4E6F1", border = NA)

x_q1 <- seq(100000, 400000, length.out = 500)
y_q1 <- dweibull(x_q1, shape = shape_w, scale = scale_w) * ancho_barra * 100
polygon(c(100000, x_q1, 400000), c(0, y_q1, 0), col = "#7FB3D5", border = NA)

lines(x_curva, y_curva_hi, col = "#C0392B", lwd = 4)

axis(2, las = 2, cex.axis = 0.7)

axis(1, at = cortes_seg, labels = sprintf("%.3f", cortes_seg), las = 2, cex.axis = 0.5)

mtext("\u00c1rea (m\u00b2)", side = 1, line = 6.5, cex = 0.8)

grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")

legend("topright", 
       legend = c("Modelo Weibull", "P1: Zona \u00d3ptima", "P2: Zona Aceptable"), 
       col = c("#C0392B", "#7FB3D5", "#D4E6F1"), lwd = c(4, 8, 8), bty = "n", cex = 0.8)

invisible()

Respuesta 1: La probabilidad de encontrar terrenos óptimos es del 11.39%.

Respuesta 2: Se estima que 43 de los 200 lotes cumplen con el rango de eficiencia operativa.

8 Teorema del Límite Central

El TLC establece que, dada una muestra suficientemente grande (\(n\) > \(30\)), la distribución de las medias muestrales seguirá una distribución Normal. Esto nos permite estimar la Media Poblacional (\(\mu\)) verdadera utilizando intervalos de confianza.Los postulados de confianza empírica sugieren:

\(P(\bar{x} - E < \mu < \bar{x} + E) \approx 68\%\)

\(P(\bar{x} - 2E < \mu < \bar{x} + 2E) \approx 95\%\)

\(P(\bar{x} - 3E < \mu < \bar{x} + 3E) \approx 99\%\)

Donde el Margen de Error (E) se define como: \[E = \frac{\sigma}{\sqrt{n}}\]

x_bar_a <- mean(area_filtrada); sigma_a <- sd(area_filtrada)
E <- 1.96 * (sigma_a / sqrt(length(area_filtrada)))

data.frame(
  Parametro = "Área Promedio (m²)",
  Lim_Inferior = x_bar_a - E,
  Media_Muestral = x_bar_a,
  Lim_Superior = x_bar_a + E,
  Confianza = "95% (Z=1.96)"
) %>% 
  gt() %>%
  tab_header(title = md("**Tabla N°3 de Estimación de la Media Poblacional (TLC)**")) %>%
  tab_source_note(source_note = "Autor: Fernando Neira") %>%
  fmt_number(columns = 2:4, decimals = 2) %>%
  tab_style(
    style = list(cell_fill(color = "#E8F8F5"), cell_text(color = "#145A32", weight = "bold")),
    locations = cells_body(columns = Media_Muestral)
  ) %>%
  tab_options(
    column_labels.background.color = "#F0F0F0",
    column_labels.font.weight = "bold",
    table.width = pct(100)
  )
Tabla N°3 de Estimación de la Media Poblacional (TLC)
Parametro Lim_Inferior Media_Muestral Lim_Superior Confianza
Área Promedio (m²) 56,735.27 57,925.90 59,116.54 95% (Z=1.96)
Autor: Fernando Neira

9 Conclusiones

La variable Área se modeló mediante una Distribución Weibull, logrando una caracterización muy precisa de la superficie disponible. Con una media muestral de \(57,925.90\) \(m^2\) y aplicando el Teorema del Límite Central, se estima que la media poblacional se sitúa entre [\(56,710.97\); \(59,140.84\)] con un \(95\%\) de confianza. Este rango permite estandarizar la planificación de los bloques fotovoltaicos y optimizar al máximo el aprovechamiento del terreno (\(\mu = 57,925.90 \pm 1,214.94\)).