1 Configuración y Carga de Datos

##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: MARTIN SARMIENTO ####
### CARRERA: INGENIERÍA EN PETRÓLEOS #####

#### VARIABLE TIPO DE CURVATURA ####
## DATASET ##
setwd("~/R INFERENCIAL/CURVATURE_TYPE")
# Cargar dataset
Datos <- read.csv("Dataset_Mundial_Final.csv", sep = ";", fileEncoding = "latin1")
## Estructura de los datos
str(Datos)
## 'data.frame':    58978 obs. of  29 variables:
##  $ ï..OBJECTID           : int  2 3 4 5 6 7 8 9 10 11 ...
##  $ code                  : chr  "00001-AFG-P" "00002-AFG-P" "00003-AFG-P" "00004-AFG-P" ...
##  $ plant_name            : chr  "Badghis Solar Power Plant" "Balkh solar farm" "Behsood solar farm" "Dab Pal 4 solar farm" ...
##  $ country               : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ operational_status    : chr  "cancelled - inferred 4 y" "cancelled - inferred 4 y" "cancelled - inferred 4 y" "shelved - inferred 2 y" ...
##  $ longitude             : chr  "62,874" "67,121" "70,413" "66,239" ...
##  $ latitude              : chr  "35,078" "36,714" "34,407" "33,768" ...
##  $ elevation             : int  918 359 629 2288 1060 1060 1392 398 410 1012 ...
##  $ area                  : chr  "6,735" "10,718" "487,729" "111,801" ...
##  $ size                  : chr  "Small" "Small" "Small" "Small" ...
##  $ slope                 : chr  "7,375" "0,49" "1,099" "6,162" ...
##  $ slope_type            : chr  "Moderado" "Plano o casi plano" "Plano o casi plano" "Moderado" ...
##  $ curvature             : chr  "-0,024" "0" "0" "0,045" ...
##  $ curvature_type        : chr  "Superficies cóncavas / Valles" "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies convexas / Crestas" ...
##  $ aspect                : chr  "96,77" "358,452" "36,18" "305,766" ...
##  $ aspect_type           : chr  "East" "North" "Northeast" "Northwest" ...
##  $ dist_to_road          : chr  "7037,104" "92,748" "112,117" "1705,255" ...
##  $ ambient_temperature   : chr  "14,402" "17,875" "21,315" "8,857" ...
##  $ ghi                   : chr  "5,824" "5,579" "5,805" "6,749" ...
##  $ humidity              : chr  "47,743" "42,305" "36,396" "37,344" ...
##  $ wind_speed            : chr  "0,039" "0,954" "0,234" "0,943" ...
##  $ wind_direction        : chr  "187,481" "207,422" "255,601" "160,331" ...
##  $ dt_wind               : chr  "South" "Southwest" "West" "South" ...
##  $ solar_aptitude        : chr  "0,72" "0,635" "0,685" "0,659" ...
##  $ solar_aptitude_rounded: int  7 6 7 7 8 8 8 6 6 4 ...
##  $ solar_aptittude_class : chr  "Alta" "Alta" "Alta" "Alta" ...
##  $ capacity              : chr  "32" "40" "60" "3000" ...
##  $ optimal_tilt          : chr  "30" "31" "31,063" "33" ...
##  $ pv_potential          : chr  "4,613" "4,408" "4,572" "5,424" ...
# Cargamos las librerias
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(gt)

2 Extraer Variable

Se realizó la agrupación jerárquica de la variable curvature_type mediante técnicas de mapeo en R. Esto permitió consolidar las categorías geomorfológicas para facilitar el tratamiento inferencial de los 58,978 datos registrados, asegurando la corrección de caracteres especiales en los nombres de los relieves.

# Extraer variable
Curvature <- Datos$curvature_type
# Tabla de distribución de frecuencias
TDF_curvature <- table(Curvature)

3 Tabla de Distribución de Frecuencias

Se calculó la distribución de frecuencias absolutas (\(n_i\)) y relativas (\(h_i\)). Los resultados determinan que las Superficies planas o intermedias predominan con el 81.13%, evidenciando que la ingeniería de plantas solares prioriza terrenos con curvatura neutra para garantizar la estabilidad del sistema.

# Tabla de frecuencias absolutas
Tabla <- as.data.frame(TDF_curvature)

# Renombrar columna de frecuencia
colnames(Tabla) <- c("Curvature", "ni")

# Asegurar tipo character
Tabla$Curvature <- as.character(Tabla$Curvature)

# Crear porcentaje
Tabla$`hi (%)` <- (Tabla$ni / sum(Tabla$ni)) * 100

# Fila total
fila_total_curv <- tibble(
  Curvature = "TOTAL",
  ni = sum(Tabla$ni),
  `hi (%)` = sum(Tabla$`hi (%)`)
)

# Unir fila total
tabla_Final <- bind_rows(Tabla, fila_total_curv)

# TABLA GT
tabla_curv_gt <- tabla_Final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1 de Distribución de Frecuencias de Tipo de Curvatura de las Plantas Solares**")
  ) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento"
  ) %>%
  cols_label(
    Curvature = "Tipo de Curvatura",
    ni = "Frecuencia (ni)",
    `hi (%)` = "Porcentaje (hi%)"
  ) %>%
  fmt_number(
    columns = `hi (%)`,
    decimals = 2
  ) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0"
  )

# Mostrar tabla
tabla_curv_gt
Tabla N°1 de Distribución de Frecuencias de Tipo de Curvatura de las Plantas Solares
Tipo de Curvatura Frecuencia (ni) Porcentaje (hi%)
Superficies cóncavas / Valles 6323 10.72
Superficies convexas / Crestas 4806 8.15
Superficies planas o intermedias 47849 81.13
TOTAL 58978 100.00
Autor: Martin Sarmiento

4 Análisis Gráfico

4.1 Diagramas de Barras de Cantidad

Mediante un diagrama de barras de cantidad, se identificó visualmente la alta heterogeneidad de la variable. Esta observación justificó la división del análisis en dos agrupaciones (Mercados de Estabilidad y Relieves Complejos) para aplicar modelos de probabilidad específicos según el comportamiento de cada segmento topográfico.

Tabla$Curvature[Tabla$Curvature == "Superficies cóncavas / Valles"] <- "Valles (Cóncavas)"
Tabla$Curvature[Tabla$Curvature == "Superficies convexas / Crestas"] <- "Crestas (Convexas)"

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

barplot(height = Tabla$ni[1:3], 
        names.arg = Tabla$Curvature[1:3],
        main = "Gráfica N°1: Distribución de Cantidad de Plantas Solares por Tipo de Curvatura",
        ylab = "", 
        col = "#EEE685", 
        las = 2, 
        cex.names = 0.8,
        cex.main = 0.9) # Ajustado tamaño del título

mtext("Cantidad", side = 2, line = 3.5, cex = 1)

5 Agrupación 1 (Mercados de Estabilidad)

Se realiza un mapeo asignando valores numéricos a las categorías de curvatura. Este proceso permite cuantificar la variable cualitativa para ajustar el Modelo Geométrico a la frecuencia observada en los terrenos de mayor implementación.

# 1. Definimos niveles y limpieza de nombres
niveles_G1 <- c("Superficies planas o intermedias", "Superficies cóncavas / Valles", "Superficies convexas / Crestas")

# 2. Extracción y Mapeo
Datos_G1 <- Datos %>% filter(curvature_type %in% niveles_G1)
TDF_G1 <- as.data.frame(table(Datos_G1$curvature_type))
colnames(TDF_G1) <- c("Curvature", "ni")

# 3. Ordenamos para que el decaimiento sea correcto (Plano como base 0)
# Se asume que el índice 3 es 'Planas', 1 es 'Valles' y 2 es 'Crestas'
TDF_G1 <- TDF_G1[c(3, 1, 2), ] 

# 4. Asignación de valores numéricos y frecuencia relativa
TDF_G1$X <- 0:(nrow(TDF_G1) - 1)
TDF_G1$hi <- TDF_G1$ni / sum(TDF_G1$ni)

# 5. Visualización de la Tabla con formato profesional (gt)
TDF_G1 %>% 
  select(Curvature, X, ni, hi) %>%
  gt() %>% 
  tab_header(
    title = md("**Tabla N°2 de Distribución de Curvatura de las Plantas Solares - Mapeado**"),
      ) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_label(
    Curvature = "Tipo de Curvatura",
    X = "Valor Asignado (X)",
    ni = "Frecuencia Absoluta (ni)",
    hi = "Frecuencia Relativa (hi)"
  ) %>%
  fmt_number(
    columns = hi, 
    decimals = 4
  ) %>%
  tab_options(
    heading.title.font.size = px(16),
    heading.subtitle.font.size = px(14),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°2 de Distribución de Curvatura de las Plantas Solares - Mapeado
Tipo de Curvatura Valor Asignado (X) Frecuencia Absoluta (ni) Frecuencia Relativa (hi)
Superficies planas o intermedias 0 47849 0.8113
Superficies cóncavas / Valles 1 6323 0.1072
Superficies convexas / Crestas 2 4806 0.0815
Autor: Martin Sarmiento

5.1 Conjetura del Modelo (Geométrico)

Se seleccionaron todos los tipos de curvatura para analizar el comportamiento del diseño estructural. Se aplica un Modelo Geométrico bajo la premisa de que la probabilidad de encontrar una planta solar disminuye drásticamente conforme el terreno se aleja de la planitud ideal, concentrando la mayor frecuencia en el estado inicial de superficie plana.

# Parámetros Geométricos
n_total_g1 <- sum(TDF_G1$ni)
media_g1 <- sum(TDF_G1$X * TDF_G1$ni) / n_total_g1
prob_geom_g1 <- 1 / (media_g1 + 1)

# Probabilidades Teóricas
P_Geom_G1 <- dgeom(TDF_G1$X, prob = prob_geom_g1)
P_Geom_G1 <- P_Geom_G1 / sum(P_Geom_G1)

# Gráfica N°2
par(mar = c(10, 4, 4, 2))
barplot(height = rbind(TDF_G1$hi, P_Geom_G1), beside = TRUE,
        main = "Gráfica N°2: Comparado de lo Observado frente a lo Esperado (Geométrico)",
        names.arg = c("Planas", "Valles", "Crestas"),
        col = c("#EEE685", "darkgoldenrod2"), legend.text = c("Obs", "Esp"),
        cex.main = 0.8, las = 1)

5.2 Test de Pearson

# Definir Frecuencia Observada y Esperada basándose en el modelo Geométrico
Fo_G1 <- TDF_G1$hi
Fe_G1 <- P_Geom_G1

# Gráfico de Correlación
plot(Fo_G1, Fe_G1, 
     main = "Gráfica N°3: Correlación del Modelo Observado y Esperado (Geométrico)",
     cex.main = 0.7,
     xlab = "Frecuencia Observada", 
     ylab = "Frecuencia Esperada", 
     pch = 19, col = "#8B864E")
abline(lm(Fe_G1 ~ Fo_G1), col = "red", lwd = 2)

# Cálculo del coeficiente de Pearson
Correlacion_G1 <- cor(Fo_G1, Fe_G1) * 100
Correlacion_G1
## [1] 99.10444

5.3 Test de Chi-cuadrado

# Cálculo de Chi-cuadrado (Bondad de Ajuste)
x2_G1 <- sum(((Fo_G1 - Fe_G1)^2) / Fe_G1)

# Grados de libertad (k - 1) donde k es el número de categorías (3)
gl_G1 <- length(Fo_G1) - 1

# Valor crítico al 95% de confianza
vc_G1 <- qchisq(0.95, gl_G1)

# Mostrar resultados para verificación
x2_G1
## [1] 0.08059168
vc_G1
## [1] 5.991465
# Validación lógica
x2_G1 < vc_G1
## [1] TRUE

5.4 Tabla Resumen del Test

# Crear data frame resumen con los datos del modelo Geométrico
tabla_resumen_G1 <- data.frame(
  Variable = "Mercados de Estabilidad",
  Pearson = round(Correlacion_G1, 2),
  Chi2 = round(x2_G1, 4),
  Umbral = round(vc_G1, 2),
  Resultado = x2_G1 < vc_G1
)

# Visualizar con GT
tabla_resumen_G1 %>% 
  gt() %>% 
  cols_label(
    Variable = "Variable",            
    Pearson  = "Test Pearson (%)",
    Chi2     = "Chi Cuadrado", 
    Umbral   = "Umbral de Aceptación",
    Resultado = "Resultado"
  ) %>%
  tab_header(
    title = md("**Tabla N°3 Resumen del Test de Bondad al Modelo de Probabilidad**"),
      ) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento") %>%
  cols_align(
    align = "center", 
    everything()) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°3 Resumen del Test de Bondad al Modelo de Probabilidad
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Mercados de Estabilidad 99.1 0.0806 5.99 TRUE
Autor: Martin Sarmiento

5.5 Cálculo de Probabilidades

¿Cuál es la probabilidad de que una planta solar seleccionada al azar dentro de la base de datos global se encuentre instalada sobre una Superficie Plana o Intermedia, considerando la tasa de decaimiento del modelo geométrico?

# La probabilidad de éxito en el primer intento (X=0) según el modelo geométrico
# corresponde a nuestra categoría base: Superficies planas o intermedias.

prob_plano_geom <- dgeom(0, prob = prob_geom_g1)

paste0("La probabilidad estimada para superficies planas o intermedias es de: ", 
       round(prob_plano_geom * 100, 2), "%")
## [1] "La probabilidad estimada para superficies planas o intermedias es de: 78.73%"

6 Agrupación 2 (Relieves Complejos)

Se asignan valores numéricos a las categorías de relieve no neutro. Esta codificación es el requisito técnico para parametrizar el Modelo Binomial y evaluar la probabilidad de ocurrencia en terrenos con curvaturas convexas o cónfavas.

# 1. Definición de niveles (Solo Valles y Crestas)
niveles_G2 <- c("Superficies cóncavas / Valles", "Superficies convexas / Crestas")

# 2. Extracción y Factorización
Datos_G2 <- Datos %>% filter(curvature_type %in% niveles_G2)
# Limpiamos los nombres para que la tabla se vea profesional
Datos_G2$curvature_type <- factor(Datos_G2$curvature_type, levels = niveles_G2)

# 3. Crear Tabla de Frecuencias y Mapeo
TDF_G2 <- as.data.frame(table(Datos_G2$curvature_type))
colnames(TDF_G2) <- c("Curvature", "ni")

# Mapeo: Valles = 0, Crestas = 1
TDF_G2$X <- 0:(nrow(TDF_G2) - 1)
TDF_G2$hi <- TDF_G2$ni / sum(TDF_G2$ni)

# 4. Visualización del Mapeo (Tabla GT con formato idéntico)
TDF_G2 %>% 
  select(Curvature, X, ni, hi) %>%
  gt() %>% 
  tab_header(
    title = md("**Tabla N°4 de Distribución de Frecuencias de Tipo de Curvatura - Mapeado**"),
      ) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_label(
    Curvature = "Tipo de Curvatura",
    X = "Valor Asignado",
    ni = "Frecuencia (ni)",
    hi = "Porcentaje (hi%)"
  ) %>%
  fmt_number(columns = hi, decimals = 4) %>%
  tab_options(
    heading.title.font.size = px(16),
    heading.subtitle.font.size = px(14),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°4 de Distribución de Frecuencias de Tipo de Curvatura - Mapeado
Tipo de Curvatura Valor Asignado Frecuencia (ni) Porcentaje (hi%)
Superficies cóncavas / Valles 0 6323 0.5682
Superficies convexas / Crestas 1 4806 0.4318
Autor: Martin Sarmiento

6.1 Conjetura del Modelo (Binomial)

Esta agrupación comprende los estados de relieve irregular (Valles y Crestas). Se propone un Modelo Binomial para representar este segmento, ya que permite evaluar la probabilidad de éxito al situar un proyecto en una cresta frente al fracaso relativo de situarlo en un valle profundo, buscando identificar una tendencia central en terrenos complejos.

# Parámetros Binomiales
n_total_g2 <- sum(TDF_G2$ni)
size_b2 <- 1 # Dos categorías
media_g2 <- sum(TDF_G2$X * TDF_G2$ni) / n_total_g2
prob_p2 <- media_g2 / size_b2

# Probabilidades Teóricas
P_Binom_G2 <- dbinom(TDF_G2$X, size = size_b2, prob = prob_p2)

# Gráfica N°4
par(mar = c(10, 4, 4, 2))
barplot(height = rbind(TDF_G2$hi, P_Binom_G2), beside = TRUE,
        main = "Gráfica N°4: Comparado de lo Observado frente a lo Esperado (Binomial)",
        names.arg = c("Valles", "Crestas"),
        col = c("#EEE685", "darkgoldenrod2"), legend.text = c("Obs", "Esp"),
        cex.main = 0.8, las = 1)

6.2 Test de Pearson

# Definir Frecuencia Observada y Esperada para el modelo Binomial
Fo_G2 <- TDF_G2$hi
Fe_G2 <- P_Binom_G2

# Gráfico de Correlación
plot(Fo_G2, Fe_G2, 
     main = "Gráfica N°5: Correlación del Modelo Observado y Esperado (Binomial)",
     cex.main = 0.7,
     xlab = "Frecuencia Observada", 
     ylab = "Frecuencia Esperada", 
     pch = 19, col = "#CDAD00")
abline(lm(Fe_G2 ~ Fo_G2), col = "red", lwd = 2)

# Cálculo del coeficiente de Pearson
Correlacion_G2 <- cor(Fo_G2, Fe_G2) * 100
Correlacion_G2
## [1] 100

6.3 Test de Chi-cuadrado

# Cálculo de Chi-cuadrado
x2_G2 <- sum(((Fo_G2 - Fe_G2)^2) / Fe_G2)

# Grados de libertad (k - 1) donde k es 2
gl_G2 <- length(Fo_G2) - 1

# Valor crítico al 95% de confianza
vc_G2 <- qchisq(0.95, gl_G2)

# Resultados
x2_G2
## [1] 0
vc_G2
## [1] 3.841459
# Validación lógica
x2_G2 < vc_G2
## [1] TRUE

6.4 Tabla Resumen del Test

# Crear data frame resumen para el modelo Binomial
tabla_resumen_G2 <- data.frame(
  Variable = "Relieves Complejos",
  Pearson = round(Correlacion_G2, 2),
  Chi2 = round(x2_G2, 4),
  Umbral = round(vc_G2, 2),
  Resultado = x2_G2 < vc_G2
)

# Visualizar con GT
tabla_resumen_G2 %>% 
  gt() %>% 
  cols_label(
    Variable = "Variable",            
    Pearson  = "Test Pearson (%)",
    Chi2     = "Chi Cuadrado", 
    Umbral   = "Umbral de Aceptación",
    Resultado = "Resultado"
  ) %>%
  tab_header(
    title = md("**Tabla N°5 Resumen del Test de Bondad al Modelo de Probabilidad**"),
    subtitle = "Validación mediante Distribución Binomial"
  ) %>%
  tab_source_note(
    source_note = "Autor: Martin Sarmiento") %>%
  cols_align(
    align = "center", 
    everything()) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0"
  )
Tabla N°5 Resumen del Test de Bondad al Modelo de Probabilidad
Validación mediante Distribución Binomial
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Relieves Complejos 100 0 3.84 TRUE
Autor: Martin Sarmiento

6.5 Cálculo de Probabilidades

¿Cuál es la probabilidad estimada de que una nueva planta solar instalada en un terreno de relieve complejo se encuentre situada específicamente sobre una Cresta (Superficie Convexa)?

# Probabilidad para el valor asignado 1 (Crestas) bajo el modelo Binomial
prob_cresta_binom <- dbinom(1, size = size_b2, prob = prob_p2)

paste0("La probabilidad estimada para superficies convexas (Crestas) es de: ", 
       round(prob_cresta_binom * 100, 2), "%")
## [1] "La probabilidad estimada para superficies convexas (Crestas) es de: 43.18%"

7 Conclusiones

El análisis probabilístico permitió modelar la geomorfología de los terrenos donde se asientan las plantas solares a nivel mundial mediante un modelo geométrico para los mercados de estabilidad y un modelo binomial para los relieves complejos. Los resultados muestran que la gran mayoría de los proyectos se concentran en superficies planas o intermedias, mientras que en terrenos de orografía irregular existe una distribución equilibrada entre valles y crestas, con una ligera inclinación hacia las zonas cóncavas.

Las pruebas de bondad de ajuste, con coeficientes de Pearson del 99.10% y 100% respectivamente, confirman que ambos modelos representan adecuadamente los datos observados. Esto evidencia una descripción estadística rigurosa de los criterios de selección de sitio, validando que la ingeniería fotovoltaica prioriza la estabilidad topográfica para optimizar la instalación y el rendimiento de la infraestructura solar a gran escala.