1 IDENTIFICACIÓN Y JUSTIFICACIÓN DE LA VARIABLE

\(Variable\) \(de\) \(Estudio\): Tipo de Pendiente (slope_type).

Se determina que esta variable es Cualitativa Ordinal, categorizada en seis niveles de inclinación (desde Plano hasta Escarpado). La pendiente del terreno condiciona directamente la viabilidad de la obra civil y los costos de instalación de los equipos. Debido al patrón natural donde predominan fuertemente las áreas llanas y disminuyen drásticamente las zonas inclinadas, se opta por una Estrategia de Modelado Único:

\(Modelo\) \(Aceptado\): Distribución Geométrica (Validado mediante Test de Pearson, lo que asegura un modelo confiable para una planificación segura de la infraestructura).

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 slope_type, omitimos las celdas en blanco y verificamos el tamaño muestral.

Slope_Vec <- factor(Datos$slope_type, 
                    levels = c("Plano o casi plano", "Suave", "Moderado", "Fuerte", "Muy fuerte", "Escarpado o abrupto"), 
                    ordered = TRUE)

conteo_slope <- table(Slope_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)
})

slope_vec <- factor(Datos$slope_type, 
                    levels = c("Plano o casi plano", "Suave", "Moderado", "Fuerte", "Muy fuerte", "Escarpado o abrupto"), 
                    ordered = TRUE)

conteo_slope_raw <- table(slope_vec)
ni_slope_val <- as.numeric(conteo_slope_raw)
hi_slope_val <- (ni_slope_val / sum(ni_slope_val)) * 100

df_slope_final <- data.frame(
  Asignacion = 1:6,
  Pendiente = names(conteo_slope_raw),
  ni = ni_slope_val,
  hi = hi_slope_val
)

df_slope_final %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N\u00ba 1: DISTRIBUCI\u00d3N DE FRECUENCIAS DEL TIPO DE PENDIENTE**"),
  ) %>%
  cols_label(
    Asignacion = "Asignaci\u00f3n", 
    Pendiente = "Tipo de Pendiente", 
    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 DEL TIPO DE PENDIENTE
Asignación Tipo de Pendiente ni hi (%)
1 Plano o casi plano 46766 79.29
2 Suave 8523 14.45
3 Moderado 2906 4.93
4 Fuerte 562 0.95
5 Muy fuerte 217 0.37
6 Escarpado o abrupto 4 0.01

5 ANÁLISIS GRÁFICO

5.1 DIAGRAMA DE BARRAS

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

barplot(df_slope_final$hi,
        main = "GR\u00c1FICO N\u00ba 1: PORCENTAJE DEL TIPO DE PENDIENTE",
        ylab = "Porcentaje (%)",
        col = "#B0C4DE",    
        names.arg = c("1", "2", "3", "4", "5", "6"), 
        las = 1,              
        cex.names = 0.8,      
        cex.axis = 0.8,   
        ylim = c(0, max(df_slope_final$hi) + 10))

mtext("Tipo de Pendiente", side = 1, line = 8)

6 CONJETURA DEL MODELO

Se aplicó el modelo geométrico porque describe perfectamente el patrón de decaimiento del terreno: una gran mayoría de zonas planas que disminuyen drásticamente conforme aumenta la inclinación. Esta consistencia entre los datos reales y el modelo teórico permite validar que la topografía es predecible y favorable para la instalación de la infraestructura.

X_indices_slope <- 0:5
n_total_slope <- sum(df_slope_final$ni)

media_obs_slope <- sum(X_indices_slope * df_slope_final$ni) / n_total_slope
prob_p_geom_slope <- 1 / (media_obs_slope + 1)

P_Geometrica_Slope <- dgeom(X_indices_slope, prob = prob_p_geom_slope) * 100

par(mar = c(9, 4, 4, 2))
max_y_slope <- max(max(df_slope_final$hi), max(P_Geometrica_Slope))

barplot(rbind(df_slope_final$hi, P_Geometrica_Slope), 
        beside = TRUE,
        main = "GR\u00c1FICO N\u00ba 2: Comparado de lo Observado frente a lo Esperado del Tipo de Pendiente",
        ylab = "Porcentaje (%)",
        names.arg = c("1", "2", "3", "4", "5", "6"), 
        col = c("#B0C4DE", "#AED6F1"), 
        ylim = c(0, max_y_slope + 20), 
        las = 1, 
        cex.names = 0.8,
        cex.main = 0.85)

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

mtext("Tipo de Pendiente (Slope Type)", side = 1, line = 7)

7 TEST DE PEARSON

Fo_Slope <- df_slope_final$hi
Fe_Slope <- P_Geometrica_Slope 

test_correlacion_slope <- cor.test(Fo_Slope, Fe_Slope)
r_valor_slope <- round(test_correlacion_slope$estimate, 4)

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

plot(Fo_Slope, Fe_Slope, 
     main = "GR\u00c1FICO N\u00ba 3: CORRELACI\u00d3N DEL MODELO GEOM\u00c9TRICO (PENDIENTE)",
     cex.main = 0.85,
     xlab = "Frecuencia Observada (%)", 
     ylab = "Frecuencia Esperada (%)", 
     pch = 19,            
     col = "#2E4053",    
     cex = 1.5)          

abline(lm(Fe_Slope ~ Fo_Slope), col = "red", lwd = 2)

text(x = min(Fo_Slope), y = max(Fe_Slope), 
     labels = paste("r =", r_valor_slope), 
     pos = 4, font = 2, col = "#2E4053")

Correlacion_Slope_Geom <- cor(Fo_Slope, Fe_Slope) * 100

Correlacion_Slope_Geom
## [1] 99.89058

7.1 TEST DE CHI-CUADRADO

x2_Slope_Geom <- sum(((Fo_Slope - P_Geometrica_Slope)^2) / P_Geometrica_Slope)

gl_Slope <- length(Fo_Slope) - 1

vc_Slope <- qchisq(0.95, gl_Slope)

cat("Estad\u00edstico Chi-cuadrado (Calculado):", round(x2_Slope_Geom, 4), "\n")
## Estadístico Chi-cuadrado (Calculado): 1.0049
cat("Valor Cr\u00edtico (Tabla):", round(vc_Slope, 4), "\n")
## Valor Crítico (Tabla): 11.0705
cat("\u00bfSe acepta el modelo Geom\u00e9trico? (Calculado < Cr\u00edtico):", x2_Slope_Geom < vc_Slope, "\n")
## ¿Se acepta el modelo Geométrico? (Calculado < Crítico): TRUE

8 TABLA RESUMEN DE BONDAD DEL AJUSTE

tabla_resumen_Slope <- data.frame(
  Variable = "Tipo de Pendiente",
  Pearson = round(Correlacion_Slope_Geom, 2),
  Chi2    = round(x2_Slope_Geom, 4),
  Umbral  = round(vc_Slope, 2),
  Resultado = ifelse(x2_Slope_Geom < vc_Slope, "Modelo Aceptado", "Modelo Rechazado")
)

library(gt)
library(dplyr)

tabla_resumen_Slope %>% 
  gt() %>% 
  tab_header(
    title = md("**TABLA N\u00ba 2: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD (PENDIENTE)**")
  ) %>%
  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 (PENDIENTE)
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado Final
Tipo de Pendiente 99.89 1.0049 11.07 Modelo Aceptado
Autor: Fernando Neira

9 CÁLCULO DE PROBABILIDADES

  1. ¿Cuál es la probabilidad de que un punto seleccionado al azar presente una pendiente de tipo “Plano o casi plano”?
prob_plano <- df_slope_final$hi[df_slope_final$Pendiente == "Plano o casi plano"]

prob_plano
## [1] 79.29397

La probabilidad de encontrar un terreno Plano o casi plano es del 79.29%. Este dato es fundamental para la ingeniería del proyecto, ya que garantiza que la gran mayoría del área no requiere nivelación compleja, lo que reduce significativamente los costos y tiempos de preparación del suelo.

  1. ¿Cuál es la probabilidad de que un punto seleccionado al azar NO presente una pendiente de nivel “Fuerte” o superior?
niveles_manejables <- c("Plano o casi plano", "Suave", "Moderado")
prob_pendiente_adecuada <- sum(df_slope_final$hi[df_slope_final$Pendiente %in% niveles_manejables])

prob_pendiente_adecuada
## [1] 98.67239

La probabilidad de que el terreno presente una pendiente manejable (No Fuerte) es del 98.67%. Este resultado confirma la viabilidad técnica del emplazamiento, asegurando que la práctica totalidad del área es apta para la instalación de equipos sin enfrentar riesgos de inestabilidad o sobrecostos por terrenos escarpados.

10 CONCLUSIÓN

El modelo geométrico confirmó que predominan los terrenos Planos o casi planos. Aunque existe variabilidad en los datos, el alto coeficiente de Pearson valida la tendencia y brinda un respaldo estadístico sólido para la planificación de la obra civil y la adecuación del terreno.