1 Identificación y Justificación de la Variable

\(Variable\) \(de\) \(Estudio\): Temperatura Ambiente (°C).

Variable Cuantitativa Continua con dominio \(D=\{x \in \mathbb{R} \mid -17.06 \leq x \leq 30.34\}\). 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 \(94.64\)% valida el modelo para proyecciones operativas con una alta precisión.

  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 [\(14.55\)°C; \(14.64\)°C], lo que permite estandarizar criterios técnicos con un margen de error mínimo (\(\pm 0.047\)).

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 térmica, utilizando intervalos definidos estadísticamente para facilitar la interpretación técnica de las condiciones atmosféricas y su impacto en el rendimiento de la ingeniería.

library(dplyr)
library(gt)

BASE <- 5
temp_variable <- Datos$ambient_temperature

n_total <- length(temp_variable)
min_int <- floor(min(temp_variable, na.rm = TRUE) / BASE) * BASE
max_int <- ceiling(max(temp_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(temp_variable, breaks = cortes_int, include.lowest = TRUE, right = FALSE)))
hi_int <- (ni_int / n_total) * 100

df_tabla_temp <- 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_temp %>%
  mutate(across(everything(), ~as.character(round(as.numeric(.), 2)))) %>%
  rbind(c("TOTAL", "-", "-", n_total, "100", "-", "-", "-", "-")) %>%
  gt() %>%
  tab_header(title = md("**Tabla N°1 de Distribución de Frecuencias de Temperatura Ambiente (°C) 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 Temperatura Ambiente (°C) de las Plantas Solares
Lim. Inf Lim. Sup Marca Clase ni hi (%) Ni ↑ Ni ↓ Hi ↑ Hi ↓
-20 -15 -17.5 1 0 1 58978 0 100
-15 -10 -12.5 0 0 1 58977 0 100
-10 -5 -7.5 13 0.02 14 58977 0.02 100
-5 0 -2.5 90 0.15 104 58964 0.18 99.98
0 5 2.5 882 1.5 986 58874 1.67 99.82
5 10 7.5 12395 21.02 13381 57992 22.69 98.33
10 15 12.5 21373 36.24 34754 45597 58.93 77.31
15 20 17.5 14272 24.2 49026 24224 83.13 41.07
20 25 22.5 4315 7.32 53341 9952 90.44 16.87
25 30 27.5 5631 9.55 58972 5637 99.99 9.56
30 35 32.5 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 mostrar una tendencia clara: la mayoría de las plantas solares operan en climas templados, con temperaturas concentradas principalmente entre los \(10^\circ C\) y \(18^\circ C\). ## 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 basándose en df_tabla_temp
posiciones <- barplot(df_tabla_temp$hi, 
                      names.arg = df_tabla_temp$MC,
                      col = "#B0C4DE", 
                      border = "black", 
                      ylim = c(0, max(df_tabla_temp$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("Temperatura Ambiente (°C)", side = 1, line = 4, cex = 1)
mtext("Gráfica N°1: Distribución Porcentual de las Plantas Solares por Temperatura Ambiente", 
      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)

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 14.6^\circ C\)), reflejando las condiciones térmicas templadas y predominantes en las regiones donde se concentra la mayor infraestructura fotovoltaica a nivel mundial.

# 1. Preparación de datos 
mu_temp <- mean(Datos$ambient_temperature, na.rm = TRUE)
sd_temp <- sd(Datos$ambient_temperature, na.rm = TRUE)
n_total <- length(Datos$ambient_temperature)

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

# 3. Generación del histograma base 
# Usamos un ancho de clase de 5 para la temperatura
cortes <- seq(floor(min(Datos$ambient_temperature, na.rm = TRUE)/5)*5, 
              ceiling(max(Datos$ambient_temperature, na.rm = TRUE)/5)*5, by = 5)
h_temp <- hist(Datos$ambient_temperature, breaks = cortes, plot = FALSE)

# Convertir frecuencias absolutas a porcentajes (%)
h_temp$counts <- (h_temp$counts / n_total) * 100
ancho_clase <- diff(cortes)[1]

# 4. Preparación de la curva normal
x_curva <- seq(min(cortes), max(cortes), length.out = 100)
y_curva <- dnorm(x_curva, mean = mu_temp, sd = sd_temp) * ancho_clase * 100

y_max <- max(c(h_temp$counts, y_curva)) * 1.3

# 5. Generación del Gráfico
plot(h_temp, 
     main = "Gráfica N°2: Distribución de Temperatura Ambiente (Modelo Normal)", 
     xlab = "Temperatura Ambiente (°C)", 
     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("topright", 
       legend = c("Temp. 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)

5.1 Test de Pearson y Chi-Cuadrado

# 1. Parámetros base para Temperatura Ambiente
mu_t <- mean(Datos$ambient_temperature, na.rm = TRUE)
sd_t <- sd(Datos$ambient_temperature, na.rm = TRUE)
n_total <- sum(!is.na(Datos$ambient_temperature))

# Definición de intervalos basados en el rango de temperatura (pasos de 5°C)
min_t <- floor(min(Datos$ambient_temperature, na.rm = TRUE) / 5) * 5
max_t <- ceiling(max(Datos$ambient_temperature, na.rm = TRUE) / 5) * 5
breaks_t <- seq(min_t, max_t, by = 5)
K_t <- length(breaks_t) - 1

# 2. Frecuencias (Base 100)
probs_t <- diff(pnorm(breaks_t, mu_t, sd_t))
probs_t <- probs_t / sum(probs_t) # Normalización de probabilidades

n_base <- 100
Fo_t <- as.vector(table(cut(Datos$ambient_temperature, breaks = breaks_t, right = FALSE))) * (n_base / n_total)
Fe_t <- probs_t * n_base

# 3. Estadísticos de Validación
chi_t  <- sum((Fo_t - Fe_t)^2 / Fe_t, na.rm = TRUE)
pear_t <- cor(Fo_t, Fe_t) * 100

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

# IMPRESIÓN EN CONSOLA 
cat("RESULTADOS VALIDACIÓN TEMPERATURA:\n")
## RESULTADOS VALIDACIÓN TEMPERATURA:
cat("Test Pearson:", round(pear_t, 2), "%\n")
## Test Pearson: 94.64 %
cat("Chi-Cuadrado:", round(chi_t, 2), "\n")
## Chi-Cuadrado: 21.4
cat("Estado de Validación:", res_t, "\n")
## Estado de Validación: APROBADO

6 Tabla Resumen de Bondad de Ajuste

Se ajusta un Modelo Normal debido a que los datos de temperatura se distribuyen de forma equilibrada alrededor de los promedios globales (\(14.59^\circ C\)). La validación se apoya en un análisis dual: el Coeficiente de Pearson (\(R\)) de \(94.64\)% confirma la forma de la campana, mientras que el Chi-Cuadrado (\(\chi^2\)) de \(21.40\) valida el ajuste de las frecuencias en base 100.

library(gt)
library(dplyr)

# 1. Crear dataframe para la tabla con los resultados de temperatura
resumen_ajuste_temp <- data.frame(
  "Variable" = "Temperatura Ambiente (°C)", 
  "Modelo_Aplicado" = "Distribución Normal",
  "Pearson_R" = pear_t,
  "Chi_Sq" = chi_t,
  "Estado" = res_t
)

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

7 Cálculo de Probabilidades

\(Pregunta\) \(1\): ¿Cuál es la probabilidad de que una planta se sitúe en el rango templado entre \(10^\circ C\) y \(20^\circ C\)?

\(Pregunta\) \(2\): En una cartera de \(200\) proyectos, ¿cuántos se estiman que operarán bajo estas condiciones térmicas?

mu_t <- mean(Datos$ambient_temperature, na.rm = TRUE)
sd_t <- sd(Datos$ambient_temperature, na.rm = TRUE)

prob_optima <- pnorm(20, mu_t, sd_t) - pnorm(10, mu_t, sd_t)
proyectos_200 <- round(prob_optima * 200)

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

x_t <- seq(min(Datos$ambient_temperature, na.rm = TRUE) - 5, 
           max(Datos$ambient_temperature, na.rm = TRUE) + 5, length.out = 500)
y_vals <- dnorm(x_t, mu_t, sd_t)
y_max <- max(y_vals) * 1.2

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

x_area <- seq(10, 20, length.out = 100)
y_area <- dnorm(x_area, mu_t, sd_t)
polygon(c(10, x_area, 20), c(0, y_area, 0), col = "#7FB3D5", border = NA)

lines(x_t, y_vals, col = "#C0392B", lwd = 4)

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)

legend("topleft", 
       legend = c("Modelo Normal (Temp)", 
                  paste0("Rango 10°C - 20°C (", round(prob_optima * 100, 2), "%)")), 
       col = c("#C0392B", "#7FB3D5"), 
       lwd = c(4, 10), 
       bty = "n", 
       cex = 0.8)

\(Respuesta\) \(1\): Existe una probabilidad del \(61.26\)% de que cualquier planta solar del dataset opere en condiciones de temperatura ambiente de entre \(10^\circ C\) y \(20^\circ C\). Esto confirma que la mayoría de los activos están sujetos a niveles térmicos templados y operativos.

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

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 (Temperatura Ambiente)
x_bar_t <- mean(Datos$ambient_temperature, na.rm = TRUE)
sigma_t <- sd(Datos$ambient_temperature, na.rm = TRUE)
n_total <- sum(!is.na(Datos$ambient_temperature))

# 2. CÁLCULO DEL ERROR Y MARGEN (E) AL 95%
# E = Z * (sigma / sqrt(n))
E_t <- 1.96 * (sigma_t / sqrt(n_total))

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

data.frame(
  Parametro = "Temperatura Promedio Mundial (°C)",
  Lim_Inferior = x_bar_t - E_t,
  Media_Muestral = x_bar_t,
  Lim_Superior = x_bar_t + E_t,
  Error_Estandar = paste0("+/- ", round(E_t, 4)),
  Confianza = "95% (Z=1.96)"
) %>% 
  gt() %>%
  tab_header(
    title = md("**Tabla N°3: Estimación de la Media Poblacional de Temperatura (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°3: Estimación de la Media Poblacional de Temperatura (TLC)
Parametro Lim_Inferior Media_Muestral Lim_Superior Error_Estandar Confianza
Temperatura Promedio Mundial (°C) 14.546 14.593 14.639 +/- 0.0466 95% (Z=1.96)
Autor: Fernando Neira

9 Conclusión

El análisis de la Temperatura Ambiente 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 térmicas templadas, estabilizadas por los patrones climáticos de las zonas de mayor inversión fotovoltaica.

Con un \(95\)% de confianza, se determina que la media poblacional de temperatura se sitúa en el intervalo de [\(14.546^\circ C\); \(14.639^\circ C\)]. Esta precisión, respaldada por un margen de error mínimo de \(\pm 0.0466\), garantiza un sustento estadístico sólido para optimizar el diseño, la refrigeración y la eficiencia del parque energético mundial basado en una media de \(14.593^\circ C\).