Aunque la variable Dirección del Viento predominante, es de naturaleza cualitativa nominal, para fines del presente análisis estadístico se ha procedido a realizar una recalificación a escala ordinal.”Se transformó la variable Dirección del Viento predominante mediante un ordenamiento descendente de frecuencias (ni ). Esta jerarquización se justifica por la siguiente razon: Priorización Climática: Permite identificar a X1 como la dirección predominante (Moda), estableciendo una escala de importancia para la ingeniería solar.
Importamos el archivo “Mundial.csv” desde una ruta local y lo almacena en el objeto datos, usando espacios o tabulaciones como separador.
# 1. CARGA DE LIBRERÍAS (Silenciadas para el informe)
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(readxl))
suppressPackageStartupMessages(library(gt))
datos <-read_excel("C:\\Users\\Luis\\Downloads\\prima\\Dataset_Mundial_Final.xls")
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 Dirección del viento predominante, omitimos las celdas en blanco o valores iguales a cero y verificamos el tamaño muestral.
En este apartado se cuantifican la dirección del viento por categoría predominante y se asigna un identificador numérico (Xi ) a cada subtipo de direccion del viento.
# 1. Extracción, Limpieza y Traducción de la variable dt_wind
tabla_viento_base <- datos %>%
filter(!is.na(dt_wind) & dt_wind != "") %>%
group_by(dt_wind) %>%
summarise(ni = n()) %>%
arrange(desc(ni)) %>%
mutate(dt_wind = case_when(
dt_wind == "North" ~ "Norte",
dt_wind == "South" ~ "Sur",
dt_wind == "East" ~ "Este",
dt_wind == "West" ~ "Oeste",
dt_wind == "Northeast" ~ "Noreste",
dt_wind == "Northwest" ~ "Noroeste",
dt_wind == "Southeast" ~ "Sureste",
dt_wind == "Southwest" ~ "Suroeste",
TRUE ~ dt_wind
))
# 2. Construcción de la tabla con ID (Xi) y Porcentaje (hi)
tabla_viento_final <- tabla_viento_base %>%
mutate(
ID = as.character(row_number()),
hi = round((ni / sum(ni)) * 100, 2)
) %>%
dplyr::select(ID, dt_wind, ni, hi)
# 3. Creación de la fila de TOTAL
fila_total_v <- data.frame(
ID = "",
dt_wind = "TOTAL",
ni = sum(tabla_viento_final$ni),
hi = 100.00
)
# 4. Unión de la tabla con el total
tabla_render_viento <- rbind(tabla_viento_final, fila_total_v)
# 5. Visualización con GT (Corregido con Unicode para evitar errores de tildes)
tabla_render_viento %>%
gt() %>%
tab_header(
title = md("**Tabla N\u00ba 1: Distribuci\u00f3n de Frecuencias de la Direcci\u00f3n del Viento predominante**")
) %>%
cols_label(
ID = "Xi",
dt_wind = "Punto Cardinal",
ni = "Frecuencia (ni)",
hi = "Porcentaje (hi %)"
) %>%
fmt_number(columns = ni, decimals = 0) %>%
fmt_number(columns = hi, decimals = 2) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#F0F0F0"), cell_text(weight = "bold")),
locations = cells_column_labels()
) %>%
tab_style(
style = list(cell_text(weight = "bold"), cell_fill(color = "#E8E8E8")),
locations = cells_body(rows = nrow(tabla_render_viento))
) %>%
tab_options(
table.width = pct(100),
data_row.padding = px(5)
) %>%
tab_source_note(
source_note = "**Autor:** JULEYDI MILES"
)| Tabla Nº 1: Distribución de Frecuencias de la Dirección del Viento predominante | |||
| Xi | Punto Cardinal | Frecuencia (ni) | Porcentaje (hi %) |
|---|---|---|---|
| 1 | Suroeste | 21,042 | 35.68 |
| 2 | Oeste | 11,472 | 19.45 |
| 3 | Sureste | 10,675 | 18.10 |
| 4 | Este | 8,118 | 13.76 |
| 5 | Sur | 7,327 | 12.42 |
| 6 | Noreste | 160 | 0.27 |
| 7 | Norte | 153 | 0.26 |
| 8 | Noroeste | 31 | 0.05 |
| TOTAL | 58,978 | 100.00 | |
| **Autor:** JULEYDI MILES | |||
# Generación de la gráfica de barras para frecuencias absolutas (ni)
# Filtramos para que no aparezca el "TOTAL" en la gráfica
grafica_viento_data <- tabla_render_viento[tabla_render_viento$ID != "" & !is.na(tabla_render_viento$ID), ]
ggplot(grafica_viento_data, aes(x = factor(ID), y = ni)) +
geom_bar(stat = "identity", fill = "#B0C4DE", color = "black") +
theme_minimal() +
labs(
title = "Gr\u00e1fica N\u00ba 1: Distribuci\u00f3n General de la Direcci\u00f3n del Viento Predominante",
x = "Direcci\u00f3n del Viento (Xi)",
y = "Cantidad"
)
# CONJETURA DE MODELO GEOMÉTRICO #
Se seleccionó el modelo geométrico debido a que la distribución de frecuencias de las direcciones del viento, una vez ordenadas por su importancia (Moda), presenta un decaimiento sucesivo. Este comportamiento visual, donde la dirección predominante concentra la mayoría de los eventos y las demás disminuyen progresivamente, sugiere un ajuste a una distribución geométrica.
# 1. Limpieza de datos
# Filtramos para quitar la fila del TOTAL (que tiene ID vacío "") y evitar el error
tabla_mod_viento <- tabla_render_viento[tabla_render_viento$ID != "" & !is.na(tabla_render_viento$ID), ]
# 2. Estimación del parámetro p basado en la media observada
# CORRECCIÓN: as.numeric para permitir la operación matemática
media_viento <- sum(as.numeric(tabla_mod_viento$ID) * tabla_mod_viento$ni) / sum(tabla_mod_viento$ni)
p_est_viento <- 1 / media_viento
# 3. Cálculo de frecuencias relativas teóricas (Modelo %)
# CORRECCIÓN: as.numeric en la potencia
tabla_mod_viento$hi_modelo <- (p_est_viento * (1 - p_est_viento)^(as.numeric(tabla_mod_viento$ID) - 1)) * 100
# 4. Preparación de datos para la comparación
library(tidyr)
df_comp_viento <- pivot_longer(tabla_mod_viento,
cols = c("hi", "hi_modelo"),
names_to = "Origen",
values_to = "Valor")
# Ajuste de etiquetas para la leyenda
df_comp_viento$Origen <- ifelse(df_comp_viento$Origen == "hi", "Realidad", "Modelo")
# 5. Generación de la Gráfica N° 4
ggplot(df_comp_viento, aes(x = factor(ID), y = Valor, fill = Origen)) +
geom_bar(stat = "identity", position = "dodge", color = "black") +
# Mantengo tus colores: skyblue y dodgerblue4
scale_fill_manual(values = c("Modelo" = "skyblue", "Realidad" = "#B0C4DE")) +
theme_minimal() +
labs(
title = "Gr\u00e1fica N\u00ba 4: Modelo de probabilidad geom\u00e9trico de direcci\u00f3n del viento predominante",
x = "Direcci\u00f3n del Viento",
y = "Probabilidad ",
fill = "Leyenda"
)
# TEST DE PEARSON #
# 1. Definir Fo (Frecuencias Observadas - Realidad)
Fo_viento <- tabla_mod_viento$hi
# 2. Definir Fe (Frecuencias Esperadas - Modelo Geométrico)
Fe_viento <- tabla_mod_viento$hi_modelo
# 3. Cálculo de la Correlación de Pearson
Correlacion_Viento <- cor(Fo_viento, Fe_viento) * 100
# 4. Mostrar el resultado en el documento
cat("La correlación de Pearson (afinidad) entre la Realidad y el Modelo es:",
round(Correlacion_Viento, 2), "%")## La correlación de Pearson (afinidad) entre la Realidad y el Modelo es: 94.35 %
# 1. Definición de parámetros básicos
k_viento <- length(tabla_mod_viento$ni)
n_total_viento <- sum(tabla_mod_viento$ni)
# 2. Grados de libertad (k - 1 - parámetros estimados)
grados_lib_viento <- k_viento - 2
# 3. Nivel de significancia
nivel_sign_viento <- 0.001
# 4. Preparación de Frecuencias Porcentuales (Fo y Fe)
Fo_p_viento <- tabla_mod_viento$hi
Fe_p_viento <- tabla_mod_viento$hi_modelo
# 5. Cálculo del estadístico Chi-Cuadrado (x2)
x2_viento <- sum((Fe_p_viento - Fo_p_viento)^2 / Fe_p_viento)
# 6. Determinación del Umbral (Valor Crítico)
umbral_viento <- qchisq(1 - nivel_sign_viento, grados_lib_viento)
# 7. Resultado del Test
modelo_viento_aceptado <- x2_viento < umbral_viento
# Resultados
cat("Estadístico Chi-Cuadrado calculado:", round(x2_viento, 4), "\n")## Estadístico Chi-Cuadrado calculado: 20.4291
## Umbral de Aceptación (Valor Crítico): 22.4577
## ¿El modelo es aceptado bajo este umbral?: TRUE
Para demostrar la utilidad práctica del análisis realizado sobre las condiciones climáticas de las plantas solares, se plantean y resuelven dos interrogantes.
¿Cuál es la probabilidad teórica de que, al registrar una nueva planta, el viento provenga de la dirección predominante suroeste (ID 1)?
# La probabilidad teórica del primer evento en el modelo geométrico es p
prob_teorica_viento_id1 <- p_est_viento
cat("Respuesta: La probabilidad teórica es del", round(prob_teorica_viento_id1 * 100, 2), "%")## Respuesta: La probabilidad teórica es del 40.01 %
Si se analizan 500 nuevas ubicaciones y se mantiene la distribución observada, ¿en cuántas de ellas se espera que el viento sople desde la segunda dirección más frecuente oeste (ID 2)?
# Obtenemos la frecuencia relativa real (hi) para el ID 2 de la tabla de vientos
hi_viento_id2 <- tabla_mod_viento$hi[tabla_mod_viento$ID == 2]
# Cálculo de la cantidad esperada para una muestra de N = 500
n_proyeccion_v <- 500
cantidad_esperada_v <- (hi_viento_id2 / 100) * n_proyeccion_v
cat("Respuesta: Se esperarían aproximadamente", round(cantidad_esperada_v, 0), "plantas con esta dirección de viento.")## Respuesta: Se esperarían aproximadamente 97 plantas con esta dirección de viento.
La variable Dirección del Viento predominante presenta un comportamiento que se ajusta satisfactoriamente al modelo geométrico tras ordenar sus categorías por frecuencia. Esta estructura permite predecir, por ejemplo, ¿Cuál es la probabilidad de que, al registrar una nueva planta, el viento provenga de la dirección predominante suroeste (ID 1)?la probabilidad es de un 40.01 %.