1 Configuración y Carga de Datos

##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: Juleydi Miles ####
### CARRERA: INGENIERÍA EN PETRÓLEOS #####


#### VARIABLE CAPACIDAD ####
## DATASET ##
# Cargar dataset
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 ...

2 Cálculo de Intervalos y Frecuencias

library(readxl)
library(dplyr)
library(gt)

datos <- read_excel("C:\\Users\\Luis\\Downloads\\prima\\Dataset_Mundial_Final.xls")

Variable <- datos %>%
  mutate(dist_km = as.numeric(dist_to_road) / 1000) %>%
  filter(dist_km >= 0 & dist_km <= 3) %>%
  pull(dist_km) %>%
  na.omit()

N <- length(Variable)

min_dec <- min(Variable)
max_dec <- max(Variable)
k_dec   <- floor(1 + 3.322 * log10(N))
rango_dec <- max_dec - min_dec
amplitud_dec <- rango_dec / k_dec

cortes_dec <- seq(min_dec, max_dec, length.out = k_dec + 1)
cortes_dec[length(cortes_dec)] <- max_dec + 0.0001

inter_dec <- cut(Variable, breaks = cortes_dec, include.lowest = TRUE, right = FALSE)
ni_dec    <- as.vector(table(inter_dec))

hi_dec      <- (ni_dec / N) * 100
Ni_asc_dec  <- cumsum(ni_dec)
Hi_asc_dec  <- cumsum(hi_dec)
Ni_desc_dec <- rev(cumsum(rev(ni_dec)))
Hi_desc_dec <- rev(cumsum(rev(hi_dec)))

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 = Ni_asc_dec,
  Ni_desc = Ni_desc_dec,
  Hi_asc = Hi_asc_dec,
  Hi_desc = Hi_desc_dec
)

TDF_Final <- TDF_Decimal %>%
  mutate(across(c(Li, Ls, MC, hi, Hi_asc, Hi_desc), ~ as.character(round(., 2))),
         across(c(ni, Ni_asc, Ni_desc), as.character))

fila_total <- c("TOTAL", "-", "-", as.character(sum(ni_dec)), "100.00", "-", "-", "-", "-")
TDF_Final <- rbind(TDF_Final, fila_total)

TDF_Final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla Nº 1: Distribución de Frecuencias de Distancia a la Vía (km)**"),
    subtitle = md("*Rango: 0 a 3 km*")
  ) %>%
  cols_label(
    Li = "Lim. Inf", Ls = "Lim. Sup", MC = "Marca Clase",
    ni = "ni", hi = "hi (%)", Ni_asc = "Ni (Asc)", 
    Ni_desc = "Ni (Desc)", Hi_asc = "Hi Asc (%)", Hi_desc = "Hi Desc (%)"
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_style(
    style = list(cell_fill(color = "#F0F0F0"), cell_text(weight = "bold")),
    locations = cells_column_labels()
  ) %>%
  tab_source_note(source_note = md("**Autor:** Juleydi Miles")) %>%
  tab_options(table.width = pct(100))
Tabla Nº 1: Distribución de Frecuencias de Distancia a la Vía (km)
Rango: 0 a 3 km
Lim. Inf Lim. Sup Marca Clase ni hi (%) Ni (Asc) Ni (Desc) Hi Asc (%) Hi Desc (%)
0 0.19 0.09 13583 29.97 13583 45315 29.97 100
0.19 0.37 0.28 6889 15.2 20472 31732 45.18 70.03
0.37 0.56 0.47 5252 11.59 25724 24843 56.77 54.82
0.56 0.75 0.66 4308 9.51 30032 19591 66.27 43.23
0.75 0.94 0.84 3764 8.31 33796 15283 74.58 33.73
0.94 1.12 1.03 2273 5.02 36069 11519 79.6 25.42
1.12 1.31 1.22 1471 3.25 37540 9246 82.84 20.4
1.31 1.5 1.41 1328 2.93 38868 7775 85.77 17.16
1.5 1.69 1.59 1134 2.5 40002 6447 88.28 14.23
1.69 1.87 1.78 1030 2.27 41032 5313 90.55 11.72
1.87 2.06 1.97 934 2.06 41966 4283 92.61 9.45
2.06 2.25 2.16 779 1.72 42745 3349 94.33 7.39
2.25 2.44 2.34 751 1.66 43496 2570 95.99 5.67
2.44 2.62 2.53 653 1.44 44149 1819 97.43 4.01
2.62 2.81 2.72 599 1.32 44748 1166 98.75 2.57
2.81 3 2.91 567 1.25 45315 567 100 1.25
TOTAL - - 45315 100.00 - - - -
Autor: Juleydi Miles

3 Análisis Gráfico

3.1 Histogramas de Cantidad

# 1. Configuración de márgenes y área gráfica
# Aumentamos el margen inferior para el título y el autor
par(mar = c(7, 7, 5, 3)) 

# Obtenemos la cantidad de intervalos de tu TDF_Decimal
k_barras <- nrow(TDF_Decimal)

# 2. Creación del Gráfico (Histograma de barras juntas)
# xaxt = "n" elimina el eje X por defecto para poner el nuestro de 0 a 3
# xaxs = "i" asegura que las barras peguen exactamente en los bordes
grafico <- barplot(TDF_Decimal$ni, 
                  main = "", 
                  xlab = "", 
                  ylab = "",
                  col = "#B0C4DE", 
                  border = "black",
                  ylim = c(0, max(TDF_Decimal$ni) * 1.2),
                  space = 0, 
                  las = 1,
                  xaxt = "n",
                  xaxs = "i")

# 3. Personalización del Eje X (Separación exacta 0, 1, 2, 3 km)
# Colocamos marcas cada 1 km dividiendo el ancho total de las barras
axis(1, 
     at = seq(0, k_barras, length.out = 4), 
     labels = c("0", "1", "2", "3"),
     cex.axis = 1, 
     font = 2)

# 4. Textos y Etiquetas (Usando tus parámetros de km)
mtext("Cantidad de Plantas (ni)", side = 2, line = 4.5, cex = 1, font = 1)
mtext("Distancia a la Vía (km)", side = 1, line = 3, font = 2)

mtext("Gráfica Nº 1: Distribución de Plantas Solares por Distancia Vial", 
      side = 3, 
      line = 2, 
      adj = 0.5, 
      cex = 1, 
      font = 2)

# Créditos
mtext("Autor: Juleydi Miles", side = 1, line = 5, adj = 1, cex = 0.8, font = 3)

# Cuadrícula de guía opcional
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

# 1. Configuración de márgenes
par(mar = c(7, 7, 5, 3)) 

# Obtenemos la cantidad de intervalos
k_barras <- nrow(TDF_Decimal)

# 2. Creación del Gráfico Global
# El ylim se fija en 58978 (Total de la muestra)
grafico_global <- barplot(TDF_Decimal$ni, 
                         main = "", 
                         xlab = "", 
                         ylab = "",
                         col = "#B0C4DE", 
                         border = "black",
                         ylim = c(0, 58978), 
                         space = 0, 
                         las = 1,
                         xaxt = "n",
                         xaxs = "i")

# 3. Personalización del Eje X (0 a 3 km)
axis(1, 
     at = seq(0, k_barras, length.out = 4), 
     labels = c("0", "1", "2", "3"),
     cex.axis = 1, 
     font = 2)

# 4. Textos y Etiquetas
mtext("Cantidad de Plantas (ni)", side = 2, line = 4.5, cex = 1, font = 1)
mtext("Distancia a la Vía (km)", side = 1, line = 3, font = 2)

mtext("Gráfica Nº 2: Distribución Global de Plantas Solares por Distancia Vial", 
      side = 3, 
      line = 2, 
      adj = 0.5, 
      cex = 1, 
      font = 2)

# Créditos
mtext("Autor: Juleydi Miles", side = 1, line = 5, adj = 1, cex = 0.8, font = 3)

# Cuadrícula de guía
grid(nx = NA, ny = NULL, col = "gray85", lty = "dotted")

# Etiquetas de valor sobre las barras
text(x = grafico_global, 
     y = TDF_Decimal$ni, 
     labels = TDF_Decimal$ni, 
     pos = 3, 
     cex = 0.7)

3.2 Histogramas Porcentuales

# 1. Configuración de márgenes
par(mar = c(7, 7, 5, 3)) 

# 2. Cantidad de barras
k_barras <- nrow(TDF_Decimal)

# 3. Barplot Porcentual Local
# ylim se ajusta al porcentaje más alto encontrado en la tabla
bp_p_local <- barplot(TDF_Decimal$hi, 
                     main = "", 
                     xlab = "", 
                     ylab = "Porcentaje (%)", 
                     col = "#B0C4DE", 
                     border = "black",
                     space = 0, 
                     las = 1, 
                     xaxt = "n",
                     xaxs = "i",
                     ylim = c(0, max(TDF_Decimal$hi) * 1.3))

# 4. Eje X (0 a 3 km)
axis(1, at = seq(0, k_barras, length.out = 4), labels = c("0", "1", "2", "3"), font = 2)

# 5. Títulos y Etiquetas
mtext("Distancia a la Vía (km)", side = 1, line = 3, font = 2)
mtext("Gráfica Nº 3: Distribución Porcentual Local de Plantas Solares", 
      side = 3, line = 2, adj = 0.5, cex = 1, font = 2)

# 6. Etiquetas de % sobre las barras
text(x = bp_p_local, 
     y = TDF_Decimal$hi, 
     labels = paste0(round(TDF_Decimal$hi, 2), "%"), 
     pos = 3, cex = 0.8)

# Autor
mtext("Autor: Juleydi Miles", side = 1, line = 5, adj = 1, cex = 0.8, font = 3)
grid(nx = NA, ny = NULL, col = "gray90", lty = "dotted")

# Este gráfico es fundamental para mostrar qué tan grande es el porcentaje de los intervalos respecto al total (100%).

# 1. Configuración de márgenes
par(mar = c(7, 7, 5, 3)) 

# 2. Barplot Porcentual Global
# El ylim se fija en 100 para representar la totalidad
bp_p_global <- barplot(TDF_Decimal$hi, 
                      main = "", 
                      xlab = "", 
                      ylab = "Porcentaje (%)", 
                      col = "#B0C4DE", 
                      border = "black",
                      space = 0, 
                      las = 1, 
                      xaxt = "n",
                      xaxs = "i",
                      ylim = c(0, 100)) # Límite global del 100%

# 3. Eje X (0 a 3 km)
axis(1, at = seq(0, k_barras, length.out = 4), labels = c("0", "1", "2", "3"), font = 2)

# 4. Títulos y Etiquetas
mtext("Distancia a la Vía (km)", side = 1, line = 3, font = 2)
mtext("Gráfica Nº 4: Distribución Porcentual Global de Plantas Solares", 
      side = 3, line = 2, adj = 0.5, cex = 1, font = 2)

# 5. Etiquetas de % sobre las barras
text(x = bp_p_global, 
     y = TDF_Decimal$hi, 
     labels = paste0(round(TDF_Decimal$hi, 2), "%"), 
     pos = 3, cex = 0.8)

# Autor
mtext("Autor: Juleydi Miles", side = 1, line = 5, adj = 1, cex = 0.8, font = 3)
grid(nx = NA, ny = NULL, col = "gray90", lty = "dotted")

3.3 Diagrama de Cajas (Boxplot)

3.4 Ojivas

4 Indicadores Estadísticos

Tabla Nº 3: Indicadores Estadísticos de la Distancia a la Vía
Resumen de tendencia central, dispersión y forma
Variable Rango Media (X) Mediana (Me) Moda (Mo) Varianza (V) Desv. Est. (Sd) C.V. (%) Asimetría (As) Curtosis (K) Outliers [Intervalo]
Distancia a la Vía (km) [0; 3] 0.69 0.45 0.09 0.506 0.711 103.06 1.377 1.168 2959 [2.16; 3]
Autor: Juleydi Miles

5 Conclusión

La variable “Distancia a la Vía (m)” fluctúa entre [0 ; 3] km y sus valores se encuentran alrededor de 0.45, con una desviación estándar de 0.711, siendo una variable muy heterogénea, cuyos valores se concentran en la parte media alta de la variable con la agregación de valores atípicos de 2959 outliers; por todo lo anterior, el comportamiento de la variable es regular.