데이터 분석 공부 기록

[kaggle] 중국 대기오염, 10년간 어떻게 변했을까? Air Pollution in China (2015-2025)

note818 2025. 4. 7. 23:49

Find Open Datasets and Machine Learning Projects | Kaggle

 

Air Pollution in China (2015-2025)

Synthetic Air Pollution Data from Major Chinese Cities (2015-2025)

www.kaggle.com

본 포스트에서는 2015년부터 2025년까지 중국의 주요 5개 도시(베이징, 상하이, 광저우, 청두, 선전)를 대상으로 한 합성 대기오염 데이터셋을 활용하여, 대기질 변화 및 주요 오염물질 추세를 분석합니다.
해당 데이터는 총 3,000개의 샘플과 24개의 변수로 구성되어 있으며, 각 도시의 기상 정보, 주요 대기오염 지표(PM2.5, PM10, NO2 등), 지역 정보를 포함하고 있습니다.
이 데이터는 머신러닝 기반 예측 모델 구축, 데이터 시각화, 환경 변화 연구 등의 다양한 목적에 활용될 수 있습니다.
본 글에서는 주요 트렌드와 시사점을 중심으로 데이터를 분석하고, 향후 활용 가능성을 함께 모색하고자 합니다.

 

 

 

1. AQI (Air Quality Index, 대기질 지수 분석) 지역별 연도별 추이 

AQI (Air Quality Index, 대기질 지수)**는 공기 중 오염물질 농도를 기준으로 공기의 청정도 혹은 오염 수준을 수치화한 지표

AQI 범위 수준 설명
0–50 좋음 건강에 해가 없음
51–100 보통 일부 민감군에 약한 영향 가능
101–150 민감군 영향 어린이·노약자·호흡기 환자 영향 가능
151–200 나쁨 모든 사람에게 영향 가능
201–300 매우 나쁨 건강에 심각한 영향 가능
301 이상 위험 건강 비상사태 수준
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 불러오기
df = pd.read_csv("air_pollution_china.csv")

# 연도별 도시별 평균 AQI 계산
aqi_trend = df.groupby(["City", "Year"])["AQI"].mean().reset_index()

# 시각화
plt.figure(figsize=(12, 6))
sns.lineplot(data=aqi_trend, x="Year", y="AQI", hue="City", marker="o")

# 정책 전환점 (예: 2017년) 강조
plt.axvline(x=2017, color='red', linestyle='--', label="정책 도입 기준점 (예시)")

plt.title("2015~2025 도시별 연도별 평균 AQI 변화 추이")
plt.ylabel("평균 AQI")
plt.xlabel("연도")
plt.legend(title="도시")
plt.grid(True)
plt.tight_layout()
plt.show()

 

연도 평균 AQI 변화
2017 250.40 -
2018 240.46 ⬇️
2019 239.48 (양회 정책 발표) ⬇️
2020 254.87 ⬆️
2021 259.39 ⬆️
2022 254.37 ⬇️
2023 256.63 ⬆️
2024 255.32 ⬇️

2019년 양회(양회(兩會)**는 전국 중국 최대 정치행사 ) 에서 시진핑 주석이 직접 "스모그 줄이자!" 며 환경 정책을 강조했는데

그 이후 중국의 대기질은 어떻게 변했을까요?

 

2018~2019년까지 AQI(대기질)지수가 점점 낮아지는 추세가 낮아져 정책에 효과가 있나 싶었지만

2020년부터 다시 상승세! 2021년에는 오히려 가장 높은 AQI 수치(259.4)를 기록했습니다.

2022~2024년에도 큰 개선은 없었어요.

 

2. 연도별 PM2.5 농도 변화

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# CSV 파일 불러오기
df = pd.read_csv("air_pollution_china.csv")

# 2017~2024년 데이터 필터링
df_filtered = df[(df["Year"] >= 2017) & (df["Year"] <= 2024)]

# 연도별 평균 PM2.5 농도 계산
pm25_by_year = df_filtered.groupby("Year")["PM2.5 (µg/m³)"].mean().reset_index()

# 결과 출력
print("연도별 평균 PM2.5 (초미세먼지) 농도 (µg/m³):")
print(pm25_by_year)

# 시각화
plt.figure(figsize=(10, 5))
sns.lineplot(data=pm25_by_year, x="Year", y="PM2.5 (µg/m³)", marker="o", linewidth=2)
plt.title("연도별 초미세먼지(PM2.5) 농도 변화 (2017~2024)", fontsize=14)
plt.xlabel("연도")
plt.ylabel("평균 PM2.5 (µg/m³)")
plt.grid(True)
plt.tight_layout()
plt.show()

 

연도 PM2.5 평균 농도 (µg/m³)
2017 133.34
2018 130.81
2019 128.38
2020 133.20
2021 123.98 🔽 (최저)
2022 131.76
2023 131.97
2024 129.91

 

 

PM2.5 농도는 장기적으로 서서히 개선되는 추세이나, 일시적인 외부 변수(예: 팬데믹, 정책 전환)에 민감하게 반응함

2021년의 급격한 감소는 비정상적 외생 요인(팬데믹) 영향일 가능성

 

3. 계절별 평균 초미세먼지(PM2.5) 농도

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 계절별 평균 PM2.5 농도 계산
pm25_by_season = df.groupby("Season")["PM2.5 (µg/m³)"].mean().reset_index()

# 계절 순서 정렬
season_order = ["Spring", "Summer", "Autumn", "Winter"]
pm25_by_season["Season"] = pd.Categorical(pm25_by_season["Season"], categories=season_order, ordered=True)
pm25_by_season = pm25_by_season.sort_values("Season")

# 결과 출력
print("계절별 평균 초미세먼지(PM2.5) 농도 (µg/m³):")
print(pm25_by_season)

# 시각화
plt.figure(figsize=(8, 5))
sns.barplot(data=pm25_by_season, x="Season", y="PM2.5 (µg/m³)", palette="coolwarm")
plt.title("계절별 평균 초미세먼지(PM2.5) 농도")
plt.xlabel("계절")
plt.ylabel("평균 PM2.5 (µg/m³)")
plt.tight_layout()
plt.show()
연도 평균 PM2.5 (µg/m³) 변화
2017 133.34 -
2018 130.81 ⬇️
2019 128.38 (정책 발표 연도) ⬇️
2020 133.20 ⬆️
2021 123.98 (최저치) ⬇️
2022 131.76 ⬆️
2023 131.97 ⬆️
2024 129.91 ⬇️

봄철(PM2.5: 137.01 µg/m³)이 가장 높은 초미세먼지 농도를 보임
→ 황사, 건조한 날씨, 꽃가루 및 농번기 대기질 악화 등이 원인일 수 있음

여름은 상대적으로 낮은 수준
→ 강수량 증가, 대기 확산 원활 등의 환경적 요인이 작용했을 가능성

 

4. 머신러닝을 활용하여 초미세먼지와 기상현상에 대한 연관관계에 대한 분석

궁금한점, 

봄에 미세먼지가 많다던데 ,바람이 많이 부는것이 미세먼지와 상관있는걸까?
비가 많이오면 미세먼지가 얼마나 줄어들까? 
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 데이터 불러오기
df = pd.read_csv("air_pollution_china.csv")

# 분석에 사용할 변수 선택
cols = ["PM2.5 (µg/m³)", "Season", "Wind Speed (m/s)", "Precipitation (mm)"]
df_subset = df[cols]

# 1. 바람 세기 vs PM2.5 (계절별 시각화)
plt.figure(figsize=(10, 5))
sns.scatterplot(
    data=df_subset,
    x="Wind Speed (m/s)",
    y="PM2.5 (µg/m³)",
    hue="Season",
    alpha=0.4
)
plt.title("계절별 바람 세기와 PM2.5 농도의 관계")
plt.xlabel("Wind Speed (m/s)")
plt.ylabel("PM2.5 (µg/m³)")
plt.grid(True)
plt.tight_layout()
plt.show()

# 2. 강수량 vs PM2.5 (전체 시각화)
plt.figure(figsize=(10, 5))
sns.scatterplot(
    data=df_subset,
    x="Precipitation (mm)",
    y="PM2.5 (µg/m³)",
    alpha=0.4
)
plt.title("강수량과 PM2.5 농도의 관계")
plt.xlabel("Precipitation (mm)")
plt.ylabel("PM2.5 (µg/m³)")
plt.grid(True)
plt.tight_layout()
plt.show()

# 3. 상관관계 분석 출력
correlation = df_subset[["PM2.5 (µg/m³)", "Wind Speed (m/s)", "Precipitation (mm)"]].corr()
print("📊 PM2.5와 바람, 강수량의 상관관계:")
print(correlation.round(4))

 

                         PM2.5 (µg/m³)  Wind Speed (m/s)  Precipitation (mm)
PM2.5 (µg/m³)                1.0000            -0.0074             -0.0159    
Wind Speed (m/s)          -0.0074            1.0000              0.0264
Precipitation (mm)         -0.0159             0.0264              1.0000

 

 

pm2.5(미세먼지)Wind Speed(풍속) 상관계수 -0.007은 거의 0에 가깝네요 실질적인 영향 없음

Precipitation(강수량)미세먼지 -0.016으로  비가많이오면 pm2.5(미세먼지)다소 낮아지긴하지만 이것도한 미미함 

 

결론적으로 바람과 비 모두 PM2.5에 큰 영향을 미치지 않음

 

비가오면 비가 미세먼지와 함께 바닥으로 가라앉는 이미지를 상상하곤 했는데 

실제 기사를 보면 미세먼지 입자에 따라서도 씻겨내려가는 정도 다르다 적은양의 비가 내린뒤 오히려 미세먼지 농도가 오른다라는 사례도 볼수가 있네요 

 

 

 

마무리 

이번 분석을 통해 바람이나 강수량이 PM2.5 농도에 미치는 영향은 생각보다 미미하다는 사실을 확인할 수 있었습니다.
그렇다면, 봄철에 유독 미세먼지가 심한 이유는 무엇일까요?

단순한 예측으로는 황사 발생, 건조한 대기 상태, 그리고 농사철을 앞둔 각종 야외 소각 활동 등
기상 조건 외의 외부적 환경 요인들이 복합적으로 작용했을 가능성이 있습니다.

요즘 봄철에 야외 소각활동을하다 최근 산불로 큰 사고로 이어졌는데 이런 큰 사건이 발생했음에도 여전히 야외 소각활동을하는

나쁜! 사람들이 많더라구요 경각심을 가졌으면 좋겠습니다  

 

아무튼,
더 다양한 요인을 함께 고려한 분석이 필요하다는 점에서 이번 분석의 의미를 되새길 수 있었습니다.