본문 바로가기

공부/python

혼자 공부하는 데이터 분석 6주차: 복잡한 데이터 표현하기

 

pyplot 방식과 객체지향 API 방식

 

  • pyplot 방식: matplotlib.pyplot에 있는 함수를 사용
  • 객체지향 API 방식: 피겨 객체와 서브플롯 객체를 만들고 이 객체의 메서드를 사용

 

pyplot() 방식으로 그려보기

  • matplotlib.pyplot에 있는 함수를 사용하면 함수들이 하나의 피겨 객체에 대한 상태를 공유한다.
  • plot() 함수와 title() 함수가 동일한 피겨 객체에 적용되는 모습을 확인할 수 있다.
  • plot()함수에 하나의 리스트만 전달시 plot()함수는 해당 리스트를 y축의 값으로 인식하고 해당 리스트의 인덱스 값을 x축 값으로 사용한다.

 

객체지향 API 방식으로 그래프 그리기

 

  • 객체지향 API 방식으로 그래프를 그릴시, 하나의 axes() 객체를 가지는 피겨를 생성한다.
  • 주로 여러 개의 서브플롯을 추가하는 등  복잡한 그래프를 그리는 경우에 객체지향 방식을 사용하는 것이 좋다. 

 

그래프에 한글 출력하기

 

#나눔고딕 폰트 사용
plt.rcParams['font.family'] = 'NanumGothic'

plt.rc('font',family='NanumBarunGothic',size=11)

 

  • font.family 속성을 이용해 사용하고자 하는 폰트를 지정할 수 있다.
  • 마찬가지로 rc('font' ,family = '사용하고자 하는 폰트', 하위속성) 으로 폰트를 지정할 수 있다. 

 

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

 

import gdown
gdown.download('https://bit.ly/3pK7iuu','ns_book7.csv',quiet=False)
import pandas as pd
ns_book7 = pd.read_csv('ns_book7.csv',low_memory=False)
ns_book7.head()
#고유한 출판사 목록 만들기
top30_pubs = ns_book7['출판사'].value_counts()[:30] #상위 30개 출판사 출력
#불리언 인덱스 만들기
top30_pubs_idx = ns_book7['출판사'].isin(top30_pubs.index)

 

  • value_counts() 메서드를 사용하여 상위 30개 출판사를 가져왔다.
  • isin() 메서드는 불리언 인덱스를 만들어주는데 여기서는 상위 30개에 해당하는 출판사는 참으로, 아닌 출판사는 거짓으로 반환하게 하였다.

 

 

  • sample() 함수는 데이터프레임의 행을 무작위로 선택한다.
  • 첫 번째 매개변수에는 선택할 행 개수를 지정, 이후 random_state 매개변수에 임의의 숫자를 작성한다.

 

산점도 그리기

 

ax.scatter(ns_book8['발행년도'],ns_book8['출판사'], s= ns_book8['대출건수'])

 

  • s 매개변수는 마커의 크기를 지정할 수 있게 해준다. 
  • '대출건수' 열을 마커 크기로 전달하게 되면 대출건수가 많은 도서를 크게 그릴 수 있다.

 

마커 꾸미기

 

  1. 투명도 조절
    • alpha 매개변수로 지정할 수 있다.
  2. 마커 테두리 색 변경
    • edgecolor 매개변수로 마커 테두리의 색을 지정할 수 있다. 기본값을 마커의 색을 의미하는 'face' 이다.
    • 주로 여러 개의 마커가 겹칠 때 경계 구분 용으로 사용하기 좋다.
  3. 마커 테두리 색 두께 변경
    • linewidths 매개변수로 지정할 수 있다.
  4. 산점도 색 변경
    • c 매개변수로 지정할 수 있다. s 매개변수와 마찬가지로 데이터 개수와 동일한 길이의 배열을 전달시 각 데이터를 다른 색깔로 그릴 수 있다. 

 

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

 

컬러맵 레퍼런스 : https://matplotlib.org/stable/gallery/color/colormap_reference.html

 

Colormap reference — Matplotlib 3.9.1 documentation

Colormap reference Reference for colormaps included with Matplotlib. A reversed version of each of these colormaps is available by appending _r to the name, as shown in Reversed colormaps. See Choosing Colormaps in Matplotlib for an in-depth discussion abo

matplotlib.org

 

 

  • cmap 매개변수로 컬러맵을 jet으로 설정하였다.
  • 참조 정보를 제공하는 컬러 막대 그래프를 산점도 그래프의 새 변수로 받아, 그렸다.
하나의 피겨에 여러 개의 선 그래프 그리기

 

 

  • 데이터 정제
    1. 상위 5개의 출판사가 선택되게 for 문과 슬라이스 연산자를 사용했다.
    2. x축은 1985년~2025년으로 범위를 지정하였다.

 

스택 영역 그래프

 

  • 스택 영역 그래프란 하나의 선 그래프 위에 다른 선 그래프를 차례대로 쌓는 것으로,
    그래프 사이의 간격이 y축 값이 된다.
  • stackplot() 메서드를 사용한다.

 

  • 데이터 정제
    1. pivot_table() 메서드로 각 발행년도 열의 값을 열로 바꾼다. pivot_table( index 매개변수, columns 매개변수 )
    2. get_level_balues() 메서드로 발행년도 열을 리스트 형태로 바꾼다. 
      해당 메서드는 다단으로 구성된 열 이름에서 선택한 항목만 가져올 수 있다.
    3. stackplot() 메서드로 스택 영역 그래프를 그린다. 
  • 데이터프레임을 가져올 시 fillna() 메서드를 사용하는 이유
    • 판다스 데이터프레임의 누락값을 제대로 처리하지 못하기 때문에 누락값을 0으로 채운다.

 

 

여러 개의 막대 그래프 그리기

 

  • 막대 그래프를 나란히 그리게 하기 위해서는 막대의 두께를 줄이고 너비를 이동시키면 된다.

 

스택 막대 그래프

 

  • 스택 막대 그래프는  bottom 매개변수를 사용하여 수동으로 막대를 쌓을 수 있다.
  • height2는 height 위에 쌓이는 형태이다. bottom =height를 통해 알 수 있다.

 

데이터값 누적하여 그리기

 

  • cumsum() 메서드를 사용하여 값을 누적할 수 있다. 
  • 민음사 행을 주목하면 두 그림의 차이점을 확인할 수 있다.

 

 

  • 데이터값을 누적하여 그릴 때는 가장 큰 막대를 먼저 그림으로써, 이전에 그린 막대가 모두 덮이는 일이 일어나지 않도록 해야 한다. 
  • reversed()함수를 사용해 인덱스의 역순으로 반복하여 그리게 하였다.

 

원 그래프

 

  • 원 그래프는 pie() 메서드로 그릴 수 있다.
  • labels 매개 변수에는 원의 부채꼴 위에 표시할 데이터 값을 전달할 수 있다.
  • startangle 매개변수는 원 그래프의 시작 위치를 지정할 수 있다.
  • pie() 메서드의 autopct 매개변수에는 파이썬의 % 연산자에 적용할 포맷팅 문자열을 전달할 수 있다.
  • explode 매개변수에는 떨어뜨리길 원하는 조각의 간격을 반지름의 비율로 지정할 수 있다.
  • explode 매개변수에 전달하는 리스트 길이는 data 배열의 길이와 같아야 한다.

 

여러 종류가 있는 서브플롯 그려보기
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, ns_book10.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]
  label = 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')
  fig.show()

 

  • 위 코드로 2X2 형태의 서브플롯에 산점도, 스택 영역 그래프, 스택 막대 그래프, 원 그래프를 순서대로 그릴 수 있다.

 

숙제