네이버 뉴스 크롤링과 KOSIS데이터를 활용한 미세먼지 뉴스 분석
http://www.yonhapnews.co.kr/bulletin/2018/05/11/0200000000AKR20180511144500017.HTML
2017년 12월 한국보건사회연구원에서 발행한 '사회통합 실태 진단 및 대응 방안 연구(Ⅳ)'에 따르면 국민이 가장 불안을 느끼는 위험 요소는 미세먼지와 같은 대기오염인 것으로 나타났다. 언제부턴가 미세먼지는 심각한 사회적 이슈가 되었다. 좀 옛날로 거슬러 가보면 '봄철 황사'란 키워드의 언론 보도가 많았던 시절이 있었는데, 지금은 미세먼지란 키워드의 기사들이 보도면을 채운다.
언제부터 미세먼지가 큰 이슈가 됐을까?
동일한 개념은 아니지만, '미세먼지'와 '황사'란 두 키워드에 대한 사람들의 관심도의 추이에 변화가 있었는지 알고 싶어서 간단히 'Google Trends'에서 2004년 이후로 검색량 흐름을 비교해보았다. 아래 '그림 1'을 보면 대략 2014년 이전까진 '황사'가 '미세먼지'에 비해 검색량이 우위에 있다가 그 이후로는 '미세먼지'의 검색량이 이 폭증해 역전된 것을 볼 수 있다.
건강에 대한 심각한 위험 요인인 미세먼지
대기오염 물질 중 최근 가장 건강을 심각하게 위협하는 물질로 인식되고 있는 미세먼지는 지름 10μm 이하의 작은 입자(PM10)를 말한다. 그 보다 더 작은 지름 2.5μm 이하의 입자(PM2.5)는 '초미세먼지'로 구분한다.
미세먼지가 건강에 미치는 영향은 근본적으로 인간이 면역력으로 방어하기 힘들다는 것과, 미세먼지가 체내에 들어왔을 때 배출이나 제거를 할 수 있는 방법을 모른다는 것에서 그 심각성이 있다. 체내에 들어온 미세먼지가 인체에 끼칠 악영향도 언제 어떻게 일어나는지에 대해 정확히 알지 못한 채 체내에 쌓여간다는 것이 공포스러운 부분이다. 초미세먼지의 경우엔 체내 섬모에서 여과되지 않고 혈관에까지 침투하면 신체 여러 부분에서 혈전이나 염증 등을 통해 다양한 질환을 일으킬 수 있다. 여러 악영향이 보고되고 있지만, 크게 천식, COPD(만성폐쇄성폐질환) 등의 호흡기 질환과 뇌졸중, 치매 등 뇌혈관질환 및 부정맥, 심근경색 등 심혈관질환 등을 발생시킬 수 있다는 것은 그 심각성이 크다. 2013년 WHO(세계보건기구) 산하 IARC(국제암연구소)에서는 미세먼지를 1급 발암물질로 지정하고 권고 기준을 두고 있다.
뉴스 기사로 미세먼지 들여다보기
파이썬을 활용한 사소한 분석을 해보고 싶은데, 사회적으로 큰 이슈인 미세먼지는 언론 보도 데이터를 활용해 다뤄보기 좋을 것 같았다. 가장 간단한 것부터 해보기로 했다.
흔히 데이터를 모으기 쉬운 방법으로 API를 얘기한다. 그래서 네이버 API로 '네이버 뉴스'에서 '미세먼지'로 검색되는 뉴스 데이터를 수집해보려 했다. 네이버 API로 뉴스 크롤링 하는 것 자체는 어렵지 않았으나, 네이버 API에서 한 번에 허용하는 수집량이 매우 적어서 큰 의미가 없을 것 같았다. 다시 네이버 뉴스 자체를 크롤링해보기로 했다.
네이버 뉴스 자체를 크롤링하는 코드는 검색하면 많이 나온다. 그중 난 'seodaeho91'님 의 블로그에서 소개된 코드를 내가 원하는 조건에 맞게 수정했다.(서대호 님은 김혜진 박사님의 빅데이터 수업시간의 코드를 참조했다고 한다.)
https://blog.naver.com/seodaeho91/221269288709
검색 조건은 네이버 뉴스에서 2014에서 2017년까지 1년 단위로 기사 제목에서 '미세먼지'로 검색되는 기사 중 '지면기사' 유형의 기사들만 수집했다. BeautifulSoup을 썼고, 워드클라우드를 돌려보기 위해 제목과 본문 데이터만 크롤링했다.
네이버 뉴스 검색은 한 번에 4000개의 기사만 검색된다. 검색을 본문이 아닌 기사 제목으로 한정한 이유는 본문까지 모두 검색하게 되면 대부분의 날씨 예보 기사까지 모두 검색되기 때문이었다. 그리고 검색 조건을 '지면기사'로 한정한 것은 동영상, 포토, 보도자료 등 모든 유형을 다 검색하면 네이버 뉴스 검색 한계인 4000개를 훨씬 넘은 것도 있고, 신문사 입장에서 지면기사로 올리는 기사들이 좀 더 정제되어 있고 대표성 또한 있을 것이라 생각했기 때문이다.
워드클라우드는 자연어처리를 위해 KoNLPy의 twitter엔진과 pytagcloud, collections.Counter 등의 패키지들을 활용한 코드로 돌려보았다. '팅크웨어 선행기술개발팀' 블로그의 코드를 참조하였고, 해당 포스트에서 설명한 대로 맥OS의 경우 폰트 설치를 위한 환경 설정이 필요했고, 자바 버전의 문제가 발생해서 stackoverflow에서 찾은 방법대로 해결했다. 기사의 제목과 본문 텍스트의 단어의 빈도를 카운트하여 상위 100개씩을 빈도 크기에 따라 워드클라우드를 만들었다.
2014년도에서 2017년까지 4년간의 미세먼지 기사 워드클라우드를 보면 생각보다 키워드 간의 큰 차이가 보이지 않아 큰 의미를 찾기는 힘들었다. 하지만 작은 특징이나 변화를 굳이 찾아본다면
2014~2015년 : 2014년에 비해 '중국' 키워드의 비율이 약간 줄어든 것이 보인다. 2015년엔 '석탄'같은 키워드가 증가한 것으로 보인다.
2015~2016년 : 2016년엔 그 전엔 보이지 않던 '경유'와 '화력발전소' 키워드가 등장하고 '대책'같은 키워드가 대두된 것이 특징이다.
2016~2017년 : 크게 특징적인 변화는 보이지 않는다.
일단 이 워드클라우드 결과 자체가 불필요한 단어 제거 등의 전처리를 생략하여 크게 의미를 둘 결과는 아니다. 하지만 가볍게라도 분석해본다면 2014~2015년에 미세먼지의 원인에 해당하는 '중국'이나 '석탄'등의 키워드가 등장하다가 2016년 워드클라우드에선 또 다른 원인이라 할 수 있는 '경유', '화력발전소'와 함께 '대책'이란 키워드가 새롭게 높은 빈도로 등장하는 게 특징적으로 보인다. 구글 트렌드 상으로도 검색량이 폭증한 2014년도부터 미세먼지가 사회적인 이슈로 부상되면서 먼저 그 원인에 대한 보도가 많았던 것으로 보인다. 원인에 대한 키워드도 '중국'->'석탄'->'경유', '화력발전소' 등으로 이동하는 것이 흥미롭다. 사회적인 관심도가 증가한 2016년부터는 그 '대책'에 대한 보도량이 많아진 것처럼 보인다.
3년 간 미세먼지 평균 농도와 보도된 뉴스 수의 관계는 어떨까?
미세먼지 관련 기사들을 크롤링해서 워드클라우드로 보고 나니, 좀 더 호기심이 생겼다. 실제 미세먼지 농도 데이터를 구할 수 있다면 해당 달의 네이버 뉴스에서 검색된 기사수와는 어떤 관계가 나타날지 궁금해졌다. 그래서 해 보았다.
월별 미세먼지(PM10)와 초미세먼지(PM2.5) 평균 농도 데이터는 KOSIS(국가통계포털)에서 구할 수 있었다.
'미세먼지' 기사 수는 네이버 뉴스에서 '제목'에서 검색, 유형은 '동영상', '포토', '지면기사', '보도자료'를 포함한 모든 기사로 그 숫자만 카운팅 했다.(검색 일자: 2018년 8월 17일)
미세먼지 농도는 평균 농도였으므로, 기사 수도 해당 달의 일수로 나눠서 '일 평균 기사 수'의 데이터로 만들었다.
초미세먼지(PM.2.5) 평균 농도 데이터가 2015년 1월부터 있어서, 2015년 1월부터 2017년 12월까지 36행의 데이터만 가지고 분석했다
먼저 시간 흐름에 따라 월별 미세먼지, 초미세먼지 농도와 일 평균 검색된 기사 수를 꺾은선 그래프로 나타냈다.
대략 미세먼지의 증가 혹은 감소에 따라 네이버 뉴스 또한 증가하거나 감소하는 경향이 보이는 듯하다. 미세먼지 및 초미세먼지와 기사 수는 약간 다른 추이를 보이는 것 같아서 비교를 위해 3가지 그래프의 트렌드 선과 빨간 수평선을 그려 보았다.
여기서 한 가지 특징적인 것은 2015년 초에서 2017년 말 까지 3년간 미세먼지와 초미세먼지의 농도의 추이는 감소하는 추세였다. 하지만 '미세먼지'로 검색되는 기사의 수는 확연히 증가하는 경향을 보인다. 미세먼지 농도와는 별개로 미세먼지가 사회적인 문제로 커져가면서 이슈를 소비하는 과정에서의 언론 보도는 점차 증가했을 것으로 생각할 수도 있겠다.
여기까지 보고 나니 미세먼지와 초미세먼지 그리고 언론에 보도된 기사수엔 어느 정도의 상관관계가 있을지 궁금해졌다. 그래서 간단히 산포도(scatter plot)를 그려보았다. (seaborn을 활용했다.)
산포도를 보면 어느 정도 상관관계는 있어 보이나, 등분산성을 충족시키지는 않는 것 같기도 하다.(outlier로 보일 수 있는 두 점의 경우는 꺾은선 그래프에서 보이 듯 언론 보도의 특성상 이슈가 커졌을 때 발생한 다량의 기사 수 이므로 제거하지 않았다.) 통계학 책에선 등분산성을 충족시키지 못하는 경우 상관계수가 더 낮게 나온다고 얘기하나 일단은 상관계수를 구해보기로 했다.
파이썬의 Pandas를 이용해 Pearson 상관계수를 구해 보았다.
가장 높은 양의 상관계수를 보인 것은 미세먼지(PM10)와 초미세먼지(PM2.5)였다. 0.83으로 상관이 매우 높아 보였다.
미세먼지(PM10)와 기사 수 사이의 Pearson 상관계수는 0.57 정도로 서로 상관이 있어 보인다.
초미세먼지(PM2.5)와 기사 수 사이의 Pearson 상관계수는 0.41 정도로 서로 상관이 있어 보였지만 미세먼지(PM10)보다는 낮았다.
왜 그럴까에 대해선 추측일 뿐이지만, 아무래도 기자들이 기사를 작성할 때 1차적으로 확인하는 수치는 초미세먼지 농도보다는 미세먼지 농도일 것이므로 그로 인한 영향도 있지 않았을까 생각해 본다.
이 글의 시작은 당장 손에 넣을 수 있는 데이터로 뭔가 해보고 싶은 마음에서였지만, 의외로 사소하지만 흥미로운 부분들을 찾아볼 수 있는 기회였다. 마치 보물찾기처럼 느껴지는 데이터의 세계에서 작지만 의미 있는 건강과 관련한 분석들을 시도해보려고 한다.
참고 자료
1) 미세먼지가 건강에 미치는 영향과 우리나라 정부 R&D 동향. 한국보건산업진흥원 이명선. NICE. 제3권 제4호. 2017
*위에서 사용된 네이버 뉴스에서 '미세먼지'로 검색된 기사 데이터들은 2018년 8월 17일에 검색된 데이터들입니다.