본문 바로가기

Programming/Data mining

7. Boxplot, Heatmap _ python

Coursera.org 에서 Michigan University의 Applied Data Science with Python의 강의를 토대로 정리한 내용입니다.

이제까지 예전 포스팅에서 열심히 배웠던 pandas를 별로 활용하지 않았는데요, 이제 본격적으로 슬슬 사용해보도록 하죠.
사실 pandas의 DataFrame은 matplotlib에서 매우 유용한 데이터타입이랍니다.
normal random gamma distribution을 랜덤하게 생성한 후 데이터프레임에 저장한 후 plotting 해볼게요.
그리고 이 때, boxplot이란 걸 사용할건데요, boxplot은 생소한 분들도 많으시겠지만 뭔가 실험데이터와 관련된 논문이나 자료를 보신 분들은 한번쯤 반드시 보셨을 형식의 데이터표현이랍니다. 바로 시작해볼게요.

import pandas as pd
normal_sample = np.random.normal(loc=0.0, scale=1.0, size=10000)
random_sample = np.random.random(size=10000)
gamma_sample = np.random.gamma(2, size=10000)

df = pd.DataFrame({'normal': normal_sample, 
                   'random': random_sample, 
                   'gamma': gamma_sample})
                   
df.describe() #describe() 함수를 사용하면 한 눈에 데이터프레임의 정보를 요약해서 알려준답니다.
>>>
	gamma			normal			random
count	10000.000000		10000.000000		10000.000000
mean	2.020280		-0.007136		0.500746
std	1.414641		0.998347		0.287485
min	0.007720		-4.231456		0.000045
25%	0.975431		-0.683986		0.249955
50%	1.693747		-0.002820		0.502622
75%	2.718741		0.686151		0.749806
max	13.379897		3.712579		0.999966

#Boxplot을 그려볼께요.

plt.figure() #이 때 혹시 이전의 plot을 지우고 싶다면 plt.clf()를 사용하시면 됩니다.
# plot boxplots for all three of df's columns
_ = plt.boxplot([ df['normal'], df['random'], df['gamma'] ], whis='range')

앗! 이제 어디서 좀 많이 본 것 같나요?
boxplot에서의 box는 양쪽 끝이 25%, 75% 구간을 의미하며 주황색 라인은 median값을 의미한답니다.
그리고 이건 상황에 따라서 유용하게 쓰일 수도 있는데요, 저 plot안에 한번 gamma plot을 설명해주는 histogram plot을 넣어볼게요.

import mpl_toolkits.axes_grid1.inset_locator as mpl_il

# overlay axis on top of another 
ax2 = mpl_il.inset_axes(plt.gca(), width='60%', height='40%', loc=2)
ax2.hist(df['gamma'], bins=100)
ax2.margins(x=0.5)

# switch the y axis ticks for ax2 to the right side
ax2.yaxis.tick_right()

어때요? 유용해보이나요..? 
아 참, 저기 whis='range'를 설정해주는 것은 box위아래로 쭉 뻗어있는 데이터의 범위를 어디까지 나타내줄 것인지인데요, 만약 설정해주지 않는다면 대략 median 기준 box위아래 크기의 1.5배 정도까지만 그려지며 그 밖의 범위를 outliner로 scatter plot 시켜 보여준답니다.

다음 주제인 Heatmap은 간단히만 설명하고 넘어갈게요.
data분포도의 density로도 나타낼 수도 있고 두 데이터 시리즈의 correlation을 비교할 때도 주로 사용하는 Heatmap인데요.
최근 우한폐렴으로 인해 코로나바이러스 감염자의 수를 지역별로 표현해주는 코로나맵의 경우,
지역별로 감염자가 많으면 짙은 빨강, 없을수록 옅은 혹은 하얀색이나 파란색으로 표현되기도 하는데요.
이와 같은 표현법이 바로 Heatmap입니다.

plt.figure()

Y = np.random.normal(loc=0.0, scale=1.0, size=10000)
X = np.random.random(size=10000)
_ = plt.hist2d(X, Y, bins=25)

# add a colorbar legend
plt.colorbar()

요런 느낌이쥬.

끝.