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

[혼공분석] #5. 데이터 시각화하기

✨️데이터분석가✨️ 2024. 2. 4. 18:02
728x90
728x90
5. 데이터 시각화하기
    1) 맷플롯립 기본 요소 알아보기

        (1) Figure 객체
        (2) rcParams 객체
        (3) 여러 개의 서브플롯 출력하기
    2) 선 그래프와 막대 그래프 그리기
        (1) 발행년도별 도서 개수 구하기
        (2) 주제별 도서 개수 구하기
        (3) 선 그래프 그리기
        (4) 막대 그래프 그리기

 

1) 맷플롯립 기본 요소 알아보기

(1) Figure 객체

- 피겨는 맷플롯립의 그래프 요소를 모두 담고 있는 최상위 객체

- [Figure() 함수]의 [figsize 매개변수]로 그래프 크기를 지정할 수 있음

import matplotlib.pyplot as plt
print(plt.rcParams['figure.figsize'])     #기본 그래프 크기 확인
[6.4, 4.8]
 
plt.figure(figsize=(9, 6))

 

- 예상보다 그래프가 작게 그려진 이유는 DPI 때문임

- 원하는 크기(픽셀)에 맥플롯립 DPI 기본값인 72로 나누고, [bbox_inches 옵션]을 None으로 지정하여 타이트 레이아웃(그래프 주변 공백 최소화)을 사용하지 않아야 정확한 크기의 그래프가 그려짐

%config InlineBackend.print_figure_kwargs = {'bbox_inches': None}
plt.figure(figsize=(900/72, 600/72))

 

- [dip 매개변수]로 그래프 크기를 바꾸면, 그래프 내 모든 구성 요소 크기도 바뀜 (마커, xy축 숫자 등)

plt.figure(dpi=144)

 

 


(2) rcParams 객체

- rcParams는 맷플롯립 그래프의 기본값을 관리하는 객체

- [figure.dpi]로 DPI 기본값을 바꿔 그래프 해상도를 높일 수 있음

plt.rcParams['figure.dpi'] = 100

 

- [scatter.marker]로 산점도 기본 마커 모양을 바꿀 수 있음 

plt.rcParams['scatter.marker'] = '*'

 

- [marker 매개변수]로 기본값이 아닌 해당 그래프의 마커 모양을 바꿀 수 있음

plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1, marker='+')
plt.show()

marker 매개변수
marker 매개변수

 

 


(3) 여러 개의 서브플롯 출력하기

- 서브플롯은 피겨 안에 포함된 그래프를 의미하며, Axes 객체를 의미함

  (Axis 클래스는 축 객체를 다루며, 두 개 이상의 Axis 객체로 이루어지면 Axes를 의미함) 

- [subplots() 함수]에 원하는 서브플롯 개수를 지정함

- Figure 클래스 객체인 fig에 Axis 클래스 객체인 axs[]을 서브플롯으로 추가하는 형태

fig, axs = plt.subplots(2, figsize=(6, 8))
axs[0].scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)    # 첫번째 그래프
axs[1].hist(ns_book7['대출건수'], bins=100)    # 두번째 그래프
fig.show()

서브플롯 출력하기1
서브플롯 출력하기1

 

- subplots(행 개수, 열 개수)로 서브플롯 모양 지정

- [set_title()]로 제목 지정, [set_xlable()], [set_ylable()]로 축 이름 지정

fig, axs = plt.subplots(1, 2, figsize=(10, 4))
axs[0].scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
axs[1].hist(ns_book7['대출건수'], bins=100)
axs[1].set_title('histogram')
axs[1].set_yscale('log')
axs[1].set_xlabel('borrow count')
axs[1].set_ylabel('frequency')
fig.show()

서브플롯 출력하기2
서브플롯 출력하기2

 

 


2) 선 그래프와 막대 그래프 그리기 

(1) 발행년도별 도서 개수 구하기

- [value_counts() 메서드]로 고유한 값이 등장한 횟수를 계산함  

- 발행년도별 도서 개수를 출력 → 값 내림차순으로 출력됨

count_by_year = ns_book7['발행년도'].value_counts()
count_by_year
 
2012    18601
2014    17797
2009    17611
        ...  
1947        1
Name: 발행년도, Length: 87, dtype: int64

 

- [sort_index() 메서드]로 인덱스 순으로 내림차순 출력

count_by_year = count_by_year.sort_index()
count_by_year
 
1947        1
1948        3
1949        1
        ...  
2650        1

 

- 부등호 기호를 통해 발행년도가 2030년 이하만 출력

count_by_year = count_by_year[count_by_year.index <= 2030]

 

 


(2) 주제별 도서 개수 구하기

- 주제분류번호(no)가 1로 시작하면 철학, 2로 시작하면 종교 등 첫 번째 문자 기준으로 도서 개수 출력하기

- no가 NaN인 경우 -1로 반환, 그렇지 않으면 첫 번째 문자를 반환하여 kdc_1st_char() 함수를 선언한 후 [apply() 메서드]에 넣어 데이터프레임에 반복 적용

import numpy as np
def kdc_1st_char(no):
    if no is np.nan:
        return '-1'
    else:
        return no[0]
count_by_subject = ns_book7['주제분류번호'].apply(kdc_1st_char).value_counts()
count_by_subject
 
8     108643
3      80767
        ...  
-1     16978
0      12376
Name: 주제분류번호, dtype: int64

 

 


(3) 선 그래프 그리기

- 그래프 해상도 향상을 위해 맷플롯립의 기본 DPI를 100으로 변환

- [plot(x축, y축) 함수]로 선 그래프 그리기

import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 100    # 해상도 향상
plt.plot(count_by_year.index, count_by_year.values)
plt.title('Books by year')
plt.xlabel('year')
plt.ylabel('number of books')
plt.show()

 

- [linestyle 매개변수]로 선 모양 지정 (실선 '-', 점선 ':', 쇄선 '-.', 파선'--')

- [color 매개변수]로 선 색상 지정 (blue, magenta, yellow, cyan 등)

plt.plot(count_by_year, marker='.', linestyle=':', color='red')
plt.plot(count_by_year, '.:r')    # 위와 동일한 표현

선 그래프1
선 그래프1

 

- [xticks() 함수]로 x축의 눈금을 지정할 수 있으며, [range() 함수]로 범위 지정

- [슬라이스 연산자(:)]로 표시할 값을 선택, [items() 메서드]로 인덱스의 값을 감싼 튜플을 얻을 수 있음

- [annotate(값, (x, y)) 함수]로 값을 출력하며, [xytext 매개변수]로 값 위치를 조정함

plt.plot(count_by_year, '*-g')
plt.xticks(range(1947, 2030, 10))
for idx, val in count_by_year[::5].items():
    plt.annotate(val, (idx, val), xytext=(idx+1, val+10))
plt.show()

선 그래프2
선 그래프2

 

- x,y축 단위 차이가 클 경우, [textcoords 매개변수]로 상대 위치를 나타내는 'offset points'로 지정

    plt.annotate(val, (idx, val), xytext=(2, 2), textcoords='offset points')

 

 


(4) 막대 그래프 그리기

- [bar() 함수]로 막대 그래프 그리기

- [width 매개변수]로 막대 두께를 조절, [color 매개변수]로 막대 색깔을 지정함

- [annotate() 함수][ha 매개변수]를 'center'로 지정하면 값 위치가 가운데 정렬되고, fontsize로 글자크기, color로 글자색을 지정함

plt.bar(count_by_subject.index, count_by_subject.values, width=0.7, color='blue')
for idx, val in count_by_subject.items():
    plt.annotate(val, (idx, val), xytext=(0, 2), textcoords='offset points',
                 fontsize=10, ha='center', color='red')
plt.show()

막대 그래프1
막대 그래프1

 

- [barh() 함수]로 가로 막대 그래프 그리기

- [heiht 매개변수]로 막대 두께 조절하며, xy축 값이 바뀌어야 하고, [va 매개변수]로 값 위치 지정함

plt.barh(count_by_subject.index, count_by_subject.values, height=0.7, color='blue')
for idx, val in count_by_subject.items():
    plt.annotate(val, (val, idx), va='center')

 

 

 


5주차 미션
5주차 미션

 

5주차. 기본 미션

p314. 손코딩[맷플롯립에서 bar() 함수로 막대 그래프 그리기]을 코랩에서 그래프 출력하고 화면 캡처하기

기본 미션. 막대 그래프 그리기

 

 

5주차. 선택 미션

p316. 손코딩[텍스트 정렬, 막대 조절 및 색상 바꾸기]을 코랩에서 그래프 출력하고 화면 캡처하기

선택 미션. 막대 그래프 바꾸기
선택 미션. 막대 그래프 바꾸기

 

 

 

728x90
728x90