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/proyecto/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
# Raíz del modelo: valor de x donde y = 0
# y = a + b*ln(x) -> 0 = a + b*ln(x0) -> x0 = e^(-a/b)
x0 <- unname(exp(-a / b))
x0
## [1] 38.04671
intervalo <- ifelse(b > 0,
paste0("0 < x < ", round(x0, 2)),
paste0("x > ", round(x0, 2)))
ecuacion <- paste0("y = ", round(a, 4), " + ", round(b, 4), " * ln(x)")
tabla_restricciones <- data.frame(
Modelo = c("Logarítmico", "Logarítmico"),
Ecuacion = c(ecuacion, ecuacion),
Condicion = c("y = 0 (raíz)", "y < 0 (no aplica)"),
Valor = c(paste0("x = ", round(x0, 2)), intervalo)
)
tabla_restricciones %>%
gt() %>%
tab_header(title = "Tabla N°2: Valores donde el modelo es 0 o negativo") %>%
cols_label(Modelo = "Modelo",
Ecuacion = "Ecuación",
Condicion = "Condición",
Valor = "Valor / Intervalo de x") %>%
cols_width(
Modelo ~ px(110),
Ecuacion ~ px(220),
Condicion ~ px(140),
Valor ~ px(160)
) %>%
tab_style(
style = cell_text(align = "center"),
locations = cells_body()
) %>%
tab_style(
style = cell_text(align = "center"),
locations = cells_column_labels()
) %>%
tab_source_note(source_note = "Autor: Grupo 4 - Minas")
| Tabla N°2: Valores donde el modelo es 0 o negativo | |||
| Modelo | Ecuación | Condición | Valor / Intervalo de x |
|---|---|---|---|
| Logarítmico | y = -28.9227 + 7.9484 * ln(x) | y = 0 (raíz) | x = 38.05 |
| Logarítmico | y = -28.9227 + 7.9484 * ln(x) | y < 0 (no aplica) | 0 < x < 38.05 |
| Autor: Grupo 4 - Minas | |||
El modelo corta el eje x (y = 0) en x = 38.05. Dado que
b es positivo, la función es creciente, por lo que el
modelo predice valores negativos de EMIS_SO2 cuando 0 < x <
38.05.
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."
## [1] "Entre EMIS_CO2 y EMIS_SO2 existe una relación de tipo logarítmica donde\nel modelo ajustado sigue la forma f(x) = -51.7534 + 13.3034*ln(x),\nsiendo 'x' el valor de EMIS_CO2 y 'y' el valor de EMIS_SO2. Esto indica\nque el EMIS_SO2 crece rápidamente ante incrementos bajos de EMIS_CO2,\ny ese crecimiento se hace cada vez más lento a medida que el EMIS_CO2\naumenta.\n\nEl coeficiente de determinación obtenido (R² = 61.16%) es moderado:\nel EMIS_CO2 explica una parte relevante de la variabilidad del\nEMIS_SO2, pero una proporción considerable se debe a otros factores\ndel proceso de combustión y condiciones operativas no incluidos en\nel modelo.\n\nEjemplo: cuando EMIS_CO2 es de 300 unidades, se espera un valor de\nEMIS_SO2 de aproximadamente 24.13 unidades."