La metodología CRISP-DM (Cross Industry Standard Process for Data Mining) se ha consolidado como un enfoque estándar en el desarrollo de proyectos de minería de datos y ciencia de datos. Su estructura está compuesta por seis fases fundamentales: comprensión del negocio, comprensión de los datos, preparación de los datos, modelado, evaluación y despliegue, que permiten abordar de manera sistemática y replicable problemas complejos a partir del análisis de grandes volúmenes de información. En este contexto, el conjunto de datos AirQualityUCI, que recopila registros horarios de contaminantes atmosféricos y variables meteorológicas entre marzo de 2004 y abril de 2005, representa una valiosa fuente de información para estudiar la calidad del aire en entornos urbanos. Variables como el monóxido de carbono (CO), los óxidos de nitrógeno (NOx), el benceno (C₆H₆) y la humedad relativa permiten caracterizar patrones de contaminación y sus posibles causas. Aplicar CRISP-DM a este conjunto de datos no solo permite generar modelos predictivos con rigor científico, sino también aportar insumos fundamentales para la formulación de políticas públicas orientadas a mitigar los efectos de la contaminación del aire, una de las principales amenazas ambientales para la salud humana.
library(readxl)
Air <- read_excel("C:/Users/gabui/Downloads/AirQualityUCI.xlsx")
La contaminación del aire es una de las amenazas ambientales más graves para la salud humana, especialmente en entornos urbanos donde la densidad poblacional y la actividad industrial y vehicular generan altos niveles de emisión de gases contaminantes. En este contexto, surge la necesidad de contar con herramientas analíticas que permitan predecir la concentración de múltiples contaminantes atmosféricos con base en datos medidos de forma continua por sensores ambientales.
Problema del negocio:
El monitoreo ambiental en tiempo real permite recolectar grandes
volúmenes de datos sobre contaminantes y variables meteorológicas. Sin
embargo, transformar esos datos en conocimiento útil requiere el
desarrollo de modelos predictivos confiables. El problema consiste en
predecir la concentración horaria de gases contaminantes en el aire,
como el monóxido de carbono (CO), hidrocarburos no metánicos (NMHC),
óxidos de nitrógeno (NOx) y dióxido de nitrógeno (NO₂), a partir de las
mediciones recolectadas por un dispositivo multisensor.
Objetivo del negocio (global):
Desarrollar modelos de regresión que permitan predecir la concentración
de diversos contaminantes atmosféricos utilizando como variables
explicativas tanto otras concentraciones de gases como las condiciones
meteorológicas (temperatura, humedad relativa y absoluta), considerando
además el comportamiento temporal de las mediciones.
El conjunto de datos AirQualityUCI contiene un total de 9,357 registros distribuidos en 15 variables, que corresponden a mediciones horarias realizadas durante más de un año en una ciudad europea. Estas mediciones combinan tanto datos ambientales (temperatura, humedad) como químicos (concentraciones de contaminantes). Aunque no hay celdas vacías, existen valores negativos en ciertas variables, los cuales se deben considerar como datos faltantes o inválidos, ya que representan magnitudes físicas que no pueden tomar valores por debajo de cero (como concentraciones o temperaturas).
library(knitr)
resultados <- data.frame(Índice = integer(0), Columna = character(0))
for (i in seq_along(colnames(Air))) {
resultados <- rbind(resultados, data.frame(Índice = i, Columna = colnames(Air)[i]))
}
kable(resultados,
col.names = c("Indice", "Columna"),
caption = "Tabla de Indices y Nombres de Columnas",
align = c("c", "l"))
| Indice | Columna |
|---|---|
| 1 | Date |
| 2 | Time |
| 3 | CO(GT) |
| 4 | PT08.S1(CO) |
| 5 | NMHC(GT) |
| 6 | C6H6(GT) |
| 7 | PT08.S2(NMHC) |
| 8 | NOx(GT) |
| 9 | PT08.S3(NOx) |
| 10 | NO2(GT) |
| 11 | PT08.S4(NO2) |
| 12 | PT08.S5(O3) |
| 13 | T |
| 14 | RH |
| 15 | AH |
Date: Fecha en la que se tomó la medición
Time: Hora exacta de la medición, registrada en formato de 24 horas.
CO(GT): Concentración de monóxido de carbono (CO) en el aire ambiente, medida en miligramos por metro cúbico (mg/m³).
PT08.S1(CO): Sensor de óxido de estaño que mide la resistencia eléctrica en presencia de CO. Valores más altos indican mayor concentración de CO.
NMHC(GT): Concentración de hidrocarburos no metánicos (NMHC) medida en microgramos por metro cúbico (µg/m³).
C6H6(GT): Concentración de benceno (C₆H₆) en el aire, expresada en microgramos por metro cúbico (µg/m³).
PT08.S2(NMHC): Salida eléctrica del sensor 2, relacionado con la detección de hidrocarburos no metánicos.
NOx(GT): Concentración de óxidos de nitrógeno totales (NOx), que incluye monóxido y dióxido de nitrógeno, expresada en microgramos por metro cúbico (µg/m³).
PT08.S3(NOx): Salida eléctrica del sensor 3, que corresponde a la detección de óxidos de nitrógeno.
NO2(GT): Concentración de dióxido de nitrógeno (NO₂), medida en microgramos por metro cúbico (µg/m³).
PT08.S4(NO2): Salida eléctrica del sensor 4, el cual está asociado a la detección de dióxido de nitrógeno.
PT08.S5(O3): Salida eléctrica del sensor 5, relacionado con la detección de ozono (O₃).
T: Temperatura del aire ambiente, medida en grados Celsius (°C).
RH: Humedad relativa del aire, expresada como porcentaje (%), que indica la cantidad de vapor de agua presente en el aire respecto al máximo que puede contener a esa temperatura.
AH: Humedad absoluta, medida en kilogramos de vapor de agua por metro cúbico de aire seco (kg/m³)
Información extra:
Todas las variables son continuas:
Los sensores (p. ej. PT08.S1(CO), PT08.S2(NMHC), etc.), las concentraciones de contaminantes (CO, NOx, NO₂, C6H6) y las variables meteorológicas (T, RH, AH) están en escala numérica continua.
Variable objetivo con valores reales y amplios rangos
La variable CO(GT) (monóxido de carbono) presenta un rango amplio de valores (desde negativos como artefacto de medición hasta picos positivos) y una distribución sesgada, como muestra el histograma.
En el análisis de calidad de datos del conjunto AirQualityUCI, es fundamental identificar tanto valores faltantes como registros anómalos que puedan distorsionar los resultados. Aunque el archivo no presenta celdas vacías explícitas, sí contiene múltiples valores codificados como -200, los cuales aparecen en variables clave como CO(GT), NMHC(GT), NOx(GT) y NO2(GT). Estos valores deben interpretarse como datos inválidos o faltantes, ya que corresponden a mediciones fallidas por parte de los sensores. Si se dejan sin tratar, pueden influir negativamente en los análisis estadísticos y en el entrenamiento de modelos predictivos.
Por otro lado, aunque algunas variables como la temperatura (T) sí pueden tener valores negativos de manera legítima, especialmente si las mediciones se realizaron durante el invierno, esto no es aplicable a otras variables como las concentraciones de contaminantes (CO(GT), NOx(GT), etc.) o la humedad relativa (RH), las cuales por definición no deberían ser negativas. Por lo tanto, en estas variables, cualquier valor por debajo de cero debe tratarse como anómalo y revisarse cuidadosamente.
Se cálculo la media y la desviación estandar de las variables númericas sin haber realizado la depuración de los datos.
library(dplyr)
Air %>% summarise(across(where(is.numeric), list(mean = mean, sd = sd), na.rm = TRUE))
El análisis de los datos revela que existen problemas de calidad significativos, especialmente en las variables relacionadas con contaminantes como CO(GT) y NMHC(GT), cuyas medias son negativas. Dado que estas variables representan concentraciones físicas que no pueden ser menores que cero, estos valores indican la presencia de datos erróneos o codificados como faltantes, usualmente con el valor -200. Este patrón afecta directamente la confiabilidad del análisis si no se realiza una limpieza adecuada de los datos.
Por otro lado, las lecturas de los sensores PT08 muestran valores promedio y desviaciones estándar elevados pero positivos, lo que indica que estas variables no presentan problemas evidentes de codificación incorrecta. Debido a su estabilidad y amplitud, podrían ser útiles como predictores en un modelo de regresión para estimar contaminantes como CO o NOx.
Las variables meteorológicas, como la temperatura (T), muestran valores coherentes con el contexto de una ciudad europea (media cercana a 10 °C), y se acepta la presencia de temperaturas negativas. La humedad relativa (RH) y la humedad absoluta (AH) presentan una alta dispersión, lo cual puede sugerir condiciones atmosféricas muy variables o la existencia de valores extremos que podrían requerir tratamiento estadístico.
Primero eliminaremos las filas que contengan los datos de -200 que no aportan para el futuro modelo de regresión
Air_clean <- Air %>%
mutate(across(where(is.numeric), ~na_if(., -200)))
Air_clean <- na.omit(Air_clean)
dim(Air_clean)
## [1] 827 15
Después de realizar el proceso de limpieza de datos, se ha obtenido una base de datos con 827 columnas y 15 variables, donde se han corregido inconsistencias y valores faltantes.
Air_clean %>% summarise(across(where(is.numeric), list(mean = mean, sd = sd), na.rm = TRUE))
Para construir un modelo de regresión que permita predecir la concentración de monóxido de carbono en el aire ambiente (CO(GT)), se seleccionó esta variable como la variable dependiente (Y). A partir de las múltiples variables disponibles en la base de datos, se eligió un subconjunto de variables independientes (X) que, desde un enfoque técnico y físico, tienen una relación más directa o significativa con el CO. Estas variables seleccionadas incluyen la salida del sensor PT08.S1(CO), que mide directamente la presencia de monóxido de carbono; la concentración de benceno (C6H6(GT)), ya que suele coexistir con el CO como subproducto de procesos de combustión; la salida del sensor PT08.S5(O3), por su relación química con otros contaminantes atmosféricos; y las condiciones ambientales como la temperatura (T), la humedad relativa (RH) y la humedad absoluta (AH), ya que influyen en la dispersión y concentración de contaminantes en el aire. Esta selección permite construir un modelo más eficiente y menos redundante, evitando la colinealidad excesiva y manteniendo la interpretabilidad de los resultados.
Por lo cual se seleccionaron de la bade de datos que fue limpiada previamente, las variables ya mecionadas, construyendo una base de datos que facilitara los siguientes pasos.
datos_modelo <- Air_clean[, c("CO(GT)",
"PT08.S1(CO)",
"C6H6(GT)",
"PT08.S5(O3)",
"T",
"RH",
"AH")]
dim(datos_modelo)
## [1] 827 7
head(datos_modelo)
modelo_CO <- lm(`CO(GT)` ~ `PT08.S1(CO)` + `C6H6(GT)` + `PT08.S5(O3)` + T + RH + AH, data = datos_modelo)
summary(modelo_CO)
##
## Call:
## lm(formula = `CO(GT)` ~ `PT08.S1(CO)` + `C6H6(GT)` + `PT08.S5(O3)` +
## T + RH + AH, data = datos_modelo)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.0454 -0.1465 -0.0173 0.1328 1.8062
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.042e-02 1.899e-01 -0.318 0.7505
## `PT08.S1(CO)` 1.640e-03 1.414e-04 11.594 < 2e-16 ***
## `C6H6(GT)` 1.608e-01 3.996e-03 40.238 < 2e-16 ***
## `PT08.S5(O3)` -3.528e-04 7.134e-05 -4.945 9.23e-07 ***
## T -4.637e-02 9.040e-03 -5.130 3.62e-07 ***
## RH -7.167e-03 3.195e-03 -2.243 0.0251 *
## AH 1.746e-01 1.810e-01 0.964 0.3351
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2754 on 820 degrees of freedom
## Multiple R-squared: 0.9621, Adjusted R-squared: 0.9618
## F-statistic: 3470 on 6 and 820 DF, p-value: < 2.2e-16
Este modelo corresponde a una regresión lineal múltiple en la que se busca predecir la concentración de monóxido de carbono en el aire (CO(GT)) a partir de una serie de variables independientes que incluyen señales de sensores, temperatura y humedad. Las variables utilizadas en el modelo son: PT08.S1(CO), C6H6(GT), PT08.S5(O3), la temperatura del aire (T), la humedad relativa (RH) y la humedad absoluta (AH).
El modelo muestra un excelente ajuste a los datos, como lo evidencia un coeficiente de determinación R² de 0.9621, lo que significa que el 96.21% de la variabilidad observada en la concentración de CO es explicada por las variables incluidas. El error estándar de los residuos es bajo (0.2754), indicando que las predicciones del modelo están, en promedio, bastante cercanas a los valores reales. Además, el modelo es globalmente significativo, ya que el valor de F es muy alto y su p-valor es prácticamente cero.
En cuanto a los coeficientes individuales, se observa que las variables PT08.S1(CO) y C6H6(GT) tienen una influencia positiva y muy significativa sobre la concentración de CO, lo cual es lógico ya que ambas están asociadas con la presencia de contaminantes. Por otro lado, variables como la temperatura (T) y la señal del sensor de ozono (PT08.S5(O3)) muestran una relación negativa con el CO, también con alta significancia estadística. La humedad relativa (RH) tiene un efecto negativo leve pero estadísticamente significativo, mientras que la humedad absoluta (AH) no resulta ser significativa (p = 0.3351), lo que sugiere que podría ser excluida del modelo para simplificarlo sin perder capacidad explicativa.
Reajustamos el modelo:
modelo_CO1 <- lm(`CO(GT)` ~ `PT08.S1(CO)` + `C6H6(GT)` + `PT08.S5(O3)` + T + RH , data = datos_modelo)
summary(modelo_CO1)
##
## Call:
## lm(formula = `CO(GT)` ~ `PT08.S1(CO)` + `C6H6(GT)` + `PT08.S5(O3)` +
## T + RH, data = datos_modelo)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.04080 -0.14723 -0.01768 0.13173 1.80465
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.918e-01 1.323e-01 -1.450 0.147541
## `PT08.S1(CO)` 1.642e-03 1.414e-04 11.607 < 2e-16 ***
## `C6H6(GT)` 1.604e-01 3.974e-03 40.358 < 2e-16 ***
## `PT08.S5(O3)` -3.415e-04 7.038e-05 -4.853 1.46e-06 ***
## T -3.835e-02 3.541e-03 -10.829 < 2e-16 ***
## RH -4.272e-03 1.096e-03 -3.900 0.000104 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2754 on 821 degrees of freedom
## Multiple R-squared: 0.9621, Adjusted R-squared: 0.9618
## F-statistic: 4165 on 5 and 821 DF, p-value: < 2.2e-16
predicciones <- predict(modelo_CO1, newdata = datos_modelo)
mse <- mean((datos_modelo$`CO(GT)` - predicciones)^2)
rmse <- sqrt(mse)
mae <- mean(abs(datos_modelo$`CO(GT)` - predicciones))
r2 <- summary(modelo_CO1)$r.squared
cat("Evaluación del modelo de regresión lineal múltiple:\n")
## Evaluación del modelo de regresión lineal múltiple:
cat("--------------------------------------------------\n")
## --------------------------------------------------
cat("MSE (Error Cuadrático Medio): ", round(mse, 4), "\n")
## MSE (Error Cuadrático Medio): 0.0753
cat("RMSE (Raíz del Error Cuadrático): ", round(rmse, 4), "\n")
## RMSE (Raíz del Error Cuadrático): 0.2744
cat("MAE (Error Absoluto Medio): ", round(mae, 4), "\n")
## MAE (Error Absoluto Medio): 0.1946
cat("R² (Coeficiente de determinación):", round(r2, 4), "\n")
## R² (Coeficiente de determinación): 0.9621
La evaluación cuantitativa del modelo de regresión lineal múltiple muestra un desempeño predictivo altamente satisfactorio. El Error Cuadrático Medio (MSE) es de 0.0753, lo que indica que, en promedio, el modelo comete errores de predicción pequeños al estimar los niveles de monóxido de carbono (CO). La Raíz del Error Cuadrático Medio (RMSE) es de 0.2744, lo cual representa el error típico de predicción en las mismas unidades que la variable dependiente, facilitando su interpretación práctica. Por otro lado, el Error Absoluto Medio (MAE) es de 0.1946, lo que refleja una baja magnitud promedio en las desviaciones absolutas entre los valores observados y los valores predichos por el modelo. Finalmente, el coeficiente de determinación (R²) alcanza un valor de 0.9621, lo que significa que aproximadamente el 96.21% de la variabilidad en los niveles de CO puede explicarse por las variables independientes incluidas en el modelo. Este alto valor de R² sugiere un excelente ajuste del modelo a los datos, validando su capacidad explicativa y predictiva en el contexto analizado.
par(mfrow = c(2, 2))
plot(modelo_CO1)
El gráfico de Residuos vs Valores Ajustados muestra una dispersión relativamente homogénea alrededor de la línea horizontal, sin patrones curvos evidentes, lo cual sugiere que la relación entre las variables independientes y la variable dependiente es aproximadamente lineal. No obstante, se identifican algunos valores atípicos como los puntos 647 y 624, que podrían estar influyendo en el ajuste. El gráfico Q-Q de los residuos evidencia que estos se alinean bastante bien con la línea teórica, especialmente en la zona central, lo cual indica que la distribución de los residuos se aproxima a la normalidad, aunque existen ligeras desviaciones en los extremos. En cuanto al gráfico Scale-Location, se observa una ligera tendencia ascendente, lo que sugiere una posible presencia de heterocedasticidad (varianza no constante de los residuos), aunque no de forma severa. Finalmente, el gráfico de Residuos vs Leverage permite identificar algunos puntos con influencia potencial, como los casos 647 y 646; sin embargo, ninguno de ellos supera los límites críticos, por lo que no se consideran observaciones excesivamente influyentes. En conjunto, los gráficos indican que el modelo cumple de forma razonable con los supuestos de regresión.
residuos <- resid(modelo_CO1)
hist(residuos, breaks = 30, main = "Histograma de residuos", xlab = "Residuos", col = "lightblue", border = "white")
El histograma de los residuos del modelo muestra una distribución aproximadamente simétrica y con forma de campana, lo cual sugiere que los residuos se distribuyen de manera cercana a una distribución normal. Esta es una condición importante para la validez de los intervalos de confianza y las pruebas de significancia en un modelo de regresión lineal. Aunque se puede observar una ligera asimetría hacia la derecha, no es lo suficientemente pronunciada como para invalidar el supuesto de normalidad. La mayoría de los residuos se concentran alrededor de cero, lo que indica que el modelo predice adecuadamente los valores de la variable dependiente para la mayor parte de las observaciones. En conjunto con el gráfico Q-Q, este histograma respalda la suposición de normalidad de los errores, lo que refuerza la confiabilidad estadística del modelo ajustado.
El desarrollo del modelo de regresión lineal múltiple aplicado al conjunto de datos AirQualityUCI permitió construir una herramienta predictiva robusta para estimar la concentración de monóxido de carbono (CO) en entornos urbanos, a partir de variables relacionadas con sensores químicos y condiciones meteorológicas. Siguiendo la metodología CRISP-DM, se abordó de manera sistemática la comprensión del problema, la exploración y limpieza de los datos, así como el modelado y la evaluación del desempeño predictivo. El modelo final, que incluyó variables como la salida del sensor PT08.S1(CO), la concentración de benceno, la señal del sensor de ozono y los factores climáticos (temperatura y humedad relativa), logró un ajuste excelente con un R² de 0.9621 y errores de predicción muy bajos (RMSE = 0.2744 y MAE = 0.1946). Estos resultados evidencian que es posible capturar con alta precisión el comportamiento del CO en función de variables fácilmente medibles, lo que aporta valor tanto en el ámbito científico como en la toma de decisiones ambientales. Además, el análisis de residuos sugiere que el modelo cumple con los supuestos básicos de la regresión, aunque con ligeros indicios de heterocedasticidad que podrían explorarse en futuras mejoras. En conclusión, este trabajo demuestra el potencial de la analítica de datos y la modelación estadística como herramientas clave para abordar problemas ambientales complejos y generar conocimiento útil para la gestión de la calidad del aire.