컴붕이의 감자 탈출기/혼공분석

[혼공분석]6주차_복잡한 데이터 표현하기

potato2brain 2025. 2. 23. 14:25

마지막 6주차!

 

06 - 1 객체지향 API로 그래프 그리기

pyplot  방식 vs  객체지향 API 방식

  • pyplot 방식은 matplotlib.pyplot에 있는 함수를 사용하는 방식으로 함수들이 하나의 피겨객체에 대한 상태를 공유한다
  • 객체지향 API방식은 피겨 객체와 서브플롯 객체를 만들고 이 객체의 메서드를 사용하는 방식으로 복잡한 그래프를 그리는 경우 특히 하나의 피겨에 여러 개의 서브플롯을 추가하는 경우 객체지향 API 방식을 사용하는 것이 좋다

 

그래프에 한글 출력하기

✔️미리 네이버 폰트에서 나눔고딕을 다운 받아 Library/Fonts/ 경로에 넣어둔 상태로 진행

import matplotlib.pyplot as plt
plt.rc('font', family='Nanum Gothic')

⚠️진짜 다 맞게 했는데 계속 font not found가 나와서 식겁했으나... 분명 폰트가 저장된 이름은 'NanumGothic.ttf'인데

'Nanum Gothic' 이렇게 띄어쓰기를 해줘야 오류가 안나더라... 진짜 오래 고생했다 ㅠㅠ 왜인지는 잘 모르겠음.. 

마커 꾸미기

  • s 매개변수를 통해 마커의 크기를 조절한다. 기본값은 6이며 특정 배열을 마커 크기로 전달하면 각 데이터마다 마커의 크기가 다른 산점도를 그릴 수 있다
  • alpha 매개변수를 통해 마커의 투명도를 결정한다. 앞주차에서 설명 했으므로 넘어간다
  • edgecolor 매개변수를 통해 마커 테두리의 색을 결정한다. 마커의 테두리를 그리면 여러 개의 마커가 겹칠 때 경계를 구분하기 명확하다
  • linewidths 매개변수를 통해 마커 테두리 선의 두께를 결정하며 기본값은 1.5이다
  • c 매개변수를 통해 산점도의 색을 지정한다. 큰 값은 밝은 노랑색, 낮은 값은 진한 녹색으로 그린다
fig, ax = plt.subplots(figsize=(10, 8))
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], linewidths = 0.5, edgecolors = 'k', alpha=0.3, s = ns_book8['대출건수']*2, c=ns_book8['대출건수'])
ax.set_title('출판사별 발행도서')
fig.show()

 ⚠️ns_book8 은 데이터에 가장 많은 출판사 30개를 추려낸 뒤 임의로 1000개의 데이터를 뽑아 만든 변수 입니다

 

값에 따라 색상 표현하기: 컬러맵

  • 앞에 그린 산점도는 scatter()함수가 사용하는 기본 값인 viridis 컬러맵임
  • jet 컬러맵은 낮을 수록 짙은 파란색, 높을수록 노란색 -> 붉은색 이 되기 때문에 좀더 직관적임
  • cmap 매개변수를 이용해 지정가능
  • colorbar() 메서드를 통해 컬러막대를 그릴 수 있음
fig, ax = plt.subplots(figsize=(10, 8))
sc = ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], linewidths = 0.5, edgecolors = 'k', alpha=0.3, s = ns_book8['대출건수']**1.3, c=ns_book8['대출건수'], cmap='jet')
ax.set_title('출판사별 발행도서')
fig.colorbar(sc)
fig.show()

기본 숙제~!

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

#상위 30위에 해당하는 출판사 고르기
top30_pubs = ns_book7['출판사'].value_counts[:30]
top30_pubs_index = ns_book7['출판사'].isin(top30_pubs.index)
#원하는 자료로 데이터 정제
ns_book9 = ns_book7[top30_pubs_index][['출판사','발행년도','대출건수']]
ns_book9 = ns_book9.groupby(by=['출판사','발행년도']).sum()
ns_book9 = ns_book9.reset_index()

 

선 그래프 2개 그리기

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

💡맷플롯립은 기본적으로 10개의 색을 돌아가며 그래프를 그림. 10개 이상의 선을 그릴 경우 처음 색부터 다시 반복해서 사용

💡label 매개변수를 추가한 후 legend() 메서드를 호출하면 범례가 추가됨

 

 

스택 영역 그래프 그리기

  • 하나의 선 그래프 위에 다른 선 그래프를 차례대로 쌓는 것
  • 그래프 사이의 간격이 y축의 값이 됨
  • stackplot() 메서드로 그림
  • y매개변수에 2차원배열로 전달해야함

그리는 순서

  1. pivot_table() 메서드로 각 '발행년도'열의 값을 열로 바꾸기
  2. '발행년도'열을 리스트 형태로 바꾸기
  3. stackplot() 메서드로 스택 영역 그래프 그리기
#1번
ns_book10 = ns_book9.pivot_table(index='출판사', columns='발행년도')
ns_book10.head()

✔️엑셀의 피벗테이블과 유사한 기능을 수행함

 

#2번
top10_pubs = top30_pubs.index[:10]
year_cols = ns_book10.columns.get_level_values(1)

💡get_level_values() 메서드는 다단으로 구성된 열 이름에서 선택한 항목만 가져올 수 있음. ('대출건수', 1947)로 되어 있는 열 이름 중 연도로 구성된 두번째 항목만 가져 온 것

 

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

추가과제 입니다~

💡set_xlim()메서드는 x축의 좌표 범위를 지정합니다

 

원 그래프 그리기

  • pie() 메서드 활용
  • 기본적으로 3시 방향부터 반시계 방향으로 그림, startangle 매개변수를 90으로 지정하여 12시 방향부터 그리기 가능
  • autopac 매개변수로 각 부채꼴의 비율 표시
  • explode 매개변수로 떨어뜨리길 원하는 조각 선택 가능. 원하는 항목만 간격으로 나타내고 나머지는 0인 리스트를 만들어 전달
data = top30_pubs[:10]
labels = top30_pubs.index[:10]

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