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)
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
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
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 | |
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)")
La nube de puntos crece con rapidez en valores bajos de EMIS_CO2 y se va desacelerando progresivamente, sin gran dispersión caótica.
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.
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.
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
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)
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))
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
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)
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)
“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.”