[DBGUIDE 연재] R로 하는 데이터 시각화 1부

최근 dbguide.net에 관련 연재를 하고 있어서 늦게나마 블로그에 올려본다.

여태 3회가 올라갔는데, R을 왠만큼 하시는 분들은 3회부터 보시는게 도움이 될거란 생각을 해본다. 3회는 내일까지 이곳에 게시를 할 예정이다.

 

 

R로 하는 데이터 시각화의 시작

최근 빅 데이터 붐이 일어나면서 데이터 처리 플랫폼인 Hadoop과 함께 R이라는 언어도 뜨고 있으며 빅 데이터의 분석 방법으로 다시 각광을 받게 되는 게 데이터 시각화(data visualization)이다. 왜 빅 데이터에서 데이터 시각화가 각광을 받는지 잘 생각해보면 이렇다.

데이터가 굉장히 커서 이들 개개를 일일이 살펴보는 건 거의 불가능에 가까운데, 그렇다고 단순히 평균, 표준편차 등의 요약된 통계량을 가지고 보는 것도 사실 분석가에게는 어느 정도 편리한 요약 수단이라고 해도, 이를 기반으로 누군가를 설득하기 위해서는 사람들마다 공통적으로 가지고 있는 훌륭한 인지 기관인 눈에 호소할 수 있는 데이터 시각화가 분석과 타인을 설득하기 위해 가장 효과적인 방법 중에 하나가 된다. 아무리 데이터를 빨리 처리하는 Hadoop 플랫폼이 있다고 하더라도 결과적으로 분석한 것을 정보로 만들지 않으면 그저 거대한 데이터로 밖에 남아 있지 않을 것이다.

필자가 빅 데이터 플랫폼을 모 금융 회사에서 금융 데이터를 기반으로 파일럿을 진행해본 경험을 이야기 해보자면 빅 데이터 처리 플랫폼이 아무리 빨리 처리를 하더라도 처리한 결과의 정보가 의미가 있어야 빅 데이터 플랫폼의 가치를 사람들이 인지한다는 것을 알 수 있었는데, 그 정점에 서 있는 기술이 바로 시각화 기술이었다. “많은 데이터를 처리한 결과, 우리가 얻는 정보나 혜택이 뭐나?” 하고 물었을 때 바로 답변을 해줄 수 있는 몇 가지 안 되는 기술 중에 하나가 바로 시각화였고, 앞으로의 강좌에서 설명할 ggplot2를 활용해서 잘 마무리한 경험이 있었다. 한마디로 빅 데이터 플랫폼 엔지니어 뿐만 아니라 데이터를 다루는 사람들은 배워볼 필요가 충분한 기술이라는 것이다.

이제 본격적으로 시각화에 대한 맛을 보도록 해보자!

한 예로 각 나라의 자살률을 살펴본다고 한다.
데이터는 http://en.wikipedia.org/wiki/List_of_countries_by_suicide_rate 에서 가져왔다. 위키에서 보면 데이터의 신빙성에 대한 논란은 있으니 참고 바란다.

이 예제의 제시 목적은 시각화 학습을 위한 목적도 있으나, 한국의 자살률이 세계적으로 높다는 측면을 강조해 경각심을 키우기 위함도 있다. “다른 나라에 비해 우리나라의 자살률이 왜 높을까?”라는 의문을 독자들이 가지는 순간 아마도 이와 상관된 데이터를 찾아볼 수 있을 것이고 관련 있는 연구의 촉매가 될 수도 있을 거란 소망을 가져본다. 물론 그런 연구에서 시각화가 좋은 도구가 될 것임은 자명할 것이다.

이 데이터에 대한 시각화에 부담을 가지고 있거나 시도를 해볼 여력이 없는 분들은 그저 엑셀에서 10만명당 몇 명이 자살을 하는지에 대해서 내림차순으로 정렬해서 가장 높은 나라들이 어떤 나라들인지 살펴볼 것이다.

물론 아래와 같이 단순한 통계량을 가지고 전체적인 관점으로 여자보다 남자의 자살이 더 많다는 것을 알 수 있으나 어떤 나라에서 그런 차이를 보이는지는 알 수 없다.

위의 결과에서 얻을 수 있는 건 남,녀의 자살률의 차이일 뿐인데, 이를 단순히 상자그림(boxplot)으로 표현하면 더 보기 쉽다.

이런 식으로 시각적으로 데이터를 표현함으로써 많은 정보를 한눈에 볼 수 있게끔 해주는 게 바로 데이터 시각화라는 것이다.

하지만 뭔가 아쉬운 점이 있는데, 실제 아웃라이어(outlier)라고 불리는 평균이나 중앙값에서 멀리 떨어진 값이 어떤 것인지 표시해 주면 훨씬 가독성이 있을 거라 생각해 본다.

이렇게 하면 아웃라이어에 어떤 나라들이 있는지 확인이 가능할 것이다. 안타깝지만 여자든 남자든 한국의 자살률이 세계적이라는 것을 볼 수 있는데, 기분 좋지 않은 상위권이 아닐 수 없다. 위 그래프 만으로 데이터 파일의 거의 모든 정보를 보여주는데, 텍스트 크기와 색깔은 10만명당 자살수(남+여)의 상대적인 크기를 알려주고 있고, 남, 녀 개별적인 자살수도 역시 보여주고 있어 상대적인 비교를 가능하게 도식화 하고 있다.

다른 예를 들자면, 얼마 전에 필자가 블로그에 올려둔 타이타닉 데이터 분석 포스팅을 더 자세히 살펴보자(http://freesearch.pe.kr/archives/2855). 이 포스팅의 목적은 타이타닉 사망자 통계를 기반으로 남자의 경우 죽을 확률이 높았고, 여자는 살 확률이 높았다는 것을 데이터를 통해 보여주고, 영화가 비극적인 결말로 끝을 맺을 가능성이 애초부터 높았다는 것을 알려주기 위함이다. 여기서 성별에 따른 생존율이 어떻게 다르고, 승객 등급에 따라 생존율 변화가 어떻게 되는지 가장 먼저 확인하고 싶어질 것이다. 일단 개별적으로 생존율을 확인 하기 위한 아래와 같은 결과를 확인 가능할 것이다.

각 등급에 따른 생존율은 위와 같이 숫자로 표현 가능하다(상세한 코드 설명은 1회의 범위에 넘어가니 하지 않겠다). 이를 보면 승객등급(pclass)이 높을수록 생존율이 높다는 것을 알 수 있고, 여자의 경우 남자보다 생존율이 높다는 것과 성인(isminor=adult) 생존율이 높았다는 것을 알 수 있다. 하지만 이들간의 상호작용은 위 통계만으로는 알기 힘들다. 상호작용이라 하면 승객 등급이 여자와 남자의 생존율 차이에 어떤 영향을 줄 수 있느냐이다. 이를 보기 위해서는 chi-square와 같은 통계적 방법이 필요하나 일반인들에게 이해시키기 위해 부연설명이 너무 길어지기 때문에 필자의 경우에는 시각화를 이용한다.

Y축에는 성별에 따른 나이를 표기하고, X축은 승객 등급을 디스플레이 했고 범례로 오른쪽 끝에 생존율 범례를 확률값으로 넣었다. 그리고 그래프 내부에서는 박스 형태로 구간을 나눠서 확률 범례를 기준으로 색상의 밝기로 생존율을 표기 했다. 이렇게 되면서 등급과 성별 그리고 성인 유무에 따른 생존율을 한눈에 볼 수 있게 되었다. 이를 볼 때 등급이 올라갈수록 생존율이 높아지는 경향이 있으나 이 또한 성별 그리고 성인유무에 따른 영향을 받는 것으로 볼 수 있다.

위 그래프는 결정나무(Decision Tree)의 한 알고리즘을 통해 데이터를 분석, 생존에 영향을 미치는 인자들이 어떤 것들이 있는지 나무 모형으로 도식화한 그림이다. 이를 보면 일단 성별이 생존에 가장 큰 영향을 끼치며 이후로는 각 성별마다 다른데 남자는 성인유무, 여자의 경우 승객등급의 영향이 생존에 가장 큰 영향을 끼치는 것으로 볼 수 있다. 게다가 트리 그래프가 타일그림(tile plot)보다는 더 많은 정보를 보여주고 있음을 알 수 있다.

정리 그리고 앞으로 방향

시각화를 하는 방법은 굉장히 많다. 예를 들어 flowingdata.com에서 시각화에 어떤 툴을 사용하는지 설문을 한 적이 있었는데, 아래와 같은 결과를 보여줬다.

출처 : http://flowingdata.com/2010/09/28/poll-results-what-do-you-use-to-analyze-andor-visualize-data/

Excel과 R이 과반을 넘고 있는 상황을 알 수 있는데, flowingdata 사이트가 시각화에 대한 유명한 사이트라는 것을 감안할 때 유의미한 설문 결과라는 것을 알 수 있다. 사실 Excel은 훌륭한 도구이지만 Excel에 대한 책은 주위에 굉장히 많기도 하여 필자의 시리즈로는 R로 시각화를 하는 방법에 대한 강좌를 열도록 하겠다(게다가 Excel은 다룰 수 있는 데이터 레코드 개수에 한계가 있다는 단점이 존재한다).

데이터를 시각화 하기 위한 세 단계는 아래와 같다.

  1. 데이터를 (어떻게든지) 구한다.
  2. 데이터를 시각화 하기 위한 데이터로 변형시킨다.
  3. 데이터를 시각화 한다.
  4. 시각화 꾸미기(옵션)

위의 과정을 위해서는 다양한 지식이 필요하다. 그러나 다행스럽게도 2, 3번의 경우 R이라는 언어에서 탁월한 기능으로 제공하고 있다. 물론 1번의 경우는 data.gov, UCI Machine Learning Repository(http://archive.ics.uci.edu/ml/) 등과 같은 오픈 데이터 사이트에서 구할 수 있으며, 몇몇 유명한 데이터는 R에서도 제공하고 있으니 큰 걱정은 하지 않아도 된다. 4번의 경우 많은 분들이 비싼 툴인 일러스트레이터를 주로 활용하지만 필자의 경우 오픈소스인 Inkscape로 간단하게 편집하곤 한다.

이런 이유로 정리된 이후 강좌 차례는 아래와 같다.

  1. R 기본 문법 및 사용법
  2. R로 데이터 다루기(data munging with R) (data.table, plyr, sqldf 패키지 비교/이용)
  3. ggplot2를 이용한 R 시각화
  4. Inkscape를 활용한 그래프 후처리

위 강좌를 따라오기 위해 필요한 사전 지식은 프로그래밍 언어에 대한 경험뿐이다. 프로그래밍 경험이 없다고 하더라도 R을 첫 프로그래밍 언어로 배우기엔 손색이 없으니 의지만 있으면 가능할 것이라 생각한다.

CC BY-NC 4.0 [DBGUIDE 연재] R로 하는 데이터 시각화 1부 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.

This entry was posted in 데이터분석

  • Pingback: [DBGUIDE 연재] R 프로그래밍 맛보기()

  • Pingback: [DBGUIDE 연재] Data Munging With R()

  • Yyhwes

    안녕하세요 고감자님
    평소 고감자님이 번역하신 집단지성 프로그램밍 책에 대한 관심이 많은 직장인입니다.
    요즘도 열심히 예제와 책의 소스코드를 분석하고 구현하려 노력하나
    힘이 드네요.
    하다하다 안돼 도움을 좀 구하려 글 남깁니다.
    yyhwes@hotmail .com 윤여황
    메일 부탁드립니다. 일단 이 소스를 구현하기 위한 환경설정에서 막히고 있네요.ㅠㅠ

  • gogamza

    소스를 구동해 보고 싶으시다면 먼저 eclipse, netbeans 같은 툴에 익숙해 지시는게 가장 편합니다.

    그러나 그 부분은 간단히 설명 드릴 수 있는 부분이 아니네요.

    이클립스 관련 책자를 보시고 익숙해지시면 코드 임포트가 어려운일은 아니니 먼저 툴에 익숙해 지시는것을 추천합니다.

    2012년 9월 13일 오후 10:52, Disqus 님의 말:

  • Pingback: [DBGUIDE 연재] ggplot2를 이용한 R 시각화()

  • lyutoo

    안녕하세요 자료탐색하다고 왔습니다
    상자그림에 이상치를 찾아야 하는데
    상자그림에서 이상치를 표현하는 R 프로그램의 소스를 알고싶습니다.

  • gogamza

    급하게 만들어본 예제 코드입니다.
    이미 이상치 데이터 포인트에 대한 계산을 해놓으셔야 되겠습니다.

    setosa <- subset(iris, Species == "setosa")

    outs <- quantile(setosa$Petal.Length)[c(2,4)]

    setosa$outliers <- ifelse(setosa$Petal.Length = outs[2] + 1.5 * diff(outs) , setosa$Petal.Length, “”)

    ggplot(setosa, aes(Species,Petal.Length)) + geom_boxplot() + geom_text(aes(label=outliers), hjust=-.3, vjust=0.5)

  • Pingback: [DBGUIDE 연재] 잉크스케이프를 활용한 그래프 후처리()

  • Lyutoo

    ggplot을 실현시키질 못하네요  gg를 boxplot으로 고치면 aes 알수없는 거라고 나와서 아직 못하고 있네요 도와주세요

  • Lyutoo

    위에 상자그림에서 오른쪽 그림처럼 표현하는 방법을 알고싶습니다