(3-3) Matplotlib / Seaborn

Yongjoo Lee·2020년 12월 16일
0
post-thumbnail

Matlab으로 데이터 시각화하기

데이터를 보기좋게 표현해봅시다.

  1. Matplotlib 시작하기
  2. 자주 사용되는 Plotting의 Options
    • 크기 : figsize
    • 제목 : title
    • 라벨 : _label
    • 눈금 : _tics
    • 범례 : legend
  3. Matplotlib Case Study
    • 꺾은선 그래프 (Plot)
    • 산점도 (Scatter Plot)
    • 박스그림 (Box Plot)
    • 막대그래프 (Bar Chart)
    • 원형그래프 (Pie Chart)
  4. The 멋진 그래프, seaborn Case Study
    • 커널밀도그림 (Kernel Density Plot)
    • 카운트그림 (Count Plot)
    • 캣그림 (Cat Plot)
    • 스트립그림 (Strip Plot)
    • 히트맵 (Heatmap)

I. Matplotlib 시작하기

  • 파이썬의 데이터 시각화 라이브러리

라이브러리 : 다른 개발자들이 만들어놓은 코드의 모음

cf) 라이브러리 vs 프레임워크

  • 라이브러리 : 원하는 대로 조합하여 사용
  • 프레임워크 : 이미 짜여진 틀에 내용을 채움
  • %matplotlib inline을 통해서 활성화
    • notebook을 실행한 브라우저에서 바로 그림을 볼 수 있게 해주는 것
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline

II. Matplotlib Case Study

  • plt.plot() : 꺾은선 그래프를 그려주는 함수
  • plt.show() : plt를 확인하는 명령
plt.plot([1,2,3,4,5])  # 실제 plotting을 하는 함수 # y = x + 1
plt.show() # plt를 확인하는 명령

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F4ac683e8-de6d-4c60-bc85-d442e5a880d0%2Foutput_7_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F4ac683e8-de6d-4c60-bc85-d442e5a880d0%2Foutput_7_0.png)

plt.plot([2,4,2,4,2])
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fe4026516-00bc-48ae-97ab-66be2f9c4063%2Foutput_8_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fe4026516-00bc-48ae-97ab-66be2f9c4063%2Foutput_8_0.png)

👉x를 따로 지정해주지 않았기때문에 자동적으로 인덱스를 x로 한다.

Figsize 옵션

Figure(도면)의 크기 조절

  • tuple 형태로 선언
  • 1 pixel (72 해상도) 단위
plt.figure(figsize=(5, 5))  # plotting을 할 도면을 선언

plt.plot([1,2,3,4,5])
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F88d2d81e-5b05-4399-98e0-e94d08d1e232%2Foutput_11_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F88d2d81e-5b05-4399-98e0-e94d08d1e232%2Foutput_11_0.png)

2차함수 그래프 with plot()

# 리스트 이용해서 1차함수 y=x를 그려보면:

plt.plot([0,1,2,3,4])
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F98976763-f965-4fd4-8d32-043529dd7b72%2Foutput_13_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F98976763-f965-4fd4-8d32-043529dd7b72%2Foutput_13_0.png)

# numpy.array를 이용해서 함수 그래프 그리기
# y = x ^ 2

x = np.array([1,2,3,4,5])  # 정의역
y = np.array([1,4,9,16,25])  # f(x)

plt.plot(x, y)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F2a09a896-df8b-4b9b-93b7-46b6d3acfa0e%2Foutput_14_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F2a09a896-df8b-4b9b-93b7-46b6d3acfa0e%2Foutput_14_0.png)

😒그래프가 매끄럽지 못하다.

🔥np.arange() 함수를 이용하여 매끄럽게 그려보자!

  • np.arrange(a, b, c) (python의 range() 함수와 다르게 c에 실수 가능!)

plt.xlabel(), plt.ylabel()을 이용하여 x축과 y축에 설명을 추가할 수 있다.

# np.arange(a, b, c) c: 0.01
x = np.arange(0, 5, 0.01)

plt.xlabel("x value")     #
plt.ylabel("f(x) value")  #

plt.plot(x, x**2)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F3297f36c-f361-4a8a-986c-c5693bdb5df7%2Foutput_18_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F3297f36c-f361-4a8a-986c-c5693bdb5df7%2Foutput_18_0.png)

plt.axis()을 이용하여 x와 y의 범위를 지정해줄 수 있다. [x_min, x_max, y_min, y_max]

# x, y축의 범위를 설정하기

x = np.arange(-10, 10, 0.01)

plt.xlabel("x value")
plt.ylabel("f(x) value")

plt.axis([-5, 5, 0, 25]) #

plt.plot(x, x**2)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F3151cc77-8adc-496b-a966-4e9fc30b0515%2Foutput_20_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F3151cc77-8adc-496b-a966-4e9fc30b0515%2Foutput_20_0.png)

plt.xticks(), plt.yticks()를 이용하여 눈금을 설정할 수 있다.

# x, y축의 눈금 설정하기

x = np.arange(-10, 10, 0.01)

plt.xlabel("x value")
plt.ylabel("f(x) value")
plt.axis([-5, 5, 0, 25])

plt.xticks([i for i in range(-5, 6, 1)])  # x축의 눈금 설정, -5, -4, -3, ....
plt.yticks([i for i in range(0,27, 3)])  # y축의 눈금 설정

plt.plot(x, x**2)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F8f7767e4-5bed-409e-bdd5-9d2b1fbe5d6b%2Foutput_22_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F8f7767e4-5bed-409e-bdd5-9d2b1fbe5d6b%2Foutput_22_0.png)

plt.title()을 이용하여 그래프의 타이틀을 추가할 수 있다.

# 그래프에 title 달기

x = np.arange(-10, 10, 0.01)

plt.xlabel("x value")
plt.ylabel("f(x) value")
plt.axis([-5, 5, 0, 25])

plt.xticks([i for i in range(-5, 6, 1)])
plt.yticks([i for i in range(0,27, 3)])

plt.title("y = x^2 graph")  #

plt.plot(x, x**2)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fbb19e790-961f-4ca9-9111-43c81cf60baf%2Foutput_24_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fbb19e790-961f-4ca9-9111-43c81cf60baf%2Foutput_24_0.png)

plt.plot()label 옵션으로 각 선의 이름을 지정해줄 수 있다.

plt.legend()선을 그린 이후에 적어주어야 한다!

# 그래프에 title 달기

x = np.arange(-10, 10, 0.01)

plt.xlabel("x value")
plt.ylabel("f(x) value")
plt.axis([-5, 5, 0, 25])

plt.xticks([i for i in range(-5, 6, 1)])
plt.yticks([i for i in range(0,27, 3)])

plt.title("y = x^2 graph") 

plt.plot(x, x**2, label="trend")  #
plt.legend()  #

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F2b04b90f-a37f-44e2-97b0-4d44a825ba2a%2Foutput_26_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F2b04b90f-a37f-44e2-97b0-4d44a825ba2a%2Foutput_26_0.png)

III. Matplotlib Case Study - 여러 plot들

꺾은선 그래프(Plot)

  • .plot()
x = np.arange(20)  # 0~19
y = np.random.randint(0, 20, 20)  # 난수를 20번 생성
# Extra : y축을 20까지 보이게 하고싶다면? , y축을 "5단위로 보이게하고 싶다면?"
# .axis(), yticks()
plt.axis([0, 20, 0, 20])
plt.yticks([i for i in range(0, 21, 5)])

plt.plot(x, y)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fbfc68640-109b-4f45-8dec-afbeadd0abea%2Foutput_30_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fbfc68640-109b-4f45-8dec-afbeadd0abea%2Foutput_30_0.png)

산점도 (Scatter Plot)

  • .scatter()
  • 점으로만 표현
plt.scatter(x, y)
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F720bdd4e-5484-4aeb-a1a0-80a20eb4d9d8%2Foutput_32_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F720bdd4e-5484-4aeb-a1a0-80a20eb4d9d8%2Foutput_32_0.png)

👉plot vs scatter plot

  • 꺾은선 그래프(plot)는 시계열 데이터에서 많이 사용
  • 산점도(scatter plot)는 x와 y가 완전히 별개인 변수일 경우 사용 (두 변수 사이의 상관관계 파악 용이)

박스 그림 (Box Plot)

  • .boxplot()
  • 수치형 데이터에 대한 정보 (Q1, Q2, Q3, min, max)
  • 맨위, 맨아래는 각각 최대/최소값
  • 가운데 박스에서
    1. 박스의 밑 부분 : Q1 - 25%
    2. 박스의 중앙 부분 : Q2 - 50% (median; 중앙값)
    3. 박스의 윗 부분 : Q3 - 75%
plt.boxplot((x, y))

# Extra : Plot의 title을 "Box plot of x, y"
plt.title("Box plot of x, y")

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fdc8bb841-ef37-4e4b-8f32-1129f29cc86d%2Foutput_35_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fdc8bb841-ef37-4e4b-8f32-1129f29cc86d%2Foutput_35_0.png)

막대 그래프 (Bar Plot)

  • .bar()
  • .hist()
    • bins 옵션으로 범주 지정 가능
  • 범주형 데이터의 "값"과 그 값의 "크기"를 직사각형으로 나타낸 그림
plt.bar(x, y)

# Extra : xticks를 올바르게 처리해봅시다.
plt.xticks(np.arange(0,20,1))

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F724374c7-eb36-412e-8353-00f6e606ae07%2Foutput_37_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F724374c7-eb36-412e-8353-00f6e606ae07%2Foutput_37_0.png)

# cf) Histogram
# 도수분포를 직사각형의 막대 형태로 나타냈다.
# "계급"으로 나타낸 것이 특징 : 0, 1, 2가 아니라 0~2 까지의 "범주형" 데이터로 구성 후 그림을 그림

plt.hist(y, bins=np.arange(0, 20, 2))

# Extra : xticks를 올바르게 고쳐봅시다.
plt.xticks(np.arange(0,20,2))

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fb96901d6-8a00-4064-bfe5-9d61e368ad30%2Foutput_38_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fb96901d6-8a00-4064-bfe5-9d61e368ad30%2Foutput_38_0.png)

원형 그래프 (Pie Chart)

  • .pie()
  • 데이터에서 전체에 대한 부분의 비율을 부채꼴로 나타낸 그래프
  • 다른 그래프에 비해서 비율확인에 용이
z = [100,300,200,400]

plt.pie(z, labels=['one', 'two', 'three', 'four'])
plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F01a7e485-70d6-4f27-901f-a86a52cbd4e5%2Foutput_40_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F01a7e485-70d6-4f27-901f-a86a52cbd4e5%2Foutput_40_0.png)

IV. The 멋진 그래프, Seaborn Case Study

Seaborn

Matplotlib를 기반으로 더 다양한 시각화 방법을 제공하는 라이브러리

  • 커널밀도그림
  • 카운트그림
  • 캣그림
  • 스트립그림
  • 히트맵

Seaborn Import 하기

import seaborn as sns

커널밀도그림 (Kernel Density Plot)

  • sns.kdeplot()
    • shade 옵션으로 색칠 가능
  • 히스토그램과 같은 연속적인 분포를 곡선화해서 그린 그림
# in Histogram

x = np.arange(0, 22, 2)
y = np.random.randint(0, 20, 20)

plt.hist(y, bins=x)

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fec3083af-9381-4869-bcd6-f2a462a8658f%2Foutput_46_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fec3083af-9381-4869-bcd6-f2a462a8658f%2Foutput_46_0.png)

# kdeplot

sns.kdeplot(y, shade=True)

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F5a841ebf-5bbb-4128-bb91-9eac48a479cb%2Foutput_47_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F5a841ebf-5bbb-4128-bb91-9eac48a479cb%2Foutput_47_0.png)

카운트그림 (Count Plot)

  • sns.countplot()
  • 범주형 column의 빈도수를 시각화 -> Groupby 후의 도수를 하는 것과 동일한 효과
vote_df = pd.DataFrame({"name":['Andy', 'Bob', 'Cat'], "vote":[True, True, False]})

vote_df

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fc1e7a98d-d72c-42e8-889b-e60d916a54a3%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fc1e7a98d-d72c-42e8-889b-e60d916a54a3%2Fimage.png)

# in matplotlib

vote_count = vote_df.groupby(by='vote').count()

vote_count

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F7481faeb-d7be-4082-b736-510ecac2d8a9%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F7481faeb-d7be-4082-b736-510ecac2d8a9%2Fimage.png)

plt.bar(x=[False, True], height=vote_count['name'])

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F1d62d0a4-d066-4c4e-8faf-35a67c20b9e3%2Foutput_51_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F1d62d0a4-d066-4c4e-8faf-35a67c20b9e3%2Foutput_51_0.png)

# sns의 countplot

sns.countplot(x=vote_df['vote'])

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fef28ba5b-db02-4887-a704-a5c9a6e0fa87%2Foutput_52_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fef28ba5b-db02-4887-a704-a5c9a6e0fa87%2Foutput_52_0.png)

캣그림 (Cat Plot)

  • sns.catplot()
    • hue 옵션으로 각 범주 내의 종류를 시각화할 수 있음
    • kind 옵션으로 그래프 형태를 변경할 수 있음 (default: strip)
  • 숫자형 변수와 하나 이상의 범주형 변수의 관계를 보여주는 함수
covid = pd.read_csv('./country_wise_latest.csv')

covid.head()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F1ba309d1-618f-4f90-a08d-462b03ad7ff6%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F1ba309d1-618f-4f90-a08d-462b03ad7ff6%2Fimage.png)

s = sns.catplot(x='WHO Region', y='Confirmed', data=covid) # kind='violin'
s.fig.set_size_inches(10, 6)

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fa7893bc6-eb1a-4ba9-a408-ca39088a0a58%2Foutput_55_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fa7893bc6-eb1a-4ba9-a408-ca39088a0a58%2Foutput_55_0.png)

스트립그림(Strip Plot)

  • sns.stripplot()
  • scatter plot과 유사하게 데이터의 수치를 표현하는 그래프
sns.stripplot(x='WHO Region', y='Recovered', data=covid)

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fa5a1093b-0e23-48c1-ac81-967475f6bd04%2Foutput_57_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fa5a1093b-0e23-48c1-ac81-967475f6bd04%2Foutput_57_0.png)

# cf) swarmplot
# 여기서 뜨는 에러는 중복된 점들의 값이 많다는 것에 대한 경고!

sns.swarmplot(x='WHO Region', y='Recovered', data=covid)

plt.show()
c:\\users\\nyk70\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\seaborn\\categorical.py:1296: UserWarning: 22.7% of the points cannot be placed; you may want to decrease the size of the markers or use stripplot.
  warnings.warn(msg, UserWarning)
c:\\users\\nyk70\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\seaborn\\categorical.py:1296: UserWarning: 69.6% of the points cannot be placed; you may want to decrease the size of the markers or use stripplot.
  warnings.warn(msg, UserWarning)
c:\\users\\nyk70\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\seaborn\\categorical.py:1296: UserWarning: 79.2% of the points cannot be placed; you may want to decrease the size of the markers or use stripplot.
  warnings.warn(msg, UserWarning)
c:\\users\\nyk70\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\seaborn\\categorical.py:1296: UserWarning: 54.3% of the points cannot be placed; you may want to decrease the size of the markers or use stripplot.
  warnings.warn(msg, UserWarning)
c:\\users\\nyk70\\appdata\\local\\programs\\python\\python39\\lib\\site-packages\\seaborn\\categorical.py:1296: UserWarning: 31.2% of the points cannot be placed; you may want to decrease the size of the markers or use stripplot.
  warnings.warn(msg, UserWarning)

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fc5bf894f-2c03-477e-a51c-08499fd7ddcd%2Foutput_58_1.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fc5bf894f-2c03-477e-a51c-08499fd7ddcd%2Foutput_58_1.png)

히트맵 (Heatmap)

  • sns.heatmap()
  • 데이터의 행렬을 색상으로 표현해주는 그래프
  • 상관계수행렬에 많이 사용
# 히트맵 예제

covid.corr()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2Fc9408dcd-6495-4699-b65d-057ccf2b3a43%2Fimage.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2Fc9408dcd-6495-4699-b65d-057ccf2b3a43%2Fimage.png)

sns.heatmap(covid.corr())

plt.show()

![https://velog.velcdn.com/images%2Fleeyongjoo%2Fpost%2F125f7bae-9b8a-4d27-b865-1c500e57b8e0%2Foutput_61_0.png%5D(https%3A%2F%2Fimages.velog.io%2Fimages%2Fleeyongjoo%2Fpost%2F125f7bae-9b8a-4d27-b865-1c500e57b8e0%2Foutput_61_0.png)

profile
하나씩 정리하는 개발공부로그입니다.

0개의 댓글