1 Librerías

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)

2 Carga de Datos

datos <- read.csv("~/Estudio/TERCER SEMESTRE/Estadistica/Dataset..csv",
                   sep = ";", stringsAsFactors = FALSE)
str(datos)
## 'data.frame':    2997 obs. of  6 variables:
##  $ EMIS_CO2 : num  130.1 318.7 446.3 71.4 301.6 ...
##  $ EMIS_NOX : num  66 151.7 369.6 30.5 262.8 ...
##  $ EMIS_SO2 : num  9.73 16.2 21.18 3.94 16.89 ...
##  $ EMIS_CO  : num  36.25 161 260.74 5.17 128.06 ...
##  $ EMIS_PM10: num  39.8 76.1 78.9 20.4 61.1 ...
##  $ EMIS_PM25: num  24.5 27.8 28.3 22.2 26.5 ...
summary(datos)
##     EMIS_CO2        EMIS_NOX         EMIS_SO2         EMIS_CO      
##  Min.   : 20.0   Min.   :  0.00   Min.   : 0.000   Min.   :  0.00  
##  1st Qu.:140.0   1st Qu.: 99.94   1st Qu.: 9.772   1st Qu.: 42.48  
##  Median :259.0   Median :187.00   Median :15.128   Median :107.51  
##  Mean   :260.4   Mean   :188.33   Mean   :13.613   Mean   :125.81  
##  3rd Qu.:380.6   3rd Qu.:275.27   3rd Qu.:18.349   3rd Qu.:199.96  
##  Max.   :499.8   Max.   :439.54   Max.   :25.148   Max.   :376.00  
##    EMIS_PM10         EMIS_PM25    
##  Min.   :  7.679   Min.   :14.45  
##  1st Qu.: 38.407   1st Qu.:24.41  
##  Median : 56.428   Median :26.94  
##  Mean   : 54.282   Mean   :26.32  
##  3rd Qu.: 70.536   3rd Qu.:28.60  
##  Max.   :104.859   Max.   :35.50
colSums(is.na(datos))
##  EMIS_CO2  EMIS_NOX  EMIS_SO2   EMIS_CO EMIS_PM10 EMIS_PM25 
##         0         0         0         0         0         0

3 Selección de Variables

Se seleccionan EMIS_CO2 (variable independiente) y EMIS_SO2 (variable dependiente). Ambos contaminantes se originan en el mismo proceso de combustión: el CO2 refleja la cantidad de carbono oxidado, mientras que el SO2 depende del contenido de azufre del combustible quemado. El aporte marginal del SO2 respecto al CO2 disminuye a medida que la combustión avanza, comportamiento compatible con una relación de tipo logarítmica entre ambas variables.

co2 <- as.numeric(datos$EMIS_CO2)
so2 <- as.numeric(datos$EMIS_SO2)

co2[is.na(co2)] <- median(co2, na.rm = TRUE)
so2[is.na(so2)] <- median(so2, na.rm = TRUE)

TPV <- data.frame(co2, so2)

dim(TPV)
## [1] 2997    2
colSums(is.na(TPV))
## co2 so2 
##   0   0

4 Tabla de Pares de Valores

cat("Tamaño muestral: n =", nrow(TPV))
## Tamaño muestral: n = 2997
TPV_tabla <- head(TPV, 10)

TPV_tabla %>%
  gt() %>%
  tab_header(title = "Tabla N°1: Pares de valores EMIS_CO2 - EMIS_SO2") %>%
  cols_label(co2 = "EMIS_CO2", so2 = "EMIS_SO2") %>%
  tab_source_note(source_note = "Autor: Grupo 4 - Minas")
Tabla N°1: Pares de valores EMIS_CO2 - EMIS_SO2
EMIS_CO2 EMIS_SO2
130.080 9.728
318.677 16.204
446.328 21.180
71.436 3.936
301.645 16.889
258.165 14.510
62.459 5.350
493.452 21.408
301.545 17.495
333.784 16.107
Autor: Grupo 4 - Minas

5 Gráfica de Dispersión

x <- as.numeric(TPV$co2)
y <- as.numeric(TPV$so2)

# El modelo logarítmico requiere x > 0
validos <- complete.cases(x, y) &
  is.finite(x) &
  is.finite(y) &
  x > 0

x <- x[validos]
y <- y[validos]

orden <- order(x)
x <- x[orden]
y <- y[orden]

plot(x, y,
     pch = 16,
     col = "blue",
     xlim = c(0, max(x)),
     ylim = c(0, max(y)),
     main = "Gráfica N°1: Diagrama de dispersión entre EMIS_CO2\ny EMIS_SO2 en emisiones registradas",
     xlab = "EMIS_CO2 (unidades)",
     ylab = "EMIS_SO2 (unidades)")

6 Conjetura del Modelo

La nube de puntos crece con rapidez en valores bajos de EMIS_CO2 y se va desacelerando progresivamente, sin gran dispersión caótica.

6.1 6.1 Tratamiento de los Datos

Q1_x <- quantile(x, 0.25); Q3_x <- quantile(x, 0.75); IQR_x <- Q3_x - Q1_x
Q1_y <- quantile(y, 0.25); Q3_y <- quantile(y, 0.75); IQR_y <- Q3_y - Q1_y

outliers_x <- sum(x < (Q1_x - 1.5*IQR_x) | x > (Q3_x + 1.5*IQR_x))
outliers_y <- sum(y < (Q1_y - 1.5*IQR_y) | y > (Q3_y + 1.5*IQR_y))

cat("Outliers en EMIS_CO2:", outliers_x, "\nOutliers en EMIS_SO2:", outliers_y)
## Outliers en EMIS_CO2: 0 
## Outliers en EMIS_SO2: 0

No se identifican valores atípicos relevantes ni una nube caótica, por lo que no es necesario aplicar segmentación ni omitir observaciones.

6.2 6.2 Nueva Gráfica de Dispersión

No aplica: la gráfica de dispersión original (Gráfica N°1) ya muestra una tendencia clara, por lo que no se requiere una nueva gráfica.

6.3 6.3 Nueva Conjetura

No aplica: se mantiene la conjetura de un modelo logarítmico.

modelo_log <- lm(y ~ log(x))
modelo_log
## 
## Call:
## lm(formula = y ~ log(x))
## 
## Coefficients:
## (Intercept)       log(x)  
##     -28.923        7.948

7 Cálculo de Parámetros

a <- coef(modelo_log)[1]  # intercepto
b <- coef(modelo_log)[2]  # pendiente

a
## (Intercept) 
##   -28.92271
b
##   log(x) 
## 7.948389
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")

texto_ecuacion <- paste0(
  "Modelo logarítmico general\n",
  "Y = a + b * ln(x)\n\n",
  "Modelo ajustado:\n",
  "Y = ", round(a, 4), " + ", round(b, 4), " * ln(x)"
)

text(x = 1, y = 1, labels = texto_ecuacion, cex = 1.5, col = "blue", font = 2)

8 Realidad y Modelo

x_modelo <- seq(min(x), max(x), length.out = 200)
y_modelo <- a + b * log(x_modelo)

plot(x, y,
     pch = 16,
     col = "blue",
     xlim = c(0, max(x)),
     ylim = c(0, max(y)),
     main = "Gráfica N°2: Comparación entre la realidad y el modelo logarítmico\nentre EMIS_CO2 y EMIS_SO2",
     xlab = "EMIS_CO2 (unidades)",
     ylab = "EMIS_SO2 (unidades)")

lines(x_modelo, y_modelo, col = "red", lwd = 3)

legend("topleft",
       legend = c("Datos reales", "Modelo logarítmico"),
       col = c("blue", "red"),
       pch = c(16, NA),
       lty = c(NA, 1),
       lwd = c(NA, 3))

9 Test

r <- cor(log(x), y)
r * 100
## [1] 97.30112
predicciones <- predict(modelo_log)

SSE <- sum((y - predicciones)^2)
SST <- sum((y - mean(y))^2)

r2 <- 1 - (SSE / SST)
r2 * 100
## [1] 94.67509

10 Restricciones

plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")

text(x = 1, y = 1,
     labels = "Evaluación del modelo:

     El análisis no evidencia restricciones
     significativas para la aplicación del modelo
     dentro del conjunto de datos estudiado.

     La relación logarítmica observada presenta un
     ajuste moderado (R² = 61.16%), inferior al de
     otros modelos evaluados para este mismo par de
     variables, lo que indica que una parte
     considerable de la variabilidad del EMIS_SO2 no
     es explicada únicamente por el EMIS_CO2.

     El modelo solo es válido para valores de
     EMIS_CO2 mayores a cero, dado el dominio de la
     función logaritmo.

     Las predicciones deben interpretarse dentro del
     rango de datos evaluado, considerando el margen
     de error propio de este ajuste.
     ",
     cex = 1, col = 'darkred', font = 2)

11 Estimación

CO2_ejemplo <- 300

SO2_esp <- a + b * log(CO2_ejemplo)
SO2_esp
## (Intercept) 
##    16.41317
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")

texto_pronostico <- paste0(
  "¿Qué valor de EMIS_SO2 se espera\n",
  "cuando EMIS_CO2 es de 300 unidades?\n\n",
  "R = ", round(SO2_esp, 2), " unidades"
)

text(x = 1, y = 1, labels = texto_pronostico, cex = 1.5, col = "blue", font = 2)

12 Conclusión

“Entre EMIS_CO2 y EMIS_SO2 existe una relación de tipo logarítmica donde el modelo ajustado sigue la forma f(x) = -51.7534 + 13.3034*ln(x), siendo ‘x’ el valor de EMIS_CO2 y ‘y’ el valor de EMIS_SO2. Esto indica que el EMIS_SO2 crece rápidamente ante incrementos bajos de EMIS_CO2, y ese crecimiento se hace cada vez más lento a medida que el EMIS_CO2 aumenta.

El coeficiente de determinación obtenido (R² = 61.16%) es moderado: el EMIS_CO2 explica una parte relevante de la variabilidad del EMIS_SO2, pero una proporción considerable se debe a otros factores del proceso de combustión y condiciones operativas no incluidos en el modelo.

Ejemplo: cuando EMIS_CO2 es de 300 unidades, se espera un valor de EMIS_SO2 de aproximadamente 24.13 unidades.”