PYTHON DATA 시각화 – PANDAS #2
누적 도면 그리기¶
데이터 과학 meetup 그룹의 시간에 따른 구성원 분포를 확인하기 위해 매주 meetup 그룹별로 재구성한다. 매주 총 회원 수를 cumsum을 통하여 계산하고, 각 그룹의 총합으로 나눠 각 그루의 분포를 전체 회원 수의 비율로 구한다. div 함수를 사용하면서 axis 매개변수 값을 index 로 설정한다.
In [1]:
import pandas as pd
import matplotlib.pyplot as plt
In [2]:
# join_date 컬럼의 데이터를 timestamp 로 변환 한다음 인덱스로 설정한다.
meetup = pd.read_csv('data/meetup_groups.csv', parse_dates=['join_date'], index_col='join_date')
meetup
Out[2]:
In [3]:
(meetup
.groupby([pd.Grouper(freq='W'), 'group'])
.size()
)
Out[3]:
In [4]:
(meetup.groupby([pd.Grouper(freq='W'), 'group'])
.size()
.unstack('group', fill_value=0))
Out[4]:
In [5]:
(meetup.groupby([pd.Grouper(freq='W'), 'group'])
.size()
.unstack('group',fill_value=0)
.cumsum()
)
Out[5]:
누적 영역 차트는 전체 백분율을 사용하여 각 행의 총합이 항상 1이 되게 한다.
In [6]:
(meetup
.groupby([pd.Grouper(freq='W'), 'group'])
.size()
.unstack('group', fill_value=0)
.cumsum()
.pipe(lambda df_:df_.div(df_.sum(axis='columns'),axis='index'))
)
Out[6]:
1. 누적 영역 도면 만들기¶
In [7]:
fig, ax = plt.subplots(figsize=(18,6))
(meetup
.groupby([pd.Grouper(freq='W'), 'group'])
.size()
.unstack('group',fill_value=0)
.cumsum()
.pipe(lambda df_:df_.div(df_.sum(axis='columns'),axis='index'))
.plot.area(ax=ax, cmap='Greys',xlim=('2013-6',None), ylim=(0,1), legend=False)
)
ax.figure.suptitle('Houston Meetup Groups', size=25)
ax.set_xlabel('')
ax.yaxis.tick_right()
kwargs={'xycoords':'axes fraction','size':15}
ax.annotate(xy=(.1,.7), s='R Users', color='w', **kwargs)
ax.annotate(xy=(.25, .16), s='Data Visualizatoin', color='k', **kwargs)
ax.annotate(xy=(.5, .55), s='Energy Data Science', color='k', **kwargs)
ax.annotate(xy=(.83, .07), s='Data Science', color='k', **kwargs)
ax.annotate(xy=(.86, .78), s='Machine Learning', color='w', **kwargs)
fig.savefig('c13-stacked1.png')