인터렉티브 워드 크라우드로 확인한 3월 코로나19 뉴스 키워드
이전에도 말한 바 있지만, 머신러닝과 딥러닝이라는 무시무시한 도구를 사용하지 않더라도 "데이터를 보는 눈"만 있다면 얼마든지 컴퓨터를 통해 유용한 정보를 뽑아낼 수 있다. 사회의 많은 이슈들은 사실 복잡한 모델링 보다 직관적으로 데이터를 파악하는 게 더 중요하며, 기초적인 기술을 제대로 활용할 수 있다면 이는 쉽게 해결할 수 있기 때문이다.
오늘은 이런 맥락에서 "코로나 19" 보도 관련해서 이슈를 빠르게 정리하는 "워드 크라우드" 시각화로 "인터렉티브"하게 구현해 보도록 하자.
오늘의 인터렉티브 시각화 내용은 웹상에서 바로 확인할 수 있다(링크 를 클릭하면 확인 가능하다, 데스크톱 환경을 추천한다)
워드크라우드(WordCloud)는 말 그대로, 말뭉치로 구름을 만드는 것이다. 간단히 말해 문서에 등장한 모든 단어를 하나씩 센 후에, 빈도수에 맞춰 크기를 조절해서 겹치지 않도록 나열하면 되는 아주 간단한 분석 방법이다.
물론, 말은 간단하지만 만드는 과정은 상당히 번거로운데(어려운 게 아니다!), 일단 1) 대용량의 텍스트를 끌어모아서, 2) 키워드를 잘 골라낸 다음에", 3) 단어별로 등장 빈도 표를 만들고, 4) 다시 한번 크기별, 빈도별로 시각화 하고, 5) 인터렉티브나 색상 효과를 넣어야 과정이 마무리 되기 때문이다. 물론, 다른 흉악한(?) 머신러닝 알고리즘에 비하면 상대적으로 어려운 부분은 없지만, 상당히 손이 많이 가는 분석 방법이다.*
* 특히, 다른 머신러닝 방법과 비교해서 "시각화"를 통한 분석 방법이기 때문에 "보기 좋게"만들어야 하는 점을 생각하면 "효과적인" 워드 크라우드를 만드는 것은 센스에 따라 아주 어려운 일일 수도 있다.
일단, 워드 크라우드의 기본은 "데이터 수집"이다. 당연하지만, 키워드(단어)를 시각화 하려면 일단 단어가 많이 들어가 있는 문서를 모아야 하며, 보통 이 과정에서 대부분의 시간(50~70%)이 소요된다.
이유는 간단한데, 우리가 모으려는 문서 데이터는 "비정형 데이터"라고 불리고, 이름에서 알 수 있듯이 "정해진 형태가 없기" 때문에 정갈하게(?) 표 모양으로 저장하기 어렵다. 그래서 보통 "전처리"라고 불리는 과정을 거치는데, 이 과정은 정해진 매뉴얼이 없고 그때 상황에 맞춰서 이뤄지기 때문에 난이도가 천차만별이다.
간단히 몇 개를 소개해 보자면
스테밍 : "먹고, 먹어서, 먹으니, 먹었으니"와 같은 활용형을 "먹다"와 같은 식으로 정리하는 방법이다
스톱워드(Stopwords) : 그, 저, 이, 하다 와 같이 많이 사용되지만 의미가 없는 단어를 제거하는 과정이다. 이 과정에서 , ! " 와 같은 문장 부호를 같이 삭제하기도 한다.
이 외로 만약에 "1도 없다"와 같은 신조어가 포함되어 있다면, "하나도 없다"와 같이 바꾸거나, 따로 기록하는 과정도 전처리에 포함될 수 있을 것이다.*
* 필자의 경우 코로나19가 가장 많이 등장하지만, 당연한 결과기 때문에 해당 키워드를 삭제하거나 하는 식의 전처리를 사용했다
어쨌든, 이런 이유로 흔히 "가장 좋은 데이터는 남이 만든 데이터"라는 이야기를 많이 하곤 하는데, 오늘 시각화 해 볼 뉴스 정보의 경우 빅카인즈(https://www.bigkinds.or.kr/) 라는 데이터베이스에서 뉴스 정보를 가져올 수 있기 때문에, 그대로 활용하도록 하자.
이제, 대용량의 문서를 구했으니 키워드를 추출하고 수를 세면 된다. 이 과정은 Python이나 R과 같은 패키지를 사용해야 하는데, 개인적으로는 한글 처리는 Python으로 하는 것이 편하다고 생각한다. R의 경우 문자를 전처리 하기 보다는 결과를 통계에 넣고 돌리는데 쓰는 것이 편하기 때문이다.
일단 Python을 사용하기로 했으면 그 다음은 간단한데, Python을 실행시키고 Konlpy라는 패키지를 사용하면 명사를 자동적으로 추출할 수 있기 때문이다.
위 문서를 하나씩 풀이해 보자면 첫째줄은 konlpy기능중 tag와 관련된 기능, 그 중에서 Kkma(꼬꼬마 분석기)를 가져온다는 의미, 둘째줄은 Kkma를 작동시켜 tagger에 기능을 할당하겠다는 의미(간단하게 말하자면), , 셋째줄은 실제 문장에서 명사를 추출하는 과정이다.*
* 파이썬 사용에 대해서는 나중에 쉽게 다뤄보도록 하겠다.
이제, 문장에서 명사를 추출하면서 날짜(주차)와 매체(공중파/중앙지)를 구분해서 정리해 보도록 하자.
보통 이 과정에서 Pandas, Collection이라는 라이브러리를 사용하는데 오늘은 코딩에 대해서 깊이 이야기 하지 않을 것이기 때문에 결과만 엑셀로 확인하도록 하자.
이제 인터렉티브 워드 크라우드를 만들어 보도록 하자. 사실, 워드 크라우드는 워낙 보편적인 기술이다 보니 Python이나 (https://github.com/amueller/word_cloud), R에서도 (https://cran.r-project.org/web/packages/wordcloud/) 쉽게 매뉴얼에 따라 만들면 작성 가능하다(필자는 웹 상의 배포 과정 까지 고려해 Tableau라는 프로그램을 사용했다).
어쨌든, 우리는 오늘 "인터렉티브"워드 크라우드를 만들 예정이기 때문에 몇 가지 추가 내용이 필요하다.
1) 필터 사용 - 언론사, 주차를 구분하기
간단히 목록형 필터를 추가하면 주차와 언론사를 구분할 수 있다. 이것은 다음과 같이 버튼 박스를 만들어서 해결 가능하다.
2) 추가 정보 확인하기
얼마나 단어가 등장했는지 세부 정보를 보여주기 위해 "마우스를 올리면"(호버링이라고 부른다) 해당 세부 값이 나타나도록 조절해보자.
이제 정보 소스와 필터를 조합하면 다음과 같은 레이아웃이 얻어진다.
이제 결과를 웹에서 다른 사람에게 전달하기 위해 인터넷 상에 올려보자. 보통 이 과정에서 개인적으로 서버를 구입하거나 하는데, 우리는 개인적인 정보도 아니고, 간단한 내용이기 때문에 오픈소스 프로그래밍으로 유명한 Github(https://github.com/)의 페이지를 하나 빌려 결과를 올려놓고 확인하도록 하겠다. 깃허브는 이런 개인 프로젝트를 위해 Github Pages라는 기능을 제공하고 있다(https://pages.github.com/)
이제 모든 과정이 마무리됐다. 필자의 깃헙 페이지 링크(https://eqo295.github.io/news_cloud/)를 방문하면 결과를 쉽게 확인할 수 있을 것이다(데스크톱 환경을 추천하고 약간의 버퍼링이 있을 수 있다).*
* 시각화 내용에서 알 수 있듯이, 뉴스 전달시에는 정보 출처를 항상 상기하는 것이 중요하다
내용을 확인하면 주차, 언론 매체(방송사, 중앙지)에 따라 중심되는 보도 키워드가 달라지는 것을 확인할 수 있다. 복잡한 모델링을 구성하는 것도 데이터 과학이지만, 쉽고 빠르게 직관적인 아이디어를 전달하는데도 데이터 과학은 큰 역할을 할 수 있다는 것이다.
다음 기회가 된다면, 더 자세한 공개 데이터를 통해 예측 모델링이나 클러스터링 등 좀 더 전문적인 데이터 분석을 시행해 보도록 하겠다.