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 시작하기
- 파이썬의 데이터 시각화 라이브러리
%matplotlib inline
을 통해서 활성화
matplotlib를 inline환경에서(=셀안에서) 보여주게 해주는 코드
cf) 라이브러리 vs 프레임워크
라이브러리 : 개발자들이 만들었을 뿐, 이를 바탕으로 우리가 원하는 목표를 달성하기 위해서는
라이브러리 내부에 있는 코드들을 조합해서 결과를 내야된다.
ex) numpy, pandas, matplotlib ...
프레임워크 : 이미 틀이 짜여져 있고 그 틀에서 내용물을 채워서 결과물을 만들어낸다
ex) Django ...
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
II. 자주 사용되는 Plotting의 Options
# 실제 plotting을 하는 함수 # y = x + 1 (x=index, y=[1,2,3,4,5])
plt.plot([1,2,3,4,5])
plt.show() # plt를 확인하는 명령
plt.plot([2, 4, 2, 4, 2])
plt.show()
Figsize : Figure(도면)의 크기 조절
# 도면 = figure
plt.figure(figsize=(6, 6)) # plotting을 할 도면을 선언
plt.plot([0, 1, 2, 3, 4]) # 실제 plotting을 하는 함수 # y = x
plt.show() # plt를 확인하는 명령
2차함수 그래프 with plot()
# 리스트를 이용해서 1차함수 y = x를 그려보면 :
plt.plot([0, 1, 2, 3, 4])
plt.show()
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()
그래프의 데이터의 간격을 좁게하여 부드러운 그래프 만들기
# np.arange(a, b, c) c : 0.01의 값을 넣어주어 간격을 좁게 만들어준다.
x = np.arange(-10, 10, 0.01)
plt.plot(x, x**2)
plt.show()
x, y축에 label 추가하기
# x, y축에 설명 추가하기
x = np.arange(-10, 10, 0.01)
###
plt.xlabel('x value')
plt.ylabel('f(x) value')
###
plt.plot(x, x**2)
plt.show()
x, y축의 범위 설정하기
# x, y축의 범위를 설정하기
x = np.arange(-10, 10, 0.01)
plt.xlabel('x value')
plt.ylabel('f(x) value')
###
plt.axis([-5, 5, 0, 25]) # [x_min, x_max, y_min, y_max]
###
plt.plot(x, x**2)
plt.show()
x, y축의 눈금 설정하기
# 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, 5, 1)]) # x축의 눈금 설정. -5, -4, -3, ...
plt.yticks([i for i in range(0, 27, 3)]) # y축의 눈금 설정. 0, 3, 6, 9, ...
###
plt.plot(x, x**2)
plt.show()
그래프의 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, 5, 1)])
plt.yticks([i for i in range(0, 27, 3)])
###
plt.title('y = x^2 graph')
###
plt.plot(x, x**2)
plt.show()
범례 만들기
# 범례 만들기
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, 5, 1)])
plt.yticks([i for i in range(0, 27, 3)])
plt.title('y = x^2 graph')
plt.plot(x, x**2, label='trend') # label 달기
### 선을 그린 이후 코드를 작성해야한다.
plt.legend()
###
plt.show()
III. Matplotlib Case Study
꺽은선 그래프(plot)
.plot()
- 시계열 데이터에서 많이 사용
- 그 이전의 데이터에 비해 다음 데이터가 얼마나 변하는가를 볼 수 있다.
numpy.random.randint(a, b, ...)
는 [a, b) 의 범위 중 하나의 수를 임의로 추출합니다.
cf) random.randint(a, b)
는 [a, b]의 범위 중 하나의 수를 임의의로 추출합니다.
x = np.arange(20) # 0 ~ 19
y = np.random.randint(0, 20, 20) # 난수를 20번 생성
# Extra : y축을 20까지 보이게 하고 싶다면?, y축을 "5"단위로 보이게 하고 싶다면?
# .axis(), .yticks()
# y축을 20까지만 보이게 하고 싶다면?
plt.axis([0, 20, 0, 20])
plt.yticks([0, 5, 10, 15, 20])
plt.plot(x, y)
plt.show()
산점도 (Scatter Plot)
.scatter()
- 점들을 선으로 연결하지 않고 단순 점으로 표현
- y와 x가 별개인 변수 사이의 상관관계가 있는지 확인할 때 사용
plt.scatter(x, y)
plt.show()
박스 그림(Box Plot)
.boxplot()
- 수치형 데이터에 대한 정보 (Q1, Q2, Q3, min, max)
상한선과 하한선은 max, min값을 볼 수 있다.
가운데 박스 그림에는 세가지 가로 선을 볼 수 있는데,
맨 위 : Q3 값 (75%에 해당하는 값)
중간 : median 값 (50%에 해당하는 값)
맨 밑 : Q1 값 (25%에 해당하는 값)
을 뜻한다.
plt.boxplot(y)
### Extra : Plot의 title을 'Box plot of y'로
plt.title('Box plot of y')
###
plt.show()
x, y 두 변수를 한꺼번에 그리기
# x, y 두 변수를 한번에 표시할 수 있다.
plt.boxplot((x, y))
plt.title('Box plot of x, y')
plt.show()
막대 그래프 (Bar Plot)
.bar()
- 범주형 데이터의 "값"과 그 값의 크기를 직사각형으로 나타낸 그림
plt.bar(x, y)
### Extra : xtics를 올바르게 처리해봅시다.
plt.xticks(np.arange(0, 20, 1))
###
plt.show()
cf) Histogram
hist()
막대그래프와 공통점
- 도수분포를 직사각형의 막대 형태로 나타낸다.
막대그래프와 차이점
- "계급"으로 나타낸 것이 특징
- 막대그래프에서의 x축처럼 0, 1, 2가 아니라 0~2까지의 "범주형" 데이터로 구성 후 그림을 그림
plt.hist(y, bins=np.arange(0, 22, 2)) # bins : 그 범주의 간격을 설정해준다.
### Extra : xticks를 올바르게 고쳐봅시다.
plt.xticks(np.arange(0, 22, 2))
plt.show()
원형 그래프 (Pie Chart)
.pie()
- 데이터에서 전체에 대한 부분의 비율을 부채꼴로 나타낸 그래프
- 다른 그래프에 비해서 비율 확인에 용이
z = [100, 300, 200, 400]
plt.pie(z, labels=['one', 'two', 'three', 'four'])
plt.show()
IV. The 멋진 그래프, Seaborn Case Study
Matplotlib를 기반으로 더 다양한 시각화 방법을 제공하는 라이브러리
- 커널밀도그림 (Kernel Density Plot)
- 카운트그림 (Count Plot)
- 캣그림 (Cat Plot)
- 스트립그림 (Strip Plot)
- 히트맵 (Heatmap)
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()
# kdeplot
# ylabel은 전체를 1로 봤을 때 얼만큼의 Density를 갖는지 표시
# shade : 선 안쪽을 칠할 것인지(True), 안 칠할 것인지(False) Default는 False
sns.kdeplot(y, shade=True)
plt.show()
카운트그림 (Count Plot)
- 범주형 column의 빈도수를 시각화 -> Groupby 후의 도수를 하는 것과 동일한 효과
sns.countplot()
vote_df = pd.DataFrame({'name':['Andy', 'Bob', 'Cat'], 'vote':[True, True, False]})
vote_df
기본 Pandas를 가지고 groupby 명령어를 이용해 count했을 때
# in matplotlib barplot
vote_count = vote_df.groupby('vote').count()
vote_count
plt.bar(x=[False, True], height=vote_count['name'])
plt.show()
Seaborn을 가지고 count를 했을 경우
# sns의 countplot
# ylabel도 써져있고, x축에는 fase, true가 넣어져있고, 색깔도 다르게 나온다
sns.countplot(x=vote_df['vote'])
plt.show()
캣그림 (Cat Plot)
- 숫자형 변수와 하나 이상의 범주형 변수의 관계를 보여주는 함수
sns.catplot()
covid = pd.read_csv("./country_wise_latest.csv")
covid.head(5)
Country/Region | Confirmed | Deaths | Recovered | Active | New cases | New deaths | New recovered | Deaths / 100 Cases | Recovered / 100 Cases | Deaths / 100 Recovered | Confirmed last week | 1 week change | 1 week % increase | WHO Region | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Afghanistan | 36263 | 1269 | 25198 | 9796 | 106 | 10 | 18 | 3.50 | 69.49 | 5.04 | 35526 | 737 | 2.07 | Eastern Mediterranean |
1 | Albania | 4880 | 144 | 2745 | 1991 | 117 | 6 | 63 | 2.95 | 56.25 | 5.25 | 4171 | 709 | 17.00 | Europe |
2 | Algeria | 27973 | 1163 | 18837 | 7973 | 616 | 8 | 749 | 4.16 | 67.34 | 6.17 | 23691 | 4282 | 18.07 | Africa |
3 | Andorra | 907 | 52 | 803 | 52 | 10 | 0 | 0 | 5.73 | 88.53 | 6.48 | 884 | 23 | 2.60 | Europe |
4 | Angola | 950 | 41 | 242 | 667 | 18 | 1 | 0 | 4.32 | 25.47 | 16.94 | 749 | 201 | 26.84 | Africa |
# 세개의 매개변수를 넣어주어야 한다.
s = sns.catplot(x='WHO Region', y='Confirmed', data=covid)
s.fig.set_size_inches(10, 6) # figsize 설정
plt.show()
# catPlot은 그래프의 형태보다는 여러개의 데이터를 묶는 방식
# 그래프의 모양을 다른 plot으로 사용가능하다. (`kind` 옵션 사용)
# default는 strip
s = sns.catplot(x='WHO Region', y='Confirmed', data=covid, kind='violin')
s.fig.set_size_inches(10, 6) # figsize 설정
plt.show()
스트립그림 (Strip Plot)
- scatter plot과 유사하게 데이터의 수치를 표현하는 그래프
sns.stripplot()
sns.stripplot(x='WHO Region', y='Recovered', data=covid)
plt.show()
cf) swarmplot
sns.swarmplot()
- strip plot과 유사
- strip plot의 경우 점들이 뭉쳐있으면 얼만큼의 데이터가 있는지 확인하기 어려움
- swarmplot의 경우는 유사한 데이터들을 양쪽으로 분산시켜 보여준다.
# 오류 발생 이유
# 유사한 점들의 개수가 너무 크다보니깐 표현할 수 없어서
sns.swarmplot(x='WHO Region', y='Recovered', data=covid)
plt.show()
C:\ProgramData\Anaconda3\envs\kdzero\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:\ProgramData\Anaconda3\envs\kdzero\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:\ProgramData\Anaconda3\envs\kdzero\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:\ProgramData\Anaconda3\envs\kdzero\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:\ProgramData\Anaconda3\envs\kdzero\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)
히트맵 (Heatmap)
- 데이터의 행렬을 색상으로 표현해주는 그래프
- 상관계수 행렬에서 제일 많이 사용
sns.heatmap()
# 상관계수 행렬 만들기 `.corr()`
covid.corr()
Confirmed | Deaths | Recovered | Active | New cases | New deaths | New recovered | Deaths / 100 Cases | Recovered / 100 Cases | Deaths / 100 Recovered | Confirmed last week | 1 week change | 1 week % increase | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Confirmed | 1.000000 | 0.934698 | 0.906377 | 0.927018 | 0.909720 | 0.871683 | 0.859252 | 0.063550 | -0.064815 | 0.025175 | 0.999127 | 0.954710 | -0.010161 |
Deaths | 0.934698 | 1.000000 | 0.832098 | 0.871586 | 0.806975 | 0.814161 | 0.765114 | 0.251565 | -0.114529 | 0.169006 | 0.939082 | 0.855330 | -0.034708 |
Recovered | 0.906377 | 0.832098 | 1.000000 | 0.682103 | 0.818942 | 0.820338 | 0.919203 | 0.048438 | 0.026610 | -0.027277 | 0.899312 | 0.910013 | -0.013697 |
Active | 0.927018 | 0.871586 | 0.682103 | 1.000000 | 0.851190 | 0.781123 | 0.673887 | 0.054380 | -0.132618 | 0.058386 | 0.931459 | 0.847642 | -0.003752 |
New cases | 0.909720 | 0.806975 | 0.818942 | 0.851190 | 1.000000 | 0.935947 | 0.914765 | 0.020104 | -0.078666 | -0.011637 | 0.896084 | 0.959993 | 0.030791 |
New deaths | 0.871683 | 0.814161 | 0.820338 | 0.781123 | 0.935947 | 1.000000 | 0.889234 | 0.060399 | -0.062792 | -0.020750 | 0.862118 | 0.894915 | 0.025293 |
New recovered | 0.859252 | 0.765114 | 0.919203 | 0.673887 | 0.914765 | 0.889234 | 1.000000 | 0.017090 | -0.024293 | -0.023340 | 0.839692 | 0.954321 | 0.032662 |
Deaths / 100 Cases | 0.063550 | 0.251565 | 0.048438 | 0.054380 | 0.020104 | 0.060399 | 0.017090 | 1.000000 | -0.168920 | 0.334594 | 0.069894 | 0.015095 | -0.134534 |
Recovered / 100 Cases | -0.064815 | -0.114529 | 0.026610 | -0.132618 | -0.078666 | -0.062792 | -0.024293 | -0.168920 | 1.000000 | -0.295381 | -0.064600 | -0.063013 | -0.394254 |
Deaths / 100 Recovered | 0.025175 | 0.169006 | -0.027277 | 0.058386 | -0.011637 | -0.020750 | -0.023340 | 0.334594 | -0.295381 | 1.000000 | 0.030460 | -0.013763 | -0.049083 |
Confirmed last week | 0.999127 | 0.939082 | 0.899312 | 0.931459 | 0.896084 | 0.862118 | 0.839692 | 0.069894 | -0.064600 | 0.030460 | 1.000000 | 0.941448 | -0.015247 |
1 week change | 0.954710 | 0.855330 | 0.910013 | 0.847642 | 0.959993 | 0.894915 | 0.954321 | 0.015095 | -0.063013 | -0.013763 | 0.941448 | 1.000000 | 0.026594 |
1 week % increase | -0.010161 | -0.034708 | -0.013697 | -0.003752 | 0.030791 | 0.025293 | 0.032662 | -0.134534 | -0.394254 | -0.049083 | -0.015247 | 0.026594 | 1.000000 |
# 밝은 부분은 1의 값으로 관련이 높다는 뜻
# 어두운 부분은 -1의 값으로 관련이 없다는 뜻
sns.heatmap(covid.corr())
plt.show()
'프로그래머스인공지능스쿨' 카테고리의 다른 글
[4주차 - Day2] 클라우드를 활용한 머신러닝 모델 Serving API 개발 (0) | 2021.05.11 |
---|---|
[4주차 - Day1] Web Application with Flask (0) | 2021.05.11 |
[3주차 - Day3] Python으로 데이터 다루기 II - Pandas (0) | 2021.05.05 |
[3주차 - Day2] Python으로 데이터 다루기 I - numpy (0) | 2021.05.04 |
[3주차 - Day2] 참고 : Git (0) | 2021.05.04 |