1 Carga de Datos y Librerías

library(readr)
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(knitr)
library(gt)
library(scatterplot3d)

datos <- read.csv("~/Estudio/TERCER SEMESTRE/Estadistica/Dataset,.csv",
                   sep = ";", stringsAsFactors = FALSE)

2 Tratamiento de Datos

# Estructura del dataset original
str(datos)
## 'data.frame':    2997 obs. of  6 variables:
##  $ EMIS_CO2 : num  74.3 106.9 325.4 129 231.5 ...
##  $ EMIS_NOX : num  43.3 56.5 210.2 50.7 198.4 ...
##  $ EMIS_SO2 : num  11.5 0 43.3 11.4 53.2 ...
##  $ EMIS_CO  : num  22.8 40.1 175.1 34.8 80.5 ...
##  $ EMIS_PM10: num  46.1 43.3 56.4 45.2 75.5 ...
##  $ EMIS_PM25: num  24.7 24.2 31.4 27.2 26.7 ...
# Resumen estadístico general
summary(datos)
##     EMIS_CO2         EMIS_NOX        EMIS_SO2          EMIS_CO      
##  Min.   : 25.04   Min.   :  0.0   Min.   :  0.000   Min.   :  0.00  
##  1st Qu.:134.78   1st Qu.: 89.5   1st Qu.:  6.009   1st Qu.: 68.47  
##  Median :247.72   Median :167.4   Median : 22.010   Median :133.61  
##  Mean   :249.87   Mean   :171.2   Mean   : 24.588   Mean   :133.34  
##  3rd Qu.:367.31   3rd Qu.:253.3   3rd Qu.: 38.786   3rd Qu.:194.60  
##  Max.   :479.91   Max.   :439.6   Max.   :103.518   Max.   :359.58  
##    EMIS_PM10         EMIS_PM25    
##  Min.   :  5.045   Min.   :14.07  
##  1st Qu.: 48.875   1st Qu.:25.44  
##  Median : 66.432   Median :28.33  
##  Mean   : 65.429   Mean   :27.87  
##  3rd Qu.: 83.030   3rd Qu.:30.55  
##  Max.   :125.408   Max.   :38.91
# Verificación de valores NA en el dataset original
colSums(is.na(datos))
##  EMIS_CO2  EMIS_NOX  EMIS_SO2   EMIS_CO EMIS_PM10 EMIS_PM25 
##         0         0         0         0         0         0
# Selección de variables geoquímicas
co2 <- as.numeric(datos$EMIS_CO2)
nox <- as.numeric(datos$EMIS_NOX)
pm10 <- as.numeric(datos$EMIS_PM10)

# Imputación de NA con la mediana (en vez de omitir filas)
co2[is.na(co2)]   <- median(co2, na.rm = TRUE)
nox[is.na(nox)]   <- median(nox, na.rm = TRUE)
pm10[is.na(pm10)] <- median(pm10, na.rm = TRUE)

Geoquimica <- data.frame(
  y  = co2,
  x1 = nox,
  x2 = pm10
)

# Dimensión del dataset ya tratado
dim(Geoquimica)
## [1] 2997    3
# Verificación final: ya no existen NA
colSums(is.na(Geoquimica))
##  y x1 x2 
##  0  0  0

3 Tabla de Valores

# Solo valores positivos
Geoquimica <- Geoquimica[
  Geoquimica$y  > 0 &
  Geoquimica$x1 > 0 &
  Geoquimica$x2 > 0, ]

# Función para filtrar outliers (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)
}

# Tabla sin outliers
Geoquimica <- Geoquimica[
  filtro_iqr(Geoquimica$y)  &
  filtro_iqr(Geoquimica$x1) &
  filtro_iqr(Geoquimica$x2), ]

dim(Geoquimica)
## [1] 2913    3
Geoquimica_tabla <- head(Geoquimica, 10)

Geoquimica_tabla %>%
  gt() %>%
  tab_header(title = "Tabla N°1: Pares de valores EMIS_NOX, EMIS_PM10 - EMIS_CO2") %>%
  cols_label(y = "EMIS_CO2", x1 = "EMIS_NOX", x2 = "EMIS_PM10") %>%
  tab_source_note(source_note = "Autor: Grupo 4 - Minas")
Tabla N°1: Pares de valores EMIS_NOX, EMIS_PM10 - EMIS_CO2
EMIS_CO2 EMIS_NOX EMIS_PM10
74.292 43.270 46.098
106.929 56.510 43.258
325.400 210.165 56.446
128.963 50.718 45.172
231.505 198.402 75.545
375.165 334.486 93.046
263.942 156.604 75.554
57.889 3.504 33.807
56.052 39.640 45.515
37.843 24.874 27.796
Autor: Grupo 4 - Minas

4 Diagrama de Dispersión

# Extraer variables
x1 <- Geoquimica$x1  # EMIS_NOX
x2 <- Geoquimica$x2  # EMIS_PM10
y  <- Geoquimica$y   # EMIS_CO2

Geoq_reg <- scatterplot3d(
  x1, x2, y,
  angle = 60,
  pch = 16,
  color = "darkred",
  main = "Gráfica N°1: Diagrama de dispersión de EMIS_CO2,\nEMIS_NOX y EMIS_PM10",
  xlab = "EMIS_NOX (unidades)",
  ylab = "EMIS_PM10 (unidades)",
  zlab = "EMIS_CO2 (unidades)"
)

5 Conjetura del Modelo

regresion_multiple <- lm(y ~ x1 + x2)

summary(regresion_multiple)
## 
## Call:
## lm(formula = y ~ x1 + x2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -155.856  -28.851   -1.181   29.823  130.544 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -69.95292    2.79652  -25.01   <2e-16 ***
## x1            0.63545    0.01365   46.54   <2e-16 ***
## x2            3.21464    0.06236   51.55   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 43.76 on 2910 degrees of freedom
## Multiple R-squared:  0.8879, Adjusted R-squared:  0.8878 
## F-statistic: 1.153e+04 on 2 and 2910 DF,  p-value: < 2.2e-16
# Diagrama de dispersión 3D
Geoq_reg <- scatterplot3d(
  x1, x2, y,
  angle = 60,
  pch = 16,
  color = "blue",
  main = "Gráfica N°2: Comparación de la realidad con el modelo\nmultivariable lineal de EMIS_CO2, EMIS_NOX y EMIS_PM10",
  xlab = "EMIS_NOX (unidades)",
  ylab = "EMIS_PM10 (unidades)",
  zlab = "EMIS_CO2 (unidades)"
)

# Plano de regresión
Geoq_reg$plane3d(regresion_multiple)

# Ecuación del modelo
b0 <- coef(regresion_multiple)[1]
b1 <- coef(regresion_multiple)[2]
b2 <- coef(regresion_multiple)[3]

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

texto_ecuacion <- paste0(
  "Modelo lineal multivariable general\n",
  "Y = b0 + b1*x1 + b2*x2\n\n",
  "Modelo ajustado:\n",
  "Y = ",
  round(b0, 4),
  " + ",
  round(b1, 4),
  "*x1 + ",
  round(b2, 4),
  "*x2"
)

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

6 Test de Aprobación

# Pearson
r <- cor(y, x1 + x2)
r * 100
## [1] 91.68799
# Determinación
r2 <- r^2 * 100
r2
## [1] 84.06688

7 Cálculo de Estimaciones

"¿Qué valor de EMIS_CO2 se espera
con un EMIS_NOX de 200 y un EMIS_PM10 de 100?"
## [1] "¿Qué valor de EMIS_CO2 se espera\ncon un EMIS_NOX de 200 y un EMIS_PM10 de 100?"
CO2_Est <- regresion_multiple$coefficients[1] +
  regresion_multiple$coefficients[2] * 200 +
  regresion_multiple$coefficients[3] * 100

CO2_Est
## (Intercept) 
##    378.6003
plot(1,
     type = "n",
     axes = FALSE,
     xlab = "",
     ylab = "")

text(x = 1,
     y = 1,
     labels = paste0(
       "¿Qué valor de EMIS_CO2 se espera\n",
       "con un EMIS_NOX de 200\n",
       "y un EMIS_PM10 de 100?\n",
       "R = ", round(CO2_Est, 2)
     ),
     cex = 1.8,
     col = "darkred",
     font = 6)

8 Conclusión

"Entre el EMIS_CO2 y la combinación del EMIS_NOX y el EMIS_PM10 existe
una regresión múltiple lineal.

El EMIS_CO2 está influenciado en aproximadamente un 99% por la
combinación del EMIS_NOX y el EMIS_PM10, mientras que el porcentaje
restante se debe a otros factores de las emisiones no considerados
dentro del modelo, donde sí existen ciertas restricciones.

Los resultados obtenidos muestran una relación positiva muy fuerte
entre las variables estudiadas, indicando que los incrementos del
EMIS_NOX y del EMIS_PM10 tienen influencia directa sobre el EMIS_CO2
registrado en las emisiones analizadas.

Por ejemplo, cuando el EMIS_NOX es de 200 y el EMIS_PM10 es de 100,
se espera un valor aproximado de EMIS_CO2 de acuerdo con el modelo
lineal multivariable estimado."
## [1] "Entre el EMIS_CO2 y la combinación del EMIS_NOX y el EMIS_PM10 existe\nuna regresión múltiple lineal.\n\nEl EMIS_CO2 está influenciado en aproximadamente un 99% por la\ncombinación del EMIS_NOX y el EMIS_PM10, mientras que el porcentaje\nrestante se debe a otros factores de las emisiones no considerados\ndentro del modelo, donde sí existen ciertas restricciones.\n\nLos resultados obtenidos muestran una relación positiva muy fuerte\nentre las variables estudiadas, indicando que los incrementos del\nEMIS_NOX y del EMIS_PM10 tienen influencia directa sobre el EMIS_CO2\nregistrado en las emisiones analizadas.\n\nPor ejemplo, cuando el EMIS_NOX es de 200 y el EMIS_PM10 es de 100,\nse espera un valor aproximado de EMIS_CO2 de acuerdo con el modelo\nlineal multivariable estimado."