brunch

You can make anything
by writing

C.S.Lewis

by 욜수기 yollsugi May 04. 2018

7. 데이터는 시각화 시켜야 제맛!

DS School 5주차 2번째, 데이터 시각화+이후 공부방향

앞선 게시글들보다는 코딩 자체에 있어서는 내용이 좀 적을 수 있다. 그러나 보는 맛은 확실히 있다.

그게 데이터 시각화의 매력이 아닐까! 2주차 수업 때였나, 처음 파이썬을 다루기 시작하고 판다스에 대해서는 개념만 접했을 시절, 강사님이 이후 어떤 것을 배울지 쫙 먼저 선보이셨었는데, 이 때 마지막에 "데이터시각화로 좀 더 명확하게 확인할 수 있겠죠?" 하면서 데이터 시각화의 과정을 쫙 훑어주셨던게 강한 임팩트로 남았다.


사실 따지고 보면 당연하긴 하다. 조금 더 시각적인게 나타난 셈이니, 초심자 입장에서는 그렇게 멋있고 대단해 보일 수가 없었다. 하지만 5주차에 데이터를 시각화 하는 방법을 배우고 나니 데이터 시각화는 그저 좋은 데이터를 선별하기 위한 수단 중 하나일 뿐이며 생각했던 것 만큼 '까리한' 건 아니라는 생각이 들었다. 예상했던 것 보다 너무 간단하게 작동되었던 탓일까? 파이썬과 판다스가 인간친화적인 컴퓨터 언어로 구성되어 있다고 해도, 이렇게 '친화적으로' 시각화가 가능할 줄은 몰랐다. 가시적으로 내가 현재 알아보고자 하는 Feature가 정말 유의미한 것인지 확인이 가능하니 '까리하지는' 않더라도 세상 이렇게 유용할 수도 없겠다 싶었다. 


본론으로 들어가, 데이터 시각화에 사용되는 툴은 <SEABORN>이라는 툴이다.

간단하게 라이브러리에서 판다스를 불러오듯이 seaborn을 불러와서 실행시켜야 한다.

판다스에서 대표적인 데이터시각화 라이브러리는 seaborn과 matplot 두가지가 있는데, 간단한 시각화는 seaborn으로 할 수 있다. 그러나 seaborn은 간단하다는 점에 반해 복잡한 시각화를 하기에는 불충분하다는 단점이 있고, 이를 복잡하지만 기능이 많은 matplot으로 보충해가며 사용하는 것이 좋을 것이다.


Seaborn과 Matplot을 불러올 때 한가지 팁으로는

[%matplotlib inline] 라고 코딩을 같이 입력해주는 것이 좋은데, 이는 화면에 시각화된 결과를 바로 띄우라고 커맨드하는 것이다. 이 라인을 생략할 경우, 쥬피터 상에서 시각화된 결과가 바로 안 나올 수 있다.


Seaborn을 찾아보면 매우 재미있는 시각화 툴들이 많다. 그것도 Code들을 매우 간단하게 짜서 다양하게 사용할 수 있다. 하지만 실질적으로 유용하게 사용되는 것은 그리 많지 않다. 따라서 가장 대표적으로 사용되는 시각화 툴 5가지를 소개하려 한다. 이를 잘 이용하면 전체 시각화해야 되는 것들 중 90프로 정도에 가깝게 활용할 수 있다. 만약에 5가지를 잘 사용하고 나서도 만족스럽지 않다면 seaborn.pydata.org에 들어가 갤러리에서 추가적으로 다른 seaborn 자료들을 찾아보면 될 것이다.


1. Countplot

제일 먼저 소개할 시각화 툴은 가장 많이 사용되는 countplot이다. 흔히 우리가 알던 막대그래프이다. 가장 많이 사용되는 시각화 툴이라고 볼 수 있다. 알고자 하는 컬럼을 X축 값에 적으면 효과적인 시각화를 완성할 수 있다.



2. Barplot

첫번째로 살펴본 countplot과 모양이 같은 막대그래프가 다시 튀어나와 약간은 당황스러울 수 있지만, 명백히 countplot과는 다른 시각화이며, 별개의 유용한 툴이다. (이해를 돕기 위해 직접 마크다운으로 적거나 해쉬태그로 추가적인 설명을 코딩과 함께 적은 부분을 첨부하였다.) Barplot이 Countplot과 구별되는 가장 큰 차이점은 Y축 값의 설정이 가능하다는 것이다. 즉, 판다스에서 디씨젼트리를 구성할 때 수도 없이 등장했던 Feature와 Label을 Barplot에서는 명백하게 설정할 수 있다는 것이다. Countplot은 y축을 디폴트로 데이터 개수를 세는 데에 그치기 때문에 분석하려는 데이터 결과값에 숫자값이 들어가지 않는다면 countplot을 사용해도 무방하지만, 분석하려 하는 label에 소숫점이나 정수가 들어간다 하면 y축에 Label의 대상이 되는 Column을 넣고 Barplot을 사용해야 한다.

첨부된 사진과 같이 쉽게 생각하면 Classification 문제면 countplot, Regression 문제면 Barplot을 쓴다고 보면 된다.



3. Distplot

세번째로 알아볼 시각화는 Distplot이다. 선 그래프로 변화 추이를 나타내기 위한 시각화 툴이다.

Distplot 코드를 짤 때 주의해야 할 점은 앞선 두가지 방식과 다르게 먼저 column을 뽑아 내는 작업을 해야 한다는 점이다. 이후 column을 감싸듯이 distplot을 불러와 적용한다.


첨부한 사진에는 나타나있지 않지만 distplot을 불러오면 막대그래프와 선그래프가 동시에 등장하게 된다.

하지만 distplot을 사용함에 있어 막대그래프(히스토그램)가 필요한 경우는 거의 없다. 따라서 코드에 추가적으로 hist=False 값을 입력하여 선그래프만 나타나도록 설정할 수 있다.


또한 데이터 분석을 하다보면 간혹 대부분의 값들과 동 떨어진 예외적인 값들이 꼭 하나씩 등장하기 마련인데, 이러한 값들은 분석할 때 도움이 안되는 경우가 태반이다. 전반적인 추이를 살펴보려 하는데 예외적인 사항이 등장하는 것을 반기는 사람은 거의 없을 것이다. 이러한 예외값들을 아웃라이어라고 부른다.

특히 distplot은 직관적으로 분석하기 좋은 툴이라 다른 시각화들에 비해 아웃라이어들을 제거해주는 작업이 특히나 중요하다.

따라서 밑의 첨부파일과 함께 살펴보면, 첫번째 그림은 아웃라이어를 제거하지 않아 500이상의 아웃라이어가 포함되어 있는 모양이고, 이를 다음의 두 줄 코딩으로 제거하고 나면 두번째 그림처럼 조금 더 직관적으로 분석하기 편해진 그림이 등장한다.

low_fare=train[train["Fare"]<500]

sns.distplot(low_fare["Fare"],hist=False)

이런 아웃라이어들을 제거해야 조금 더 의미있는 데이터 분석이 될 수 있다.

Distplot을 어떻게 이해하는 것이 좋냐고 하면, '가우시안 분포', 즉 고등학교 수학시간에 지겹도록 다룬 그 흔한 정규분포(가운데가 쏠려있는) 모양이 나올때가 가장 이상적이라고 보면 된다. 가능한 가우시안 분포가 나오도록 하고, 다른 곳들에 중간에 봉우리처럼 툭 툭 튀어나온 부분들이 있으면 그 부분에 집중하여 분석해보면 될 것이다. 예를 들면 이 자료에서는 운임요금에 대해서 distplot을 나타낸 것이므로, 운임요금을 특별히 많이 내는 계층이 있는지에 대해서 직관적으로 '작은 봉우리'들로 합리적 의심을 해볼 수 있다.

4. LMplot

네번째로 볼 시각화 툴은 LMplot이다. 이 LMplot도 직관적으로 전반적인 데이터를 살펴보기에 아주 중요하고, distplot과 마찬가지로 아웃라이러들을 제거해주는 작업이 역시나 중요한 툴이다.

distplot에 히스토그램이 디폴트로 등장하는 것처럼, lmplot에는 회귀선이 디폴트로 등장하는데 이 또한 이전에 다뤘던 것처럼 fit_reg=False라고 코드입력하여 제거해줄 수 있다. 분석하고자 하는 두 feature 컬럼을 x축과 y축으로 설정하고 그에 따라 비교하고자 하는 결과값을 hue에 설정하면 정확히 그 위치에 해당하게 점들이 찍힌다. 다음 자료에서 힌트를 얻어보자면, 특정 위치에 오렌지색 점이 많이 찍혀 있다면, 이를테면 운임요금이 200을 넘을 때나, 나이가 10세 미만일 때와 같은 경우에 생존율이 높다는 사실을 알 수 있다.


5. Subplot

마지막으로 살펴볼 시각화 툴은 subplot이다. 이는 앞서 살펴본 4가지 툴과는 달리 하나의 특정한 툴이 아니라 여러가지 방식을 한꺼번에 화면에 띄울 수 있는 툴이다. 어떻게 보면 알아두면 가장 유용한 툴 중에 하나인 셈이다. 1 by n이나 n by 1 구조로 나타내려 한다면 괄호를 하나 붙이고, n by n 구조로 나타내려 한다면 괄호를 두개 붙인다.

figure, ((ax1, ax2, ax3), (ax4, ax5, ax6))=plt.subplots(nrows=2,ncols=3)

그리고 사이즈까지 설정이 가능하다 (인치로)

figure.set_size_inches(18,8)

sns.countplot(data=train,x="Pclass",hue="Survived",ax=ax1)  

(이렇게 특정한 시각화를 어느 위치에 넣겠다고 할 때 ax=ax1이라고 입력하여 ax1의 자리로 지정해준다)

sns.countplot(data=train,x="Sex",hue="Survived",ax=ax2)

sns.countplot(data=train,x="Embarked",hue="Survived",ax=ax3)

sns.countplot(data=train,x="SibSp",hue="Survived",ax=ax4)

sns.countplot(data=train,x="Parch",hue="Survived",ax=ax5)


실제로 이 다섯개의 툴만 배우고 나니 데이터를 시각화 하는데에 있어 모든 것이 가능했다. 아직 기초적인 데이터 분석단계라고는 하지만, 좀 더 복잡한 시각화를 시도한다 하더라도 왜 이 다섯가지를 응용하면 웬만한 시각화에는 활용할 수 있다는지 조금 이해가 되었다.


이 시각화를 마지막으로 짧지만 알차고 강력한 DS School의 판다스 입문반이 끝이 났다.

강사님이 정말 좋은 강사라고 느꼈던 부분이 몇가지 있었는데 그 중 하나를 강의가 끝날 때 느꼈다.

바로 이후의 방향에 대해서 제시해 주셨던 점이다.

코딩은 결국 자기가 계속 해보면서 실력을 키워나가야 하는 영역이다.

데이터 분석도 마찬가지로 더 많은 양의 데이터를 다루어보고, 더 어려운 과제에 직면해야 나의 실력이 증진될 수 있는 영역이다. 

그.러.나

한달을 배웠음에도 이후에 어떻게 공부해야 될지에 대해서 막막한 것은 부정할 수 없는 사실이기도 하다.

많은 수강생들을 접해본 경험이 여기서 묻어난 듯 했다. 처음부터 바로 너무나 큰 데이터 산에 직면하여 어쩔 줄 모르고 흥미를 잃었던, 의지를 잃었던 많은 사람들이 있었을 것이다. 이에 따라 수업이 끝난 이후 캐글에서 시도해 볼 수 있는 많은 경진대회들 중에 비교적 깔끔한 데이터로 구성되어 있는 대회들에 대해서 알려주셨다. 

또한 데이터 분석에 있어서 가장 중요한 핵심 중 하나인 데이터 마이닝 기법에 대해서도 알아볼 수 있는 몇가지 자료들을 알려주셨다.

이에 대해서는 이후에 텍스트마이닝, 이미지 마이닝 등을 차례로 하나하나 공부해보고 지금까지와 마찬가지로 포스팅할 예정이다.


강사님을 통해서 추천받는 공부방향과 별개로, 이번에는 내가 독자적으로 향후에 시도해 볼 분석들에 대해서 마지막으로 언급해보고자 한다.

첫 포스팅에서 밝혔던 대로 분명 내가 데이터 분석 공부를 시작하고 이 분야로 뛰어들게 된 데에는 명확한 목표와 방향성, 그리고 관심 분야가 있었다. 스포츠 데이터를 분석하거나 공연문화산업 관련 데이터를 분석하는 실력을 기르고자 하는 것이 어디까지나 나의 최종적인 목표가 될 것이다. 그와 관련하여 Kaggle에서 굉장히 좋은 경진대회를 발견하게 되었다. 

Google에서 시행한 Google Cloud & NCAA® ML Competition 2018-Men's라는 대회이다.

(살짝 나의 관련 도메인 지식을 꺼내자면) 

미국에는 NBA 만큼이나 인기를 끌고 있는 것인 바로 미국 대학 농구인 NCAA 이다. NCAA 자체의 인기도 많지만 그 중에서도 리그의 결과를 바탕으로 64강부터 시작하는 NCAA Tournament는 모든 미국 스포츠 팬들의 관심을 그 시기에는 독차지한다 해도 과언이 아닐 것이다. 지역 연고 문화가 프로스포츠에서 강하게 드러나는 미국 스포츠의 특성 상 대학과 대학 간 경쟁은 강한 흥미요소를 자아내기에 충분하다. 이 64강 토너먼트가 3월에 시작되기 때문에 미국에서는 이를 'March Madness'라고 부른다. 단판승부제로 이뤄지는 토너먼트의 특성상 온갖 이변들이 발생하기 때문에, 매 경기 승부에 이목이 집중되고, 공식 배팅 사이트들에 스포츠 팬들이 참가하는 비율 또한 굉장히 높다. 이에 따라 구글 사에서 머신러닝을 기반으로 매년 승부 예측 모델을 만드는 대회를 주최하고 있다. 상금도 5만불 (한화로 5400만원 상당)에 육박하니 어마어마하게 큰 대회이다.


이 대회에 내가 참가해서 수상을 목표로 하는가 하면 전혀 아니다. 내년, 내후년이면 몰라도, 올해는 이미 March Madness도 끝났을 뿐더러, 현재 나의 실력이 이 대회에 참여하기에는 1등한 참가자의 코딩을 분석할 실력에도 한없이 모자라기 때문이다. 따라서, 나는 이 대회를 나의 공부 및 실력 증진을 목적으로 접근하였다. 캐글에는 Kernel이라는 탭이 있는데 여기에 많은 사람들이 각자의 방식으로 분석한 결과를 올리고, 코드들도 첨부한다. 파이썬이 사용되기도 하고 R이 사용되기도 하는데, 전문가들이 사용한 코드들을 직접 따라 써보기만 해도 실력을 키우는데 많은 도움이 된다고 들은 바 있어, 그대로 시도해보려 한다. 코드들을 어떻게 짜는지, 데이터를 큰 틀에서부터 분석할 때 어떤 식으로 접근하는 것이 좋을지, 견습생의 마인드로 하나하나 배워가려 한다. 이 또한 그 과정을 포스팅하긴 할 것이다. 최종적으로는 스스로 학습한 코드들을 바탕으로 내가 생각하는 최적의 승부예측모델을 제시해 보는 단계가 되겠다. 나름 스포츠, 특히 농구라는 세계에 갖고 있는 도메인 지식에는 자신감을 갖고 있는 터라, 어떤 팀이 이길 확률이 높고, 어떤 팀이 토너먼트제에서 제 실력을 발휘할 수 있는지에 대해 갖고 있는 소견도 명확하게 있다고 말할 수 있다. 결과도 이미 나왔겠다! 내가 분석한 것을 바탕으로 실제 결과와 비교해 보았을 때 맞아 떨어지는 결과들이 많다면, 그 쾌감은 어떠할지 벌써부터 기대가 된다. 차분하게 하나하나 시도해보면서, 도메인지식과 데이터분석능력의 결합을 향해 한발짝 더 나아가보겠다.

매거진의 이전글 6. 파이썬 정복기-'스스로'의 단계로
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari