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()