# 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 ...
# 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 |
# 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 |
# 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)# ==========================================================
# 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)# ==========================================================
# 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) ---
## Modelo: Exponencial | Rango: 0.00 a 8.671
## Prueba Chi-cuadrado: APROBADO
## Chi-calculado: 12,48 | Chi-crítico: 29,14
## Correlación de Pearson: 97,49 %
# 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)")| 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 |
# ==========================================================
# 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)# ==========================================================
# 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) |