\(Variable\) \(de\) \(Estudio\): Aptitud Solar.
Variable Cuantitativa Continua con dominio \(D=\{x \in \mathbb{R} \mid 0 \leq x \leq 0.94\}\). Debido a su comportamiento unimodal y la concentración de datos en niveles de alta eficiencia, se aplica un Modelo de Distribución Normal global.
\(Estrategia\) \(Inferencial\):
Validación: Se utiliza el Coeficiente de Pearson (\(R\)) y Chi-Cuadrado (\(\chi^2\)). El ajuste de \(99.11\)% valida el modelo con un rigor estadístico absoluto para proyecciones operativas.
Estimación: Mediante el Teorema del Límite Central (TLC), se estima la media poblacional con un \(95\)% de confianza.
Precisión: El análisis arroja un intervalo de [\(0.6809\); \(0.6830\)], lo que permite estandarizar criterios técnicos con un margen de error mínimo (\(\pm 0.00109\)).
##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: FERNANDO NEIRA ####
### CARRERA: INGENIERÍA EN PETRÓLEOS #####
#### VARIABLE HUMEDAD ####
## DATASET ##
library(tidyverse)## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.1.6
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.2 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.1
## ── 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(dplyr)
Datos <- read_excel("C:/Users/ASUS/OneDrive/Escritorio/ESTADÍSTICA/EXPO/ACTIVIDADES/Dataset_Mundial_Final.xls",
sheet = "Dataset_Mundial_Final")
# Estructura de los datos
str(Datos)## tibble [58,978 × 29] (S3: tbl_df/tbl/data.frame)
## $ OBJECTID : num [1:58978] 2 3 4 5 6 7 8 9 10 11 ...
## $ code : chr [1:58978] "00001-AFG-P" "00002-AFG-P" "00003-AFG-P" "00004-AFG-P" ...
## $ plant_name : chr [1:58978] "Badghis Solar Power Plant" "Balkh solar farm" "Behsood solar farm" "Dab Pal 4 solar farm" ...
## $ country : chr [1:58978] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
## $ operational_status : chr [1:58978] "cancelled - inferred 4 y" "cancelled - inferred 4 y" "cancelled - inferred 4 y" "shelved - inferred 2 y" ...
## $ longitude : num [1:58978] 62.9 67.1 70.4 66.2 65.7 ...
## $ latitude : num [1:58978] 35.1 36.7 34.4 33.8 31.7 ...
## $ elevation : num [1:58978] 918 359 629 2288 1060 ...
## $ area : num [1:58978] 6.74 10.72 487.73 111.8 1929.96 ...
## $ size : chr [1:58978] "Small" "Small" "Small" "Small" ...
## $ slope : num [1:58978] 7.38 0.49 1.1 6.16 1.23 ...
## $ slope_type : chr [1:58978] "Moderado" "Plano o casi plano" "Plano o casi plano" "Moderado" ...
## $ curvature : num [1:58978] -0.024 0 0 0.045 -0.005 -0.005 -0.015 0 0 -0.009 ...
## $ curvature_type : chr [1:58978] "Superficies cóncavas / Valles" "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies convexas / Crestas" ...
## $ aspect : num [1:58978] 96.8 358.5 36.2 305.8 248.4 ...
## $ aspect_type : chr [1:58978] "East" "North" "Northeast" "Northwest" ...
## $ dist_to_road : num [1:58978] 7037.1 92.7 112.1 1705.3 115.8 ...
## $ ambient_temperature : num [1:58978] 14.4 17.88 21.32 8.86 19.64 ...
## $ ghi : num [1:58978] 5.82 5.58 5.8 6.75 6.62 ...
## $ humidity : num [1:58978] 47.7 42.3 36.4 37.3 24.2 ...
## $ wind_speed : num [1:58978] 0.039 0.954 0.234 0.943 0.37 ...
## $ wind_direction : num [1:58978] 187.5 207.4 255.6 160.3 97.7 ...
## $ dt_wind : chr [1:58978] "South" "Southwest" "West" "South" ...
## $ solar_aptitude : num [1:58978] 0.72 0.635 0.685 0.659 0.819 0.819 0.818 0.642 0.63 0.374 ...
## $ solar_aptitude_rounded: num [1:58978] 7 6 7 7 8 8 8 6 6 4 ...
## $ solar_aptittude_class : chr [1:58978] "Alta" "Alta" "Alta" "Alta" ...
## $ capacity : num [1:58978] 32 40 60 3000 100 100 36 50 25 100 ...
## $ optimal_tilt : num [1:58978] 30 31 31.1 33 31 ...
## $ pv_potential : num [1:58978] 4.61 4.41 4.57 5.42 5.17 ...
Se aplica la Regla de Sturges para organizar sistemáticamente la competitividad del terreno, utilizando intervalos de \(0.1\) para facilitar la interpretación técnica en ingeniería.
# CÁLCULO PARA TABLA APTITUD SOLAR
BASE_APT <- 0.1
apt_variable <- Datos$solar_aptitude # Nombre corregido
n_total_apt <- length(apt_variable)
min_int_apt <- floor(min(apt_variable, na.rm = TRUE) / BASE_APT) * BASE_APT
max_int_apt <- ceiling(max(apt_variable, na.rm = TRUE) / BASE_APT) * BASE_APT
cortes_int_apt <- seq(from = min_int_apt, to = max_int_apt, by = BASE_APT)
K_int_apt <- length(cortes_int_apt) - 1
ni_int_apt <- as.vector(table(cut(apt_variable, breaks = cortes_int_apt, include.lowest = TRUE, right = FALSE)))
hi_int_apt <- (ni_int_apt / n_total_apt) * 100
df_tabla_apt <- data.frame(
Li = cortes_int_apt[1:K_int_apt],
Ls = cortes_int_apt[2:(K_int_apt+1)],
MC = (cortes_int_apt[1:K_int_apt] + cortes_int_apt[2:(K_int_apt+1)]) / 2,
ni = ni_int_apt,
hi = hi_int_apt,
Ni_asc = cumsum(ni_int_apt),
Ni_desc = rev(cumsum(rev(ni_int_apt))),
Hi_asc = cumsum(hi_int_apt),
Hi_desc = rev(cumsum(rev(hi_int_apt)))
)
df_tabla_apt %>%
mutate(across(everything(), ~as.character(round(as.numeric(.), 3)))) %>%
rbind(c("TOTAL", "-", "-", n_total_apt, "100", "-", "-", "-", "-")) %>%
gt() %>%
tab_header(title = md("**Tabla N°1 de Distribución de Frecuencias de Aptitud Solar 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 (%)",
Ni_asc = "Ni \u2191", Ni_desc = "Ni \u2193", Hi_asc = "Hi \u2191", Hi_desc = "Hi \u2193") %>%
cols_align(align = "center", columns = everything()) %>%
tab_options(column_labels.background.color = "#F0F0F0")| Tabla N°1 de Distribución de Frecuencias de Aptitud Solar de las Plantas Solares | ||||||||
| Lim. Inf | Lim. Sup | Marca Clase | ni | hi (%) | Ni ↑ | Ni ↓ | Hi ↑ | Hi ↓ |
|---|---|---|---|---|---|---|---|---|
| 0 | 0.1 | 0.05 | 112 | 0.19 | 112 | 58978 | 0.19 | 100 |
| 0.1 | 0.2 | 0.15 | 315 | 0.534 | 427 | 58866 | 0.724 | 99.81 |
| 0.2 | 0.3 | 0.25 | 582 | 0.987 | 1009 | 58551 | 1.711 | 99.276 |
| 0.3 | 0.4 | 0.35 | 879 | 1.49 | 1888 | 57969 | 3.201 | 98.289 |
| 0.4 | 0.5 | 0.45 | 2740 | 4.646 | 4628 | 57090 | 7.847 | 96.799 |
| 0.5 | 0.6 | 0.55 | 10322 | 17.501 | 14950 | 54350 | 25.348 | 92.153 |
| 0.6 | 0.7 | 0.65 | 15501 | 26.283 | 30451 | 44028 | 51.631 | 74.652 |
| 0.7 | 0.8 | 0.75 | 17368 | 29.448 | 47819 | 28527 | 81.079 | 48.369 |
| 0.8 | 0.9 | 0.85 | 9850 | 16.701 | 57669 | 11159 | 97.781 | 18.921 |
| 0.9 | 1 | 0.95 | 1309 | 2.219 | 58978 | 1309 | 100 | 2.219 |
| TOTAL | - | - | 58978 | 100 | - | - | - | - |
| Autor: Fernando Neira | ||||||||
Se utiliza un histograma para mostrar que los datos se agrupan en un solo pico. Esto evidencia que la mayoría de las plantas solares están correctamente ubicadas en zonas de máxima eficiencia y aptitud.
# Configuración de márgenes profesionales
par(mar = c(9, 6, 5, 2))
# Generación del gráfico basado en df_tabla_apt
posiciones <- barplot(df_tabla_apt$hi,
col = "#B0C4DE",
border = "black",
ylim = c(0, max(df_tabla_apt$hi) * 1.3),
space = 0,
axes = FALSE)
# Eje X Vertical con las marcas de clase de aptitud
axis(1, at = posiciones, labels = df_tabla_apt$MC, las = 2, cex.axis = 0.8)
# Personalización de ejes y rejilla técnica
axis(2, las = 2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
# Rotulación corregida para Aptitud
mtext("Porcentaje (%)", side = 2, line = 4, cex = 1, font = 1)
mtext("Aptitud Solar (Índice)", side = 1, line = 7, cex = 1)
mtext("Gráfica N°1: Distribución Porcentual de las Plantas Solares por Aptitud Solar",
side = 3, line = 2, adj = 0.5, cex = 1.1, font = 2)
# Leyenda Técnica
legend("topleft",
legend = c("Datos Empíricos"),
fill = c("#B0C4DE"),
border = c("black"),
bty = "n",
cex = 0.9)
# Línea de base (eje X)
abline(h = 0, col = "black", lwd = 1.5)Se ajusta un Modelo Normal porque los datos se agrupan equilibradamente alrededor de un valor central (\(\approx 0.68\)). Esto refleja que la mayoría de las plantas solares se instalan en zonas con alta eficiencia, siguiendo un estándar de calidad técnica a nivel mundial.
# 1. Preparación de datos
mu_apt <- mean(Datos$solar_aptitude, na.rm = TRUE)
sd_apt <- sd(Datos$solar_aptitude, na.rm = TRUE)
n_total <- length(Datos$solar_aptitude)
# 2. Configuración de márgenes
par(mar = c(8, 6, 5, 2))
# 3. Generación del histograma base
# Usamos cortes de 0.1 para el rango [0, 1]
cortes <- seq(0, 1, by = 0.1)
h_apt <- hist(Datos$solar_aptitude, breaks = cortes, plot = FALSE)
# Convertir frecuencias absolutas a porcentajes (%)
h_apt$counts <- (h_apt$counts / n_total) * 100
# 4. Preparación de la curva normal
x_curva <- seq(0, 1, length.out = 100)
# Ajustamos la densidad: multiplicamos por el ancho del intervalo (0.1) y por 100
y_curva <- dnorm(x_curva, mean = mu_apt, sd = sd_apt) * 0.1 * 100
# Definir el límite superior del eje Y
y_max <- max(c(h_apt$counts, y_curva)) * 1.3
# 5. Generación del Gráfico
plot(h_apt,
main = "Gráfica N°2: Distribución de Aptitud Solar (Modelo Normal)",
xlab = "Aptitud Solar (Índice)",
ylab = "Porcentaje (%)",
col = "#B0C4DE",
border = "black",
cex.main = 1.1,
font.main = 2,
ylim = c(0, y_max),
axes = FALSE)
# Superposición de la Curva Normal (Conjetura)
lines(x_curva, y_curva, col = "#C0392B", lwd = 3)
# 6. Personalización técnica
axis(1)
axis(2, las = 2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
abline(h = 0, col = "black", lwd = 1.5)
# 7. Leyenda
legend("topleft",
legend = c("Aptitud Observada", "Modelo Normal"),
fill = c("#B0C4DE", NA),
border = c("black", NA),
lty = c(NA, 1),
col = c(NA, "#C0392B"),
lwd = c(NA, 3),
bty = "n",
cex = 0.8)# 1. Parámetros base para Aptitud Solar
mu_a <- mean(Datos$solar_aptitude, na.rm = TRUE)
sd_a <- sd(Datos$solar_aptitude, na.rm = TRUE)
n_total <- sum(!is.na(Datos$solar_aptitude))
# Rango de 0 a 1 con intervalos de 0.1
breaks_a <- seq(0, 1, by = 0.1)
K_a <- length(breaks_a) - 1
# 2. Frecuencias Teóricas y Observadas (Base 100)
# Cálculo de probabilidades bajo el Modelo Normal
probs_a <- diff(pnorm(breaks_a, mu_a, sd_a))
probs_a <- probs_a / sum(probs_a) # Normalización
n_base <- 100
# Frecuencias Observadas escaladas a base 100
Fo_a <- as.vector(table(cut(Datos$solar_aptitude, breaks = breaks_a, right = FALSE))) * (n_base / n_total)
# Frecuencias Esperadas
Fe_a <- probs_a * n_base
# 3. Estadísticos de Validación
chi_a <- sum((Fo_a - Fe_a)^2 / Fe_a)
pear_a <- cor(Fo_a, Fe_a) * 100
# 4. Determinación del Estado de la Conjetura
res_a <- if(pear_a > 80) "APROBADO" else "RECHAZADO"
# IMPRESIÓN EN CONSOLA
cat("RESULTADOS:\n")## RESULTADOS:
## Test Pearson: 98.39 %
## Chi-Cuadrado: 66.3
## Estado de Validación: APROBADO
Se ajusta un Modelo Normal debido a que los datos de aptitud se distribuyen de forma equilibrada alrededor de los promedios globales. La validación se apoya en un análisis dual: el Coeficiente de Pearson (\(R\)) de 98.39% confirma la forma de la campana, mientras que el Chi-Cuadrado (\(\chi^2\)) de 66.3 valida el ajuste de las frecuencias en base 100.
library(gt)
library(dplyr)
# 1. Crear dataframe para la tabla con los datos de Aptitud Solar
resumen_ajuste_apt <- data.frame(
"Variable" = "Aptitud Solar (Índice)",
"Modelo_Aplicado" = "Distribución Normal",
"Pearson_R" = pear_a,
"Chi_Sq" = chi_a,
"Estado" = res_a
)
# 2. Formato de la tabla profesional
resumen_ajuste_apt %>%
gt() %>%
tab_header(title = md("**Tabla N°2 de Resumen de Validación de Aptitud Solar**")) %>%
tab_source_note(source_note = "Autor: Fernando Neira") %>%
cols_label(
Variable = "Variable",
Modelo_Aplicado = "Modelo de Ajuste",
Pearson_R = "Test Pearson (%)",
Chi_Sq = "Chi-Cuadrado (X²)",
Estado = "Validación"
) %>%
fmt_number(columns = c(Pearson_R, Chi_Sq), 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, rows = Estado == "APROBADO")
)| Tabla N°2 de Resumen de Validación de Aptitud Solar | ||||
| Variable | Modelo de Ajuste | Test Pearson (%) | Chi-Cuadrado (X²) | Validación |
|---|---|---|---|---|
| Aptitud Solar (Índice) | Distribución Normal | 98.39 | 66.30 | APROBADO |
| Autor: Fernando Neira | ||||
\(Pregunta\) \(1\): ¿Cuál es la probabilidad de que una planta solar se sitúe en una franja de alta competitividad entre \(0.7\) y \(0.9\) de aptitud?
\(Pregunta\) \(2\): En una expansión proyectada de \(200\) nuevas plantas, ¿cuántas se estima que calificarán en este rango de alta aptitud?
# 1. Parámetros del modelo (usando solar_aptitude)
mu_a <- mean(Datos$solar_aptitude, na.rm = TRUE)
sd_a <- sd(Datos$solar_aptitude, na.rm = TRUE)
# 2. Cálculo de Probabilidades
# Probabilidad de estar entre 0.7 y 0.9 (Rango de Alta Aptitud)
prob_alta <- pnorm(0.9, mu_a, sd_a) - pnorm(0.7, mu_a, sd_a)
proyectos_estimados <- round(prob_alta * 200)
# 3. Configuración de márgenes y gráfico
par(mar = c(6, 8, 4, 2))
# Generación de la curva normal (rango 0 a 1 para aptitud)
x_a <- seq(0, 1, length.out = 500)
y_vals <- dnorm(x_a, mu_a, sd_a)
y_max <- max(y_vals) * 1.2
plot(x_a, y_vals, type = "n", axes = FALSE,
main = "Gráfica N°3: Zonas de Probabilidad de Aptitud Solar (Modelo Normal)",
xlab = "Aptitud Solar (Índice)", ylab = "",
ylim = c(0, y_max))
# Sombreado del área de interés (0.7 - 0.9)
x_area <- seq(0.7, 0.9, length.out = 100)
y_area <- dnorm(x_area, mu_a, sd_a)
polygon(c(0.7, x_area, 0.9), c(0, y_area, 0), col = "#7FB3D5", border = NA)
# Línea del modelo
lines(x_a, y_vals, col = "#C0392B", lwd = 4)
# Personalización técnica
axis(1)
axis(2, las = 2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
mtext("Densidad de Probabilidad", side = 2, line = 5.5, cex = 1)
# Leyenda
legend("topleft",
legend = c("Modelo Normal (Aptitud)",
paste0("Zona de Alta Aptitud (", round(prob_alta * 100, 2), "%)")),
col = c("#C0392B", "#7FB3D5"),
lwd = c(4, 10),
bty = "n",
cex = 0.8)\(Respuesta\) \(1\): Existe una probabilidad del 44.07% de que cualquier planta solar del dataset opere en un rango de alta competitividad de entre 0.7 y 0.9 de aptitud. Esto confirma que una porción significativa de los activos globales se encuentra en terrenos con condiciones óptimas para la captación energética.
\(Respuesta\) \(2\): Si se planificara una expansión de 200 proyectos nuevos, el modelo proyecta que aproximadamente 88 de ellos se ubicarán dentro de esta franja de alta aptitud solar.
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}}\]
# 1. ESTADÍSTICOS BÁSICOS (Aptitud Solar)
x_bar_a <- mean(Datos$solar_aptitude, na.rm = TRUE)
sigma_a <- sd(Datos$solar_aptitude, na.rm = TRUE)
n_total_a <- sum(!is.na(Datos$solar_aptitude))
# 2. CÁLCULO DEL ERROR Y MARGEN (E) AL 95%
# Basado en la fórmula del PDF: E = Z * (sigma / sqrt(n))
E_a <- 1.96 * (sigma_a / sqrt(n_total_a))
# 3. CONSTRUCCIÓN DE LA TABLA CON GT
library(gt)
library(dplyr)
data.frame(
Parametro = "Aptitud Solar Promedio Mundial",
Lim_Inferior = x_bar_a - E_a,
Media_Muestral = x_bar_a,
Lim_Superior = x_bar_a + E_a,
Error_Estandar = paste0("+/- ", round(E_a, 5)),
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 = 4) %>%
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 | Error_Estandar | Confianza |
|---|---|---|---|---|---|
| Aptitud Solar Promedio Mundial | 0.6809 | 0.6820 | 0.6830 | +/- 0.00109 | 95% (Z=1.96) |
| Autor: Fernando Neira | |||||
El análisis de la Aptitud Solar mediante el Modelo Normal permitió caracterizar con precisión la viabilidad técnica de la infraestructura fotovoltaica global. Los resultados validan que la mayoría de los proyectos se sitúan en niveles de competitividad media-alta, reflejando una selección estratégica de emplazamientos optimizada por las condiciones del terreno y el recurso solar disponible.
Con un \(95\%\) de confianza, se determina que la media poblacional de la aptitud solar se sitúa en el intervalo de \([0.6809; 0.6830]\). Esta precisión, respaldada por un margen de error mínimo de \(\pm 0.00109\), garantiza un sustento estadístico sólido para optimizar la planificación y expansión del parque energético mundial basado en una media de \(0.6820\).