\(Variable\) \(de\) \(Estudio\): Tamaño de la Planta (Size).
Se determina que esta variable es Cualitativa Ordinal, categorizada en tres niveles (Small, Medium y Big). El tamaño de la planta condiciona directamente la infraestructura y la planificación logística del proyecto. Debido a la tendencia de los datos a concentrarse en instalaciones de menor tamaño y disminuir progresivamente hacia las más grandes, se opta por una Estrategia de Modelado Único:
\(Modelo\) \(Aceptado\): Distribución Geométrica (Validado mediante Test de Pearson, lo que confirma que el modelo es coherente y confiable para una planificación logística segura).
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 ...
Extraemos la variable size, omitimos las celdas en blanco y verificamos el tamaño muestral.
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)
})
size_vec <- factor(Datos$size,
levels = c("Small", "Medium", "Big"),
ordered = TRUE)
conteo_size_raw <- table(size_vec)
ni_size_val <- as.numeric(conteo_size_raw)
hi_size_val <- (ni_size_val / sum(ni_size_val)) * 100
df_size_final <- data.frame(
Asignacion = 1:3,
Tamano = names(conteo_size_raw),
ni = ni_size_val,
hi = hi_size_val
)
df_size_final %>%
gt() %>%
tab_header(
title = md("**TABLA N\u00ba 1: DISTRIBUCI\u00d3N DE FRECUENCIAS DEL TAMA\u00d1O DE PLANTA**"),
) %>%
cols_label(
Asignacion = "Asignaci\u00f3n",
Tamano = "Tama\u00f1o de la Planta",
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 TAMAÑO DE PLANTA | |||
| Asignación | Tamaño de la Planta | ni | hi (%) |
|---|---|---|---|
| 1 | Small | 41069 | 69.63 |
| 2 | Medium | 13208 | 22.39 |
| 3 | Big | 4701 | 7.97 |
par(mar = c(9, 4, 4, 2))
barplot(df_size_final$hi,
main = "GR\u00c1FICO N\u00ba 1: PORCENTAJE DEL TAMA\u00d1O DE LA PLANTA",
ylab = "Porcentaje (%)",
col = "#B0C4DE", # Azul profesional (se mantiene)
names.arg = c("1", "2", "3"),
las = 1, # Etiquetas verticales
cex.names = 0.9, # Tamaño de las etiquetas "Small, Medium, Big"
cex.axis = 0.8, # Tamaño de los números del eje Y
cex.main = 1.0, # Tamaño del título principal
ylim = c(0, max(df_size_final$hi) + 10)) # Espacio extra arriba para que no tope el título
mtext("Tama\u00f1o de la Planta", side = 1, line = 7)Se aplicó una Distribución Geométrica para validar el Tamaño de la Planta. Este modelo es ideal para representar la tendencia decreciente de las categorías (de Small a Big). La alta correlación entre lo observado y lo esperado confirma que la distribución del tamaño sigue una lógica técnica coherente, respaldando la validez del análisis logístico del proyecto.
X_indices <- 0:2
n_total_Size <- sum(df_size_final$ni)
media_obs_size <- sum(X_indices * df_size_final$ni) / n_total_Size
prob_p_geom <- 1 / (media_obs_size + 1)
P_Geometrica_Size <- dgeom(X_indices, prob = prob_p_geom) * 100
par(mar = c(9, 4, 4, 2))
max_y_size <- max(max(df_size_final$hi), max(P_Geometrica_Size))
barplot(rbind(df_size_final$hi, P_Geometrica_Size),
beside = TRUE,
main = "GR\u00c1FICO N\u00ba 2: Comparado de lo Observado frente a lo Esperado del Tamaño de la Planta",
ylab = "Porcentaje (%)",
names.arg = c("1", "2", "3"),
col = c("#B0C4DE", "#AED6F1"),
ylim = c(0, max_y_size + 25),
las = 1,
cex.names = 0.9,
cex.main = 0.85)
legend("topright",
legend = c("Realidad", "Modelo Geom"),
fill = c("#B0C4DE", "#AED6F1"),
bty = "n", cex = 0.8)
mtext("Tama\u00f1o de la Planta ", side = 1, line = 6)Fo_Size <- df_size_final$hi
Fe_Size <- P_Geometrica_Size
test_correlacion_size <- cor.test(Fo_Size, Fe_Size)
r_valor_size <- round(test_correlacion_size$estimate, 4) # El coeficiente 'r'
par(mar = c(5, 5, 4, 2))
plot(Fo_Size, Fe_Size,
main = "GR\u00c1FICO N\u00ba 3: CORRELACI\u00d3N DEL MODELO GEOM\u00c9TRICO",
cex.main = 0.85,
xlab = "Frecuencia Observada (%)",
ylab = "Frecuencia Esperada (%)",
pch = 19,
col = "#2E4053",
cex = 1.5)
abline(lm(Fe_Size ~ Fo_Size), col = "red", lwd = 2)
text(x = min(Fo_Size), y = max(Fe_Size),
labels = paste("r =", r_valor_size),
pos = 4, font = 2, col = "#2E4053")## [1] 99.98424
x2_Size_Geom <- sum(((Fo_Size - P_Geometrica_Size)^2) / P_Geometrica_Size)
gl_Size <- length(Fo_Size) - 1
vc_Size <- qchisq(0.95, gl_Size)
cat("Estad\u00edstico Chi-cuadrado (Calculado):", round(x2_Size_Geom, 4), "\n")## Estadístico Chi-cuadrado (Calculado): 1.4302
## Valor Crítico (Tabla): 5.9915
cat("\u00bfSe acepta el modelo Geom\u00e9trico? (Calculado < Cr\u00edtico):", x2_Size_Geom < vc_Size, "\n")## ¿Se acepta el modelo Geométrico? (Calculado < Crítico): TRUE
tabla_resumen_Size <- data.frame(
Variable = "Tama\u00f1o de la Planta", # \u00f1 es la letra ñ
Pearson = round(Correlacion_Size_Geom, 2),
Chi2 = round(x2_Size_Geom, 4),
Umbral = round(vc_Size, 2),
Resultado = ifelse(x2_Size_Geom < vc_Size, "Modelo Aceptado", "Modelo Rechazado")
)
library(gt)
library(dplyr)
tabla_resumen_Size %>%
gt() %>%
tab_header(
title = md("**TABLA N\u00ba 2: RESUMEN DEL TEST DE BONDAD AL MODELO DE PROBABILIDAD (SIZE)**")
) %>%
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_style(
style = cell_text(color = "red", weight = "bold"),
locations = cells_body(columns = Resultado, rows = Resultado == "Modelo Rechazado")
) %>%
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 (SIZE) | ||||
| Variable | Test Pearson (%) | Chi Cuadrado | Umbral de Aceptación | Resultado Final |
|---|---|---|---|---|
| Tamaño de la Planta | 99.98 | 1.4302 | 5.99 | Modelo Aceptado |
| Autor: Fernando Neira | ||||
## [1] 69.63444
La probabilidad de que una planta seleccionada al azar presente un tamaño “Small” es del 69.63444%. Este resultado es clave para la dimensión del proyecto, ya que indica que la gran mayoría de las unidades evaluadas corresponden a pequeña escala, lo que sugiere una infraestructura distribuida y de menor impacto inicial en el terreno.
## [1] 92.02923
La probabilidad de que un punto seleccionado al azar presente un tamaño Small o Medium (No Big) es del 92.02923%. Este resultado es clave para el presupuesto, ya que confirma que casi la totalidad del proyecto se puede ejecutar con logística estándar y equipos convencionales.
El modelo geométrico confirmó que predominan las instalaciones Small. Aunque existe variabilidad en los datos, el alto coeficiente de Pearson valida la tendencia y da un respaldo estadístico sólido para organizar la logística y la infraestructura del proyecto.