1 IDENTIFICACIÓN Y JUSTIFICACIÓN DE LA VARIABLE

Variable de Estudio: Orientación de Ladera (Aspect_type)

Es una variable Cualitativa Ordinal, categorizada en: North (1), Northeast (2), East (3), Southeast (4), South (5), Southwest (6), West (7), Northwest (8) y Flat (9).

Procesamiento: Se utilizaron las frecuencias y una escala numérica para facilitar el análisis gráfico y la caracterización técnica del terreno.

Modelado y Validación: Se aplicó una Distribución Normal. El Test de Pearson confirmó que el modelo es coherente y confiable, lo que permite una planificación segura para optimizar el diseño y la captación de radiación solar.

2 CARGA DE DATOS

# 1. CARGA DE LIBRERÍAS (Silenciadas para el informe)
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(readxl))

# 2. CARGAR EL ARCHIVO
# Mantenemos tu ruta original
Datos <- read_excel(file.choose(), sheet = "Dataset_Mundial_Final")
# 3. VERIFICAR 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 EXTRAER VARIABLE

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

# 1. Extraemos la columna y definimos el orden lógico (Ordinal)
# Usamos el nombre exacto de tu variable: aspect_type
Aspect_Vec <- factor(Datos$aspect_type, 
                    levels = c("North", "Northeast", "East", "Southeast", "South", "Southwest", "West", "Northwest", "Flat"), 
                    ordered = TRUE)

# 2. Creamos el conteo (ni)
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.

# 1. CARGA DE LIBRERÍAS (Silenciadas)
suppressPackageStartupMessages({
  library(gt)
  library(dplyr)
  library(readxl)
})

# 2. PREPARACIÓN DE LA VARIABLE ORDINAL
# Ajustamos los niveles exactos para las 9 categorías de aspect_type
aspect_levels <- c("North", "Northeast", "East", "Southeast", 
                   "South", "Southwest", "West", "Northwest", "Flat")

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

# 3. CONSTRUCCIÓN DE LA DATA (ni y hi)
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
)

# 4. GENERACIÓN DE LA TABLA GT (Diseño Idéntico)
df_aspect_final %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N\u00ba 3: 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()) %>%
  # Estilo de encabezados (Gris claro y negrita)
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  # Opciones de diseño para consistencia visual
  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º 3: 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

# 1. Configuracion de margenes (espacio para las etiquetas verticales largas)
par(mar = c(10, 4, 4, 2))

# 2. Creacion del grafico de barras para la variable aspect_type
# Usamos df_aspect_final que creamos en el paso anterior
barplot(df_aspect_final$hi,
        main = "GRAFICO No 3: 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,              # Etiquetas horizontales para el eje Y
        cex.names = 0.8,      # Tamano de las etiquetas
        cex.axis = 0.8,       # Tamano de los numeros del eje Y
        cex.main = 0.9,       # Tamano del titulo principal
        ylim = c(0, max(df_aspect_final$hi) + 10)) # Espacio extra arriba

# 3. Titulo del eje horizontal
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.

# 1. PARÁMETROS DEL MODELO NORMAL
# Mapeo: 1 a 9 para las 9 categorías
X_indices_aspect <- 1:9
n_total_aspect <- sum(df_aspect_final$ni)

# 2. CÁLCULO DE MEDIA Y DESVIACIÓN ESTÁNDAR (Observadas)
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))

# 3. CÁLCULO DEL MODELO (Lo esperado usando dnorm)
# Calculamos la densidad normal y normalizamos para que sume 100%
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

# 4. GRÁFICA COMPARATIVA "PRIME"
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 4: 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)

7 TEST DE PEARSON

# 1. DEFINICIÓN DE VARIABLES PARA EL TEST
Fo_Aspect <- df_aspect_final$hi
Fe_Aspect <- P_Normal_Aspect 

# 2. CÁLCULO DEL TEST DE PEARSON
test_correlacion_aspect <- cor.test(Fo_Aspect, Fe_Aspect)
r_valor_aspect <- round(test_correlacion_aspect$estimate, 4)

# 3. GRÁFICA DE CORRELACIÓN
par(mar = c(5, 5, 4, 2)) 

plot(Fo_Aspect, Fe_Aspect, 
     main = "GRAFICO No 5: 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")

# 1. CÁLCULO DE LA CORRELACIÓN (Escala 0-100)
# Fo_Aspect: Datos reales (hi) | Fe_Aspect: Modelo (Normal)
# Nota: Fe_Aspect es P_Normal_Aspect del paso anterior
Correlacion_Aspect_Normal <- cor(Fo_Aspect, Fe_Aspect) * 100

# 2. MOSTRAR EL RESULTADO
Correlacion_Aspect_Normal
## [1] 83.92916

7.1 TEST DE CHI-CUADRADO

# 1. CÁLCULO DEL ESTADÍSTICO CHI-CUADRADO (Calculado)
# Fo_Aspect: Observado (hi) | Fe_Aspect: Esperado (Normal)
x2_Aspect_Normal <- sum(((Fo_Aspect - P_Normal_Aspect)^2) / P_Normal_Aspect)

# 2. GRADOS DE LIBERTAD
# k - 1 (donde k es el número de categorías de orientación)
gl_Aspect <- length(Fo_Aspect) - 1

# 3. VALOR CRÍTICO (95% de confianza)
vc_Aspect <- qchisq(0.95, gl_Aspect)

# 4. RESULTADOS EN CONSOLA
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

8 TABLA RESUMEN DE BONDAD DEL AJUSTE

# 1. CREACION DEL DATAFRAME RESUMEN
# Usamos los resultados del modelo Normal para Orientacion (Aspect)
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")
)

# 2. GENERACION DE LA TABLA GT
library(gt)
library(dplyr)

tabla_resumen_Aspect %>% 
  gt() %>% 
  tab_header(
    title = md("**TABLA No 5: 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: Grupo 1"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  # Estilo del Titulo (Azul Oscuro y Blanco)
  tab_style(
    style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
    locations = cells_title()
  ) %>%
  # Estilo de Encabezados (Gris y Azul Oscuro)
  tab_style(
    style = list(cell_fill(color = "#F2F3F4"), cell_text(weight = "bold", color = "#2E4053")),
    locations = cells_column_labels()
  ) %>%
  # Opciones de diseno y bordes
  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 5: 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: Grupo 1

9 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)?
# Probabilidad de orientación "South" (Sur)
prob_sur <- df_aspect_final$hi[df_aspect_final$Orientacion == "South"]

# Mostramos el resultado
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 NO presente una orientación hacia el Norte (“North”, “Northeast” o “Northwest”)?
# Probabilidad de que NO sea orientación Norte (niveles de orientación más favorables)
orientaciones_favorables <- c("East", "Southeast", "South", "Southwest", "West", "Flat")
prob_orientacion_adecuada <- sum(df_aspect_final$hi[df_aspect_final$Orientacion %in% orientaciones_favorables])

# Mostramos el resultado
prob_orientacion_adecuada
## [1] 69.75313

La probabilidad de que el terreno presente una orientación favorable (que no apunte hacia el Norte y sus variantes) es del 69.75%. Este resultado confirma la viabilidad técnica de los emplazamientos elegidos, asegurando que la gran mayoría del área evita las orientaciones con menor exposición solar y mayor riesgo de pérdidas energéticas por sombras geográficas.

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