1 Identificación y Justificación de la Variable

\(Variable\) \(de\) \(Estudio\): Humedad (%).

Variable Cuantitativa Continua con dominio \(D=\{x \in \mathbb{R} \mid 0 \leq x \leq 95\}\). Debido a su comportamiento unimodal, se aplica un Modelo de Distribución Normal global.

\(Estrategia\) \(Inferencial\):

  1. Validación: Se utiliza el Coeficiente de Pearson (\(R\)) y Chi-Cuadrado (\(\chi^2\)). El ajuste de \(86.76\)% valida el modelo para proyecciones operativas.

  2. Estimación: Mediante el Teorema del Límite Central (TLC), se estima la media poblacional con un \(95\)% de confianza.

  3. Precisión: El análisis arroja un intervalo de [\(66.80\)%; \(66.99\)%], lo que permite estandarizar criterios técnicos con un margen de error mínimo (\(\pm 0.09\)).

2 Configuración y Carga de datos

##### 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 ...

3 Tabla de Distribución de Frecuencias

Se aplica la Regla de Sturges para organizar sistemáticamente la variabilidad atmosférica, utilizando intervalos de 10% para facilitar la interpretación técnica en ingeniería.

# CÁLCULO PARA TABLA HUMEDAD
BASE <- 10
hum_variable <- Datos$humidity  # Asegúrate de que el nombre coincida con tu dataframe

n_total <- length(hum_variable)
min_int <- floor(min(hum_variable, na.rm = TRUE) / BASE) * BASE
max_int <- ceiling(max(hum_variable, na.rm = TRUE) / BASE) * BASE
cortes_int <- seq(from = min_int, to = max_int, by = BASE)

K_int <- length(cortes_int) - 1
ni_int <- as.vector(table(cut(hum_variable, breaks = cortes_int, include.lowest = TRUE, right = FALSE)))
hi_int <- (ni_int / n_total) * 100

df_tabla_hum <- data.frame(
  Li = cortes_int[1:K_int], 
  Ls = cortes_int[2:(K_int+1)],
  MC = (cortes_int[1:K_int] + cortes_int[2:(K_int+1)]) / 2,
  ni = ni_int, 
  hi = hi_int,
  Ni_asc = cumsum(ni_int), 
  Ni_desc = rev(cumsum(rev(ni_int))),
  Hi_asc = cumsum(hi_int), 
  Hi_desc = rev(cumsum(rev(hi_int)))
)

df_tabla_hum %>%
  mutate(across(everything(), ~as.character(round(as.numeric(.), 2)))) %>%
  rbind(c("TOTAL", "-", "-", n_total, "100", "-", "-", "-", "-")) %>%
  gt() %>%
  tab_header(title = md("**Tabla N°2 de Distribución de Frecuencias de Humedad (%) 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°2 de Distribución de Frecuencias de Humedad (%) de las Plantas Solares
Lim. Inf Lim. Sup Marca Clase ni hi (%) Ni ↑ Ni ↓ Hi ↑ Hi ↓
0 10 5 3 0.01 3 58978 0.01 100
10 20 15 99 0.17 102 58975 0.17 99.99
20 30 25 921 1.56 1023 58876 1.73 99.83
30 40 35 1343 2.28 2366 57955 4.01 98.27
40 50 45 2805 4.76 5171 56612 8.77 95.99
50 60 55 7116 12.07 12287 53807 20.83 91.23
60 70 65 16357 27.73 28644 46691 48.57 79.17
70 80 75 27383 46.43 56027 30334 95 51.43
80 90 85 2945 4.99 58972 2951 99.99 5
90 100 95 6 0.01 58978 6 100 0.01
TOTAL - - 58978 100 - - - -
Autor: Fernando Neira

4 Análisis Gráfico

Se ajusta el diseño de barras para visualizar la distribución unimodal, destacando la alta concentración de proyectos en el rango de humedad moderada-alta.

4.1 Histograma de Frecuencia

# Configuración de márgenes profesionales
par(mar = c(8, 6, 5, 2)) 

# Generación del gráfico con ajuste dinámico de ylim basándose en df_tabla_hum
posiciones <- barplot(df_tabla_hum$hi, 
                      names.arg = df_tabla_hum$MC,
                      col = "#B0C4DE", 
                      border = "black", 
                      # El factor 1.3 asegura espacio para la leyenda y títulos superiores
                      ylim = c(0, max(df_tabla_hum$hi) * 1.3), 
                      space = 0, 
                      axes = FALSE, 
                      las = 2, 
                      cex.names = 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 con posicionamiento corregido
mtext("Porcentaje (%)", side = 2, line = 4, cex = 1, font = 1)
mtext("Humedad (%)", side = 1, line = 4, cex = 1)
mtext("Gráfica N°2: Distribución Porcentual de las Plantas Solares por Humedad", 
      side = 3, line = 2, adj = 0.5, cex = 1.1, font = 2)

# Leyenda Técnica (ajustada sin los cortes estratégicos)
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)

5 Conjetura del Modelo

Se ajusta un Modelo Normal debido a que los datos se distribuyen de forma equilibrada alrededor de un valor central (\(\approx 67\%\)), reflejando las condiciones ambientales moderadas y predominantes en las regiones donde se concentra la mayor infraestructura fotovoltaica a nivel mundial.

# 1. Preparación de datos 
mu_hum <- mean(Datos$humidity, na.rm = TRUE)
sd_hum <- sd(Datos$humidity, na.rm = TRUE)
n_total <- length(Datos$humidity)

# 2. Configuración de márgenes
par(mar = c(8, 6, 5, 2))

# 3. Generación del histograma base 
cortes <- seq(0, 100, by = 10)
h_hum <- hist(Datos$humidity, breaks = cortes, plot = FALSE)

# Convertir frecuencias absolutas a porcentajes (%)
h_hum$counts <- (h_hum$counts / n_total) * 100

# 4. Preparación de la curva normal
x_curva <- seq(0, 100, length.out = 100)
# Ajustamos la densidad normal al ancho del intervalo (10) y al porcentaje (100)
y_curva <- dnorm(x_curva, mean = mu_hum, sd = sd_hum) * 10 * 100

# Definir el límite superior del eje Y con margen para la leyenda
y_max <- max(c(h_hum$counts, y_curva)) * 1.3

# 5. Generación del Gráfico
plot(h_hum, 
     main = "Gráfica N°3: Distribución de Humedad (Modelo Normal)", 
     xlab = "Humedad (%)", 
     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
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("Humedad Observada", "Modelo Normal (Conjetura)"), 
       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)

5.1 Test de Pearson y Chi-Cuadrado

# 1. Parámetros base
mu_h <- mean(Datos$humidity, na.rm = TRUE)
sd_h <- sd(Datos$humidity, na.rm = TRUE)
n_total <- sum(!is.na(Datos$humidity))
breaks_h <- seq(0, 100, by = 10)
K_h <- length(breaks_h) - 1

# 2. Frecuencias (Base 100)
probs_h <- diff(pnorm(breaks_h, mu_h, sd_h))
probs_h <- probs_h / sum(probs_h)

n_base <- 100
Fo_h <- as.vector(table(cut(Datos$humidity, breaks = breaks_h, right = FALSE))) * (n_base / n_total)
Fe_h <- probs_h * n_base

# 3. Estadísticos
chi_h  <- sum((Fo_h - Fe_h)^2 / Fe_h)
pear_h <- cor(Fo_h, Fe_h) * 100

# 4. Determinación del Estado 
res_h <- if(pear_h > 80) "APROBADO" else "RECHAZADO"

# IMPRESIÓN EN CONSOLA 
cat("RESULTADOS:\n")
## RESULTADOS:
cat("Test Pearson:", round(pear_h, 2), "%\n")
## Test Pearson: 86.76 %
cat("Chi-Cuadrado:", round(chi_h, 2), "\n")
## Chi-Cuadrado: 66.7
cat("Estado de Validación:", res_h, "\n")
## Estado de Validación: APROBADO

6 Tabla Resumen de Bondad de Ajuste

Se ajusta un Modelo Normal debido a que los datos de humedad 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 \(86.76\)% confirma la forma de la campana, mientras que el Chi-Cuadrado (\(\chi^2\)) de \(66.7\) valida el ajuste de las frecuencias en base 100.

library(gt)
library(dplyr)

# 1. Crear dataframe para la tabla con los nombres solicitados
resumen_ajuste_hum <- data.frame(
  "Variable" = "Humedad (%)", 
  "Modelo_Aplicado" = "Distribución Normal",
  "Pearson_R" = pear_h,
  "Chi_Sq" = chi_h,
  "Estado" = res_h
)

# 2. Formato de la tabla
resumen_ajuste_hum %>%
  gt() %>%
  tab_header(title = md("**Tabla N°3 de Resumen de Validación de Humedad**")) %>%
  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°3 de Resumen de Validación de Humedad
Variable Modelo de Ajuste Test Pearson (%) Chi-Cuadrado (X²) Validación
Humedad (%) Distribución Normal 86.76 66.70 APROBADO
Autor: Fernando Neira

7 Cálculo de Probabilidades

\(Pregunta\) \(1\): ¿Cuál es la probabilidad de que una planta se sitúe en la franja óptima entre \(60\)% y \(80\)%?

\(Pregunta\) \(2\): En una cartera de \(200\) proyectos, ¿cuántos se estiman en este rango?

# 1. Parámetros del modelo (usando el objeto Datos)
mu_h <- mean(Datos$humidity, na.rm = TRUE)
sd_h <- sd(Datos$humidity, na.rm = TRUE)

# 2. Cálculo de Probabilidades
# Probabilidad de estar entre 60% y 80%
prob_optima <- pnorm(80, mu_h, sd_h) - pnorm(60, mu_h, sd_h)
proyectos_200 <- round(prob_optima * 200)

# 3. Configuración de márgenes y gráfico
par(mar = c(6, 8, 4, 2))

# Generación de la curva normal
x_h <- seq(20, 100, length.out = 500)
y_vals <- dnorm(x_h, mu_h, sd_h)
y_max <- max(y_vals) * 1.2

plot(x_h, y_vals, type = "n", axes = FALSE, 
     main = "Gráfica N°5: Zonas de Probabilidad de Humedad (Modelo Normal)", 
     xlab = "Humedad (%)", ylab = "", 
     ylim = c(0, y_max))

# Sombreado del área de interés (60% - 80%)
x_area <- seq(60, 80, length.out = 100)
y_area <- dnorm(x_area, mu_h, sd_h)
polygon(c(60, x_area, 80), c(0, y_area, 0), col = "#7FB3D5", border = NA)

# Línea del modelo
lines(x_h, 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 (Humedad)", 
                  paste0("Zona Óptima (", round(prob_optima * 100, 2), "%)")), 
       col = c("#C0392B", "#7FB3D5"), 
       lwd = c(4, 10), 
       bty = "n", 
       cex = 0.8)

\(Respuesta\) \(1\): Existe una probabilidad del \(59.29\)% de que cualquier planta solar del dataset opere en condiciones de humedad de entre el \(60\)% y el \(80\)%. Esto confirma que la mayoría de los activos están sujetos a niveles de humedad medio-altos.

\(Respuesta\) \(2\): Si se planificara una expansión de \(200\) proyectos nuevos, el modelo proyecta que aproximadamente \(119\) de ellos se ubicarán dentro de esta franja de incidencia.

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}}\]

# 1. ESTADÍSTICOS BÁSICOS (Humedad)
x_bar <- mean(Datos$humidity, na.rm = TRUE)
sigma <- sd(Datos$humidity, na.rm = TRUE)
n_total <- sum(!is.na(Datos$humidity))

# 2. CÁLCULO DEL ERROR Y MARGEN (E) AL 95%
# Basado en la fórmula del PDF: E = Z * (sigma / sqrt(n))
E <- 1.96 * (sigma / sqrt(n_total))

# 3. CONSTRUCCIÓN DE LA TABLA CON GT
library(gt)
library(dplyr)

data.frame(
  Parametro = "Humedad Promedio Mundial (%)",
  Lim_Inferior = x_bar - E,
  Media_Muestral = x_bar,
  Lim_Superior = x_bar + E,
  Error_Estandar = paste0("+/- ", round(E, 4)),
  Confianza = "95% (Z=1.96)"
) %>% 
  gt() %>%
  tab_header(
    title = md("**Tabla N°4 de Estimación de la Media Poblacional (TLC)**")
  ) %>%
  tab_source_note(source_note = "Autor: Fernando Neira") %>%
  fmt_number(columns = 2:4, decimals = 3) %>%
  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°4 de Estimación de la Media Poblacional (TLC)
Parametro Lim_Inferior Media_Muestral Lim_Superior Error_Estandar Confianza
Humedad Promedio Mundial (%) 66.804 66.898 66.992 +/- 0.094 95% (Z=1.96)
Autor: Fernando Neira

9 Conclusión

El análisis de la Humedad mediante el Modelo Normal permitió caracterizar con precisión el entorno operativo de la infraestructura solar global. Los resultados validan que la mayoría de los proyectos operan bajo condiciones de humedad moderada-alta, estabilizadas por los patrones climáticos de las zonas de mayor inversión.

Con un \(95\)% de confianza, se determina que la media poblacional de humedad se sitúa en el intervalo de [\(66.804\)%; \(66.992\)%]. Esta precisión, respaldada por un margen de error mínimo de \(\pm\) \(0.094\), garantiza un sustento estadístico sólido para optimizar el mantenimiento y la protección del parque energético mundial basado en una media de \(66.89\)%.