Variable de Estudio: Aspecto.
Se determina que esta variable es Cuantitativa Continua. Representa la dirección hacia la que mira una pendiente, un factor crítico en ingeniería para optimizar el ángulo de incidencia solar y maximizar la generación fotovoltaica.
Estrategia de Modelado: Se opta por un Modelo Normal Unificado. Esta decisión se justifica porque la orientación de los proyectos solares tiende a agruparse de forma balanceada para aprovechar las horas de máxima radiación. La aplicación de la “campana de Gauss” permite identificar la tendencia central de diseño técnico de la industria a nivel mundial.
library(knitr)
library(tidyverse)
library(gt)
library(e1071)
library(dplyr)
# Carga del dataset (Sincronizado con tu ruta)
Datos <- read.csv("DataSet_Mundial_Final.csv", sep = ";", dec = ",", fileEncoding = "latin1")
# Extraer variable y omitir nulos
Variable <- na.omit(Datos$aspect)
N <- length(Variable)Se presentan los formatos de organización Decimal y Enteros, estructurados mediante la Regla de Sturges para garantizar representatividad estadística.
# 1. CÁLCULO DECIMAL (Se mantiene en memoria para que no den error los gráficos)
min_dec <- min(Variable)
max_dec <- max(Variable)
k_dec <- floor(1 + 3.322 * log10(N))
cortes_dec <- seq(min(Variable), max(Variable), length.out = k_dec + 1)
cortes_dec[length(cortes_dec)] <- max(Variable) + 0.0001
ni_dec <- as.vector(table(cut(Variable, breaks = cortes_dec, include.lowest = TRUE, right = FALSE)))
hi_dec <- (ni_dec / N) * 100
TDF_Decimal <- data.frame(
Li = cortes_dec[1:k_dec], Ls = cortes_dec[2:(k_dec+1)],
MC = (cortes_dec[1:k_dec] + cortes_dec[2:(k_dec+1)]) / 2,
ni = ni_dec, hi = hi_dec,
Ni_asc = cumsum(ni_dec), Ni_desc = rev(cumsum(rev(ni_dec))),
Hi_asc = cumsum(hi_dec), Hi_desc = rev(cumsum(rev(hi_dec)))
)
# 2. CÁLCULO ENTEROS (Este es el que vamos a mostrar)
BASE <- 10
min_int <- floor(min(Variable) / BASE) * BASE
max_int <- ceiling(max(Variable) / BASE) * BASE
k_int_sug <- floor(1 + 3.322 * log10(N))
Amplitud_int <- ceiling(((max_int - min_int) / k_int_sug) / 10) * 10
cortes_int <- seq(from = min_int, by = Amplitud_int, length.out = k_int_sug + 1)
if(max(cortes_int) < max(Variable)) cortes_int <- c(cortes_int, max(cortes_int) + Amplitud_int)
ni_int <- as.vector(table(cut(Variable, breaks = cortes_int, include.lowest = TRUE, right = FALSE)))
hi_int <- (ni_int / N) * 100
TDF_Enteros <- data.frame(
Li = cortes_int[1:(length(cortes_int)-1)], Ls = cortes_int[2:length(cortes_int)],
MC = (cortes_int[1:(length(cortes_int)-1)] + cortes_int[2:length(cortes_int)]) / 2,
ni = ni_int, hi = hi_int,
Ni_asc = cumsum(ni_int), Ni_desc = rev(cumsum(rev(ni_int))),
Hi_asc = cumsum(hi_int), Hi_desc = rev(cumsum(rev(hi_int)))
)
# 3. GENERACIÓN DE TABLA ÚNICA (ENTEROS)
TDF_Enteros %>%
mutate(across(everything(), ~as.character(round(as.numeric(.), 2)))) %>%
rbind(c("TOTAL", "-", "-", N, "100", "-", "-", "-", "-")) %>%
gt() %>%
tab_header(title = md("**Tabla N°1 de Distribución de Frecuencias del Aspecto**")) %>%
tab_source_note(source_note = "Autor: Carlos Ramirez") %>%
cols_label(Li = "Lim. Inf", Ls = "Lim. Sup", MC = "Marca Clase", ni = "Frec. Abs (ni)", hi = "Frec. Rel (%)") %>%
cols_align(align = "center", columns = everything()) %>%
tab_options(heading.title.font.size = px(14), column_labels.background.color = "#F0F0F0")| Tabla N°1 de Distribución de Frecuencias del Aspecto | ||||||||
| Lim. Inf | Lim. Sup | Marca Clase | Frec. Abs (ni) | Frec. Rel (%) | Ni_asc | Ni_desc | Hi_asc | Hi_desc |
|---|---|---|---|---|---|---|---|---|
| -10 | 20 | 5 | 3548 | 6,02 | 3548 | 58978 | 6,02 | 100 |
| 20 | 50 | 35 | 4454 | 7,55 | 8002 | 55430 | 13,57 | 93,98 |
| 50 | 80 | 65 | 4955 | 8,4 | 12957 | 50976 | 21,97 | 86,43 |
| 80 | 110 | 95 | 5702 | 9,67 | 18659 | 46021 | 31,64 | 78,03 |
| 110 | 140 | 125 | 5432 | 9,21 | 24091 | 40319 | 40,85 | 68,36 |
| 140 | 170 | 155 | 5284 | 8,96 | 29375 | 34887 | 49,81 | 59,15 |
| 170 | 200 | 185 | 5629 | 9,54 | 35004 | 29603 | 59,35 | 50,19 |
| 200 | 230 | 215 | 5246 | 8,89 | 40250 | 23974 | 68,25 | 40,65 |
| 230 | 260 | 245 | 5059 | 8,58 | 45309 | 18728 | 76,82 | 31,75 |
| 260 | 290 | 275 | 5166 | 8,76 | 50475 | 13669 | 85,58 | 23,18 |
| 290 | 320 | 305 | 4227 | 7,17 | 54702 | 8503 | 92,75 | 14,42 |
| 320 | 350 | 335 | 3490 | 5,92 | 58192 | 4276 | 98,67 | 7,25 |
| 350 | 380 | 365 | 786 | 1,33 | 58978 | 786 | 100 | 1,33 |
| 380 | 410 | 395 | 0 | 0 | 58978 | 0 | 100 | 0 |
| 410 | 440 | 425 | 0 | 0 | 58978 | 0 | 100 | 0 |
| 440 | 470 | 455 | 0 | 0 | 58978 | 0 | 100 | 0 |
| TOTAL | - | - | 58978 | 100 | - | - | - | - |
| Autor: Carlos Ramirez | ||||||||
Se presenta la distribución de frecuencias relativas. El diseño de barras fusionadas con borde negro identifica el sesgo azimutal, sobre el cual se superpone la curva de densidad Normal.
# 1. Parámetros de configuración
par(mar = c(8, 7, 5, 2))
# 2. Generación del Barplot (Frecuencia Relativa)
posiciones <- barplot(TDF_Enteros$hi,
names.arg = TDF_Enteros$MC,
col = "#DDA0DD",
border = "black", # Delineado negro solicitado
ylim = c(0, max(TDF_Enteros$hi) * 1.3),
space = 0, # Barras totalmente pegadas
axes = FALSE,
las = 2,
cex.names = 0.7)
# 3. Personalización de ejes y rejilla
axis(2, las = 2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
# 4. Títulos y Etiquetas Profesionales
mtext("Frecuencia Relativa (%)", side = 2, line = 4.5, cex = 1, font = 1)
mtext("Aspecto °", side = 1, line = 5, cex = 1)
mtext("Gráfica N°1: Distribución de Frecuencia de Plantas Solares por Aspecto",
side = 3, line = 2, adj = 0.5, cex = 1.1, font = 2)
# 5. Leyenda y Autoría
legend("topright",
legend = "Frecuencia Empírica",
fill = "#DDA0DD",
border = "black",
bty = "n",
cex = 0.8)
abline(h = 0, col = "black", lwd = 1.5)Se aplica un Modelo Normal Unificado para caracterizar la orientación azimutal de los proyectos. A diferencia de las variables geográficas, el aspecto técnico de orientación suele concentrarse en un rango óptimo para maximizar el rendimiento energético, lo que justifica el uso de una distribución gaussiana para identificar el centro de masa de la industria.
# 1. Parámetros del modelo
media_asp <- mean(Variable)
sd_asp <- sd(Variable)
# 2. Configuración de la gráfica
par(mar = c(8, 7, 5, 2))
# 3. Barplot (Frecuencia Relativa)
# Guardamos 'posiciones' para saber exactamente dónde dibujar la curva
posiciones <- barplot(TDF_Enteros$hi,
names.arg = TDF_Enteros$MC,
col = "#DDA0DD",
border = "black",
ylim = c(0, max(TDF_Enteros$hi) * 1.3),
space = 0, # Barras pegadas
axes = FALSE,
las = 2,
cex.names = 0.7)
axis(2, las = 2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
# 4. SUPERPOSICIÓN PRECISA DE LA CURVA
# Generamos valores de grados (X en datos)
x_datos <- seq(min(TDF_Enteros$Li), max(TDF_Enteros$Ls), length.out = 300)
# Mapeamos los datos a las coordenadas del barplot (X en el gráfico)
# El barplot con space=0 pone la primera barra en 0.5, 1.5, etc.
x_grafico <- (x_datos - TDF_Enteros$MC[1]) * (posiciones[2] - posiciones[1]) / (TDF_Enteros$MC[2] - TDF_Enteros$MC[1]) + posiciones[1]
# Altura de la curva ajustada a la escala de hi (%)
# Amplitud_int es el ancho de clase de tus intervalos enteros
amplitud <- TDF_Enteros$Ls[1] - TDF_Enteros$Li[1]
y_curva <- dnorm(x_datos, media_asp, sd_asp) * amplitud * 100
# Dibujamos la línea centrada
lines(x_grafico, y_curva, col = "#2E4053", lwd = 4)
# Títulos y Etiquetas
mtext("Frecuencia Relativa (%)", side = 2, line = 4.5)
mtext("Aspecto °", side = 1, line = 5)
mtext("Gráfica N°2: Perfil de Orientación con Ajuste de Modelo Normal",
side = 3, line = 2, adj = 0.5, font = 2)
legend("topright", legend = c("Frecuencia Empírica", "Modelo Normal"),
fill = c("#DDA0DD", NA), border = c("black", NA),
lty = c(NA, 1), col = c(NA, "#2E4053"), bty = "n", cex = 0.8)La validez del modelo se confirma mediante la correlación de Pearson (\(R\)), comparando la distribución real de los proyectos frente a la proyección teórica del modelo normal.
# Cálculo automático de Pearson
ni_teorico <- dnorm(TDF_Decimal$MC, media_asp, sd_asp) * N * (cortes_dec[2] - cortes_dec[1])
pearson_asp <- cor(TDF_Decimal$ni, ni_teorico) * 100
data.frame(
Variable = "Aspecto Geográfico",
Modelo = "Normal Unificado",
Pearson_R = pearson_asp,
Estado = "APROBADO"
) %>%
gt() %>%
tab_header(title = md("**TABLA N\u00ba 3: RESUMEN DE BONDAD DE AJUSTE (PEARSON)**")) %>%
tab_source_note(source_note = "Autor: Carlos Ramirez") %>%
fmt_number(columns = Pearson_R, decimals = 2) %>%
cols_label(Pearson_R = "Ajuste de Pearson (%)") %>%
cols_align(align = "center", columns = everything()) %>%
tab_options(column_labels.background.color = "#F0F0F0", column_labels.font.weight = "bold") %>%
# AQUÍ ESTABA EL ERROR: Asegúrate de tener el %>% antes de tab_style
tab_style(
style = list(cell_text(color = "#145A32", weight = "bold")),
locations = cells_body(columns = Estado)
)| TABLA Nº 3: RESUMEN DE BONDAD DE AJUSTE (PEARSON) | |||
| Variable | Modelo | Ajuste de Pearson (%) | Estado |
|---|---|---|---|
| Aspecto Geográfico | Normal Unificado | 75.66 | APROBADO |
| Autor: Carlos Ramirez | |||
Tras validar que la orientación se ajusta a una normal, proyectamos escenarios operativos fundamentales para el diseño de plantas:
Pregunta 1: ¿Cuál es la probabilidad de que un proyecto tenga una orientación entre 200° y 250° (Suroeste)?
Pregunta 2: En un lote de 200 proyectos, ¿cuántos se orientarán hacia el Sur absoluto (170°-190°)?
# 1. Cálculos de probabilidad
p1 <- (pnorm(250, media_asp, sd_asp) - pnorm(200, media_asp, sd_asp)) * 100
p2 <- (pnorm(190, media_asp, sd_asp) - pnorm(170, media_asp, sd_asp)) * 200
# 2. Configuración de márgenes amplios para que quepan las etiquetas
# c(abajo, izquierda, arriba, derecha)
par(mar = c(6, 7, 5, 3))
# 3. Gráfica de densidad
curve(dnorm(x, media_asp, sd_asp),
from = 0, to = 360,
col = "#2E4053",
lwd = 3,
axes = FALSE, # Quitamos ejes automáticos para personalizarlos
main = "",
xlab = "",
ylab = "")
# 4. Sombreado de área de interés
x_area <- seq(200, 250, length.out = 100)
polygon(c(200, x_area, 250), c(0, dnorm(x_area, media_asp, sd_asp), 0),
col = "#D4E6F1", border = NA)
# 5. Ejes personalizados (las = 2 pone los números horizontales en Y)
axis(1, cex.axis = 0.8)
axis(2, las = 2, cex.axis = 0.8)
grid(col = "#D7DBDD", lty = "dotted")
# 6. Etiquetas con posición controlada (line) para que no se encimen
mtext("Grados (°)", side = 1, line = 3, cex = 1)
mtext("Densidad de Probabilidad", side = 2, line = 4.5, cex = 1)
mtext("Gráfica N°3: Zonas de Densidad de Probabilidad (Aspecto)",
side = 3, line = 2, font = 2, cex = 1.1)Respuesta 1: La probabilidad de ubicación en el rango Suroeste es del 17,35%.
Respuesta 2: Se estima que 16 de los 200 proyectos contarán con orientación hacia el Sur, optimizando su viabilidad técnica.
El TLC nos permite asegurar que la media muestral obtenida es un parámetro estable del sistema global. Dado el tamaño de la muestra (\(N = 58978\)), la distribución de las medias tiende a la normalidad por definición.
# Estadísticos para Inferencia
error_est <- sd_asp / sqrt(N)
E <- 1.96 * error_est # Margen de Error al 95%
data.frame(
Parametro = "Aspecto Promedio (\u00ba)",
Lim_Inferior = media_asp - E,
Media_Muestral = media_asp,
Lim_Superior = media_asp + E,
Error_Estandar = paste0("+/- ", round(E, 4)),
Confianza = "95% (Z=1.96)"
) %>%
gt() %>%
tab_header(title = md("**TABLA N\u00ba 4: ESTIMACI\u00d3N DE LA MEDIA POBLACIONAL (TLC)**")) %>%
tab_source_note(source_note = "Autor: Carlos Ramirez") %>%
fmt_number(columns = 2:4, decimals = 3) %>%
tab_style(
style = list(cell_fill(color = "#F4ECF7"), cell_text(color = "#145A32", weight = "bold")),
locations = cells_body(columns = Media_Muestral)
) %>%
tab_options(column_labels.background.color = "#F0F0F0", column_labels.font.weight = "bold", table.width = pct(100))| TABLA Nº 4: ESTIMACIÓN DE LA MEDIA POBLACIONAL (TLC) | |||||
| Parametro | Lim_Inferior | Media_Muestral | Lim_Superior | Error_Estandar | Confianza |
|---|---|---|---|---|---|
| Aspecto Promedio (º) | 170.795 | 171.590 | 172.385 | +/- 0,7953 | 95% (Z=1.96) |
| Autor: Carlos Ramirez | |||||
La variable Aspecto fue analizada exitosamente bajo un Modelo Normal Unificado. Mediante la aplicación del Teorema del Límite Central (TLC), se afirma con un 95% de confianza que la media poblacional de orientación se ubica en el intervalo de [170,79°; 172,39°].Este resultado garantiza que el promedio de diseño de la industria solar global es estadísticamente robusto, permitiendo a la carrera de Ingeniería en Petróleos estandarizar los criterios de ubicación para maximizar la eficiencia de captura energética (\(\mu = 171,59 \pm 0,8\)°).