1 IDENTIFICACIÓN Y JUSTIFICACIÓN DE LA VARIABLE

La Pendiente (Slope) es una variable cuantitativa continua, expresada generalmente en porcentajes o grados, que mide la inclinación del terreno respecto a la horizontal. Esta naturaleza es determinante para la ingeniería del proyecto, ya que permite evaluar la viabilidad del movimiento de tierras, optimizar el drenaje superficial y garantizar que los seguidores solares operen dentro de sus límites mecánicos de diseño para maximizar la captación de radiación.

2 CARGA DE DATOS Y LIBRERÍAS

Importamos el archivo “Dataset_Mundial_Final.xls” desde una ruta local y lo almacenamos en el objeto 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("C:/Users/ASUS/OneDrive/Escritorio/ESTADÍSTICA/EXPO/ACTIVIDADES/Dataset_Mundial_Final.xls", 
                    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 de curvatura (curvature), omitimos las celdas en blanco y verificamos el tamaño muestral.
slope <- na.omit(Datos$slope)
slope <- slope[slope > 0]
n_total <- length(slope)

4 TABLA DE DISTRIBUCIÓN DE FRECUENCIA

La tabla de distribución de frecuencias de la Pendiente (Slope) se estructuró aplicando la regla de Sturges para definir el número de intervalos idóneos. Complementariamente, el ancho de cada clase se estableció con base en el rango total de los datos, permitiendo una organización sistemática y precisa de la inclinación topográfica y la variabilidad del relieve observada en la muestra.
# 1. CARGAR LIBRERIAS (Silenciadas)
suppressPackageStartupMessages({
  library(gt)
  library(dplyr)
})

# 2. PREPARACIÓN DE LA VARIABLE GLOBAL (SLOPE)
# Cambiamos curvature por slope (ajusta el nombre exacto según tu dataframe)
slope_global <- na.omit(Datos$slope) 
n_total <- length(slope_global)

# 3. CÁLCULO DE INTERVALOS (Sturges)
K_slope <- floor(1 + 3.322 * log10(n_total))
min_abs <- min(slope_global)
max_abs <- max(slope_global)

# Definición de límites
breaks_slope <- seq(min_abs, max_abs, length.out = K_slope + 1)
lim_inf_s <- breaks_slope[1:K_slope]
lim_sup_s <- breaks_slope[2:(K_slope+1)]
MC_s <- (lim_inf_s + lim_sup_s) / 2

# Frecuencias simples
ni_s <- as.vector(table(cut(slope_global, breaks = breaks_slope, right = FALSE, include.lowest = TRUE)))
hi_s <- (ni_s / n_total) * 100 

# Frecuencias acumuladas
Ni_asc_s <- cumsum(ni_s)
Ni_desc_s <- rev(cumsum(rev(ni_s)))
Hi_asc_s <- cumsum(hi_s)
Hi_desc_s <- rev(cumsum(rev(hi_s)))

# 4. CONSTRUCCIÓN DEL DATAFRAME COMPLETO
df_temp <- data.frame(
  Li = lim_inf_s, 
  Ls = lim_sup_s,
  MC = MC_s,
  ni = ni_s,
  hi = hi_s,
  Ni_asc = Ni_asc_s,
  Ni_desc = Ni_desc_s,
  Hi_asc = Hi_asc_s,
  Hi_desc = Hi_desc_s
)

# --- PASO CLAVE: FILTRAR FILAS VACÍAS EN LOS EXTREMOS ---
# Crucial para evitar que el 100% se repita en la Pendiente si hay outliers
primera_con_datos <- min(which(df_temp$ni > 0))
ultima_con_datos  <- max(which(df_temp$ni > 0))
df_tabla_final <- df_temp[primera_con_datos:ultima_con_datos, ]

# 5. GENERACIÓN DE LA TABLA GT (ESTILO NEUTRO)
df_tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N\u00ba 1: DISTRIBUCI\u00d3N DE FRECUENCIAS DE PENDIENTE**"),
  ) %>%
  cols_label(
    Li = "Lim. Inf", Ls = "Lim. Sup", MC = "Marca Clase (Xi)",
    ni = "ni", hi = "hi (%)",
    Ni_asc = "Ni Asc.", Ni_desc = "Ni Desc.",
    Hi_asc = "Hi Asc. (%)", Hi_desc = "Hi Desc. (%)"
  ) %>%
  # Para Slope solemos usar 2 o 3 decimales dependiendo de la precisión requerida
  fmt_number(columns = c(Li, Ls, MC), decimals = 3) %>%
  fmt_number(columns = c(hi, Hi_asc, Hi_desc), decimals = 2) %>%
  cols_align(align = "center", columns = everything()) %>%
  # Estética Neutra y Académica
  tab_style(
    style = list(cell_fill(color = "#F2F2F2"), cell_text(weight = "bold", color = "#333333")),
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.width = pct(100),
    data_row.padding = px(5),
    table.border.top.style = "solid",
    table.border.top.color = "black",
    table.border.bottom.style = "solid",
    table.border.bottom.color = "black"
  )
TABLA Nº 1: DISTRIBUCIÓN DE FRECUENCIAS DE PENDIENTE
Lim. Inf Lim. Sup Marca Clase (Xi) ni hi (%) Ni Asc. Ni Desc. Hi Asc. (%) Hi Desc. (%)
0.000 2.168 1.084 47810 81.06 47810 58978 81.06 100.00
2.168 4.335 3.251 6545 11.10 54355 11168 92.16 18.94
4.335 6.503 5.419 2375 4.03 56730 4623 96.19 7.84
6.503 8.671 7.587 1059 1.80 57789 2248 97.98 3.81
8.671 10.838 9.754 577 0.98 58366 1189 98.96 2.02
10.838 13.006 11.922 259 0.44 58625 612 99.40 1.04
13.006 15.173 14.090 140 0.24 58765 353 99.64 0.60
15.173 17.341 16.257 83 0.14 58848 213 99.78 0.36
17.341 19.509 18.425 50 0.08 58898 130 99.86 0.22
19.509 21.676 20.592 25 0.04 58923 80 99.91 0.14
21.676 23.844 22.760 24 0.04 58947 55 99.95 0.09
23.844 26.012 24.928 11 0.02 58958 31 99.97 0.05
26.012 28.179 27.095 14 0.02 58972 20 99.99 0.03
28.179 30.347 29.263 3 0.01 58975 6 99.99 0.01
30.347 32.514 31.431 1 0.00 58976 3 100.00 0.01
32.514 34.682 33.598 2 0.00 58978 2 100.00 0.00

4.1 NUEVA TABLA DE DISTRIBUCIÓN DE FRECUENCIA

La tabla de distribución de frecuencias para la Pendiente (Slope) se estructuró segmentando el rango de mayor densidad operacional (\(0.00\) a \(8.671\)). Este procedimiento permite aplicar la regla de Sturges sobre un subconjunto más homogéneo, incrementando la resolución estadística y eliminando la distorsión provocada por los valores extremos del relieve, lo que facilita la identificación de las zonas con mayor aptitud para el despliegue de infraestructura.
# 1. CARGAR LIBRERIAS (Silenciadas)
suppressPackageStartupMessages({
  library(gt)
  library(dplyr)
})

# 2. PREPARACIÓN DE LA VARIABLE (FILTRADA AL INTERVALO 0.00 - 8.671)
slope_global <- na.omit(Datos$slope)
# Aplicamos el filtro directamente aquí para que todo lo demás sea automático
slope_filtrada <- slope_global[slope_global >= 0.00 & slope_global <= 8.671]
n_total <- length(slope_filtrada)

# 3. CÁLCULO DE INTERVALOS (Sturges)
K_slope <- floor(1 + 3.322 * log10(n_total))
min_abs <- 0.00
max_abs <- 8.671

# Definición de límites
breaks_slope <- seq(min_abs, max_abs, length.out = K_slope + 1)
lim_inf_s <- breaks_slope[1:K_slope]
lim_sup_s <- breaks_slope[2:(K_slope+1)]
MC_s <- (lim_inf_s + lim_sup_s) / 2

# Frecuencias simples
ni_s <- as.vector(table(cut(slope_filtrada, breaks = breaks_slope, right = FALSE, include.lowest = TRUE)))
hi_s <- (ni_s / n_total) * 100 

# Frecuencias acumuladas
Ni_asc_s <- cumsum(ni_s)
Ni_desc_s <- rev(cumsum(rev(ni_s)))
Hi_asc_s <- cumsum(hi_s)
Hi_desc_s <- rev(cumsum(rev(hi_s)))

# 4. CONSTRUCCIÓN DEL DATAFRAME COMPLETO
df_temp <- data.frame(
  Li = lim_inf_s, 
  Ls = lim_sup_s,
  MC = MC_s,
  ni = ni_s,
  hi = hi_s,
  Ni_asc = Ni_asc_s,
  Ni_desc = Ni_desc_s,
  Hi_asc = Hi_asc_s,
  Hi_desc = Hi_desc_s
)

# 5. GENERACIÓN DE LA TABLA GT (TU DISEÑO ORIGINAL)
df_temp %>%
  gt() %>%
  tab_header(
    title = md("**TABLA N\u00ba 2: DISTRIBUCI\u00d3N DE FRECUENCIAS DE PENDIENTE**"),
  ) %>%
  cols_label(
    Li = "Lim. Inf", Ls = "Lim. Sup", MC = "Marca Clase (Xi)",
    ni = "ni", hi = "hi (%)",
    Ni_asc = "Ni Asc.", Ni_desc = "Ni Desc.",
    Hi_asc = "Hi Asc. (%)", Hi_desc = "Hi Desc. (%)"
  ) %>%
  fmt_number(columns = c(Li, Ls, MC), decimals = 3) %>%
  fmt_number(columns = c(hi, Hi_asc, Hi_desc), decimals = 2) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#F2F2F2"), cell_text(weight = "bold", color = "#333333")),
    locations = cells_column_labels()
  ) %>%
  tab_options(
    table.width = pct(100),
    data_row.padding = px(5),
    table.border.top.style = "solid",
    table.border.top.color = "black",
    table.border.bottom.style = "solid",
    table.border.bottom.color = "black"
  )
TABLA Nº 2: DISTRIBUCIÓN DE FRECUENCIAS DE PENDIENTE
Lim. Inf Lim. Sup Marca Clase (Xi) ni hi (%) Ni Asc. Ni Desc. Hi Asc. (%) Hi Desc. (%)
0.000 0.542 0.271 25870 44.77 25870 57789 44.77 100.00
0.542 1.084 0.813 11723 20.29 37593 31919 65.05 55.23
1.084 1.626 1.355 6374 11.03 43967 20196 76.08 34.95
1.626 2.168 1.897 3843 6.65 47810 13822 82.73 23.92
2.168 2.710 2.439 2509 4.34 50319 9979 87.07 17.27
2.710 3.252 2.981 1765 3.05 52084 7470 90.13 12.93
3.252 3.794 3.523 1276 2.21 53360 5705 92.34 9.87
3.794 4.335 4.065 995 1.72 54355 4429 94.06 7.66
4.335 4.877 4.606 764 1.32 55119 3434 95.38 5.94
4.877 5.419 5.148 659 1.14 55778 2670 96.52 4.62
5.419 5.961 5.690 522 0.90 56300 2011 97.42 3.48
5.961 6.503 6.232 430 0.74 56730 1489 98.17 2.58
6.503 7.045 6.774 314 0.54 57044 1059 98.71 1.83
7.045 7.587 7.316 313 0.54 57357 745 99.25 1.29
7.587 8.129 7.858 232 0.40 57589 432 99.65 0.75
8.129 8.671 8.400 200 0.35 57789 200 100.00 0.35

5 ANÁLISIS GRÁFICO

Esta representación gráfica permite visualizar de manera clara la distribución de la Pendiente (Slope) del terreno, facilitando la identificación intuitiva de los rangos de inclinación donde se concentra la mayor densidad de datos. Al complementar la información numérica de la tabla de frecuencias, el histograma revela la forma y el sesgo de la distribución topográfica, elementos fundamentales para determinar la complejidad del movimiento de tierras y validar los modelos matemáticos de ajuste propuestos.

5.1 HISTOGRAMA DE FRECUENCIA

# 1. PREPARACIÓN DE LOS DATOS Y FILTRADO
# Filtramos la variable slope para el rango de mayor acumulación
slope_completa <- na.omit(Datos$slope)

# Definimos el segmento de interés (0.00 a 8.671)
slope_segmento <- slope_completa[slope_completa >= 0.00 & slope_completa <= 8.671]
n_seg <- length(slope_segmento) # Sincronizado con el n_total de tu tabla

# 2. CÁLCULO DE INTERVALOS (Regla de Sturges aplicada al segmento)
K_sturges <- floor(1 + 3.322 * log10(n_seg))
cortes_seg <- seq(0.00, 8.671, length.out = K_sturges + 1)

# 3. CREACIÓN Y ESCALADO DEL HISTOGRAMA
par(mar = c(6, 5, 4, 2))
h_slope_seg <- hist(slope_segmento, breaks = cortes_seg, plot = FALSE, right = FALSE)

# hi = (ni / n_seg) * 100 -> Porcentaje respecto al segmento filtrado (Igual a tu tabla)
h_slope_seg$counts <- (h_slope_seg$counts / n_seg) * 100

# 4. DIBUJAR LA GRÁFICA (Solo Histograma)
# \u00ba = º | \u00f3 = ó
plot(h_slope_seg, 
     main = "Gr\u00e1fica N\u00ba 1: Distribuci\u00f3n de Frecuencias de Pendiente",
     xlab = "Pendiente del Terreno", 
     ylab = "Frecuencia Relativa (%)",
     col = "#B0C4DE", 
     border = "white", 
     axes = FALSE,
     ylim = c(0, max(h_slope_seg$counts) * 1.2))

# 5. EJES Y DISEÑO PROFESIONAL
axis(2, las = 2, cex.axis = 0.7)
# Eje X con 3 decimales exactos para los cortes de Sturges
axis(1, at = cortes_seg, labels = sprintf("%.3f", cortes_seg), las = 2, cex.axis = 0.6)

grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")

# 6. LEYENDA (Solo datos empíricos)
legend("topright", 
       legend = "Datos Emp\u00edricos", 
       fill = "#B0C4DE", 
       border = "white", 
       bty = "n", 
       cex = 0.8)

invisible()

6 JUSTIFICACIÓN Y ESTRATIFICACIÓN DEL MODELO

Para garantizar la precisión del estudio, la muestra de curvatura se estratificó en subconjuntos específicos, destacando el sector de mayor densidad comprendido entre -0.035 y 0.049. Este procedimiento permite identificar de forma independiente el modelo teórico —en este caso, la distribución t-Student— que mejor se adapta a la distribución de este rango central. A continuación, se detallan las conjeturas propuestas y su validación mediante pruebas de bondad de ajuste, asegurando una inferencia técnica robusta y sólida para el análisis geomorfológico del terreno.
# ==========================================================
# BLOQUE 1: AJUSTE DEL MODELO EXPONENCIAL (GRÁFICA)
# ==========================================================
suppressPackageStartupMessages(library(MASS))

# 1. Preparación y Filtrado
slope_completa <- na.omit(Datos$slope)
n_total_global <- length(slope_completa)
slope_segmento <- slope_completa[slope_completa >= 0.00 & slope_completa <= 8.671]
n_seg <- length(slope_segmento)

# 2. Ajuste de la Conjetura (Exponencial)
ajuste_e <- suppressWarnings(
  fitdistr(slope_segmento, "exponential")
)

rate_e <- ajuste_e$estimate["rate"]

# 3. Preparación del Histograma (Regla de Sturges)
K_sturges <- floor(1 + 3.322 * log10(n_seg))
cortes_seg <- seq(0.00, 8.671, length.out = K_sturges + 1)
par(mar = c(6, 5, 4, 2))
h_slope_seg <- hist(slope_segmento, breaks = cortes_seg, plot = FALSE, right = FALSE)

# Transformación a Frecuencia Relativa hi (%)
h_slope_seg$counts <- (h_slope_seg$counts / n_total_global) * 100

# 4. Dibujar Gráfica
plot(h_slope_seg, 
     main = "Gr\u00e1fica N\u00ba 2: Distribuci\u00f3n de Frecuencias de Pendiente",
     xlab = "Pendiente del Terreno", 
     ylab = "Frecuencia Relativa (%)",
     col = "#B0C4DE", border = "white", axes = FALSE,
     ylim = c(0, max(h_slope_seg$counts) * 1.3))

# 5. Línea de la Conjetura Exponencial (Roja)
x_curva <- seq(0.00, 8.671, length.out = 300)
# Densidad teórica del modelo Exponencial
y_densidad <- dexp(x_curva, rate = rate_e)
ancho_barra <- cortes_seg[2] - cortes_seg[1]
y_curva_hi <- y_densidad * ancho_barra * 100 * (n_seg / n_total_global)

lines(x_curva, y_curva_hi, col = "#C0392B", lwd = 4)

# 6. Ejes y Estética
axis(2, las = 2, cex.axis = 0.7)
axis(1, at = cortes_seg, labels = sprintf("%.3f", cortes_seg), las = 2, cex.axis = 0.6)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")

legend("topright", 
       legend = c("Datos Emp\u00edricos", "Modelo Exponencial"), 
       col = c("#B0C4DE", "#C0392B"), lwd = c(8, 4), bty = "n", cex = 0.8)

invisible()

6.1 TEST DE PEARSON Y CHI-CUDRADO

# ==========================================================
# BLOQUE 2: TEST DE VALIDACIÓN (PEARSON Y CHI-CUADRADO)
# ==========================================================

# 1. Cálculo de Probabilidades Teóricas (Exponencial)
K_val <- length(cortes_seg) - 1
probs_e <- numeric(K_val)

for(i in 1:K_val) {
  probs_e[i] <- pexp(cortes_seg[i+1], rate = rate_e) - 
                pexp(cortes_seg[i], rate = rate_e)
}

# Normalización para base 100 (Sincronía con otros segmentos)
probs_e <- probs_e / sum(probs_e)
n_base  <- 100

# Frecuencias Observadas vs Esperadas
Fo_c <- as.vector(table(cut(slope_segmento, breaks = cortes_seg, right = FALSE))) * (n_base / n_seg)
Fe_c <- probs_e * n_base

# 2. Estadísticos de Prueba
# Chi-cuadrado
chi_calc <- sum((Fo_c - Fe_c)^2 / Fe_c)
# Grados de Libertad (K - 1 - parámetros). Exponencial tiene 1 parámetro (rate)
chi_crit <- qchisq(0.99, max(1, K_val - 1 - 1)) 

# Decisión
resultado_chi <- if(chi_calc < chi_crit) "APROBADO" else "RECHAZADO"

# Correlación de Pearson
pearson_val <- cor(Fo_c, Fe_c) * 100

# 3. Salida de Resultados
cat("\n--- RESULTADOS DE VALIDACI\u00d3N PENDIENTE (SLOPE) ---\n")
## 
## --- RESULTADOS DE VALIDACIÓN PENDIENTE (SLOPE) ---
cat("Modelo: Exponencial | Rango: 0.00 a 8.671\n")
## Modelo: Exponencial | Rango: 0.00 a 8.671
cat("Prueba Chi-cuadrado:", resultado_chi, "\n")
## Prueba Chi-cuadrado: APROBADO
cat("Chi-calculado:", round(chi_calc, 2), "| Chi-cr\u00edtico:", round(chi_crit, 2), "\n")
## Chi-calculado: 12,48 | Chi-crítico: 29,14
cat("Correlaci\u00f3n de Pearson:", round(pearson_val, 2), "%\n")
## Correlación de Pearson: 97,49 %

7 TABLA DE RESUMEN DE BONDAD DE AJUSTE

# 1. CARGAR LIBRERIAS
library(knitr)
suppressPackageStartupMessages(library(MASS))

# 2. CÁLCULOS TÉCNICOS (Para obtener los valores reales de la tabla)
slope_seg <- na.omit(Datos$slope[Datos$slope >= 0.00 & Datos$slope <= 8.671])
n_seg <- length(slope_seg)

# Ajuste Exponencial
ajuste_e <- suppressWarnings(
  fitdistr(slope_seg, "exponential")
)
rate_e <- ajuste_e$estimate["rate"]

# Intervalos y Frecuencias (Sturges)
K_val <- floor(1 + 3.322 * log10(n_seg))
cortes_seg <- seq(0.00, 8.671, length.out = K_val + 1)

# Probabilidades teóricas (Exponencial) y Frecuencias base 100
probs_e <- numeric(K_val)
for(i in 1:K_val) {
  probs_e[i] <- pexp(cortes_seg[i+1], rate = rate_e) - pexp(cortes_seg[i], rate = rate_e)
}
probs_e <- probs_e / sum(probs_e)

Fo_c <- as.vector(table(cut(slope_seg, breaks = cortes_seg, right = FALSE))) * (100 / n_seg)
Fe_c <- probs_e * 100

# Estadísticos finales
pear_c <- cor(Fo_c, Fe_c) * 100
chi_c  <- sum((Fo_c - Fe_c)^2 / Fe_c)
# Grados de Libertad: K_val - 1 - 1 (Exponencial tiene 1 parámetro)
crit_c <- qchisq(0.99, max(1, K_val - 1 - 1))
res_c  <- if(chi_c < crit_c) "APROBADO" else "RECHAZADO"

# 3. GENERACIÓN DE LA TABLA RESUMEN
# \u00f3 = ó | \u00ed = í | \u00ba = º
resumen_pendiente <- data.frame(
  "Segmento" = "Zona de Acumulaci\u00f3n (0.00 a 8.671)",
  "Modelo" = "Exponencial",
  "Pearson (%)" = round(pear_c, 2),
  "Chi-Calc" = round(chi_c, 2),
  "Chi-Crit" = round(crit_c, 2),
  "Estado" = res_c
)

# Imprimir tabla con formato kable
kable(resumen_pendiente, 
      format = "markdown", 
      align = "llcccc",
      caption = "Tabla No. 3: Resumen de validaci\u00f3n del modelo de probabilidad (Variable Pendiente)")
Tabla No. 3: Resumen de validación del modelo de probabilidad (Variable Pendiente)
Segmento Modelo Pearson…. Chi.Calc Chi.Crit Estado
Zona de Acumulación (0.00 a 8.671) Exponencial 97,49 12,48 29,14 APROBADO

8 CÁLCULO DE PROBABILIDADES

Tras validar que el comportamiento de la pendiente del terreno se ajusta con precisión a un modelo de distribución Exponencial, procedemos a proyectar los escenarios operativos y de diseño estructural para la implementación de los parques solares:
\(Pregunta\) \(1\) : ¿Cuál es la probabilidad teórica de encontrar una zona con una pendiente entre \(0.00\) y \(2.50\)?
\(Pregunta\) \(2\) : Si se instalan \(350\) soportes estructurales en el área de estudio, ¿cuántos de estos caerán en un rango de pendiente aceptable (entre \(0.00\) y \(5.00\)), donde la inclinación permite anclarlos directamente sin gastar en nivelación del terreno?
# ==========================================================
# BLOQUE: ÁREAS DE PROBABILIDAD (SÓLO MODELO TEÓRICO)
# ==========================================================
suppressPackageStartupMessages(library(MASS))

# 1. Preparación y Ajuste (Mismos datos)
slope_completa <- na.omit(Datos$slope)
n_total_global <- length(slope_completa)
slope_segmento <- slope_completa[slope_completa >= 0.00 & slope_completa <= 8.671]
n_seg <- length(slope_segmento)

ajuste_e <- suppressWarnings(fitdistr(slope_segmento, "exponential"))
rate_e <- ajuste_e$estimate["rate"]

# 2. Preparación de la Escala Y (Mantenemos la lógica de Sturges para la escala)
K_sturges <- floor(1 + 3.322 * log10(n_seg))
cortes_seg <- seq(0.00, 8.671, length.out = K_sturges + 1)
ancho_barra <- cortes_seg[2] - cortes_seg[1]

# 3. Crear el "Lienzo" Vacío (SIN BARRITAS)
x_curva <- seq(0.00, 8.671, length.out = 300)
y_curva_hi <- dexp(x_curva, rate = rate_e) * ancho_barra * 100 * (n_seg / n_total_global)

par(mar = c(6, 5, 4, 2))
# type = "n" crea los ejes y límites, pero no dibuja nada aún
plot(x_curva, y_curva_hi, type = "n", 
     main = "Gr\u00e1fica N\u00ba 2: Zonas de Probabilidad (Modelo Exponencial)",
     xlab = "Pendiente del Terreno", 
     ylab = "Probabilidad Te\u00f3rica (%)",
     axes = FALSE,
     ylim = c(0, max(y_curva_hi) * 1.2))

# 4. PINTAR LAS ÁREAS DE LAS PREGUNTAS
# Primero pintamos la Pregunta 2 (Rango 0.0 a 5.0) en color celeste claro
x_q2 <- seq(0.00, 5.00, length.out = 100)
y_q2 <- dexp(x_q2, rate = rate_e) * ancho_barra * 100 * (n_seg / n_total_global)
polygon(c(0.00, x_q2, 5.00), c(0, y_q2, 0), col = "#D4E6F1", border = NA)

# Luego pintamos la Pregunta 1 (Rango 0.0 a 2.5) en azul más fuerte encima
x_q1 <- seq(0.00, 2.50, length.out = 100)
y_q1 <- dexp(x_q1, rate = rate_e) * ancho_barra * 100 * (n_seg / n_total_global)
polygon(c(0.00, x_q1, 2.50), c(0, y_q1, 0), col = "#5DADE2", border = NA)

# 5. Dibujar la curva teórica (Roja) por encima de los colores
lines(x_curva, y_curva_hi, col = "#C0392B", lwd = 3)

# 6. Ejes y Estética
axis(2, las = 2, cex.axis = 0.7)
axis(1, at = cortes_seg, labels = sprintf("%.3f", cortes_seg), las = 2, cex.axis = 0.6)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")

# 7. Leyenda Explicativa
legend("topright", 
       legend = c("Curva Exponencial", 
                  "P 1: Ideal (0 a 2.5)", 
                  "P 2: Aceptable (0 a 5.0)"), 
       col = c("#C0392B", "#5DADE2", "#D4E6F1"), 
       lwd = c(3, 8, 8), bty = "n", cex = 0.8)

invisible()
\(Respuesta\) \(1\): Existe un \(86.93\)% de probabilidad de que el terreno presente una “Inclinación Ideal” (pendiente entre \(0.000\) y \(2.500\)), lo que garantiza excelentes condiciones naturales para la estabilidad de los seguidores solares.
\(Respuesta\) \(2\): De un lote de \(350\) estructuras, se estima que \(344\) soportes se ubicarán en el “Intervalo Aceptable” (pendiente entre \(0.000\) y \(5.000\)). Esto permite instalarlos directamente con pernos convencionales, evitando costos extra por nivelación del terreno.

9 TEOREMA DE LÍMITE CENTRAL

El TLC establece que, dada una muestra suficientemente grande (\(n\) > \(30\)), la distribución de las medias muestrales seguirá una distribución Normal. Esto nos permite estimar la Media Poblacional (\(\mu\)) verdadera utilizando intervalos de confianza.Los postulados de confianza empírica sugieren:
\(P(\bar{x} - E < \mu < \bar{x} + E) \approx 68\%\)
\(P(\bar{x} - 2E < \mu < \bar{x} + 2E) \approx 95\%\)
\(P(\bar{x} - 3E < \mu < \bar{x} + 3E) \approx 99\%\)
Donde el Margen de Error (E) se define como: \[E = \frac{\sigma}{\sqrt{n}}\]
# ==========================================================
# BLOQUE: TEOREMA DEL LÍMITE CENTRAL (PENDIENTE / SLOPE)
# ==========================================================

# 1. CARGAR LIBRERIAS (SILENCIADO)
suppressPackageStartupMessages({
  library(gt)
  library(dplyr)
  library(MASS)
})

# 2. PREPARACIÓN DE LA VARIABLE
# Usamos los datos dentro del rango de estudio (0.00 a 8.671)
slope_variable <- na.omit(Datos$slope)
slope_variable <- slope_variable[slope_variable >= 0.00 & slope_variable <= 8.671]

# 3. CALCULO DE ESTADISTICOS ARITMETICOS
x_bar_s <- mean(slope_variable)
sigma_s <- sd(slope_variable)
n_s <- length(slope_variable)

# 4. CALCULO DEL ERROR ESTANDAR Y MARGEN AL 95%
# El TLC nos dice que el error disminuye con la raíz de n
error_est_s <- sigma_s / sqrt(n_s)
margen_error_s <- 2 * error_est_s  # Aproximación para el 95% de confianza

# 5. INTERVALO DE CONFIANZA
lim_inf_s <- x_bar_s - margen_error_s
lim_sup_s <- x_bar_s + margen_error_s

# 6. CONSTRUCCION DE LA TABLA RESUMEN
tabla_tlc_s <- data.frame(
  Parametro = "Pendiente Promedio (Slope)",
  Lim_Inferior = lim_inf_s,
  Media_Muestral = x_bar_s,
  Lim_Superior = lim_sup_s,
  Error_Estandar = paste0("+/- ", sprintf("%.3f", margen_error_s)),
  Confianza = "95% (2*E)"
)

# 7. GENERACION DE LA TABLA VISUAL
# \u00d3 = Ó | \u00f3 = ó | \u00ed = í | \u00e1 = á
tabla_tlc_s %>%
  gt() %>%
  tab_header(
    title = md("**ESTIMACI\u00d3N DE LA MEDIA POBLACIONAL**"),
    subtitle = "Aplicaci\u00f3n del Teorema del L\u00edmite Central (Pendiente)"
  ) %>%
  cols_label(
    Parametro = "Par\u00e1metro",
    Lim_Inferior = "L\u00edmite Inferior",
    Media_Muestral = "Media Calculada",
    Lim_Superior = "L\u00edmite Superior",
    Error_Estandar = "Error Estimado"
  ) %>%
  fmt_number(
    columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
    decimals = 3  # Ajustado a 3 decimales para la variable pendiente
  ) %>%
  tab_style(
    style = list(cell_fill(color = "#F4ECF7"), cell_text(color = "#5B2C6F", weight = "bold")),
    locations = cells_body(columns = Media_Muestral)
  )
ESTIMACIÓN DE LA MEDIA POBLACIONAL
Aplicación del Teorema del Límite Central (Pendiente)
Parámetro Límite Inferior Media Calculada Límite Superior Error Estimado Confianza
Pendiente Promedio (Slope) 1.216 1.228 1.241 +/- 0.013 95% (2*E)

10 CONCLUSIÓN

La variable Pendiente fue modelada mediante una Distribución Exponencial, reflejando alta precisión en el relieve del terreno. Con una media muestral de \(1.228\) y aplicando el Teorema del Límite Central, se estima que la media poblacional se sitúa entre [\(1.216\); \(1.241\)] con un \(95\%\) de confianza. Estos resultados permiten estandarizar el diseño de los soportes estructurales y optimizar los costos de nivelación de la planta solar (\(\mu = 1.228 \pm 0.013\)).