Variable de Estudio: Tipo de Pendiente (Slope_type)
Es una variable Cualitativa Ordinal, categorizada en: Plano (1), Suave (2), Moderado (3), Fuerte (4), Muy fuerte (5) y Escarpado (6).
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 Geométrica. El Test de Pearson confirmó que el modelo es coherente y confiable, lo que permite una planificación segura de la obra civil y la instalación de equipos.
# 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 ...
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\u00f3gico (Ordinal)
# Usamos el nombre exacto de tu variable: slope_type
Slope_Vec <- factor(Datos$slope_type,
levels = c("Plano o casi plano", "Suave", "Moderado", "Fuerte", "Muy fuerte", "Escarpado o abrupto"),
ordered = TRUE)
# 2. Creamos el conteo (ni)
conteo_slope <- table(Slope_Vec)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 detectados en slope_type
slope_vec <- factor(Datos$slope_type,
levels = c("Plano o casi plano", "Suave", "Moderado", "Fuerte", "Muy fuerte", "Escarpado o abrupto"),
ordered = TRUE)
# 3. CONSTRUCCIÓN DE LA DATA (ni y hi)
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
)
# 4. GENERACIÓN DE LA TABLA GT (Diseño Idéntico)
df_slope_final %>%
gt() %>%
tab_header(
title = md("**TABLA N\u00ba 3: 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()) %>%
# 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 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 |
# 1. Configuraci\u00f3n de m\u00e1rgenes (espacio para las etiquetas verticales largas)
par(mar = c(10, 4, 4, 2))
# 2. Creaci\u00f3n del gr\u00e1fico de barras para la variable slope_type
# Usamos df_slope_final que creamos en el paso anterior
barplot(df_slope_final$hi,
main = "GR\u00c1FICO N\u00ba 3: PORCENTAJE DEL TIPO DE PENDIENTE",
ylab = "Porcentaje (%)",
col = "#B0C4DE", # Azul profesional
# Nombres de las categorías (ajustados para que quepan bien)
names.arg = c("1", "2", "3", "4", "5", "6"),
las = 1, # Etiquetas verticales para que no se amontonen
cex.names = 0.8, # Tama\u00f1o de las etiquetas
cex.axis = 0.8, # Tama\u00f1o de los n\u00fameros del eje Y
cex.main = 0.9, # Tama\u00f1o del t\u00edtulo principal
ylim = c(0, max(df_slope_final$hi) + 10)) # Espacio extra arriba
# 3. T\u00edtulo del eje horizontal
mtext("Tipo de Pendiente", side = 1, line = 8)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.
# 1. PARÁMETROS DEL MODELO GEOMÉTRICO
# Mapeo: Plano=0, Suave=1, Moderado=2, Fuerte=3, Muy fuerte=4, Escarpado=5
X_indices_slope <- 0:5
n_total_slope <- sum(df_slope_final$ni)
# 2. CÁLCULO DEL PARÁMETRO 'p' (Probabilidad de éxito)
# En el modelo geométrico: p = 1 / (media + 1)
media_obs_slope <- sum(X_indices_slope * df_slope_final$ni) / n_total_slope
prob_p_geom_slope <- 1 / (media_obs_slope + 1)
# 3. CÁLCULO DEL MODELO (Lo esperado)
P_Geometrica_Slope <- dgeom(X_indices_slope, prob = prob_p_geom_slope) * 100
# 4. GRÁFICA COMPARATIVA "PRIME"
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 4: Comparado de lo Observado frente a lo Esperado del Tipo de Pendiente",
ylab = "Porcentaje (%)",
# Nombres simplificados para que se vea bien en el gráfico
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)# 1. DEFINICIÓN DE VARIABLES PARA EL TEST
# Fo_Slope = Frecuencia Observada de la Pendiente
# Fe_Slope = Frecuencia Esperada (Modelo Geométrico)
Fo_Slope <- df_slope_final$hi
Fe_Slope <- P_Geometrica_Slope
# 2. CÁLCULO DEL TEST DE PEARSON
test_correlacion_slope <- cor.test(Fo_Slope, Fe_Slope)
r_valor_slope <- round(test_correlacion_slope$estimate, 4)
# 3. GRÁFICA DE CORRELACIÓN
par(mar = c(5, 5, 4, 2))
plot(Fo_Slope, Fe_Slope,
main = "GR\u00c1FICO N\u00ba 5: CORRELACI\u00d3N DEL MODELO GEOM\u00c9TRICO (PENDIENTE)",
cex.main = 0.85,
xlab = "Frecuencia Observada (%)",
ylab = "Frecuencia Esperada (%)",
pch = 19,
col = "#2E4053",
cex = 1.5)
# Línea de tendencia
abline(lm(Fe_Slope ~ Fo_Slope), col = "red", lwd = 2)
# Valor de R en el gráfico
text(x = min(Fo_Slope), y = max(Fe_Slope),
labels = paste("r =", r_valor_slope),
pos = 4, font = 2, col = "#2E4053")# 1. C\u00c1LCULO DE LA CORRELACI\u00d3N (Escala 0-100)
# Fo_Slope: Datos reales (hi) | Fe_Slope: Modelo (Geom\u00e9trico)
# Nota: Fe_Slope es P_Geometrica_Slope del paso anterior
Correlacion_Slope_Geom <- cor(Fo_Slope, Fe_Slope) * 100
# 2. MOSTRAR EL RESULTADO
Correlacion_Slope_Geom## [1] 99.89058
# 1. CÁLCULO DEL ESTADÍSTICO CHI-CUADRADO (Calculado)
# Fo_Slope: Observado (hi) | Fe_Slope: Esperado (Geom\u00e9trico)
x2_Slope_Geom <- sum(((Fo_Slope - P_Geometrica_Slope)^2) / P_Geometrica_Slope)
# 2. GRADOS DE LIBERTAD
# k - 1 (donde k es el n\u00famero de categor\u00edas de pendiente)
gl_Slope <- length(Fo_Slope) - 1
# 3. VALOR CRÍTICO (95% de confianza)
vc_Slope <- qchisq(0.95, gl_Slope)
# 4. RESULTADOS EN CONSOLA
cat("Estad\u00edstico Chi-cuadrado (Calculado):", round(x2_Slope_Geom, 4), "\n")## Estadístico Chi-cuadrado (Calculado): 1.0049
## 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
# 1. CREACI\u00d3N DEL DATAFRAME RESUMEN
# Usamos los resultados del modelo Geom\u00e9trico para Pendiente
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")
)
# 2. GENERACI\u00d3N DE LA TABLA GT
library(gt)
library(dplyr)
tabla_resumen_Slope %>%
gt() %>%
tab_header(
title = md("**TABLA N\u00ba 5: 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: Grupo 1"
) %>%
cols_align(align = "center", columns = everything()) %>%
# Estilo del T\u00edtulo (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 dise\u00f1o 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 Nº 5: 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: Grupo 1 | ||||
# Probabilidad de pendiente "Plano o casi plano"
prob_plano <- df_slope_final$hi[df_slope_final$Pendiente == "Plano o casi plano"]
# Mostramos el resultado
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.
# Probabilidad de que NO sea Fuerte, Muy fuerte o Escarpado (niveles de inclinación manejables)
niveles_manejables <- c("Plano o casi plano", "Suave", "Moderado")
prob_pendiente_adecuada <- sum(df_slope_final$hi[df_slope_final$Pendiente %in% niveles_manejables])
# Mostramos el resultado
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.
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.