본문 바로가기
논문

라즈베리파이 클러스터 Spark DataFrame 에어코리아 미세먼지 데이터 분석

by 내가 진짜 유일한 2024. 9. 21.

이전 포스팅에서 다룬 Apache Spark & Hadoop 프레임워크를 라즈베리파이5 클러스터에 적용한 상태이다.

2024.03.13 - [분류 전체보기] - Apache Spark & Hadoop 클러스터 구축 및 설정

 

Apache Spark & Hadoop 클러스터 구축 및 설정

이번 글에서는 나의 환경에 맞는 Apache Spark과 Hadoop 클러스터 구축에 대한 방법을 소개하겠다하드웨어 환경 - SingleBoard Computer(라즈베리파이, 라떼판다) 사용 클라우드 서버를 사용해서 클러스터

dont-make-excuses.tistory.com

이번 포스팅에서는 에어코리아에서 제공하는 미세먼지 데이터를 라즈베리파이 클러스터에서 Spark을 사용한 데이터 분석에 관한 글을 작성할 것이다.


 

1. 에어코리아 데이터 수집

 

에어코리아 통계정보 - 최종확정 측정자료 조회

 

  • 2001년 자료를 받아서 열어보면, 분기별로 데이터가 나눠져 있다

2001년 데이터 파일 내용
2001년 1분기 데이터

  • 대용량 미세먼지 데이터를 분석하고자,
  • 2001~2022년까지 데이터를 받아서 월별 분기별로 나눠져 있는 데이터를 하나의 csv로 합치는 작업을 진행했다

2001_2022.csv 파일의 크기


2. Spark DataFrame을 활용한 데이터 분석

  • 라즈베리파이 클러스터의 모든 노드가 데이터에 접근할 수 있도록, HDFS에 2001_2022.csv 파일을 올렸다
  • zeppelin에서 데이터 분석 작업을 진행했다. (자세한 세팅 방법은 전 포스팅 참고)

2.1. 데이터 전처리

zeppelin에서 pyspark으로 hdfs에 있는 2001_2022.csv 파일을 spark dataframe으로 변경한 코드

  • spark master를 yarn으로 설정하였고, hdfs에 있는 2001_2022.csv 파일을 Spark DataFrame으로 변형해줬다

 

데이터 전처리 - 형변환

  • 데이터 분석을 위해 데이터 타입에 맞는 형변환 처리를 했다

 

총 데이터 개수 62845983개
데이터 전처리 - 결측치 값 -999 -> null 처리

  • 에어코리아에서 받은 데이터는 -999라는 결측치 값이 있다
  • 데이터 분석을 위해 -999 값을 null로 변경해주고 이 값들의 개수를 계산하는 코드이다
  • SO2, CO, O3, NO2, PM10, 망, PM25 특성에만 결측치 값이 존재하는 것을 알 수 있다

 

2.2. 데이터 분석

데이터 분석 작업 1

데이터 분석 작업 1 - 오염물질의 각 최소 평균 최대 값 출력

  • 첫번째 데이터 분석 작업은 대기오염물질의 각 최소, 평균, 최대 값을 계산해서 출력하는 작업이다
  • 실행시간은 약 34883 밀리초가 발생하였다

특성 추가

한국대기오염 지수를 기준으로 등급 분류

  • 한국대기오염 지수를 기준으로 PM10(미세먼지)와 PM25(초미세먼지) 값으로 등급을 나누었다
  • 직관적인 데이터 분류 통계를 보기 위해서 등급으로 분류 하였다

측정일시 특성을 통해 계절 특성을 생성

  • 측정일시 특성은 yyyymmdd 형태로 되어 있는데, 여기에서 월 데이터만 substr을 통해 데이터를 가져와서 계절 특성을 만들었다
  • 계절 특성으로 계절에 따른 초미세먼지 등급 전체 비율을 계산하고자 생성하였다

데이터 분석 작업  2

데이터 분석 작업 2 - 계절에 따른 초미세먼지 비율 계산

  • PM25(초미세먼지)등급 특성에서 "나쁨"과 "매우 나쁨"일 때만 필터링하여 bad_pm25_df 라는 새로운 데이터 프레임을 만들고
  • bad_pm25_df에서 계절 특성으로 groupBy를 통해 데이터를 그룹화하여 count한다
  • bad_pm25_df에서 전체 개수로 비율을 계산하여 앞서 계절 별 데이터를 계산했던 season_counts에 컬럼을 추가한다
  • 따라서, 초미세먼지의 "나쁨"과 "매우 나쁨"이 있는 계절은 겨울이 약 40% 다음으로 봄이 약 30% 비율을 차지하고 있는 것을 확인

데이터 분석 작업 3

지역별 초미세먼지 등급 분포도를 보기 위한 작업

  • 지역별 초미세먼지 데이터 분포도를 확인해보기 위해 데이터 지역 특성으로 그룹화하여 집계를 하였음
  • 하지만 지역 특성 값이 너무 많기 때문에 통계를 확인하기 적절하지 않았음
  • 따라서 지역 특성에서 앞 2 문자만 가져와서 행정구역 특성을 생성

데이터 분석 작업 3 - 행정 구역에 따른 초미세먼지

  • 행정구역 마다 초미세먼지 등급에 따라 분류하고, 개수를 카운트 하였음
  • 데이터 프레임의 전체 개수에서 행정구역의 (경기, 서울) 비율을 계산하였음
  • 전체 개수에서 행정 구역의 비율을 계산한 이유는, 초미세먼지의 매우 나쁨 값이 많은 이유가
  • 경기나 서울에서 측정한 데이터 표본이 많기 때문일 수도 있기 때문에, 전체 데이터에서 행정 구역 비율을 계산하였음
  • 그 후에 매우 나쁨 열을 기준으로 데이터를 내림차순 정렬하여 초미세먼지가 매우 나쁨이 많은 행정구역을 출력하였음
  • 경기, 서울, 충남, 전북 순으로 초미세먼지 매우 나쁨 등급 개수가 많았지만, 전체 데이터 개수에서 경기 지역이 약 24%를 차지하기 때문에, 데이터 표본이 많아서 영향을 미쳤다고 할 수 있음

데이터 분석 작업 4

데이터 분석 작업 4 - PM10, PM25 등급 특성 전체 비율

  • PM10(미세먼지), PM25(초미세먼지) 등급 특성에서 보통, 좋음, 나쁨, 매우 나쁨 값을 카운팅해서 전체 개수 비율을 계산하였음
  • round를 사용하여 소수점 3자리 까지 계산하도록 하고, 데이터 개수를 count를 하여 total_count 로 비율을 계산하였음
  • 결측치 값은 알수 없음으로 처리 PM25은 결측치 값이 약 60% 가까이 차지하고 있음
  • 위에 데이터 전처리 부분에서 -999 결측치 값을 null 처리하고 null 개수 카운팅을 했을 때 약 3771만개 정도 나오고, 총 데이터 개수가 약 6284만개 인 것을 보아, 집계 결과가 맞음
  • 알 수 없음 값을 제외하면, 보통이 제일 많은 비율을 차지하고 있고, 보통, 나쁨, 매우 나쁨 순으로 비율이 높음
  • 매우 나쁨의 경우 약 1.46%, 0.5% 비율

데이터 분석 작업 5

데이터 분석 작업 5 - 초미세먼지 특성과 나머지 대기오염물질 간의 상관관계 계산

  • PM25(초미세먼지)특성과 나머지 대기오염물질 특성 간의 상관관계를 계산 하였음
  • 결과를 계산하기 전에는 PM10과 상관관계가 가장 높을 것으로 예상했음
  • 실제로, 초미세먼지와 미세먼지의 상관관계가 제일 높았으며, O3 > S02 > NO2 > CO 순으로 상관관계가 높았음

 

데이터 분석 작업 결과

  • 데이터 분석 작업 순서는 데이터 분석 작업 소요 시간 순으로 순서를 정했다
  • 데이터 분석 1이 제일 적은 시간 소요 되었고, 5이 제일 많은 시간 소요 되었다
  • 데이터 분석 작업 선정은 시계열 데이터나, 미세먼지 데이터에 대한 도메인이 적기 때문에 이 데이터로 해볼 법한 통계, 집계 분석 진행
  • 이 데이터 분석 작업을 통해 얻은 점은 2001~2022년까지 에어코리아에서 제공하는 전국의 모든 미세먼지 데이터를 분석하는 것은 라즈베리파이 클러스터만으로도 충분히 수행 가능하고 성능도 괜찮다는 것을 확인한 것이다

다음 포스팅 예정

  • 다음 포스팅에선 똑같은 데이터 분석 작업을 Pandas에서 해보고 이를 라즈베리파이 클러스터와 수행 시간을 비교하는 글을 작성
  • PC - Pandas, PC - Spark, RaspberryPi cluster(5) - Spark, Single RaspberryPi(1) - Spark 이렇게 4 가지 비교군으로 수행 시간을 비교