데이터 공부/SQL

[SQL, 가설 검증] 서울숲 요일별 대기오염도 계산하기

민몽 2025. 4. 16. 00:39

🔎서론

SQL 문제를 풀던 중 우연히 흥미로운 데이터를 마주쳤습니다. 서울숲 대기 관측소의 오염도 데이터를 기반으로 요일별 평균 대기오염도를 구하는 문제였는데요, 단순 쿼리 해결을 넘어, 문제에 제시된 가설을 직접 검증해 보면 재밌을 것 같다는 생각이 들어 추가 분석을 진행해 보았습니다.

가설

“유동 인구가 많은 주말에는 대기오염도가 증가하고,

유동 인구가 적은 월요일에는 대기오염도가 낮아질 것이다.”

📊 본론: 데이터로 본 요일별 오염 패턴

1️⃣ 데이터 소개

  • 관측 지점: 서울숲 대기 관측소
  • 측정 기간: 2022년 1년간
  • 오염 항목: NO₂, O₃, CO, SO₂, PM10, PM2.5 (총 6개)

2️⃣ 요일별 평균 대기오염도 구하기

SELECT
  CASE
    WHEN weeknum = 0 THEN '월요일'
    WHEN weeknum = 1 THEN '화요일'
    WHEN weeknum = 2 THEN '수요일'
    WHEN weeknum = 3 THEN '목요일'
    WHEN weeknum = 4 THEN '금요일'
    WHEN weeknum = 5 THEN '토요일'
    WHEN weeknum = 6 THEN '일요일'
  END AS weekday,
  no2,
  o3,
  co,
  so2,
  pm10,
  pm2_5
FROM(
  SELECT 
    WEEKDAY(measured_at) AS weeknum,
    ROUND(AVG(no2),4) AS no2,
    ROUND(AVG(o3),4) AS o3,
    ROUND(AVG(co),4) AS co,
    ROUND(AVG(so2),4) AS so2,
    ROUND(AVG(pm10),4) AS pm10,
    ROUND(AVG(pm2_5),4) AS pm2_5
  FROM measurements
  GROUP BY
    weeknum
  ORDER BY
    weeknum
) AS week_data

DAYOFWEEK 와 WEEKDAY의 차이점

  • DAYOFWEEK: 일요일을 1로 시작해 토요일을 7로 표시.
  • WEEKDAY: 월요일을 0으로 시작해 일요일을 6으로 표시.

💡WEEKDAY() 함수는 월요일을 0, 일요일을 6으로 반환합니다. DAYOFWEEK()는 일요일=1, 월요일=2로 시작하므로 요일 순서를 원할 때는 WEEKDAY가 더 유용!)

3️⃣ 월요일 vs 주말 비교

weekday no2 o3 co so2 pm10 pm2.5
월요일 0.0209 0.0258 0.5712 0.0028 29.7692 14.1346
화요일 0.02 0.0275 0.5308 0.0028 34.5769 15.1346
수요일 0.0211 0.0263 0.5096 0.0028 35.6154 15.5577
목요일 0.022 0.0258 0.5346 0.0027 33.5962 15.5962
금요일 0.0225 0.0278 0.5423 0.0028 34.9423 17.4423
토요일 0.0208 0.0285 0.5415 0.0027 36.9434 17.566
일요일 0.0152 0.0307 0.5558 0*.*0027 33.6538 15.7308

특히 PM10, PM2.5, O₃의 경우, 월요일보다 주말에 뚜렷하게 수치가 증가하는 경향을 보입니다.
단, 오염물질마다 단위와 수치 범위가 다르기 때문에 각 항목을 비교하기 위해서는 정규화(Min-Max Scaling)가 필요했습니다.

4️⃣ 대기오염 영향도 정리

  • 추후 결과 해석에 필요할 것이라 생각되어 각 오염 물질 별 대기오염 영향도를 정리해 보았습니다.
    항목 영향도 각 항목의 의미
    PM2.5 매우 높음 지름 2.5㎛ 이하 초미세먼지
    PM10 높음 지름 10㎛ 이하 미세먼지
    NO₂ 높음 이산화질소 (질소산화물의 일종)
    O₃ 중간 오존
    SO₂ 중간 이산화황
    CO 낮음~중간 일산화탄소

5️⃣ 정규화 및 시각화

월요일 vs 주말 평균 수치 비교

  • Python으로 데이터를 0~1 범위로 정규화한 후, Google 스프레드시트를 통해 시각화를 진행했습니다.
항목 월요일 주말 평균 차이 (주말 평균 - 월요일)
NO₂ 0.781 0.385 ▼ -0.396
O₃ 0.000 0.806 ▲ 0.806
CO 1.000 0.6135 ▼ -0.3865
SO₂ 1.000 0.000 ▼ -1.000
PM10 0.000 0.7685 ▲ 0.7685
PM2.5 0.000 0.821 ▲ 0.821

1. 월요일에 감소, 주말에 증가하는 그룹

 

요일별로 정규화된 대기오염 수치(PM10, PM2.5, O₃)를 시각화한 결과, 월요일에는 세 가지 항목 모두 가장 낮은 수치를 기록했으며, 주말(특히 일요일)에 가까워질수록 오염도가 상승하는 패턴을 보입니다.
  • PM 계열과 오존은 햇빛, 사람 이동, 야외활동 등 외부 환경 요인에 크게 영향받는 오염물질입니다. 특히 주말·낮 시간대 활동량이 많아지면 농도가 높아질 수 있습니다.

2. 월요일에 증가 주말에 감소하는 그룹

전반적으로 월요일~금요일 사이 수치가 높고, 주말에는 감소하는 경향이 뚜렷하며, 이는 출퇴근 교통량이 집중되는 평일에 오염도가 높아지는 전형적인 패턴으로 해석됩니다.
  • CO, SO₂, NO₂는 주로 도시 내 활동(교통, 산업, 연소 등)에 의해 직접 배출되는 오염물질입니다. 따라서 출근·산업 활동이 활발한 평일에 농도가 높아지는 경향이 뚜렷합니다.

✅ 결론 및 인사이트

가설

“유동 인구가 많은 주말에는 대기오염도가 증가하고,

유동 인구가 적은 월요일에는 대기오염도가 낮아질 것이다.”


요일별 대기오염 데이터를 정규화하고 각 오염물질의 특성과 영향도를 함께 살펴본 결과, 주말에 증가하는 오염물질(PM10, PM2.5, O₃)과 평일에 높아지는 오염물질(CO, SO₂, NO₂)의 차이점을 확인할 수 있었습니다.

  • PM10, PM2.5, O₃는 햇빛과 야외 활동 증가와 밀접한 관련이 있으며, 실제로 월요일보다 주말에 농도가 높게 나타나는 경향은 가설을 뒷받침합니다.
  • 반면, CO, SO₂, NO₂는 교통, 산업, 연소 등 도시 내 활동에서 직접 배출되는 오염물질로, 출근과 산업 활동이 활발한 평일에 높은 수치를 보이는 특성이 있습니다.

결과적으로, “유동 인구 변화가 대기오염 패턴에 영향을 미친다”는 가설을 전반적으로 뒷받침하는 분석 결과로 해석할 수 있습니다.

  • 하지만, 상관관계 ≠ 인과관계 이므로 유동 인구가 증가했기 때문에 대기 오염도가 증가했다고는 할 수 없습니다.
  • 실제 유동 인구 데이터 (통신 기반 위치 데이터 등)와 차량 운행량, 기상 요인 등의 데이터를 활용해 다중 회귀 분석을 진행한다면 인과관계를 더 명확하게 검증해 볼 수 있을 것 같습니다.