brunch

You can make anything
by writing

C.S.Lewis

by 최규민 Jun 17. 2016

Violin Plot 그려보기

챠트로 나의 PC App사용 트랜드 살펴보기 

데이터에 숨어있는 시즈널한 패턴, 비이상적인 신호를 찾아내기 위해서는 데이터를 Plotting 해 보는 것만큼 좋은 것이 없다. 그중에서 요즘 개인적으로 많이 사용하는 Violin Plot으로 나의 2014년, 2015년 PC 사용 패턴을 그려 보고자 한다.


Violin(바이올린) Plot 그려보기 

이름 그대로 그려진 형상이 Violin(바이올린)을 닮아서 붙여진 이름으로 카테고리컬한 데이터의 분포를 시각적으로 잘 비교할 수 있도록 하는 챠트이다.  이 Plot은 데이터의 커널 확률 밀도를 Plotting 하고 중앙의 Box Plot을 통해 최소값(low-extream), 25% 분위, 50% 분위(중앙값),  75% 분위, 최대값(max-extream) 값을 그려 줌으로써 각 데이터 특성을 잘 표현해 준다. 이때 여러 데이터 그룹을 하나의 그래프에 그려 줌으로써 데이터 그룹 간의 비교를 시각적으로 잘 표현해 준다.  


이하 설명되는 내용의 상세한 과정과 소스는 PC-App-Usetime-Trend-by-violin-plot Jupyter Notebook 을 참고 하시길 바랍니다.  


파이썬 Seaborn 패키지로 그냥 Plotting 해보자 

1. 랜덤 값 100개를 생성하고 

2. 최소값, 25% 구간, 중앙값, 75%구간, 최대값을 볼 수 있는 Box Plot을 그려보고

3. 데이터의 분포를 볼 수 있는 KDE(Kernel Density Estimation) Plot도 그려보고 

4. Box plot과 KDE plot을 한꺼번에 그려주는 Violin  Plot을 그려본다. 

Statistical Visualization 파이썬 패키지인 Seaborn을 이용하니 참 쉽죠잉~ 


그럼 이제부터 나의 PC App 사용시간을 측정한 실제 데이터로 그려보자 


PC App의 사용시간 데이터 수집

나의 업무용 PC는 Window OS를 사용하는데, 현재 사용 중인 최상위 Window App이 무엇이며 Window Title이 무엇인지를 5초 단위로 수집하여 기록하는 PC-Agent를 만들어서 측정하였다. 생각보다 간단한 Window API로 쉽게 구현할 수 있다. 이 PC-Agent로 2014년 2015년 나의 PC App사용 시간을 모두 기록한 데이터의 샘플은 아래와 같다. 

이런 데이터를 Plotting 하기 편하도록 적절히 데이터를 변형합니다.


2개 그룹을 하나의 Violin으로 Plotting 하기

# hue값 설정으로 2개의 그룹을 하나의 violin에 그릴 수 있다. ( split=True 필요 ) 
sns.violinplot(data=fully_expended_ds, x='days', y='total', hue='year', split=True )

2014년과 2015년 PC 사용시간 변화 비교

 Violin Plot으로 나의 2014년 2015년 2개의 그룹으로 나누어 시간이 지남에 따라 PC 사용 시간이 어떻게 변화하는지 그려 보았다.

위의 챠트를 유심히 살펴보면 특이한 2개의 이벤트를 볼 수 있다. 2014년 9월에 PC 사용시간이 갑자기 줄어든 (1) 구간,  2015년 7월 이후 평균적으로 PC 사용시간이 줄어든 (2) 구간을 확인할 수 있다.  

왜 그러한지 이력을 분석해 보니 

(1)구간의 경우 9월의 3주간 PC의 사용시간을 수집하는 프로그램의 오류가 생겨 데이터 수집을 못해 생긴 협곡이며, 

(2)번의 경우는 2015년 7월 부터 회사의 근무시간이 8시간(9 to 18)에서 7시간(10  to 18)으로 줄어듦에 따라 PC의 사용 시간이 줄어 든것으로 보인다. 실제로도 아래 표에서 보는 바와 같이 일일 평균 PC사용 시간이 많이 줄어 듦을 확인할 수 있었다. 

2015년 일일 평균 PC사용시간

그럼 이제 좀 더 카테고리를 나누어 어떻게 변화하는지 비교해 보자 


Y 축을 여러 개의 그룹으로 Plotting 하기 

# 그룹의 식별 값이 들어 있는 column으로 Y값 설정 
sns.violinplot(data=fully_expended_ds, x='days', y='filename' )

PC App별 사용시간 변화 보기 

많이 사용하는 상위 10개 App의 사용시간 변화를 Plotting 하였다. chrome의 사용량이 늘고, 테라텀(ttermpro)의 사용량이 줄어드는 특징이 보이고 Eclipse의 사용량이 2014년 후반이후 거의 사용량이 없어짐이 보여진다. 이러한 변화는 주 개발 언어가 Java, PHP에서 Python(ipython notebook)으로 개발 환경이 변경됨에 따라 App 사용 패턴이 변화한 것으로 판단된다.

이 PC App별로 카테고리를 만들어 트랜드 산출해보면 

개발이 줄고, 인터넷이 확연히 늘어남을 볼 수 있다. 아프리카TV도 많이 보고 IPython Notebook으로 개발 작업도 많이 해서 그런 듯하다. 절대 놀아서가 아니다. ^^;

시간대별 PC 사용량 변화 보기 

2014년과 2015년의 하루 일과에서의 사용시간 변화는 어떻까?

2015년 7월부터 출근 시간이 10시로 변경됨에 따라 녹색(2015) 그래프가 오른쪽으로 조금 치우쳐 짐이 보인고, 다행히 퇴근시간은 2014년과 동일하게 18시부터 사용량이 줄어듦이 보이네요. 

요일별 PC App사용 트랜드도 보자 

눈에 띄는 차이는 아니지만 금요일 퇴근 시간이 가장 빠른 듯하고, 목요일 오후 5시의 주간회의로 인해 쏙 들어간 굴곡이 보인다. 그리고 전체적으로 9시 이후까지 늦은 야근은 거의 없는 듯하다. 

하나의 데이터를 카테고리컬하게 데이터분포 관점으로만 그려 보아도 다양한 패턴과 다양한 시그널을 관측할 수 있었다. 역시 백문 불여일견(百聞不如一見)이다. 


요즘 Visualization 패키지는 기본적인 통계 메소드(distribution, kde, regression, corr 등)와 함께 다양한 Plotting 방식을 제공해주기 때문에 사용법만 손에 익히면 손쉽게 데이터를 Plotting 해 볼 수 있다.
조금의 수고로움만 더하여 데이터를 그려보면
데이터 탐색이 더 재미지고,
그러면 데이터의 매력에
더욱더 빠져 들기도 하는것 같다. 
이제는 내 주위의 데이터를 아름답게 형상화시켜보고 싶기도 하다. 
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari