Matlab으로 데이터 시각화하기
데이터를 보기좋게 표현해봅시다.
- Matplotlib 시작하기
- 자주 사용되는 Plotting의 Options
- 크기 :
figsize
- 제목 :
title
- 라벨 :
_label
- 눈금 :
_tics
- 범례 :
legend
- Matplotlib Case Study
- 꺾은선 그래프 (Plot)
- 산점도 (Scatter Plot)
- 박스그림 (Box Plot)
- 막대그래프 (Bar Chart)
- 원형그래프 (Pie Chart)
- 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)
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)
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)
- 맨위, 맨아래는 각각 최대/최소값
- 가운데 박스에서
- 박스의 밑 부분 : Q1 - 25%
- 박스의 중앙 부분 : Q2 - 50% (median; 중앙값)
- 박스의 윗 부분 : 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()
- 범주형 데이터의 "값"과 그 값의 "크기"를 직사각형으로 나타낸 그림
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()
- 히스토그램과 같은 연속적인 분포를 곡선화해서 그린 그림
# 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)