혼공학습단/혼자 공부하는 데이터 분석 with 파이썬

[혼공분석] #6. 복잡한 데이터 표현하기

✨️데이터분석가✨️ 2024. 2. 11. 18:14
728x90
728x90
6. 복잡한 데이터 표현하기
    1) 객체지향 API로 그래프 꾸미기

        (1) pyplot 및 객체지향 API 방식으로 그래프 그리기
        (2) 출판사별 발행 도서 개수 산점도 그리기
    2) 맷플롯립의 고급 기능 배우기
        (1) 여러 개의 선 그래프 그리기
        (2) 스택 영역 그래프 그리기
        (3) 여러 개의 막대 그래프 그리기
        (4) 원 그래프 그리기
        (5) 여러 종류 그래프가 있는 서브플롯 그리기

 

1) 객체지향 API로 그래프 꾸미기

(1) 그래프 그리기

① pyplot 방식

- matplotlib.pyplot에 있는 함수를 사용

- y축은 plot() 함수에 전달한 값, x축은 인덱스 값으로 함 

import matplotlib.pyplot as plt
plt.plot([1, 4, 9, 16])
plt.title('simple line graph')
plt.show()

pyplot 방식 그래프
pyplot 방식 그래프

 

 

② 객체지향 API 방식

- 동일한 그래프를 피겨(fig) 객체와 Axes 객체를 사용하여 그리기

- 피겨 객체 설정을 바꾸거나, 서브플롯을 추가하는 경우에 사용함

fig, ax = plt.subplots()
ax.plot([1, 4, 9, 16])
ax.set_title('simple line graph')
fig.show()

 

 


(2) 출판사별 발행 도서 개수 산점도 그리기

① 고유한 출판사 목록 만들기

- [value_counts() 메서드]로 상위 30개 출판사 목록을 만들며, 해당 메서드는 내림차순 정렬함

import pandas as pd
ns_book7 = pd.read_csv('ns_book7.csv', low_memory=False)
top30_pubs = ns_book7['출판사'].value_counts()[:30]
top30_pubs
 
문학동네      4410
민음사         3349
...
북이십일     1026

 

- [isin() 메서드]로 상위 30개 출판사에 해당하면 True, 아니면 False로 반환함

- [sample() 메서드]로 무작위 1000개 행 선택하고, [random_state 매개변수]로 동일한 결과 출력

top30_pubs_idx = ns_book7['출판사'].isin(top30_pubs.index)
top30_pubs_idx 
0                 True
1               False
...
376769     False
 
ns_book8 = ns_book7[top30_pubs_idx].sample(1000, random_state=42)

 

 

② 산점도 그리기

- [subplots() 함수]로 피겨의 크기를 지정함

- [scattter() 함수]로 x축은 '발행년도', y축은 '출판사'를 지정하여 산점도 그리기

fig, ax = plt.subplots(figsize=(10, 8))
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'])
ax.set_title('출판사별 발행도서')
fig.show()

산점도 그래프
산점도 그래프

 

 

③ 마커 꾸미기

[s 매개변수]로 마커 크기를 다르게 나타내기 ('대출건수' X 2 값으로 마커 크기 지정)

- [linewidths 매개변수]로 마커 테두리 선의 두께 바꾸기 (기본값 1.5)

- [edgecolors 매개변수]로 마커 테두리 색 바꾸기 (기본값 face, 검정색 k)

- [alpha 매개변수]로 마커 투명도 조절하기 (진할수록 해당 값이 많음을 의미)

- [c 매개변수]로 마커 색 바꾸기 (작은 값은 짙은 녹색 → 큰 값은 밝은 노랑)

- [colorbar() 메서드]로 색깔이 어떤 값에 대응하는지 참조 정보를 제공하는 컬러 막대 표시하기

fig, ax = plt.subplots(figsize=(10, 8))
sc = ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], s=ns_book8['대출건수']*2,
                        linewidths=0.5, edgecolors='k', alpha=0.3, c=ns_book8['대출건수'])
ax.set_title('출판사별 발행도서')
fig.colorbar(sc)
fig.show()

마커 꾸미기 (jet 컬러맵)
마커 꾸미기 (jet 컬러맵)

 

 

④ 컬러맵 (값에 따라 색상 표현)

[cmap 매개변수]로 컬러맵을 지정함 (파랑노랑→빨강 순인  jet 컬러맵을 자주 사용함)

 

 

 


2) 맷플롯립의 고급 기능 배우기

(1) 여러 개의 선 그래프 그리기

① 2개의 선 그래프 그리기

- 상위 30위 출판사에 해당하는 행만 선택해서 '출판사', '발행년도', '대출건수' 열을 추출함

- [groupby() 메서드]로 '출판사'&'발행년도' 기준으로 행을 묶은 후, [sum() 메서드]로 '대출건수' 합을 계산함

top30_pubs = ns_book7['출판사'].value_counts()[:30]
top30_pubs_idx = ns_book7['출판사'].isin(top30_pubs.index)
ns_book9 = ns_book7[top30_pubs_idx][['출판사', '발행년도', '대출건수']]
ns_book9 = ns_book9.groupby(by=['출판사', '발행년도']).sum()

 

- 2개 출판사에 대한 선 그래프를 그림

- [label 매개변수]로 레이블을 추가하고, [legend() 메서드]로 범례를 추가함

line1 = ns_book9[ns_book9['출판사'] == '황금가지']
line2 = ns_book9[ns_book9['출판사'] == '비룡소']

fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(line1['발행년도'], line1['대출건수'], label='황금가지')
ax.plot(line2['발행년도'], line2['대출건수'], label='비룡소')
ax.set_title('년도별 대출건수')
ax.legend()
fig.show()

2개의 선 그래프
2개의 선 그래프

 

 

② 5개의 선 그래프 그리기

- 상위 5개 출판사에 대해 선 그래프 그리기

- [set_xlim() 메서드]로 x축의 좌표 범위를 설정함 (y축은 [set_ylim() 메서드])

fig, ax = plt.subplots(figsize=(8, 6))
for pub in top30_pubs.index[:5]:
    line = ns_book9[ns_book9['출판사'] == pub]    # 상위 5개 출판사 선정
    ax.plot(line['발행년도'], line['대출건수'], label=pub)    # 5개 선 그래프 그리기
ax.set_title('년도별 대출건수')
ax.legend()
ax.set_xlim(1985, 2025)
fig.show()

 

 


(2) 스택 영역 그래프 그리기

- [pivot_table() 메서드]로 열 이름을 '발행년도' 값으로 바꾸기 (열 값이 하나의 열이 되게)

- [get_level_values() 메서드]로 다단으로 구성된 열에서 선택한 항목만 가져올 수 있음

- [stackplot() 메서드]로 스택 영역 그래프 그리기

- [fillna() 메서드]로 누락된 값을 0으로 채움

- [loc 매개변수]로 범례 위치 지정 (기본값은 'best'로 최상단 위치)

ns_book10 = ns_book9.pivot_table(index='출판사', columns='발행년도')
top5_pubs = top30_pubs.index[:5]
year_cols = ns_book10.columns.get_level_values(1)

fig, ax = plt.subplots(figsize=(8, 6))
ax.stackplot(year_cols, ns_book10.loc[top5_pubs].fillna(0), labels=top5_pubs)
ax.set_title('년도별 대출건수')
ax.legend(loc='upper left')
ax.set_xlim(1985, 2025)
fig.show()

스택 영역 그래프
스택 영역 그래프

 

 


(3) 여러 개의 막대 그래프 그리기

① 묶은 세로 막대 그래프

- [bar() 메서드]로 막대 그래프 그리며, x값 위치를 이동시켜 옆으로 나란한 막대 그래프를 그림

- [width 매개변수]로 막대 두께 지정

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()

묶은 세로 막대 그래프
묶은 세로 막대 그래프

 

 

② 누적 세로 막대 그래프

- [cumsum() 메서드]로 누적 값을 계산함

- 큰 막대(누적 값)를 먼저 그린 후, 작은 막대 순으로 그려서 막대를 쌓을 수 있음

- [range() 함수]로 행 개수만큼 인덱스 번호를 만들고, for 문에 [reversed() 함수]로 인덱스의 역순으로 반복하여 그림

ns_book12 = ns_book10.loc[top5_pubs].cumsum()
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)

누적 세로 막대 그래프
누적 세로 막대 그래프

 

 


(4) 원 그래프 그리기

- 상위 5개 출판사의 도서 개수 및 인덱스를 저장함

- [pie() 메서드]로 원 그래프 그리기

- [startangle 매개변수]를 90으로 지정하면 12시 방향부터 반시계 방향 순으로 그림 (기본값 3시 방향부터 반시계 방향 순)

- [autopct 매개변수]로 포맷팅 문자열 지정 ('%d'는 정수)

- [explode 매개변수]로 원하는 조각을 떨어뜨려 중요한 항목 강조

data = top30_pubs[:5]
labels = top30_pubs.index[:5]
fig, ax = plt.subplots(figsize=(8, 6))
ax.pie(data, labels=labels, startangle=90, autopct='%.1f%%', explode=[0.1]+[0]*4)
ax.set_title('출판사 도서비율')
fig.show()

원 그래프
원 그래프

 

 


(5) 여러 종류 그래프가 있는 서브플롯 그리기

fig, axes = plt.subplots(2, 2, figsize=(20, 16))
# 산점도
# 스택 영역 그래프
# 누적 막대 그래프
# 원 그래프
fig.savefig('all_in_one.png')
fig.show()

여러 종류 그래프가 있는 서브플롯
여러 종류 그래프가 있는 서브플롯

 

 

 


6주차 미션

 

 

6주차. 기본 미션

p344의 손코딩(맷플롯립의 컬러맵으로 산점도 그리기)을 코랩에서 그래프 출력하고 화면 캡처하기

기본미션. 맷플롯립의 컬러맵으로 산점도 그리기
기본미션. 맷플롯립의 컬러맵으로 산점도 그리기

 

 

6주차. 선택 미션

p356 ~ 359의 스택 영역 그래프를 그리는 과정을 정리하기

선택미션. 스택 영역 그래프 그리기
선택미션. 스택 영역 그래프 그리기

 

 

 

 

728x90
728x90