1 IDENTIFICACIÓN Y JUSTIFICACIÓN DE LA VARIABLE

\(Variable\) \(de\) \(Estudio\): Tipo de Aptitud Solar (Solar_aptitude_class).

Se determina que esta variable es Cualitativa Ordinal, categorizada en tres niveles jerárquicos (Baja, Media y Alta). El tipo de aptitud solar condiciona directamente la progresión energética y el diseño integral de la instalación. Debido a la estructura de las frecuencias observadas en el terreno, se opta por una Estrategia de Modelado Único:

\(Modelo\) \(Aceptado\): Distribución Binomial \(B(2, p)\) (Validado exitosamente mediante el Test de Pearson y la Prueba Chi-cuadrado \(\chi^2\), lo que demuestra que la distribución es estadísticamente coherente y confiable para el diseño del proyecto).

2 CARGA DE DATOS

suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(readxl))

Datos <- read_excel(file.choose(), sheet = "Dataset_Mundial_Final")
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 EXTRAER VARIABLE

Extraemos la variable solar_aptittude_class, omitimos las celdas en blanco y verificamos el tamaño muestral.

Solar_Vec <- factor(Datos$solar_aptittude_class, 
                    levels = c("Baja", "Media", "Alta"), 
                    ordered = TRUE)

conteo <- table(Solar_Vec)

4 TABLA DE DISTRIBUCIÓN DE FRECUENCIA

Extraemos la variable solar_aptittude_class para obtener su frecuencia absoluta (ni) y calculamos el porcentaje (hi) sobre el total. Finalmente, añadimos una Asignación jerárquica y consolidamos todo en el data frame TDF_Solar con un diseño profesional y centrado.

suppressPackageStartupMessages({
  library(gt)
  library(dplyr)
  library(readxl)
})

solar_vec <- factor(Datos$solar_aptittude_class, 
                    levels = c("Baja", "Media", "Alta"), 
                    ordered = TRUE)

conteo_raw <- table(solar_vec)
ni_val <- as.numeric(conteo_raw)
hi_val <- (ni_val / sum(ni_val)) * 100

df_solar_final <- data.frame(
  Asignacion = 1:3,
  Tipo = names(conteo_raw),
  ni = ni_val,
  hi = hi_val
)

df_solar_final %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N\u00ba 1: DISTRIBUCI\u00d3N DE FRECUENCIAS DE LA APTITUD SOLAR**"),
  ) %>%
  cols_label(
    Asignacion = "Asignaci\u00f3n", 
    Tipo = "Tipo de Aptitud Solar", 
    ni = "ni", 
    hi = "hi (%)"
  ) %>%
  fmt_number(columns = hi, decimals = 2) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.width = pct(90),              
    data_row.padding = px(12),           
    column_labels.padding = px(15),      
    table.border.top.style = "solid",
    table.border.top.color = "#2E4053",
    table.border.bottom.style = "solid",
    table.border.bottom.color = "#2E4053"
  )
TABLA Nº 1: DISTRIBUCIÓN DE FRECUENCIAS DE LA APTITUD SOLAR
Asignación Tipo de Aptitud Solar ni hi (%)
1 Baja 1892 3.21
2 Media 12791 21.69
3 Alta 44295 75.10

5 ANÁLISIS GRÁFICO

5.1 DIAGRAMA DE BARRAS

par(mar = c(5, 4, 4, 2))

barplot(df_solar_final$hi,
        main = "GRAFICO No 1: PORCENTAJE DE LA APTITUD SOLAR",
        ylab = "Porcentaje (%)",
        col = "#B0C4DE",      
        names.arg = c("1", "2", "3"), 
        las = 1,            
        cex.names = 1.0,      
        cex.axis = 0.8,     
        cex.main = 1.1,       
        ylim = c(0, max(df_solar_final$hi) + 10)) 
mtext("Tipo de Aptitud Solar", side = 1, line = 3)

6 CONJETURA DEL MODELO

Se aplicó un modelo de Distribución Binomial \(B(2, p)\) para validar la consistencia de la Aptitud Solar. A diferencia de otros modelos, el Binomial se ajusta con precisión a variables ordinales de categorías fijas, permitiendo contrastar la realidad observada frente a una tendencia teórica. El alto grado de similitud entre las barras demuestra que el potencial solar sigue una distribución probabilística coherente, fortaleciendo la validez del análisis de campo.

n_total_Solar <- sum(df_solar_final$ni)
size_binom <- 2   
X_indices <- 0:2  

media_obs <- sum(X_indices * df_solar_final$ni) / n_total_Solar
prob_p <- media_obs / size_binom

P_Binomial <- dbinom(X_indices, size = size_binom, prob = prob_p) * 100

par(mar = c(9, 4, 4, 2))
max_y <- max(max(df_solar_final$hi), max(P_Binomial))

barplot(rbind(df_solar_final$hi, P_Binomial), 
        beside = TRUE,
        main = "GR\u00c1FICO N\u00ba 2: Comparado de lo Observado frente a lo Esperado de la Aptitud Solar",
        ylab = "Porcentaje (%)",
        names.arg = c("1", "2", "2"), 
        col = c("#B0C4DE", "#AED6F1"), # Azul fuerte y Azul claro
        ylim = c(0, max_y + 25), 
        las = 1, 
        cex.names = 0.9,
        cex.main = 0.85)

legend("topright", 
       legend = c("Realidad", "Modelo"), 
       fill = c("#B0C4DE", "#AED6F1"), 
       bty = "n", cex = 0.8)

mtext("Nivel de Aptitud Solar", side = 1, line = 6)

6.1 TEST DE PEARSON

Fo_S <- df_solar_final$hi
Fe_S <- P_Binomial 

test_correlacion <- cor.test(Fo_S, Fe_S)
r_valor <- round(test_correlacion$estimate, 4)

par(mar = c(5, 5, 4, 2)) 

plot(Fo_S, Fe_S, 
     main = "GR\u00c1FICO N\u00ba 3: CORRELACI\u00d3N DEL MODELO (OBSERVADO VS. ESPERADO)",
     cex.main = 0.85,
     xlab = "Frecuencia Observada (%)", 
     ylab = "Frecuencia Esperada (%)", 
     pch = 19,           
     col = "#2E4053",    
     cex = 1.5)          

abline(lm(Fe_S ~ Fo_S), col = "red", lwd = 2)

text(x = min(Fo_S), y = max(Fe_S), 
     labels = paste("r =", r_valor), 
     pos = 4, font = 2, col = "#2E4053")

Correlacion_S <- cor(Fo_S, Fe_S) * 100

Correlacion_S
## [1] 99.8438

6.2 TEST DE CHI-CUADRADO

x2_S <- sum(((Fo_S - Fe_S)^2) / Fe_S)

gl_S <- length(Fo_S) - 1

vc_S <- qchisq(0.95, gl_S)

cat("Estad\u00edstico Chi-cuadrado (Calculado):", round(x2_S, 4), "\n")
## Estadístico Chi-cuadrado (Calculado): 1.043
cat("Valor Cr\u00edtico (Tabla):", round(vc_S, 4), "\n")
## Valor Crítico (Tabla): 5.9915
cat("\u00bfSe acepta el modelo? (Calculado < Cr\u00edtico):", x2_S < vc_S, "\n")
## ¿Se acepta el modelo? (Calculado < Crítico): TRUE

7 TABLA RESUMEN DE BONDAD DEL AJUSTE

tabla_resumen_S <- data.frame(
  Variable = "Aptitud Solar",
  Pearson = round(Correlacion_S, 2),
  Chi2    = round(x2_S, 4),
  Umbral  = round(vc_S, 2),
  Resultado = ifelse(x2_S < vc_S, "Modelo Aceptado", "Modelo Rechazado")
)

tabla_resumen_S %>% 
  gt() %>% 
  tab_header(
    title = md("**TABLA N\u00ba 2: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD**")
  ) %>%
  cols_label(
    Variable = "Variable",       
    Pearson  = "Test Pearson (%)",
    Chi2     = "Chi Cuadrado", 
    Umbral   = "Umbral de Aceptaci\u00f3n",
    Resultado = "Resultado Final"
  ) %>%
  tab_source_note(
    source_note = "Autor: Fernando Neira"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
    locations = cells_title()
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.width = pct(95),
    table.border.top.color = "#2E4053",
    table.border.bottom.color = "#2E4053",
    column_labels.border.bottom.color = "#2E4053",
    data_row.padding = px(10) 
  )
TABLA Nº 2: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado Final
Aptitud Solar 99.84 1.043 5.99 Modelo Aceptado
Autor: Fernando Neira

8 CÁLCULO DE PROBABILIDADES

  1. ¿Cuál es la probabilidad de que un punto del terreno seleccionado al azar presente una aptitud solar de nivel “Alta”?
prob_alta <- df_solar_final$hi[df_solar_final$Tipo == "Alta"]

prob_alta
## [1] 75.10428

La probabilidad de que un punto seleccionado al azar presente una aptitud solar Alta es del 75.10428%. Este valor es fundamental para el proyecto, ya que confirma la proporción del terreno que posee las condiciones óptimas de radiación para maximizar la eficiencia de los paneles fotovoltaicos.

  1. ¿Cuál es la probabilidad de encontrar zonas con restricciones de radiación (Aptitud Baja)?
prob_baja <- df_solar_final$hi[df_solar_final$Tipo == "Baja"]

prob_baja
## [1] 3.207976

La probabilidad de encontrar puntos con Aptitud Baja es apenas del 3.207976%. Este valor es excelente para el proyecto, ya que confirma que el riesgo de seleccionar un terreno con baja eficiencia energética es mínimo, asegurando que la mayor parte del área es técnicamente aprovechable.

9 CONCLUSIÓN

El análisis modeló la Aptitud Solar mediante una distribución binomial, confirmando un predominio de zonas con alto potencial energético. Las pruebas de bondad de ajuste validaron la coherencia entre los datos observados y el modelo teórico, brindando un respaldo estadístico sólido para la zonificación técnica del proyecto.