실패한 데이터 분석. 공부를 더 하고 다시 시도할 것이다.
작년, 국내 정치 지형에 많은 변화가 있었다. 지난 4월 총선에 국민의당이 40석을 가져가면서 3 당체제를 만들었다. 최다 의석을 가져간 더불어민주당도 과반을 넘지 못했기에, 제 1 정당이 독자적으로 법안을 통과시키는 것은 이제 불가능해졌다. 그리고 탄핵국면을 거치면서 새누리당(현 자유한국당)에서 다수의 의원들이 탈당하여 바른정당을 창당했다. 그렇게 국회에는 4개의 원내교섭단체(의석수가 20인 이상을 확보한 정당 또는 집단)로 구성되어졌다. : 더불어 민주당, 자유한국당, 국민의당, 바른정당. 그리고 정의당은 2개의 의석만 가지고 있지만, 지난 대선에서 심상정 후보가 6.2%의 득표율을 기록하면서 무시하지 못할 수준으로 성장했다. 정의당은 높아진 지지율과 함께 활발한 정치행보를 보이며, 언론의 주목도 조금씩 받기 시작했다. 이렇게 최근 대한민국의 정치 지형은 5당 체제로 굳어지고 있는 모습이다. 사사로운 갈등으로 분리되었다가, 다시 합당&통합하던 예전과는 달리 유례없는 상황이다.
자연스럽게 정당들 간의 이념 포지션 문제도 생기게 되었다. 단순히 진보, 보수로 나뉘어 정책을 만들던 양당체제와는 다르다. 지금은 그 스펙트럼이 넓어졌고, 5개의 정당이 서로 뚜렷한 정체성을 선점하기 위해 애쓰고 있다. 진보~보수의 성격으로 한 번 정리해보자면: 정의당 - 더불어 민주당 - 국민의당 - 바른정당 - 자유한국당 순서로 정리할 수 있을 것이다.(필자의 개인적인 분석임을 밝힙니다.) 성소수자 문제, 노동자 인권 문제 등 진보 성향 이슈에서 정의당은 적극적인 목소리를 낼 동안 더불어민주당은 비교적 타협적인 자세를 취하고 있다. 국민의당은 이념논쟁이 구태의 것이라고 규정하며 중도의 길을 걸어왔다. 얼마 전 안철수 후보가 당대표 선거에 출마하면서 국민의당 노선을 '극중도'로 가겠다는 것으로 보아 앞으로도 그럴 것이다(지금은 당대표로 당선된 상태). 바른정당이 20~40대 유권자를 기반으로 새로운 보수를 자처할 동안, 자유한국당은 정통 보수의 정체성을 내세웠다.
이념으로 나뉘는 정치가 항상 좋은 것은 아니지만, 유권자들에게 확실한 행보를 보이고 꾸준한 지지율을 받기 위해서는 포기할 수 없는 부분이다. 그래서 각 정당들은 이념 정체성을 확실시하고자 하는 것이다. 문제는 정당 리더들이 추구하는 바와 평론가, 유권자들이 받아들이는 것에는 간극이 발생할 수 있다는 것이다. 썰전에서 전원책 변호사가 유승민 당시 대선후보를 향해 좌파라고 했다. 그의 경제, 복지 정책이 진보정당의 것과 비슷한 것을 이유로 말했다. 하지만 바른정당 후보였던 유승민은 항상 보수, 우파 후보라고 정체성을 말했다. 안철수 후보의 정당이었던 국민의당 또한 노선 규명에 고민이 깊었을 것이다. 국회 의석 대부분이 호남 기반이지만, 중도 보수를 공략하는 유세를 펼쳤다. 더불어민주당과 차별화를 하고, 유권자가 많은 영남을 공략하기 위한 것으로 보였다.
정당의 리더들은 이 간극을 줄이고자 할 것이다. 본인들의 노선과 그것을 판단하는 유권자들의 생각이 일치해야 설득력이 생기고 더 많은 지지를 얻을 수 있기 때문이다. 한 마디로 득표를 목표로 하는 마케팅인 셈이다. 적절한 전략 설계를 위해서는 현재 상태의 분석이 중요한데, 그것이 은근 까다롭다. 정당간의 차이점을 파악하는 방법은 대체로 정치 평론가, 여론 분석가들의 주관적인 평가에 기반한기 때문이다.
좀 더 객관적인 비교방법이 없을까 고민하다가 문득 생각이 떠올랐다. 텍스트 마이닝 방식으로 정당들 간의 정책을 비교하고 유사도 정도를 파악해보고 싶었다.
정말 바른정당의 정책들이 더불어민주당, 정의당의 것과 비슷한지.
국민의당의 정책들은 중도를 아우르면서 위치해있는지.
더불어민주당과 자유한국당의 정책 중에서 비슷한 점은 없는지
한 번 확인해보고 싶었다. 제대로 분석된다면, 정당의 리더들은 정책의 차별화 여부를 바로바로 피드백 받을 수 있을 것이다. 현재 상황을 참고할 만한 지표가 생긴다는 것은 분명 도움될 것이라 생각한다.
데이터는 중앙선거관리위원회 선거정보 포털(http://policy.nec.go.kr/svc/policy/PolicyContent119.do)에 게재된 대선 후보들의 10대 공약집을 기준으로 삼았다. 왜냐하면 각 정당들이 가장 공을 들이고 신경을 썼을 것이며, 정체성 및 목표가 뚜렷하게 나타나는 지점이기 때문이다. 이를 이용하여 공약 하나 당 1개의 문서로 만들었고, 한 후보당 10개의 문서가 정리된다. 이렇게 하여 총 50행 길이, 74,800자의 데이터셋을 확보했다.
RHINO 패키지를 이용하여 수집된 데이터셋에서 명사를 추출했다. RHINO는 Java 기반으로 만들어진 형태소 분석기 패키지인데 CRAN에 등록된 KoNLP 형태소분석기보다 빠르고 정확하다고 한다. RHINO 형태소 분석기는 문장에서의 원하는 형태소를 추출해준다. 명사를 입력하면 해당 문서에서 명사만 뽑아주고, 동사를 입력하면 동사만 뽑아준다. 준비된 데이터셋에서 명사만을 추출하였는데, 일반적으로 명사가 가장 핵심적인 의미를 담고 있고, 그 출현 빈도가 많으면 비교적 중요하다고 인식되기 때문이다. 명사를 추출하고 난 이후에는 bi-gram으로 묶어서 정리했다. bi-gram은 추출된 단어를 2개씩 묶어서 정리해준다. 문재인 후보와 홍준표 후보의 공략 중 일부분을 발췌하여 예시로 확인해보자. (지금은 문재인 대통령, 홍준표 당대표지만, 당시의 공략을 확인하는 부분이기 때문에 후보라고 지칭함)
문재인: "비핵화와 더불어 평화로운 한반도 구현"
홍준표: "미국과의 충분한 협의 하에 ‘한반도 전술핵무기 재배치’ 추진"
bi-gram으로 묶지 않고 그냥 명사만 추출했을 경우는 다음과 같을 것이다.
문재인: 비핵화, 평화, 한반도, 구현
홍준표: 미국, 충분, 협의, 한반도, 전술핵무기, 재배치, 추진
반면 bi-gram으로 명사를 정리하면 다음과 같다.
문재인: 비핵화 평화, 평화 한반도, 한반도 구현
홍준표: 미국 충분, 충분 협의, 협의 한반도, 한반도 전술핵무기, 전술핵무기 재배치, 재배치 추진
명사 하나를 따로 따로 떼어놓고 보는 것과, 양쪽 인접한 2개의 단어를 붙여서 보는 것과 차이가 분명 있다. 두 개의 단어를 연결시킨 bi-gram에서의 의미가 더욱 뚜렷해지고 문서 간 특징이 잘 구분된다는 것을 알 수 있다. 특히 '한반도'라는 단어의 사용에 있어서 차이가 확실히 보인다. 문재인 후보의 bi-gram 단어에서는 '평화 한반도'가 나왔지만, 홍준표 후보에서는 '한반도 전술핵무기'가 나왔다. 평화와 자강안보로 나뉜 두 후보의 진영이념차이가 확인되는 부분이다. 다만 단어를 두 개씩 묶다 보면 차원의 크기가 너무 커진다는 단점이 있다. 따라서 Chi-square 방법을 이용하여 축소시켜 주어야만 한다.
정리된 단어 풀(pool)은 TF-IDF(Term Frequency- Inverse Document Frequency)방법을 이용하여 정형화시켜줬다. 이는 텍스트 마이닝 기법의 일종이다. 특정 단어의 빈도를 계산하여 해당 문서에서 얼마나 중요한지를 알려주는 지표이다. 예시를 통해 간단히 원리만 파악해보자.
1. 오늘 집에서 밥 먹고 공부를 했다. 공부는 지루하지만 꼭 해야 하는 것이다.
2. 내일도 집에서 공부를 할 예정이다.
3. 내일은 집에서 운동도 좀 해야겠다. 운동은 지루한 일상의 탈출구이다.
3개의 문서에서 특정 단어들의 중요도를 파악해보자. 1, 2, 3번 모든 문서에서 '집'이라는 단어가 나왔다. 이렇게 공통적으로 포함된 단어는 문서 간의 특징을 구분할 때 아무 쓸모가 없다. '내일' 이라는 단어는 2개의 문서에서 한 번의 빈도로 포함되어 있다. 이는 비교적 낮은 TF-IDF 값을 가질 것이다. 반면 '운동'이라는 단어는 두 번의 빈도로 3번 문서에서 유일하게 보인 단어이다. 이는 높은 TF-IDF값을 가지며, 다른 문서와 구분해주는 값으로 이용될 것이다. 아래는 TF-IDF로 정형화한 데이터셋의 모습이다.
이후 Chi-Square 0.2를 적용하여 50 x 2662의 데이터셋을 만들었다.
클러스터링은 비지도학습 방법 중 하나이며, 유사한 특성을 가진 것끼리 군집을 만들어 주는 방법이다. 유사성 정도를 측정하는 방법에 따라 다양한 알고리즘들이 존재한다. 가장 기초적인 k-means 를 사용하여 5개의 군집으로 나누어 군집의 차이를 분석할 계획이다. 그 이후에 알맞은 다른 알고리즘들을 사용해가며 분셕을 진행할 것이다.
연구 분석이 제대로 진행되고, 정당 간의 유사도가 기존의 인식과 비슷하다면 아래와 같이 형성될 것이라 판단했다. 그래서 특정 정당이 어떤 정당과 유사한 지 확인해보자는 의도였다.
# 단 군집화 방식만으로는 좌/우 이념의 스펙트럼을 계산할 수 없다. 단순히 정당과 정당 간의 유사한 정도만 파악할 수 있을 것이다.
그러나 결과는....
완전 망했다....
총 5개의 1번, 2번, 3번, 4번, 5번 군집이 있는데, 행렬의 대각선 지점에 숫자들이 배치되면 적당한 수준의 결과를 냈다고 볼 수 있다. 하지만 4번 군집에 90%가 몰려있었고, 손 쓸 도리가 없을 정도로 결과가 나빴다. 추가적인 전처리를 통해 개선할 수 있는 정도도 아닌 듯하고, 왜 이렇게 까지 망했는지에 대해 생각해보기로 했다.
살펴보면서 수많은 오류들이 나왔다. 더불어 연구실 선배에게 조언을 구하여 문제점을 지적받았다.
총 50개 행, 약 7만 4000자가량의 데이터를 수집했다. 50개의 행이 적다는 것은 알았지만, 글자 수가 많기에 분석이 가능할 줄 알았다. 하지만 문서의 개수를 기준으로 정형화를 시키는 TF-IDF 방법을 쓰기에는 너무나도 적었다.
나는 정책집에서 명사만을 추출하여 분석하였는데, 이것은 당연히 비슷할 수밖에 없다. 후보들이 의식하는 국민들의 요구사항은 대체로 비슷하다. 따라서 정책에 포함된 명사는 대체로 실업 대책, 저출산 문제, 세금 조정, 남북 관계 등으로 겹치는 부분이 많았다. 거기서 약간의 수치 차이에 의해 노선이 바뀌는 것인데, 텍스트마이닝 정형화 과정에서 숫자는 다 삭제해버리니 결과가 나쁠 수밖에 없었다. 데이터를 많이 수집해도 수치를 무시하고 분석한다면 결과는 달라지지 않을 것이다.
언제나 빠지지 않는 문제점이다. 이번에는 알고리즘에 대한 이해도가 많이 부족했다. 문제점으로 처음 지적받은 부분이, 클러스터링에 대해 얼마나 잘 이해하고 있냐는 부분이었다. 생각해보니 나는 군집화를 하는 방법만 조금 알고 있었을 뿐, 이것을 왜 쓰고 언제 쓰는지에 대한 개념은 전무했다. 알고 보니 군집화는 레이블이 달리지 않은 수많은 데이터들을 한 번 '살펴보기' 위해 쓰이는 것이었다. 예를 들어 영화의 특징들이 기입된 데이터를 가지고 SF, 로맨스, 액션, 전쟁 등의 장르를 달아야 할 때 한 번 돌려보는 것이었다. 그리고 추후에 분류 모델을 사용하여 확실하게 분류를 하고 정확도를 개선해나가는 방식이다. 그런데 나는 이미 정당들의 이름을 다 달아놓은 데이터를 사용했기에 군집화 방법은 적절치 않았던 것 같다. (물론 분석을 할 때는 정당 이름 열을 삭제시키긴 했다.)
그리고 데이터 수집과정에서의 신뢰도 문제도 있을 것이다. 정상적인 수집 방법으로는 웹 크롤링을 하여 연구자의 손을 거치지 않아야 한다. 하지만 선관위 포털에 등록된 파일들이 PDF 파일이었기 때문에 HTML 태그를 분석하여 수집하는 기존의 방법으로는 한계가 있었다. 별 수 없이 엑셀파일에 복사, 붙여넣기 방식으로 진행하여 .csv 파일을 만들었다. PDF 파일을 복사하면서 생기는 띄어쓰기 문제 몇 가지만 수정하고 다른 부분은 손대지 않았지만, 전문적인 연구를 진행할 때는 권장되지 않는 방법이다. 그러한 부분마저도 코드로 수정해야 하며 인위적인 개입은 바람직하지 않기 때문이다.
내가 직접 연구를 계획하고, 수집하고, 분석한 것은 이번이 처음이다. 결과가 나오지 않아서 너무나도 아쉽지만...개인적인 공부와 시도 부분에서는 나쁘지 않았다고 자평한다. 그리고 긍정적인 평가를 받았던 부분은 문제인식이 비교적 뚜렷했다는 점이다. 연구를 하다 보면 가끔 길을 잃고 연구 자체가 목적이 되는 경우가 있다고 하던데, 그런 부분은 없었다고 한다.
흥미로우면서도 실용적인 것에 대한 분석을 자꾸 해보고 싶다. 잘 정리되어 있고, 그냥 주어진 데이터셋을 분석하기보다 직접 현상을 발견하고 찾아나가는 것을 할 것이다. 적어도 공부를 하는 당분간은 정제된 것들로 공부를 해야겠지만... 이번 방학처럼 좀 여유로울 때는 이렇게 프로젝트 식으로 하나씩 진행해도 좋을 듯하다.