데이터 공부/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₂는 교통, 산업, 연소 등 도시 내 활동에서 직접 배출되는 오염물질로, 출근과 산업 활동이 활발한 평일에 높은 수치를 보이는 특성이 있습니다.
결과적으로, “유동 인구 변화가 대기오염 패턴에 영향을 미친다”는 가설을 전반적으로 뒷받침하는 분석 결과로 해석할 수 있습니다.
- 하지만, 상관관계 ≠ 인과관계 이므로 유동 인구가 증가했기 때문에 대기 오염도가 증가했다고는 할 수 없습니다.
- 실제 유동 인구 데이터 (통신 기반 위치 데이터 등)와 차량 운행량, 기상 요인 등의 데이터를 활용해 다중 회귀 분석을 진행한다면 인과관계를 더 명확하게 검증해 볼 수 있을 것 같습니다.