A través de la plataforma Air Pays de la Loire, exploremos la calidad del aire para entender las complejidades del problema de la contaminación: identificando áreas críticas y correlacionando los niveles con actividades humanas específicas durante el 2023. Haremos un análisis detallado de los datos de concentración de contaminantes registrados en las estaciones de medición filtradas en Loire-Atlantique. Desde dióxido de nitrógeno hasta partículas PM2,5 y PM10, comprendamos cómo estas emisiones afectan la salud y el medio ambiente. Acompáñanos en este viaje a través de datos reveladores que nos ayudarán a comprender mejor los desafíos ambientales y a desarrollar soluciones para un futuro más limpio.
Introducción
La contaminación ambiental es un importante problema global. Más de 6000 ciudades en 117 países están monitoreando la calidad del aire, pero las personas que viven en ellas todavía respiran niveles nocivos para la salud de partículas finas y dióxido de nitrógeno, y los habitantes de países de ingresos bajos y medianos sufren las mayores exposiciones.

La contaminación acelera el cambio climático. La OMS estima que después de la pandemia, la contaminación del aire se asocia a más de 7 millones de muertes al año. Sus hallazgos resaltan la importancia de frenar el uso de combustibles fósiles y tomar otras medidas para reducir los niveles de contaminación del aire.
Sabes qué contaminantes respiras a diario? 😷
Las agencias internacionales se han centrado en el análisis de los tipos de materia contaminante más comunes: las concentraciones de dióxido de nitrógeno (NO2 ), PM2,5 y PM10, y el dióxido de azufre SO2.
Dióxido de nitrógeno (NO2 )
El NO2 es un contaminante urbano común y precursor de partículas en suspensión y ozono. Se asocia con enfermedades respiratorias, particularmente asma, lo que provoca síntomas respiratorios (como tos, sibilancias o dificultad para respirar), ingresos hospitalarios y visitas a salas de emergencia.
Los óxidos de nitrógeno se generan por las altas temperaturas de los procesos de combustión. En lugares con mucho tráfico, los vehículos de combustión interna producen alrededor del 60% del total de óxidos de nitrógeno de la atmósfera.
Los efectos de estos gases son evidentes: reducción de la visibilidad, corrosión de materiales, reducción del crecimiento de determinadas especies vegetales, etc. Además, pueden transformarse en ácido nítrico que, presente en la atmósfera, puede dar lugar a lluvia ácida en caso de precipitación.
Los óxidos de nitrógeno son en gran medida responsables de la destrucción de la capa de ozono. Pequeñas cantidades de estos gases pueden destruir grandes cantidades de ozono. Esta situación se ve agravada por el hecho de que sólo pueden eliminarse de la atmósfera mediante procesos naturales que, evidentemente, son mucho más lentos que la producción de estos gases.
Se liberan a la atmósfera muchos otros gases contaminantes, como óxidos de azufre o de carbono, además de otros compuestos y metales como plomo, cadmio, níquel, hierro, mercurio, cromo, cobre, etc. Todos contribuyen a través de sus efectos negativos sobre el medio ambiente.
PM2,5 y PM10
PM significa materia particulada y el valor se refiere al diámetro de las partículas. PM2,5 tiene un diámetro inferior a 2,5 micras (μm) mientras que las PM10 tienen menos de 10 micras (μm) de diámetro. Ambos tipos de partículas son más pequeñas que la anchura del cabello humano, que suele tener entre 17 y 180 μm de diámetro.
Las partículas en suspensión, especialmente las PM2,5 , son capaces de penetrar profundamente en los pulmones y entrar en el torrente sanguíneo, provocando impactos cardiovasculares, cerebrovasculares (accidentes cerebrovasculares) y respiratorios. Cada vez hay más pruebas de que las partículas impactan en otros órganos y también causan otras enfermedades. Las PM2,5 son dañinas a corto plazo y tienen consecuencias adversas en grupos vulnerables como niños y adultos mayores. Las PM10, sin embargo, son más dañinas con la exposición crónica y repetida, especialmente en personas con enfermedades pulmonares preexistentes.
Dióxido de azufre SO2
El dióxido de azufre SO2, un gas que se origina sobre todo durante la combustión de carburantes fósiles que contienen azufre (petróleo, combustibles sólidos), llevada a cabo sobre todo en los procesos industriales de alta temperatura y de generación eléctrica. Puede producir efectos adversos sobre la salud como irritación e inflamación del sistema respiratorio, afecciones e insuficiencias pulmonares, alteración del metabolismo de las proteínas, dolor de cabeza o ansiedad, sobre la biodiversidad, los suelos y los ecosistemas acuáticos y forestales (puede ocasionar daños a la vegetación, degradación de la clorofila, reducción de la fotosíntesis y la consiguiente pérdida de especies) e incluso sobre las edificaciones, a través de procesos de acidificación, pues una vez emitido, reacciona con el vapor de agua y con otros elementos presentes en la atmósfera, de modo que su oxidación en el aire da lugar a la formación de ácido sulfúrico.
Todos contribuyen a través de sus efectos negativos a la salud de las personas y del planeta mismo. Por tanto, todas las medidas encaminadas a reducir las emisiones, refinar, mejorar y optimizar los motores de combustión interna, o incluso restringir el tráfico en las ciudades, son positivas para nuestro futuro. A partir del conjunto de datos obtenido de la plataforma www.data.airpl.org, podemos identificar los lugares que presentan más contaminación según su tipo y la actividad humana que la genera.
Origen de los datos 📁
Los datos utilizados sobre las concentraciones de contaminantes se registraron en las estaciones de medición de Air Pays de la Loire durante el 2023.

Según la descripción del sitio web: https://data.airpl.org/dataset/mesures, para obtener estos datos concretos, Air Pays de la Loire implementa sistemas automatizados de medición de la concentración de partículas según la norma NF EN 16450, utilizando dos métodos de medición (microbalanza oscilante o atenuación de la radiación beta). Estos últimos se instalan en estaciones de medición in situ, asociadas a sistemas de adquisición de datos de medición, que agregan en promedios trimestrales. Estos datos brutos se transmiten luego al servidor informático central y luego se evalúan en diferentes niveles de agregación (validaciones técnicas y medioambientales). Los datos trimestrales validados se agregan así en promedios horarios, que a su vez se agregan en promedios diarios, mensuales o anuales.
La capa de información producida está disponible para su uso en una escala que varía de 1/250.000 a 1/10.000 y puede clasificarse por tipología de estación:
- Estación de tráfico: 1/10.000
- Estación inferior: 1/30.000 (urbana) a 1/250.000 (rural)
- Estación industrial: 1/100.000
Descripción de los campos de la tabla de datos.
- Departamento (/nombre_dept): nombre del departamento donde se encuentra la estación de medición (a partir de datos del IGN).
- Municipio (/nom_com): nombre del municipio donde se encuentra la estación de medición (a partir de datos del IGN).
- Estación ( / nom_station): Nombre de la estación de medición determinada por Air Pays de la Loire.
- Contaminante (/nom_poll): nombre del contaminante medido por la estación de medición.
- Valor (/ valeur): Valor de la medición registrada para un contaminante en una estación determinada y en una métrica determinada.
- Unidad ( / unite): unidad del valor medido del contaminante.
- Indicador (/metrique): nivel de agregación temporal de los datos medidos (hora, día, mes, año).
- Fecha / Fecha-hora ( / date_debut): Fecha de inicio de la lectura de la medición en hora local (hora del territorio metropolitano francés).
- insee_com: Código INSEE del municipio donde se encuentra la estación de medición (a partir de datos del IGN).
- code_station: Código único de la estación de medición.
- Tipología(influence): Naturaleza de la estación de medición determinada por su ubicación y su influencia dependiendo del tipo de contaminante que mide.
- ID_poll_ue: Identificador del contaminante en el sistema de referencia europeo.
- fecha final(/date_fin): fecha de finalización del informe de medición en hora local (hora del territorio metropolitano francés).
- statut_valid: validez de la medición anotada, “t” si la medición está validada, “f” si la medición está invalidada.
- X_reglementaire: x coordenada de la ubicación de la estación de medición en Lambert 93 (EPSG: 2154).
- Y_reglementaire: y coordenada de la ubicación de la estación de medición en Lambert 93 (EPSG: 2154).
Descripción del método utilizado.
De acuerdo a Air Pays de la Loire, la medición de la calidad del aire ambiente se realiza de acuerdo con las recomendaciones de los estándares profesionales del Laboratorio Central de Monitoreo de la Calidad del Aire (LCSQA), en cumplimiento de los requisitos reglamentarios vigentes.
Estos requisitos cubren toda la cadena de medición, tanto desde el punto de vista de los criterios para establecer los sitios de medición, la elección de los métodos de análisis implementados, el seguimiento de la conformidad metrológica del proceso de medición, la validación y la agregación de los datos de medición.
Tipos de estaciones de medición
Mediante la clasificación de la variable Estación de tipología (influence), la naturaleza de la estación de medición está determinada por su ubicación y su influencia en función del tipo de contaminante que mide.
Las estaciones de medición se caracterizan según su ubicación y las fuentes de emisión a las que están expuestas. Existen varios tipos de ubicaciones (rurales, urbanas y periurbanas) e influencias (industriales, de fondo y de tráfico). Las situaciones de fondo corresponden a zonas donde la exposición de la población o del medio ambiente (vegetación, ecosistemas naturales) a la contaminación del aire es media y alejadas de cualquier fuente directa de emisiones.
Metodología – Implementación de un Análisis Exploratorio de Datos (EDA)
Instalación de paquetes
Para la implementación del análisis elegimos Python como lenguaje de programación y Google COLAB como entorno de trabajo, una herramienta online creada para el desarrollo de proyectos de ciencia de datos, integra por defecto muchos paquetes ampliamente utilizados por los científicos de datos.
- Matplotlib : generación de gráficos a partir de listas o tablas.
- Numpy : informática para la manipulación de vectores.
- Pandas : manipulación y análisis de datos de tablas y series temporales.
- Scipy : herramientas y algoritmos matemáticos.
- Seaborn : Visualización de datos estadísticos.
- Plotly: Análisis y visualización de datos en línea.
# Importar bibliotecas necesarias
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy.stats
import plotly
import plotly.graph_objects as go
Importando datos

Nuestra muestra de datos completa incluye un dataset en formato .CSV por cada contaminante descargado de la plataforma https://data.airpl.org/dataset/mesures, en ella es necesario filtrar la zona de la Loire-Atlantique, cada uno de los contaminantes e indicar la fecha de inicio y final durante el 2023 con una periodicidad diaria.
Para trabajar con la librería Pandas en nuestro Notebook de COLAB, importamos nuestros archivos .CSV y los convertimos en un DataFrame para su manipulación por separado asignándole un nombre (ex: so2_df), y también crearemos un dataframe final (ex: df_final) que concatene la data de los cuatro en uno solo.
# Importamos cada .CSV y lo convertimos en dataframe con Pandas.
so2_df = pd.read_csv('so2_2023.csv', sep=';')
no2_df = pd.read_csv('no2_2023.csv', sep=';')
pm10_df = pd.read_csv('pm10_2023.csv', sep=';')
pm25_df = pd.read_csv('pm25_2023.csv', sep=';')

Preparación de datos
Limpiar y adecuar los datos para su análisis es una tarea obligatoria y quizas puede ser el proceso donde más aprendemos y más valor sacamos de la información para responder a nuestros objetivos.
Con el comando .info() de Pandas podemos obtener la cantidad de observaciones, y el nombre, número y tipo de variables de cada dataset.
so2_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3648 entries, 0 to 3647
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 nom_dept 3648 non-null object
1 nom_com 3648 non-null object
2 insee_com 3648 non-null int64
3 nom_station 3648 non-null object
4 code_station (ue) 3648 non-null object
5 influence 3648 non-null object
6 nom_poll 3648 non-null object
7 id_poll_ue 3648 non-null int64
8 valeur 3616 non-null float64
9 unite 3648 non-null object
10 metrique 3648 non-null object
11 date_debut 3648 non-null object
12 date_fin 3648 non-null object
13 statut_valid 3647 non-null object
14 x_wgs84 3648 non-null float64
15 y_wgs84 3648 non-null float64
16 x_reglementaire 3648 non-null float64
17 y_reglementaire 3648 non-null float64
dtypes: float64(5), int64(2), object(11)
memory usage: 513.1+ KB
Para el ejemplo del dataset so2_df iniciamos con 3648 observaciones y 18 variables disponibles para comenzar nuestro análisis. (Recuerda que en paralelo debemos hacer el mismo proceso para los otros tres datasets: no2_df, pm10_df, pm25_df)
Diccionario de variables
Después de nuestra importación, tenemos 18 variables de diferentes tipos de datos. De los cuales 10 son cualitativas y 8 cuantitativas. Es importante resaltar que las variables de tiempo: date_debut y date_fin son de tipo Object, y más adelante las cambiaremos a tipo DateTime para visualizar y manipular los datos cronológicamente.
#tipo de datos de variables
df_final.dtypes
output
nom_dept object
nom_com object
insee_com int64
nom_station object
code_station (ue) object
influence object
nom_poll object
id_poll_ue int64
valeur float64
unite object
metrique object
date_debut object
date_fin object
statut_valid object
x_wgs84 float64
y_wgs84 float64
x_reglementaire float64
y_reglementaire float64
dtype: object
Preparando los datos para evaluar su calidad, realizamos una verificación de los datos faltantes y la proporción de valores nulos para cada variable de nuestro conjunto.
# Cuál es la proporción de valores nulos por variable en SO2
(so2_df
.isnull()
.melt()
.pipe(
lambda df: (
sns.displot(
data=df,
y='variable',
hue='value',
multiple='fill',
aspect=2
)
)
)
)

# verificación Conteo de valores nulos
so2_df.isnull().sum()
nom_dept 0
nom_com 0
insee_com 0
nom_station 0
code_station (ue) 0
influence 0
nom_poll 0
id_poll_ue 0
valeur 39
unite 0
metrique 0
date_debut 0
date_fin 0
statut_valid 1
x_wgs84 0
y_wgs84 0
x_reglementaire 0
y_reglementaire 0
dtype: int64
También podemos visualizar los valores nulos al interior del dataset, con esto validamos que dichos valores no están concentrados en un rango de observaciones específicas sino dispersos en el dataset.
#Visualizar los valores nulos en todo el dataset
df_final.isnull().transpose().pipe(lambda df: (sns.heatmap(data=df)))

Para este ejemplo del dataset so2_df, tenemos 39 observaciones con valores nulos. Si analizamos qué información perdemos al eliminar o imputar nuestros datos faltantes de cada dataset, podemos concluir que estos valores nulos de los cuatro datasets no representan un impacto importante en nuestro conjunto de datos si los imputamos con la media de cada variable. Sin embargo, siempre es importante evaluar cuál es la mejor acción para estos datos, pues pueden llegar a ser outliers importantes que cambien el rumbo de nuestro análisis o resultados. Quiero recomendarles este blogpost de Marta Castrillo que me ayudó mucho: Cómo identificar y tratar outliers con Python ?
📌 Nota: Recuerda que debemos realizar el mismo proceso para el Dataset de cada contaminante: so2_df, no2_df, pm10_df y pm25_df.
# Imputamos la variable valuer con la media
so2_df['valeur'].fillna(so2_df['valeur'].mean(), inplace=True)
print("valores perdidos en valeur: " +
str(df_final['valeur'].isnull().sum()))
# Imputamos la variable statut_valid con la media
so2_df['statut_valid'].fillna(so2_df['statut_valid'].mean(), inplace=True)
print("valores perdidos en statut_valid: " +
str(df_final['statut_valid'].isnull().sum()))
valores perdidos en valeur: 0
valores perdidos en statut_valid: 0
📌 Nota: Si eliminas datos nulos, es una buena práctica enunciar cuántos datos estás perdiendo y la razón de la decisión. Para este caso no eliminé sino imputé los datos, es decir, los remplacé por la media del valor en la variable Valuer, que es la variable principal de nuestro análisis.
Para finalizar, habíamos mencionado que debíamos cambiar el tipo de dato de las variables date_debut y date_fin a tipo datetime, para esto utilizamos Pandas de nuevo.
# Convertir fechas a formato DateTime
so2_df['date_debut'] = pd.to_datetime(so2_df['date_debut'])
so2_df['date_fin'] = pd.to_datetime(so2_df['date_fin'])
no2_df['date_debut'] = pd.to_datetime(no2_df['date_debut'])
no2_df['date_fin'] = pd.to_datetime(no2_df['date_fin'])
pm10_df['date_debut'] = pd.to_datetime(pm10_df['date_debut'])
pm10_df['date_fin'] = pd.to_datetime(pm10_df['date_fin'])
pm25_df['date_debut'] = pd.to_datetime(pm25_df['date_debut'])
pm25_df['date_fin'] = pd.to_datetime(pm25_df['date_fin'])
Es una buena práctica verificar siempre los cambios, para este caso lo hacemos con .dtypes
so2_df.dtypes
nom_dept object
nom_com object
insee_com int64
nom_station object
code_station (ue) object
influence object
nom_poll object
id_poll_ue int64
valeur float64
unite object
metrique object
date_debut datetime64[ns]
date_fin datetime64[ns]
statut_valid object
x_wgs84 float64
y_wgs84 float64
x_reglementaire float64
y_reglementaire float64
dtype: object
Antes de pasar a realizar conteos y ver proporciones de nuestros datasets vamos a crear o concatenar un dataframe final o general que unifique los cuatro contaminantes: df_final
# Concatenamos los DataFrames en uno solo por filas
contaminantes = [no2_df, so2_df, pm10_df, pm25_df]
df_final = pd.concat(contaminantes, axis=0, ignore_index=True)
df_final.head()
# Ahora df_final contiene los datos de los 4 contaminantes con el mismo número de columnas

Estadísticas descriptivas
Medidas de tendencia central y medidas de dispersión general de la variable a estudiar.
De todas las variables cuantitativas, vemos que la principal a analizar es Valeur. Con Numpy y el método .describe podemos visualizar las medidas de tendencia central.
#Medidas de tendencia central, solamente de variables numéricas
df_final.describe(include=[np.number])

Esta variable «Valeur» indica el índice de contaminación a calcular como variable cuantitativa.
Las variables centrales del dataframe df_final se definen así: la media (8.485196 µg/m3) así como la mediana (6.4 µg/m3).
En cuanto a los indicadores de dispersión, utilizaremos el diagrama de caja o BoxPlot para verificar el nivel de dispersión entre la media y la mediana.

Notamos que el diagrama de caja de la variable «valeur» tiene su mayor distribución de datos entre 2.2 ~ 12, presentándose como asimétrico hacia la derecha, bastante dispersa con un rango amplio porque existen datos que llegan a un máximo de 75.
Estadísticas descriptivas univariada
Aquí vamos a extraer las variables cualitativas de nuestro dataframe df_final:
# Solo las variables categóricas
df_final.describe(include=object)

Para estudiar las variables cualitativas, comenzaremos visualizando la distribución por municipios (commune) en Loire-Atlantique.

Así vemos que el 23% de las mediciones se realizan en el municipio de Donges, luego en Nantes (20%) y Saint-Nazaire (12%). Si realizamos el conteo de las observaciones por comuna (nom_com) verificamos su distribución evidenciando a Donges y Nantes como los principales lugares de medición. Esto se debe a que efectivamente, Donges es la región donde hay más estaciones de medida de la calidad del aire (4 estaciones), seguido de Nantes (3 estaciones), por esta razón tienen casi el doble de observaciones que Saint-Nazaire en tercer lugar (2 estaciones).

Analizando el mapa de Loire-Atlantique podemos observar que la región de Donges tiene un fuerte impacto industrial por la presencia de la refinería Total Energies, lugar donde ocurrió un incidente de fuga de gasolina de un tanque de almacenamiento el 21 de diciembre de 2022, razón por la cual se implementaron varias medidas de seguimiento y control en la calidad del aire de la zona.

df_final.value_counts('nom_com', sort=True)
nom_com
Donges 3646
Nantes 3249
Saint-Nazaire 1841
Saint-Etienne-De-Montluc 1461
Montoir-De-Bretagne 1460
Frossay 1318
Bouguenais 1095
Rezé 787
Paimbœuf 365
Trignac 365
Savenay 364
dtype: int64

¿Cuál es la comuna con la concentración de contaminantes más alta en promedio?
Es importante resaltar que al visualizar la concentración de contaminantes por comuna, no existe una correlación entre la comuna con más observaciones (Donges) y la comuna que muestra los índices de concentración más altos, donde para nuestro caso es Rezé, seguido por Nantes, quienes ocupan los primeros lugares.
avg_concentration_by_comuna = df_final.groupby('nom_com')['valeur'].mean().sort_values(ascending=False)
plt.figure(figsize=(12, 6))
avg_concentration_by_comuna.plot(kind='bar', color='skyblue', hue='nom_com')
plt.title('Average Concentration per Commune')
plt.xlabel('Commune')
plt.ylabel('Average Concentration')
plt.show()

avg_concentration_by_comuna.head()
nom_com
Rezé 13.108880
Nantes 13.063650
Bouguenais 11.697341
Trignac 8.307994
Montoir-De-Bretagne 7.894922
Name: valeur, dtype: float64
# Análisis de la concentración de contaminantes por comuna en df_final
plt.figure(figsize=(15, 6))
sns.boxplot(x="nom_com", y="valeur", data=df_final)
plt.title("Concentration of pollutants by commune")
plt.xticks(rotation=45, ha="right")
plt.show()

Ahora es el momento de analizar la distribución por “tipología”: (influence), una de las categorías más importantes del conjunto de datos completo (df_final), que nos permite establecer los porcentajes de la actividad humana influyentes en la contaminación de la región, según el número de observaciones.

Vemos que el 63% las mediciones que se realizan tienen influencia «industrial«. Si relacionamos la tipología con la medición por contaminante (nom_poll) confirmamos la procedencia de su origen.

Combinando variables: estadística descriptiva bivariada
La combinación de variables permite determinar si una variable influye en otra.
Siendo la variable cualitativa “valeur” aquella que queremos estudiar, vamos a hacer estadística bivariada centrada en esta variable.

Durante los estudios univariados, realizamos un diagrama de caja sobre el valor del contaminante. Nos parece lógico utilizar este diagrama añadiendo una variable cualitativa para realizar una comparación de dispersión.
Notamos que las estaciones naturales background e industriales tienen una dispersión similar con cuantiles, medianas y máximos en niveles bajos, mientras que las específicas y las estaciones de tráfico tienen indicadores de dispersión más elevados. De nuevo, la distribución de las estaciones por su influencia u origen nos muestra la «industria«, como la que más observaciones tiene en nuestro conjunto de datos, pero es el «tráfico» quien por sus valores muestra que es la actividad humana que más afecta en la contaminación.
Por tanto, podemos deducir la tipología que influye notáblemente en la tasa de sus valores contaminantes en cada lugar en la región: los entornos que muestren un volumen elevado en «Tráfico» tienen niveles más elevados en valores contaminantes y por tanto sería recomendable evitarlos para vivir o permanecer cerca de estos puntos.
Iniciativas como NAOAIR se convierten en soluciones importantes para informarnos en tiempo real sobre la calidad del aire, ya sea para elegir nuestros desplazamientos o realizar algún deporte.

La Comisión Europea lleva años evidenciando que la contaminación medioambiental es demasiado elevada y las sustancias nocivas se disparan por encima de los límites legales. En este reportaje de EuroNews se investiga sobre su impacto en algunas ciudades de Francia.
Contaminantes más prevalentes y preocupantes:

El promedio de concentración de los contaminantes muestra que el PM10 ☣️ es el que más prevalece y por tanto el más preocupante para la salud de los habitantes de la región.
Relación entre concentración de contaminantes y actividad humana por comuna:

Variación temporal de la concentración de contaminantes por contaminante:

Calcular los días de medición y las estaciones donde se presentan más valores de contaminación por contaminante:
Estaciones de monitoreo que registran niveles altos consistentes:

# Calcular el número de días de medición
num_days = df_final['date_debut'].nunique()
print(f"Número de días de medición: {num_days}")
# Identificar las estaciones con más valores de contaminación
stations_with_most_pollution = df_final.groupby('nom_station')['valeur'].mean().sort_values(ascending=False).head(5)
print("Estaciones con más valores de contaminación:")
print(stations_with_most_pollution)
# Visualizar los resultados
plt.figure(figsize=(12, 6))
sns.barplot(x=stations_with_most_pollution.index, y=stations_with_most_pollution.values, palette="viridis")
plt.title("Estaciones con Más Valores de Contaminación")
plt.xlabel("Nombre de la Estación")
plt.ylabel("Concentración Promedio de Contaminantes")
plt.xticks(rotation=45, ha="right")
plt.show()
Número de días de medición: 365
Estaciones con más valores de contaminación:
nom_station
FRERES GONCOURT 17.466060
TRENTEMOULT 13.108880
LES COUETS 11.697341
CIM BOUTEILLERIE 11.027805
LA CHAUVINIERE 10.841820
Name: valeur, dtype: float64
<ipython-input-447-77ba1b50069e>:12: FutureWarning:


Tendencia general de la concentración de contaminantes a lo largo del último año:

# Encontrar el día más contaminado y las estaciones asociadas
most_polluted_day = df_final.loc[df_final.groupby('date_debut')['valeur'].idxmax()]
most_polluted_day_sorted = most_polluted_day.sort_values(by='valeur', ascending=False)
Día más contaminado del año (ordenado de mayor a menor valor):
date_debut nom_station valeur
9362 2023-09-06 CIM BOUTEILLERIE 75.0
3855 2023-02-14 FRERES GONCOURT 70.0
3907 2023-02-10 FRERES GONCOURT 68.0
11651 2023-02-09 LES COUETS 66.0
1379 2023-09-08 FRERES GONCOURT 65.0
... ... ... ...
11078 2023-04-02 TRENTEMOULT 11.0
9473 2023-08-27 TRENTEMOULT 10.0
1667 2023-08-15 FRERES GONCOURT 9.4
10692 2023-05-08 TRENTEMOULT 9.4
10702 2023-05-07 TRENTEMOULT 7.2
# Si se desea visualizar también los valores contaminantes de ese día en todas las estaciones
most_polluted_day_all_stations = df_final[df_final['date_debut'] == most_polluted_day_sorted.iloc[0]['date_debut']]
most_polluted_day_all_stations_sorted = most_polluted_day_all_stations.sort_values(by='valeur', ascending=False)
Valores contaminantes de ese día en todas las estaciones (ordenados de mayor a menor valor):
date_debut nom_station valeur nom_poll
9362 2023-09-06 CIM BOUTEILLERIE 75.000000 PM10
9359 2023-09-06 LA CHAUVINIERE 64.000000 PM10
9356 2023-09-06 LA MEGRETAIS 62.000000 PM10
9363 2023-09-06 TRENTEMOULT 62.000000 PM10
9358 2023-09-06 SAINT ETIENNE DE MONTLUC 61.000000 PM10
9365 2023-09-06 CAMEE 55.000000 PM10
9357 2023-09-06 FROSSAY 53.000000 PM10
9361 2023-09-06 PARSCAU DU PLESSIS 50.000000 PM10
9360 2023-09-06 LEON BLUM 48.000000 PM10
1403 2023-09-06 FRERES GONCOURT 39.000000 NO2
13408 2023-09-06 LEON BLUM 23.000000 PM2.5
13414 2023-09-06 FRERES GONCOURT 23.000000 PM2.5
13410 2023-09-06 CIM BOUTEILLERIE 22.000000 PM2.5
1401 2023-09-06 LES COUETS 22.000000 NO2
13407 2023-09-06 LA CHAUVINIERE 20.000000 PM2.5
13406 2023-09-06 SAINT ETIENNE DE MONTLUC 19.000000 PM2.5
1399 2023-09-06 PARC PAYSAGER 19.000000 NO2
13412 2023-09-06 LES COUETS 18.000000 PM2.5
13405 2023-09-06 FROSSAY 18.000000 PM2.5
13404 2023-09-06 LA MEGRETAIS 18.000000 PM2.5
1402 2023-09-06 CAMEE 18.000000 NO2
1395 2023-09-06 JULES VERNE 18.000000 NO2
1397 2023-09-06 LEON BLUM 17.000000 NO2
13413 2023-09-06 CAMEE 17.000000 PM2.5
13411 2023-09-06 TRENTEMOULT 17.000000 PM2.5
1396 2023-09-06 LA CHAUVINIERE 16.000000 NO2
13409 2023-09-06 PARSCAU DU PLESSIS 16.000000 PM2.5
1392 2023-09-06 LA MEGRETAIS 16.000000 NO2
1398 2023-09-06 PARSCAU DU PLESSIS 16.000000 NO2
1400 2023-09-06 CIM BOUTEILLERIE 14.000000 NO2
9364 2023-09-06 LES COUETS 8.448881 PM10
9366 2023-09-06 FRERES GONCOURT 8.448881 PM10
1393 2023-09-06 FROSSAY 8.300000 NO2
1394 2023-09-06 SAINT ETIENNE DE MONTLUC 7.000000 NO2
5585 2023-09-06 LA MEGRETAIS 3.500000 SO2
5592 2023-09-06 PARC PAYSAGER 1.700000 SO2
5590 2023-09-06 CUTULLIC2 1.600000 SO2
5586 2023-09-06 PASTEUR 0.650000 SO2
5584 2023-09-06 AMPERE 0.440000 SO2
5591 2023-09-06 PARSCAU DU PLESSIS 0.280000 SO2
5587 2023-09-06 FROSSAY 0.240000 SO2
5593 2023-09-06 CAMEE 0.070000 SO2
5589 2023-09-06 SAINT ETIENNE DE MONTLUC 0.000000 SO2
5588 2023-09-06 SAVENAY 0.000000 SO2
Los días con los niveles más altos de contaminación durante el 2023 se presentaron a mediados de febrero y en la primera semana de septiembre, datos que se conectan con los días más frios del invierno y la semana del regreso a clases y retorno de vacaciones.
Variación de la concentración durante diferentes estaciones del año:

Más preguntas 🤔
Aquí te dejo algunas preguntas adicionales que podrían ayudarnos a explorar correlaciones, causalidad o diferencias que puedan estar relacionadas con problemas sociales vinculados a las emisiones contaminantes:
- ¿Existe una correlación entre la concentración de contaminantes y las tasas de enfermedades respiratorias en la población de cada comuna?
- ¿Hay una relación entre la actividad industrial en una comuna y los niveles de contaminación atmosférica en esa área?
- ¿Se observa alguna diferencia significativa en la calidad del aire entre áreas urbanas y rurales?
- ¿Cómo afectan las condiciones meteorológicas, como la temperatura y la velocidad del viento, a la dispersión de contaminantes?
- ¿Existe evidencia de disparidades socioeconómicas en la exposición a contaminantes, y cómo se relaciona esto con las decisiones de planificación urbana?
- ¿La presencia de zonas verdes o parques en una comuna se correlaciona con niveles más bajos de contaminantes?
- ¿La implementación de políticas ambientales o restricciones regulatorias ha tenido un impacto observable en la reducción de emisiones contaminantes?
- ¿Se puede establecer una relación entre la movilidad urbana (uso de transporte público, vehículos eléctricos, etc.) y la calidad del aire?
- ¿Cómo varía la percepción pública de la calidad del aire en comparación con los datos objetivos de contaminación?
- ¿Hay diferencias en los niveles de contaminantes entre días laborables y fines de semana, y cómo esto podría relacionarse con patrones de actividad humana?
Estas preguntas pueden proporcionar una comprensión más completa de los factores sociales, económicos y medioambientales que contribuyen a los problemas relacionados con las emisiones contaminantes y la calidad del aire.
El análisis revela áreas críticas de contaminación en ciertas comunas, destacando la necesidad de intervenciones específicas. Se identificaron correlaciones entre la actividad industrial, condiciones meteorológicas y concentraciones de contaminantes. La implementación de políticas ambientales y la promoción de movilidad sostenible podrían mitigar los impactos negativos en la calidad del aire. Además, la disparidad socioeconómica en la exposición a contaminantes subraya la importancia de abordar los problemas ambientales desde una perspectiva equitativa y orientada a la salud pública.
Este proyecto fue realizado con el objetivo de entender el problema de la contaminación ambiental, y poner en práctica aprendizajes en el área de la ciencia de datos. Sobra decir que es un ejercicio de juicio y valor personal, y seguramente estará lleno de correcciones que espero poder seguir haciendo con el feedback de todos. 😊
Fuentes:
https://data.airpl.org/dataset/mesures
This EuroNews report investigates their impact in some French cities.
Cómo identificar y tratar outliers con Python ?
#qualityair #dataanalyst #LinkedInAnalysis #DataScience #EnvironmentalSustainability #pollution #climatechange #environnement #nantes #paydelaloire #loireatlantique #climat

