1 IDENTIFICACIÓN Y JUSTIFICACIÓN DE LA VARIABLE

\(Variable\) \(de\) \(Estudio\): Orientación de Ladera (aspect_type).

Se determina que esta variable es Cualitativa Ordinal, categorizada en nueve niveles direccionales (desde North hasta Flat). La orientación del terreno condiciona directamente la captación de radiación solar y el diseño óptimo de la instalación. Debido a la concentración natural de los emplazamientos hacia orientaciones favorables, se opta por una Estrategia de Modelado Único:

\(Modelo Aceptado\): Distribución Normal (Validado mediante Test de Pearson, lo que permite una planificación segura y optimizada 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 aspect_type, omitimos las celdas en blanco y verificamos el tamaño muestral.

Aspect_Vec <- factor(Datos$aspect_type, 
                    levels = c("North", "Northeast", "East", "Southeast", "South", "Southwest", "West", "Northwest", "Flat"), 
                    ordered = TRUE)
conteo_aspecto <- table(Aspect_Vec)

4 TABLA DE DISTRIBUCIÓN DE FRECUENCIA

Extraemos la variable size 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)
})
aspect_levels <- c("North", "Northeast", "East", "Southeast", 
                   "South", "Southwest", "West", "Northwest", "Flat")

aspect_vec <- factor(Datos$aspect_type, 
                    levels = aspect_levels, 
                    ordered = TRUE)

conteo_aspect_raw <- table(aspect_vec)
ni_aspect_val <- as.numeric(conteo_aspect_raw)
hi_aspect_val <- (ni_aspect_val / sum(ni_aspect_val)) * 100

df_aspect_final <- data.frame(
  Asignacion = 1:9,
  Orientacion = names(conteo_aspect_raw),
  ni = ni_aspect_val,
  hi = hi_aspect_val
)

df_aspect_final %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N\u00ba 1: DISTRIBUCI\u00d3N DE FRECUENCIAS DE LA ORIENTACI\u00d3N DE LADERA**"),
  ) %>%
  cols_label(
    Asignacion = "Asignaci\u00f3n", 
    Orientacion = "Orientaci\u00f3n (Aspect)", 
    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 ORIENTACIÓN DE LADERA
Asignación Orientación (Aspect) ni hi (%)
1 North 4906 8.32
2 Northeast 6981 11.84
3 East 8270 14.02
4 Southeast 8051 13.65
5 South 8335 14.13
6 Southwest 7733 13.11
7 West 7645 12.96
8 Northwest 5952 10.09
9 Flat 1105 1.87

5 ANÁLISIS GRÁFICO

5.1 DIAGRAMA DE BARRAS

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

barplot(df_aspect_final$hi,
        main = "GRAFICO No 1: PORCENTAJE DE LA ORIENTACION DE LADERA",
        ylab = "Porcentaje (%)",
        col = "#B0C4DE",      # Azul profesional
        # Nombres de las categorias (ajustados para las 9 barritas)
        names.arg = c("1", "2", "3", "4", "5", "6", "7", "8", "9"), 
        las = 1,              
        cex.names = 0.8,      
        cex.axis = 0.8,       
        cex.main = 0.9,       
        ylim = c(0, max(df_aspect_final$hi) + 10)) 

mtext("Orientacion (Aspect)", side = 1, line = 8)

6 CONJETURA DEL MODELO

Se eligió el modelo normal porque la orientación del terreno tiende a concentrarse en direcciones más frecuentes (como el Sur y el Este) y disminuye gradualmente hacia las demás. Este comportamiento forma una curva de campana que refleja perfectamente la distribución natural y simétrica del relieve topográfico.

X_indices_aspect <- 1:9
n_total_aspect <- sum(df_aspect_final$ni)

media_obs_aspect <- sum(X_indices_aspect * df_aspect_final$ni) / n_total_aspect
sd_obs_aspect <- sd(rep(X_indices_aspect, df_aspect_final$ni))

P_Normal_raw <- dnorm(X_indices_aspect, mean = media_obs_aspect, sd = sd_obs_aspect)
P_Normal_Aspect <- (P_Normal_raw / sum(P_Normal_raw)) * 100

par(mar = c(9, 4, 4, 2))
max_y_aspect <- max(max(df_aspect_final$hi), max(P_Normal_Aspect))

barplot(rbind(df_aspect_final$hi, P_Normal_Aspect), 
        beside = TRUE,
        main = "GRAFICO No 2: Comparado de lo Observado frente a lo Esperado (Normal)",
        ylab = "Porcentaje (%)",
        names.arg = c("1", "2", "3", "4", "5", "6", "7", "8", "9"), 
        col = c("#B0C4DE", "#5DADE2"), 
        ylim = c(0, max_y_aspect + 20), 
        las = 1, 
        cex.names = 0.8,
        cex.main = 0.85)

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

mtext("Orientacion (Aspect Type)", side = 1, line = 7)

6.1 TEST DE PEARSON

Fo_Aspect <- df_aspect_final$hi
Fe_Aspect <- P_Normal_Aspect 

test_correlacion_aspect <- cor.test(Fo_Aspect, Fe_Aspect)
r_valor_aspect <- round(test_correlacion_aspect$estimate, 4)

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

plot(Fo_Aspect, Fe_Aspect, 
     main = "GRAFICO No 3: CORRELACION DEL MODELO NORMAL (ORIENTACION)",
     cex.main = 0.85,
     xlab = "Frecuencia Observada (%)", 
     ylab = "Frecuencia Esperada (%)", 
     pch = 19,            
     col = "#2E4053",    
     cex = 1.5)          

abline(lm(Fe_Aspect ~ Fo_Aspect), col = "red", lwd = 2)

text(x = min(Fo_Aspect), y = max(Fe_Aspect), 
     labels = paste("r =", r_valor_aspect), 
     pos = 4, font = 2, col = "#2E4053")

Correlacion_Aspect_Normal <- cor(Fo_Aspect, Fe_Aspect) * 100

Correlacion_Aspect_Normal
## [1] 83.92916

6.2 TEST DE CHI-CUADRADO

x2_Aspect_Normal <- sum(((Fo_Aspect - P_Normal_Aspect)^2) / P_Normal_Aspect)

gl_Aspect <- length(Fo_Aspect) - 1

vc_Aspect <- qchisq(0.95, gl_Aspect)

cat("Estadistico Chi-cuadrado (Calculado):", round(x2_Aspect_Normal, 4), "\n")
## Estadistico Chi-cuadrado (Calculado): 9.7192
cat("Valor Critico (Tabla):", round(vc_Aspect, 4), "\n")
## Valor Critico (Tabla): 15.5073
cat("¿Se acepta el modelo Normal? (Calculado < Critico):", x2_Aspect_Normal < vc_Aspect, "\n")
## ¿Se acepta el modelo Normal? (Calculado < Critico): TRUE

7 TABLA RESUMEN DE BONDAD DEL AJUSTE

tabla_resumen_Aspect <- data.frame(
  Variable = "Orientacion de Ladera",
  Pearson = round(Correlacion_Aspect_Normal, 2),
  Chi2    = round(x2_Aspect_Normal, 4),
  Umbral  = round(vc_Aspect, 2),
  Resultado = ifelse(x2_Aspect_Normal < vc_Aspect, "Modelo Aceptado", "Modelo Rechazado")
)

library(gt)
library(dplyr)

tabla_resumen_Aspect %>% 
  gt() %>% 
  tab_header(
    title = md("**TABLA No 2: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD (ORIENTACION)**")
  ) %>%
  cols_label(
    Variable = "Variable",       
    Pearson  = "Test Pearson (%)",
    Chi2     = "Chi Cuadrado", 
    Umbral   = "Umbral de Aceptacion",
    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 No 2: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD (ORIENTACION)
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptacion Resultado Final
Orientacion de Ladera 83.93 9.7192 15.51 Modelo Aceptado
Autor: Fernando Neira

8 CÁLCULO DE PROBABILIDADES

  1. ¿Cuál es la probabilidad de que un punto seleccionado al azar presente una orientación óptima hacia el “South” (Sur)?
prob_sur <- df_aspect_final$hi[df_aspect_final$Orientacion == "South"]

prob_sur
## [1] 14.13239

La probabilidad de encontrar un terreno orientado al Sur es de aproximadamente \(14.13\)%. Este dato es fundamental para la ingeniería del proyecto solar, ya que en gran parte del mundo (especialmente en el hemisferio norte), esta orientación garantiza la máxima captación de radiación solar directa a lo largo del día, optimizando la generación de energía.

  1. ¿Cuál es la probabilidad de que un punto seleccionado al azar presente una orientación completamente plana (“Flat”)?
prob_flat <- df_aspect_final$hi[df_aspect_final$Orientacion == "Flat"]

prob_flat
## [1] 1.87358

La probabilidad de encontrar un terreno completamente plano es del \(1.87\)%. Aunque son escasos, estos terrenos son los más valiosos para la ingeniería, ya que permiten instalar seguidores solares y orientar los paneles libremente sin las restricciones topográficas del relieve.

9 CONCLUSIÓN

El modelo normal y el coeficiente de Pearson confirman la predominancia de orientaciones favorables (Sur, Este y Sureste). Esto brinda un respaldo estadístico sólido para el diseño de la planta, garantizando una óptima captación de radiación solar a pesar de la variabilidad natural del terreno.