자기계발/Python

[혼공단 9기] 5주차 : Chapter 05 데이터 시각화하기

호등 2023. 2. 9. 21:28
반응형


하하하.. 회사에서 짤렸습니다.

정확히 말하자면 경영 악화로 인한 퇴직이며, 2월 말까지 근무하면 된다고 통보받았습니다.
사실 재취업 걱정은 없어요. 내가 바라는 이상적인 회사 찾는게 힘들지 타협만 하면 금방 취업할 것 같거든요.
그저 생각지도 못한 일을 겪게 되어서 머리가 띵- 할 뿐입니다.

이럴 때일수록 정신 차리고 똑바로 살아야겠습니다.
더 열심히 살면 미래에 대한 불안감도 없어지겠죠?
5주차 학습 정리 시작할게요~



생각치도 못한 4주차 우수혼공족 선정..!
샌드위치 맛있게 잘 먹겠습니다. 감사합니다 :)
이번 주말에 책을 읽으려고 했는데 이디야에 가야겠군요


Chapter 05 데이터 시각화하기

5-1 맷플롯립(matplotlib) 기본 요소 알아보기

Figure 객체 - 그래프의 크기를 바꾸는 figsize 매개변수

맷플롯립에는 Figure(피겨)라는 모든 그래프 구성 요소를 담고 있는 최상위 객체가 있다.

import matplotlib.pyplot as plt

plt.figure(figsize=(9,6))
plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
plt.show()

figsize 매개변수의 디폴트 값은 (6,4)이며 단위는 인치이다.
DPI에 따라 실제 크기와 그려진 그래프의 크기가 다를 수 있다.
( 맷플롯립 기본 DPI 값을 확인하는 코드 > print(plt.rcParams['figure.dpi] )

%config InlineBackend.print_figure_kwargs = {'bbox_inches': None}
plt.figure(figsize=(900/72, 600/72))
plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
plt.show()

figsize로 원하는 픽셀 사이즈로 그래프를 조정하려면 원하는 (픽셀값 / DPI) 값을 전달해주면 된다.
코랩 노트북에선 자동으로 그래프 주변 공백을 최소화 한다. 원하는 사이즈의 그래프를 그리고 싶다면 bbox_inches 옵션을 None으로 지정해 주어야한다.

Figure 객체 - 그래프의 크기를 바꾸는 dpi 매개변수

plt.figure(dpi=144)

dpi 매개변수를 활용하여 2배로 늘려주었다. 인치당 픽셀 수가 두 배로 늘어나서 그래프의 모든 요소가 두 배 커진다.


rcParams 객체

맷플롯립 그래프의 기본값을 관리하는 객체이다.

산점도 마커 모양 바꾸기

#DPI 기본값 바꾸기
plt.rcParams['figure.dpi'] = 100

#산점도 마커 모양 바꾸기
plt.rcParams['scatter.marker'] #마커 기본값 확인
plt.rcParams['scatter.marker'] = "*" #마커 기본값 별로 수정
plt.scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1, marker='+')
plt.show()

산점도 마커 모양을 바꾸는 두 가지 방법이다.
1) scatter.marker 속성에 지정된 기본 값을 수정해준다.
2) marker 매개변수를 직접 지정해준다. (scatter.marker 속성보다 우선순위)

서브플롯 그리기 : subplots() 함수

서브플롯이란 맷플롯립의 Axes 클래스의 객체를 말하며 하나의 서브플롯은 두 개 이상의 축을 포함한다.

fig, axs = plt.subplots(2)

axs[0].scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)

axs[1].hist(ns_book7['대출건수'], bins=100)
axs[1].set_yscale('log')

fig.show()

subplots() 함수는 피겨 객체와 각 서브플롯을 나타내는 Axes 객체의 배열을 반환한다. 괄호 안에 원하는 서브 플롯 개수를 지정할 수 있다. (Figure 클래스 객체인 fig에 Axis 클래스 객체인 axs[0], axs[1]을 서브플롯으로 추가한다고 이해하면 된다는데 Axes, Axis 헷갈리고 개념이 명확히 이해 안된다😂)

👉🏻 네이버에 subplots() 함수 검색해서 나오는 포스팅 읽고, 다음 내용까지 읽으니까 막연하게 이해되는듯 하다.
"하나의 Axes 객체는 두 개 이상의 Axis 객체를 가진다. 여기서 Axis 객체는 플롯의 가로축이나 세로축을 나타내는 객체이다."

fig, axs = plt.subplots(2, figsize = (6, 8))

axs[0].scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
axs[0].set_title('scatter plot')

axs[1].hist(ns_book7['대출건수'], bins=100)
axs[1].set_title('histogram')
axs[1].set_yscale('log')

두 그래프의 높이에 맞게 피겨 크기를 더 크게 조정해주고, set_title() 메서드로 그래프에 제목을 넣었다.

서브플롯을 가로로 출력하기

fig, axs = plt.subplots(1, 2, figsize=(10, 4))

axs[0].scatter(ns_book7['도서권수'], ns_book7['대출건수'], alpha=0.1)
axs[0].set_title('scatter plot')
axs[0].set_xlabel('number of books')
axs[0].set_ylabel('borrow count')

'''히스토그램 그래프 코드'''

사실은 subplots() 함수에 행과 열을 지정할 수 있다. 이전 코드에서 subplots(2)라고 썼던 것은 행 2개, 열은 디폴트값 1이 들어가서 1개였기 때문에 세로로 나란히 그래프가 출력된 것이다.

위 코드는 1행 2열(가로로 출력)로 피겨를 출력하였고, set_xlabel, set_ylabe 메서드로 서브플롯의 축 이름도 붙여주었다.

연도별 발행 도서 개수 구하기

count_by_year = ns_book7['발행년도'].value_counts()
count_by_year = count_by_year.sort_index()
count_by_year = count_by_year[count_by_year.index <= 2030]
count_by_year

value_counts() 메서드는 고유한 값의 등장 횟수를 계산하여 값을 기준으로 내림차순 정렬한다.
sort_index() 메서드 인덱스 순서대로 데이터를 정렬한다.
index속성으로 값이 2030보다 같거나 작은 데이터를 뽑아주었다.

주제별 도서 개수 구하기

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

주제분류번호의 맨 앞 자리 수로 주제별 도서 개수를 구하는 과정이다.
NaN값을 -1로 반환해주는 함수 kdc_1st_char()를 만들어 apply() 메서드에 넣고 데이터프레임에 반복 적용하였다.

선 그래프 그리기 : plot() 함수

import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 100

plt.plot(count_by_year.index, count_by_year.values)
plt.title()
plt.xlabel()
plt.ylabel()
plt.show()

plot() 함수의 첫 번째 매개변수에는 x축 값, 두 번째 매개변수에는 y축 값을 전달한다.
title(), xlabel(), ylabel() 함수로 각각 그래프 제목, x축 이름, y축 이름을 지정해주었다.

plt.plot(count_by_year, marker = '.', linestyle=':', color='red')
#plt.plot(count_by_year, '.:r')

이번엔 선 모양과 색상을 바꿔보았다.

- linestyle 매개변수로 실선('-'), 점선(':'), 쇄선('-.'), 파선('--')을 표현할 수 있다.
- color 매개변수로 라인의 색상을 지정할 수 있다. #ff0000처럼 16진수 컬러 코드를 지정하거나 색 이름(red)을 직접 명시해주면 된다.
- marker, linestyle, color 를 하나의 문자열로 합쳐서 포맷으로 지정해주는 것도 가능하다. ➡ '.:r'

선 그래프 눈금 개수 조절 및 마커에 텍스트 표시하기

plt.xticks(range(1947, 2030, 10))
for idx, val in count_by_year[::5].items():
  plt.annotate(val, (idx, val), xytext=(2,2), textcoords='offset points')
plt.show()

기본미션 314p 출력 결과

- xticks() 함수 : x축의 눈금을 지정하는 함수, range() 함수를 같이 사용해 1947~2030년까지 10년씩 건너뛰면서 눈금 표시를 했다.
연도별 발행 도서 개수를 그래프에 표시하면 그래프가 너무 난잡해지기 때문에 슬라이스 연산자(:)를 사용해 다섯 개씩 건너 뛰며 count_by_year 값을 선택했다. items() 메서드를 사용해서 인덱스와 값을 감싼 튜플을 얻었다.
- annotate() 함수 : 그래프에 값을 표시하는 함수. 첫 번째 매개변수는 표시할 값을, 두 번째 매개변수는 문자열이 나타날 좌표를 넣어준다. 기본적으로 마커와 동일한 좌표 시스템을 사용한다.
- xytext 매개변수 : 마커에 표시한 텍스트 위치를 조절해준다.
- textcoords 매개변수 : xytext 매개변수와 함께 사용하며 'offset points'로 지정하여 상대적인 위치로 표기할 수 있다.

막대 그래프 그리기 : bar() 함수

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=8, ha='center', color='green')

plt.show()

선택미션 316p 출력 결과

막대 그래프 그리기는 선 그래프 그렸던 것과 동일하게 해준다. bar() 함수로만 바꿔주면 된다.
bar() 함수 안에 width 매개변수로 막대의 두께를 조절할 수 있다. (기본값 0.8)
텍스트 위치는 annotate()함수의 ha 매개변수로 조절한다. (기본값 right)

가로 막대 그래프를 그릴 때 바뀌는 것들

bar() ➡ barh()
width 매개변수 ➡ hight 매개변수
annotate() 함수 텍스트 좌표 x, y 축 ➡ y, x축으로 수정
ha 매개변수 ➡ va 매개변수 (기본값 baseline)


혼공학습단(혼자 공부하는 데이터 분석 with 파이썬) 5주차_기본 미션, 선택 미션


본문 선, 막대 그래프 확인해주세요!

반응형