[혼공분석] 6주차_복잡한 데이터 표현하기
[한빛미디어] 혼자 공부하는 데이터 분석 with 파이썬
좋은 개발자는 컴퓨터를 분석의 대상으로 바라볼 뿐, 두려워하지 않는다!‘전공서가 너무 어려워서 쉽게 배우고 싶을 때’, ‘개발자가 되고 싶은데 뭐부터 봐야 하는지 모를 때’ ‘기술 면접
hongong.hanbit.co.kr
파이썬으로 그래프 그리기
pyplot 방식
matplotlib.pyplot에 있는 함수를 이용해 그래프 그리는 방법이다. 함수들이 하나의 Figure 객체에 대한 상태를 공유한다.
객체지향 API
Figure 객체와 서브플롯 객체를 만들고 이 객체의 메서드를 사용하여 그래프를 그릴 수 있다.
그래프에 한글 출력하기
구글 코랩에서 그래프를 그릴 때 한글을 이용해 그래프를 그릴 수 있다.
import sys
# 코랩의 경우 나눔 폰트를 설치
if 'google.colab' in sys.modules:
!sudo apt-get -qq -y install fonts-nanum
import matplotlib.font_manager as fm
font_files = fm.findSystemFonts(fontpaths=['/usr/share/fonts/truetype/nanum'])
for fpath in font_files:
fm.fontManager.addfont(fpath)
# 나눔 폰트를 사용
import matplotlib
matplotlib.rc('font', family='NanumBarunGothic')
matplotlib.rcParams['axes.unicode_minus'] = False
matplotlib의 고급 기능
하나의 Figure에 여러 개의 선 그래프 그리기
한 그래프에 여러 개의 선 그래프를 그려야 할 때가 있다. matplotlib에서 여러 개의 선 그래프를 그리는 방법은 다음과 같다.
top30_pubs = ns_book77['출판사'].value_counts()[:30]
tops30_pubs_ids = ns_book7['출판사'].isin(top_30_pubs.index)
ns_book9 = ns_book7[top30_pubs_ids][['출판사', '발행년도', '대출건수']]
ns_book9 = ns_book9.groupby(['출판사'], '발행년도']).sum()
ns_book9 = ns_book9.reset_index()
ns_book[ns_book9['출판사'] == '황금가지'].head()
line1 = ns_book9[ns_book9['출판사'] == '황금가지']
line2 = ns_book9[ns_book9['출판사'] == '비룡소']
fig, ax = plt.subplots(figsize = (8, 6))
ax.plot(line1['발행년도'], line1['대출건수']
ax.plot(line2[발행년도'], line2(['대출건수'])
ax.set_title('연도별 대출건수')
fig.show()
스택 영역 그래프
하나의 선 그래프 위에 다른 선 그래프를 차례대로 쌓는 것이다. 그래프 사이의 간격이 y축의 값이 된다. stackplot()메서드를 하용할 수 있다.
pivot_table()메서드로 각 '발행년도' 열의 값을 바꾸기
ns_book10 = ns_book9.pivot_tatle(index = '출판사', columsn = '발행년도')
ns_book10.head()
'발행년도'열을 리스트 형태로 바꾸기
top10_pubs = top30_pubs.index[:10]
year_cols = ns_book10.columns.get_level_values(1)
stackplot() 메서드로 스택 영역 그래프 그리기
fig, ax = plt.subplots(figsize = (8, 6))
ax.stackplot(year_cols, ns_ook10.loc[top10_pubs].fillna(0), labels = top1-_pubs)
ax.set_title('연도별 대출건수')
ax.legend(loc = 'upper left')
ax.set_xlim(11985, 2025)
fig.show()
하나의 Figure에 여러 개의 막대 그래프 그리기
fig, ax = plt.subplots(figsize = (8, 6))
ax.bar(line1['발행년도'], line1['대출건수'], label = '황금가지')
ax.bar(line2['발행년도'], line2['대출건수'], label = '비룡소')
ax.set_title('연도별 대출건수')
ax.legend()
fig.show()
# 막대 그래프를 나란히 그리기
fig, ax = plt.subplots(figsize = (8, 6))
ax.bar(line1['발행년도'] - 0.2, line1['대출건수'], width = 0.4, label = '황금가지')
ax.bar(line2['발행년도'] - 0.2, line2['대출건수'], width = 0.4, label = '비룡소')
ax.set_title('연도별 대출건수')
ax.legend()
fig.show()
데이터값 누적하여 그리기
fig, ax = plt.subplots(figsize = (8, 6))
for i in reversed(range(len(ns_book12))):
bar = ns_book12.iloc[i]
label = ns_book12.index[i]
ax.bar(year_cols, bar, label = label)
ax.set_title('연도별 대출건수')
ax.legend(loc = 'upper left')
ax.set_xlim(1985, 2025)
fig.show()
원 그래프 그리기
선 그래프나 막대 그래프와 달리 원 그래프는 시각적으로 어떤 데이터가 더 큰지 한 눈에 구분하기 여렵다. 특히 3차원으로 그린 원 그래프는 더욱 그렇다. 따라서 원 그래프를 사용할 때는 잘못된 정보를 제공하지 않도록 주의한다.
data = top30_pubs[:10]
labels = top30_pubs.index[:10]
fig, ax = plt.subplots(figsize = (8, 6))
ax.pie(data, labels = labels)
ax.set_title('출판사 도서 비율')
fig.show()
여러 종류의 그래프가 있는 서브플롯 그리기
subplots() 함수에 행 개수와 열 개수를 지정하는 매개변수를 사용하고 subplots() 함수에서 Axes 객체를 받환 받아 2차원 배열처럼 위치를 지정하여 사용한다.
fig, axes = plt.subplots(2, 2, figsize = (20, 16))
ns_book8 = ns_book7[top30_pubs_idx].sample(1000, random_state = 42)
sc = axes[0. 0].scatter(ns_book8['발행년도], ns_book8['출판사'],
linewidths = 0.5, edgecolors = 'k', alpha = 0.3,
s = ns_book8['대출건수'], c = ns_book8['대출건수'],
cmap = 'jet')
axes[0, 0].set_title('출판사별 발행 도서')
fig,.colorbar(sc, ax = axes[0, 0])
axes[0, 1].stackplot(year_cols, nsbook10.loc[top10_pubs].fillna(0),
labels = top10_pubs)
axes[0, 1].set_title('연도별 대출건수')
axes[0, 1].legend(loc = 'upper left')
axes[0, 1].set_xlim(1985, 2025)
for i in reversed(range(len(ns_book12))):
bar = ns_book12.iloc[i]
laber = ns_book12.index[i]
axes[1, 0].bar(year_cols, bar, label = label)
axes[1, 0].set_title('연도별 대출건수')
axes[1, 0].legend(loc = 'upper left')
axes[1, 0].set_xlim(1985, 2025)
axes[1, 1].pie(data, labels = labels, startangle = 90,
autopct = '%.1f%%', explode = [0.1] + [0] * 9)
axes[1, 1].set_title('출판사 도서 비율')
fig.savefig('all_in_one.png')
fog.show()