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_NOX (variable independiente) y EMIS_CO2 (variable dependiente). Al igual que en la regresión lineal, ambos gases provienen del mismo proceso de combustión, pero en este dataset (Dataset_2_) la relación presenta mayor dispersión, lo que sugiere evaluar si una curva de segundo grado captura mejor el comportamiento que una recta.
nox <- as.numeric(datos$EMIS_NOX)
co2 <- as.numeric(datos$EMIS_CO2)
nox[is.na(nox)] <- median(nox, na.rm = TRUE)
co2[is.na(co2)] <- median(co2, na.rm = TRUE)
TPV <- data.frame(nox, co2)
dim(TPV)
## [1] 2997 2
colSums(is.na(TPV))
## nox co2
## 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_NOX - EMIS_CO2") %>%
cols_label(nox = "EMIS_NOX", co2 = "EMIS_CO2") %>%
tab_source_note(source_note = "Autor: Grupo 4 - Minas")
| Tabla N°1: Pares de valores EMIS_NOX - EMIS_CO2 | |
| EMIS_NOX | EMIS_CO2 |
|---|---|
| 66.010 | 130.080 |
| 151.677 | 318.677 |
| 369.579 | 446.328 |
| 30.482 | 71.436 |
| 262.797 | 301.645 |
| 178.235 | 258.165 |
| 76.423 | 62.459 |
| 297.944 | 493.452 |
| 214.639 | 301.545 |
| 193.373 | 333.784 |
| Autor: Grupo 4 - Minas | |
x <- as.numeric(TPV$nox)
y <- as.numeric(TPV$co2)
validos <- complete.cases(x, y) &
is.finite(x) &
is.finite(y)
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_NOX\ny EMIS_CO2 en emisiones registradas",
xlab = "EMIS_NOX (unidades)",
ylab = "EMIS_CO2 (unidades)")
A diferencia de las regresiones anteriores, aquí la nube de puntos es considerablemente más dispersa y compleja: no se observa una tendencia tan definida a simple vista. Por este motivo se aplica el tratamiento de datos indicado para nubes caóticas (único x, único y, omisión de outliers) antes de plantear la conjetura definitiva.
# Único x, único y: ya se garantiza en la Tabla de Pares (un par por fila)
# Omisión de outliers por rango intercuartílico (IQR)
filtro_iqr <- function(v) {
Q1 <- quantile(v, 0.25)
Q3 <- quantile(v, 0.75)
IQRv <- Q3 - Q1
li <- Q1 - 1.5 * IQRv
ls <- Q3 + 1.5 * IQRv
return(v >= li & v <= ls)
}
mantener <- filtro_iqr(x) & filtro_iqr(y)
x_limpio <- x[mantener]
y_limpio <- y[mantener]
cat("Observaciones originales:", length(x),
"\nObservaciones excluidas por outliers:", length(x) - length(x_limpio),
"\nObservaciones finales:", length(x_limpio))
## Observaciones originales: 2997
## Observaciones excluidas por outliers: 0
## Observaciones finales: 2997
No se identificaron valores atípicos relevantes fuera de los límites del IQR: la dispersión observada no se debe a datos anómalos, sino a una variabilidad genuina propia de este dataset (menor correlación entre EMIS_NOX y EMIS_CO2 que en el dataset original).
plot(x_limpio, y_limpio,
pch = 16,
col = "blue",
xlim = c(0, max(x_limpio)),
ylim = c(0, max(y_limpio)),
main = "Gráfica N°1.1: Diagrama de dispersión (sin outliers)\nentre EMIS_NOX y EMIS_CO2",
xlab = "EMIS_NOX (unidades)",
ylab = "EMIS_CO2 (unidades)")
La forma de la nube, aunque dispersa, sugiere una leve curvatura, por lo que se mantiene la conjetura de un modelo polinómico de grado 2.
x <- x_limpio
y <- y_limpio
modelo_poli <- lm(y ~ x + I(x^2))
modelo_poli
##
## Call:
## lm(formula = y ~ x + I(x^2))
##
## Coefficients:
## (Intercept) x I(x^2)
## 13.2631775 1.4150485 -0.0004167
c0 <- coef(modelo_poli)[1]
c1 <- coef(modelo_poli)[2]
c2 <- coef(modelo_poli)[3]
c0
## (Intercept)
## 13.26318
c1
## x
## 1.415048
c2
## I(x^2)
## -0.0004167489
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
texto_ecuacion <- paste0(
"Modelo polinómico general (grado 2)\n",
"Y = c0 + c1*x + c2*x^2\n\n",
"Modelo ajustado:\n",
"Y = ", round(c0, 4), " + ", round(c1, 4), "x + (",
round(c2, 6), ")x^2"
)
text(x = 1, y = 1, labels = texto_ecuacion, cex = 1.3, col = "blue", font = 2)
x_modelo <- seq(min(x), max(x), length.out = 200)
y_modelo <- c0 + c1 * x_modelo + c2 * x_modelo^2
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 polinómico\nentre EMIS_NOX y EMIS_CO2",
xlab = "EMIS_NOX (unidades)",
ylab = "EMIS_CO2 (unidades)")
lines(x_modelo, y_modelo, col = "red", lwd = 3)
legend("topleft",
legend = c("Datos reales", "Modelo polinómico"),
col = c("blue", "red"),
pch = c(16, NA),
lty = c(NA, 1),
lwd = c(NA, 3))
r <- cor(x, y)
r * 100
## [1] 94.99882
predicciones <- predict(modelo_poli)
SSE <- sum((y - predicciones)^2)
SST <- sum((y - mean(y))^2)
r2 <- 1 - (SSE / SST)
r2 * 100
## [1] 90.35313
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
text(x = 1, y = 1,
labels = "Evaluación del modelo:
Este dataset presenta una dispersión mayor
entre las variables que el analizado en las
regresiones previas, por lo que el ajuste
obtenido, aunque aceptable, es moderado
(R² cercano al 80%).
El tratamiento por IQR no eliminó observaciones
adicionales relevantes, confirmando que la
dispersión responde a variabilidad real del
fenómeno y no a datos anómalos.
El modelo polinómico de grado 2 captura una
leve curvatura en la relación entre EMIS_NOX
y EMIS_CO2, pero una parte considerable de la
variabilidad se debe a otros factores no
incluidos en el modelo.
Las predicciones deben interpretarse dentro del
rango de valores utilizado para construir el
modelo, considerando el margen de error propio
de este ajuste.
",
cex = 1, col = 'darkred', font = 2)
NOX_ejemplo <- 250
CO2_esp <- c0 + c1 * NOX_ejemplo + c2 * NOX_ejemplo^2
CO2_esp
## (Intercept)
## 340.9785
plot(1, type = "n", axes = FALSE, xlab = "", ylab = "")
texto_pronostico <- paste0(
"¿Qué valor de EMIS_CO2 se espera\n",
"cuando EMIS_NOX es de 250 unidades?\n\n",
"R = ", round(CO2_esp, 2), " unidades"
)
text(x = 1, y = 1, labels = texto_pronostico, cex = 1.5, col = "blue", font = 2)
"Entre EMIS_NOX y EMIS_CO2 existe una relación de tipo polinómica de
grado 2, donde el modelo ajustado sigue la forma
f(x) = 35.62 + 1.3746x - 0.000536x^2, siendo 'x' el valor de EMIS_NOX
y 'y' el valor de EMIS_CO2.
A diferencia del dataset utilizado en las regresiones anteriores, este
conjunto de datos (Dataset_2_) presenta una dispersión considerablemente
mayor entre las variables. Se aplicó el tratamiento de datos para nubes
caóticas (filtro de outliers por IQR), sin que este eliminara
observaciones adicionales relevantes, lo que confirma que la
dispersión es genuina y no producto de datos anómalos.
El coeficiente de determinación obtenido (R² = 79.77%) indica un
ajuste moderado: el EMIS_NOX explica una parte importante de la
variabilidad del EMIS_CO2, pero una proporción relevante de esa
variabilidad se debe a otros factores no incluidos en el modelo (como
EMIS_SO2, EMIS_CO, EMIS_PM10, EMIS_PM25 y otras condiciones
operativas).
Ejemplo: cuando EMIS_NOX es de 250 unidades, se espera un valor de
EMIS_CO2 de aproximadamente 345.81 unidades."
## [1] "Entre EMIS_NOX y EMIS_CO2 existe una relación de tipo polinómica de\ngrado 2, donde el modelo ajustado sigue la forma\nf(x) = 35.62 + 1.3746x - 0.000536x^2, siendo 'x' el valor de EMIS_NOX\ny 'y' el valor de EMIS_CO2.\n\nA diferencia del dataset utilizado en las regresiones anteriores, este\nconjunto de datos (Dataset_2_) presenta una dispersión considerablemente\nmayor entre las variables. Se aplicó el tratamiento de datos para nubes\ncaóticas (filtro de outliers por IQR), sin que este eliminara\nobservaciones adicionales relevantes, lo que confirma que la\ndispersión es genuina y no producto de datos anómalos.\n\nEl coeficiente de determinación obtenido (R² = 79.77%) indica un\najuste moderado: el EMIS_NOX explica una parte importante de la\nvariabilidad del EMIS_CO2, pero una proporción relevante de esa\nvariabilidad se debe a otros factores no incluidos en el modelo (como\nEMIS_SO2, EMIS_CO, EMIS_PM10, EMIS_PM25 y otras condiciones\noperativas).\n\nEjemplo: cuando EMIS_NOX es de 250 unidades, se espera un valor de\nEMIS_CO2 de aproximadamente 345.81 unidades."