1 Configuración y Carga de Datos

##### UNIVERSIDAD CENTRAL DEL ECUADOR #####
#### AUTOR: MARTIN SARMIENTO ####
### CARRERA: INGENIERÍA EN PETRÓLEOS #####


#### VARIABLE ASPECTO ####
## DATASET ##
setwd("~/R/ASPECT")
# Cargar dataset
Datos <- read.csv("DataSet_.csv", sep = ";", fileEncoding = "latin1")
# Estructura de los datos
str(Datos)
## 'data.frame':    7142 obs. of  26 variables:
##  $ fid                  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ objectid             : int  127 128 129 130 131 132 133 134 135 136 ...
##  $ code                 : chr  "Arg-00001" "Arg-00002" "Arg-00003" "Arg-00004" ...
##  $ country              : chr  "Argentina" "Argentina" "Argentina" "Argentina" ...
##  $ plant_name           : chr  "Aconcagua solar farm" "Aconcagua solar farm" "Altiplano 200 Solar Power Plant" "Altiplano 200 Solar Power Plant" ...
##  $ operational_status   : chr  "announced" "announced" "operating" "operating" ...
##  $ longitude            : num  -68.9 -68.9 -66.9 -66.9 -68.9 ...
##  $ latitude             : num  -33 -33 -24.1 -24.1 -33.3 ...
##  $ elevation            : int  929 929 4000 4000 937 865 858 858 858 858 ...
##  $ area                 : num  0 0 4397290 5774 0 ...
##  $ slope                : num  0.574 0.574 1.603 6.243 0.903 ...
##  $ slope_type           : chr  "Plano o casi plano" "Plano o casi plano" "Plano o casi plano" "Moderado" ...
##  $ curvature            : num  0.000795 0.000795 -0.002781 -0.043699 0.002781 ...
##  $ curvature_type       : chr  "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies planas o intermedias" "Superficies cóncavas / Valles" ...
##  $ aspect               : num  55.1 55.1 188.7 270.9 108.4 ...
##  $ aspect_type          : chr  "Northeast" "Northeast" "South" "West" ...
##  $ ghi                  : num  6.11 6.11 8.01 7.88 6.12 ...
##  $ solar_aptitude       : num  0.746 0.746 0.8 0.727 0.595 ...
##  $ solar_aptittude_class: chr  "Alta" "Alta" "Alta" "Alta" ...
##  $ humidity             : num  0 0 53.7 53.7 0 ...
##  $ wind_speed           : num  3.78 3.78 7.02 8.33 3.87 ...
##  $ wind_direction       : num  0 0 55.1 55.1 0 ...
##  $ ambient_temperature  : num  12.6 12.6 6.8 6.8 13.1 ...
##  $ optimal_tilt         : int  31 31 26 26 31 33 30 30 30 30 ...
##  $ peak_power_per_hour  : num  4.98 4.98 6.39 6.39 4.97 ...
##  $ total_power          : num  25 66.2 101 107 180 ...
# Cargamos las librerias
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(gt)
library(e1071)

2 Cálculo de Intervalos y Frecuencias

#Extraer variable
Variable <- na.omit(Datos$aspect)
N <- length(Variable)

# Cálculos básicos 
min_val <- min(Variable)
max_val <- max(Variable)
Rango <- max_val - min_val
K <- floor(1 + 3.322 * log10(N)) 
Amplitud <- Rango / K

# Creación de Límites 
lim_inf <- round(seq(from = min_val, to = max_val - Amplitud, by = Amplitud), 2)
# Ajuste para el último límite
lim_sup <- round(seq(from = min_val + Amplitud, to = max_val, by = Amplitud), 2)
lim_sup[K] <- round(max_val, 2) 

# Marca de Clase
MC <- (lim_inf + lim_sup) / 2

# Conteo de Frecuencias (ni)
ni <- numeric(K)
for (i in 1:K) {
  if (i < K) {
    ni[i] <- length(subset(Variable, Variable >= lim_inf[i] & Variable < lim_sup[i]))
  } else {
    ni[i] <- length(subset(Variable, Variable >= lim_inf[i] & Variable <= lim_sup[i] + 0.001)) 
  }
}

# Cálculos de Frecuencias 
sum_ni <- sum(ni)
hi <- (ni / sum_ni) * 100 

Ni_asc <- cumsum(ni)
Hi_asc <- cumsum(hi)

# Acumuladas Descendentes 
Ni_desc <- rev(cumsum(rev(ni)))
Hi_desc <- rev(cumsum(rev(hi)))

# Construcción del Dataframe
TDF_Aspecto <- data.frame(
  Li = lim_inf,
  Ls = lim_sup,
  MC = MC,
  ni = ni,
  hi = round(hi, 2),
  Ni_asc = Ni_asc,
  Ni_desc = Ni_desc,
  Hi_asc = round(Hi_asc, 2),
  Hi_desc = round(Hi_desc, 2))

3 Tabla de Distribución de Frecuencias

#### Crear de fila de totales ####
totales <- c("TOTAL", "-", "-", sum(ni), sum(hi), "-", "-", "-", "-")
TDF_Aspecto_Char <- TDF_Aspecto %>% mutate(across(everything(), as.character))
TDF_Final <- rbind(TDF_Aspecto_Char, totales)

# TABLA DE FRECUENCIAS GT
tabla_gt <- TDF_Final %>%
  gt() %>%
  tab_header(
    title = md("**TABLA DE DISTRIBUCIÓN DE FRECUENCIAS**"),
    subtitle = "Variable: Aspecto (°)"
  ) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_label(
    Li = "Lim. Inf",
    Ls = "Lim. Sup",
    MC = "Marca Clase",
    ni = "Frec. Abs (ni)",
    hi = "Frec. Rel (%)",
    Ni_asc = "Ni (Asc)",
    Ni_desc = "Ni (Desc)",
    Hi_asc = "Hi Asc (%)",
    Hi_desc = "Hi Desc (%)"
  ) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#f0f0f0",
    table.font.size = px(14)
  )

tabla_gt
TABLA DE DISTRIBUCIÓN DE FRECUENCIAS
Variable: Aspecto (°)
Lim. Inf Lim. Sup Marca Clase Frec. Abs (ni) Frec. Rel (%) Ni (Asc) Ni (Desc) Hi Asc (%) Hi Desc (%)
-9999 -9202.2 -9600.6 1 0.01 1 7139 0.01 100
-9202.2 -8405.39 -8803.795 0 0 1 7138 0.01 99.99
-8405.39 -7608.59 -8006.99 0 0 1 7138 0.01 99.99
-7608.59 -6811.78 -7210.185 0 0 1 7138 0.01 99.99
-6811.78 -6014.98 -6413.38 0 0 1 7138 0.01 99.99
-6014.98 -5218.17 -5616.575 0 0 1 7138 0.01 99.99
-5218.17 -4421.37 -4819.77 0 0 1 7138 0.01 99.99
-4421.37 -3624.57 -4022.97 0 0 1 7138 0.01 99.99
-3624.57 -2827.76 -3226.165 0 0 1 7138 0.01 99.99
-2827.76 -2030.96 -2429.36 0 0 1 7138 0.01 99.99
-2030.96 -1234.15 -1632.555 0 0 1 7138 0.01 99.99
-1234.15 -437.35 -835.75 0 0 1 7138 0.01 99.99
-437.35 359.45 -38.95 7138 99.99 7139 7138 100 99.99
TOTAL - - 7139 100 - - - -
Autor: Martin Sarmiento

4 Gráfico 1 – Frecuencia Local

color_sutil <- "#DDA0DD"

par(mar = c(8, 5, 4, 2)) 
barplot(TDF_Aspecto$ni, 
        names.arg = TDF_Aspecto$MC,
        main = "Gráfica N°1: Frecuencia de Aspecto en Proyectos",
        cex.main = 0.9,
        xlab = "", 
        ylab = "Cantidad",
        col = color_sutil,
        space = 0, 
        las = 2, 
        cex.names = 0.7)
mtext("Aspecto (°)", side = 1, line = 4)

5 Gráfico 2 – Frecuencia Global

color_grafico <- "#DDA0DD"

par(mar = c(8, 5, 4, 2))
barplot(TDF_Aspecto$ni, 
        main = "Gráfica N°2: Frecuencia Global de Aspecto",
        xlab = "",
        ylab = "Cantidad",
        names.arg = TDF_Aspecto$MC,
        col = color_sutil,
        space = 0,
        cex.main = 0.9,
        cex.axis = 0.7,
        cex.names = 0.7,
        las = 2,
        ylim = c(0, sum(TDF_Aspecto$ni))) 
mtext("Aspecto (°)", side = 1, line = 4)

6 Gráfico 3 – Porcentaje Local

color_grafico <- "#DDA0DD"

par(mar = c(8, 5, 4, 2))
barplot(TDF_Aspecto$hi, 
        main = "Gráfica N°3: Porcentaje de Frecuencia de Aspecto",
        xlab = "",
        ylab = "Porcentaje (%)",
        col = color_sutil,
        space = 0,
        names.arg = TDF_Aspecto$MC,
        cex.main = 0.9,
        cex.axis = 0.7,
        cex.names = 0.7,
        las = 2,
        ylim = c(0, max(TDF_Aspecto$hi) * 1.1))
mtext("Aspecto (°)", side = 1, line = 4)

7 Gráfico 4 – Porcentaje Global

color_grafico <- "#B0C4DE"

par(mar = c(8, 5, 4, 2))
barplot(TDF_Aspecto$hi, 
        main = "Gráfica N°4: Porcentaje Global de Aspecto",
        xlab = "",
        ylab = "Porcentaje (%)",
        col = color_sutil,
        space = 0,
        cex.main = 0.9,
        names.arg = TDF_Aspecto$MC,
        las = 2,
        cex.names = 0.7,
        ylim = c(0, 100)) 
mtext("Aspecto (°)", side = 1, line = 4)

8 Gráfico 5 – Diagrama de Cajas (Boxplot)

par(mar = c(5, 5, 4, 2))
boxplot(Variable, 
        horizontal = TRUE,
        col = color_sutil,
        xlab = "Aspecto (°)",
        cex.main = 0.9,
        main = "Gráfica N°5: Variabilidad del Aspecto de los Proyectos")

9 Gráfico 6 – Ojivas de Frecuencia Acumulada

par(mar = c(5, 5, 4, 10), xpd = TRUE)

# Coordenadas
x_asc <- TDF_Aspecto$Ls  
x_desc <- TDF_Aspecto$Li 
y_asc <- TDF_Aspecto$Ni_asc
y_desc <- TDF_Aspecto$Ni_desc

# 1. Dibujar la Ascendente 
plot(x_asc, y_asc,
     type = "b", 
     main = "Gráfica N°6: Ojiva de Frecuencia Acumulada (Aspecto)",
     cex.main = 0.9,
     xlab = "Aspecto (°)",
     ylab = "Frecuencia acumulada",
     col = "black",
     pch = 19, 
     xlim = c(min(TDF_Aspecto$Li), max(x_asc)), 
     ylim = c(0, sum(ni)),
     bty = "l"
)

# 2. Agregar la Descendente 
lines(x_desc, y_desc, col = "violet", type = "b", pch = 19)

grid()
legend("left", 
       legend = c("Ascendente", "Descendente"), 
       col = c("black", "violet"), 
       lty = 1, 
       pch = 1, 
       cex = 0.6, 
       inset = c(0.05, 0.05),
       bty = "n")

10 Indicadores Estadísticos

## INDICADORES DE TENDENCIA CENTRAL
# Media aritmética
media <- round(mean(Variable), 2)

# Moda 
max_frecuencia <- max(TDF_Aspecto$ni)
moda_vals <- TDF_Aspecto$MC[TDF_Aspecto$ni == max_frecuencia]
moda_txt <- paste(round(moda_vals, 2), collapse = ", ")

# Mediana
mediana <- round(median(Variable), 2)

## INDICADORES DE DISPERSIÓN 
# Varianza
varianza <- var(Variable)

# Desviación Estándar
sd_val <- sd(Variable)

# Coeficiente de Variación
cv <- round((sd_val / abs(media)) * 100, 2)

## INDICADORES DE FORMA 
# Coeficiente de Asimetría
asimetria <- skewness(Variable, type = 2)

# Curtosis
curtosis <- kurtosis(Variable)


outliers <- boxplot.stats(Variable)$out
msg_atipicos <- if(length(outliers) > 0) "Presencia de valores atípicos" else "No hay presencia de valores atípicos"


tabla_indicadores <- data.frame(
  "Variable" = c("Aspecto (°)"),
  "Rango" = paste0("[", round(min(Variable), 2), "; ", round(max(Variable), 2), "]"),
  "X" = c(media),
  "Me" = c(round(mediana, 2)),
  "Mo" = c(moda_txt),
  "V" = c(round(varianza, 2)),
  "Sd" = c(round(sd_val, 2)),
  "Cv" = c(cv),
  "As" = c(round(asimetria, 4)),
  "K" = c(round(curtosis, 2)),
  "Valores_Atipicos" = msg_atipicos
)

# Generar Tabla GT
tabla_conclusiones_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("**CONCLUSIONES ESTADÍSTICAS**"),
    subtitle = "Resumen de la variable Aspecto"
  ) %>%
  tab_source_note(source_note = "Autor: Martin Sarmiento") %>%
  cols_label(
    Variable = "Variable",
    Rango = "Rango",
    X = "Media (X)",
    Me = "Mediana (Me)",
    Mo = "Moda (Mo)",
    V = "Varianza (V)",
    Sd = "Desv. Est. (Sd)",
    Cv = "C.V. (%)",
    As = "Asimetría (As)",
    K = "Curtosis (K)",
    Valores_Atipicos = "Valores Atípicos"
  ) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#f0f0f0"
  )

tabla_conclusiones_gt
CONCLUSIONES ESTADÍSTICAS
Resumen de la variable Aspecto
Variable Rango Media (X) Mediana (Me) Moda (Mo) Varianza (V) Desv. Est. (Sd) C.V. (%) Asimetría (As) Curtosis (K) Valores Atípicos
Aspecto (°) [-9999; 359.45] 180.24 180 -38.95 26064.68 161.45 89.57 -35.1175 2210.42 Presencia de valores atípicos
Autor: Martin Sarmiento