- 일자 : 2022년 1월 7일 14:00 ~ 18:00 (5일차)
- 주제 : Matplotlib 기초
- 내용 :
- Matplotlib이란? : 파이썬의 데이터 시각화 라이브러리
- 명령프롬프트에서
pip install matplotlib
을 입력하여 설치 후 import를 실시 - 추가로 그래프 등을 웹 상에서 곧바로 출력하기 위해서는
%matplotlib inline
를 입력
In [63]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
In [64]:
# y = x + 1
# example_list = Y축
example_list = [1, 2, 3, 4, 5]
# 실제 plotting을 하는 함수
# example_list는 Y축으로 배정되며, X값은 index값으로 자동 배정함.
plt.plot(example_list)
# plt를 확인하는 명령어.
# 깔끔하게 그래프만 나오도록 만든다.
plt.show()
In [65]:
# 꺾은선 그래프 형태 확인용
example_list2 = [2, 4, 2, 4, 2]
plt.plot(example_list2)
plt.show()
# "M"자 형태로 그래프가 출력되는 것을 알 수 있다.
.figure()
= 그래프를 그릴 도면(figure)에 적용할 속성을 결정¶
이하는 .figure()
에서 ()(괄호)안에 들어갈 속성
- figsize = (가로 길이, 세로 길이) : (가로 길이 * 세로 길이)만큼 그래프 크기 결정
In [66]:
# plotting 을 할 도면을 선언
# 5 * 5 크기의 그래프 출력
plt.figure(figsize = (5, 5))
plt.plot(example_list)
plt.show()
In [67]:
# 3 * 3 크기의 그래프 출력
plt.figure(figsize = (3, 3))
plt.plot(example_list2)
plt.show()
(1.2) 2차함수 그래프¶
- 정의역(x)와 치역(y, f(x))을 설정하여 2차함수 그래프를 출력할 수 있다.
In [76]:
# y = x^2
x = np.array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]) # 정의역
y = x**2 # f(x), y = x^2의 값으로 설정한다.
plt.plot(x, y)
plt.show()
# 그러나, 아래 그래프는 일반적인 2차함수와는 다르게 각진 모습이다.
In [72]:
# 각을 제거하기 위해 각 정수값 사이에 수많은 점을 넣는다.
# np.arange(a, b, c) : a부터 b까지 c간격으로 설정. (np.arange는 실수값 삽입 가능)
# -10 이상부터 10 미만까지 0.01 간격의 np.array 생성
x = np.arange(-10, 10, 0.01)
plt.plot(x, x**2)
plt.show()
# 우리가 아는 2차함수의 형태를 띄고 있음
(1.3) 그래프 꾸미기¶
.xlabel("x축 이름")
/.ylabel("y축 이름")
: x/y축 이름 지정.xticks(x축 눈금설정 범위 및 간격)
/.yticks(y축 눈금설정 범위 및 간격)
: x/y축 눈금설정 범위 및 간격.title("그래프 제목 이름)
: 그래프 제목 설정.plot()
괄호 내label = "범례명"
기입 후.legend()
입력 : 범례설정
In [79]:
x = np.arange(-10, 10, 0.01)
# x축, y축 이름 지정
plt.xlabel("X_name")
plt.ylabel("Y_name")
# x, y축 눈금 설정
# xticks = 어느 위치에 눈금을 설정해줄 것인지
# -5 이상 6 미만까지 1 간격으로 x축 눈금 설정
plt.xticks([i for i in range(-5, 6, 1)])
# 0 이상 27 미만까지 3 간격으로 y축 눈금 설정
plt.yticks([i for i in range(0, 27, 3)])
# 제목 설정
plt.title("Graph_name")
# 범례 그리기 (그래프 그린 이후 범례 추가)
plt.plot(x, x**2, label = "x**2_legend")
plt.legend()
plt.show()
(2) Matplotlib으로 그리는 그래프 유형¶
(2.1) 꺾은선 그래프¶
In [80]:
x = np.arange(20) # x축 : 0 ~ 19
y = np.random.randint(0, 22, 20) # Y축 : 0이상 22 미만 사이의 난수 20개를 생성
# 그래프 생성
plt.plot(x, y)
# 그래프의 x축, y축의 영역을 0 이상 20 이하로 한정
plt.axis([0, 20, 0, 20]) # plt.axis([x최소값, x최대값, y최소값, y최대값])
# 그래프의 눈금간격을 0 이상 21 미만까지 5 간격으로 설정
plt.yticks([i for i in range(0, 21, 5)])
plt.show()
# Extra : y축을 20까지 보이게 하고 싶다면?
# y축을 5 단위로 보이게 하고 싶다면?
# .axis(), ytics()
(2.2) 산점도 (Scatter Plot)¶
- x와 y가 독립적일 경우 사용
- 그래프의 전체적인 추이에 따라서 상관관계를 파악한다.
In [81]:
plt.scatter(x, y)
plt.show()
(2.3) 상자그림 (Box Plot)¶
- 수치형 데이터에 대한 다양한 정보를 제공하는 그림
- Q1 (25%), Q2 (50%), Q3(75%), min*(outlier를 제외한 최소값), max(outlier를 제외한 최대값), outlier(범위 내에서 특별히 벗어나는 이상치)
In [86]:
# 두 개의 값을 전달할 때는 튜플형태로 전달
plt.title("box plot of Y")
plt.boxplot((x, y))
plt.show()
# 한 개의 값만 전달할 때는 그냥 넣어도 된다
plt.boxplot(x)
plt.show()
# Extra : Plot의 title을 "Box Plot of Y"라고 지정하기
(2.4) 막대 그래프(Bar Plot)¶
- 범주형 데이터의 "값"과 그 값의 크기를 직사각형으로 나타낸 그림
In [87]:
# 범주형 데이터 x의 크기 y 산출하기
plt.bar(x, y)
plt.xticks(np.arange(0, 20, 1))
plt.show()
# Extra : xticks를 올바르게 처리해보자
(2.5) 히스토그램(Histogram)¶
- 도수분포를 직사각형의 막대 형태로 나타낸다.
- 각 변량을 묶어서 "계급"으로 표현한다. (예 : 0 ~ 5와 같이 x의 범주형 데이터를 묶어서 표시)
.bins = np.arange(a부터 b까지 c 간격으로 설정)
을 이용하여 범주 할당- 막대그래프와 다르게 히스토그램은 서로의 범주가 연결되어 있음
In [88]:
# cf) Histogram
# 0 이상 22 미만의 값을 2 간격으로 계급 설정
plt.hist(y, bins = np.arange(0, 22, 2))
# 가로축 수정
plt.xticks(np.arange(0, 20, 2))
plt.show()
# Extra : xticks를 고치기
(2.6) 원형 그래프 (Pie Chart)¶
- 데이터에서 전체에 대한 부분의 비율을 부채꼴로 나타낸 그래프
- 다른 그래프에 비해서 데이터 비율 확인이 용이
.pie()
로 표현.pie()
괄호 내labels = [설정1, 설정2...]
를 통해 데이터레이블 가능
In [89]:
z = [100, 300, 200, 400]
# z 데이터를 이용해 원형그래프를 그린다.
# 각 그래프에는 one, two, three, four의 레이블을 삽입한다.
plt.pie(z, labels = ['one', 'two', 'three', 'four'])
plt.show()
(3) Seaborn 활용¶
Matplotlib을 기반으로 더 다양한 시각화 방법을 제공하는 라이브러리
- 커널밀도그림
- 카운트그림
- 캣그림
- 스트립그림
- 히트맵
(3.0) Seaborn Import하기¶
- 사용 전 반드시
pip install seaborn
을 통한 설치 필요
In [90]:
import seaborn as sns
(3.1) 커널밀도그림 (Kernel Desity Plot)¶
- 히스토그램과 같은 연속적인 분포를 곡선화해서 그린 그림
sns.kdeplot(y축 데이터, shade = 그래프 내부 색을 넣고 싶다면 True(default = False))
로 사용
In [91]:
# in Histogram
x = np.arange(0, 22, 2)
y = np.random.randint(0, 20, 20)
plt.hist(y, bins = x)
plt.show()
In [94]:
# kdeplot
# shade = 음영설정
sns.kdeplot(y, shade = True)
plt.show()
(3.2) 카운트그림 (Count Plot)¶
- 범주형 column의 빈도수를 시각화 : Groupby 후의 도수를 하는 것과 동일한 효과가 있다.
sns.countplot(범주화하고자 하는 값 삽입)
을 통해 사용한다.- 자동으로 x, y축 이름을 설정해준다.
- 육안으로 쉽게 구분할 수 있도록 각 막대의 색이 다르다.
In [95]:
# 임의의 dataframe 형성
vote_df = pd.DataFrame({"name" : ['길동', '밥', '낙동강', '오리알'], "vote" : [True, False, True, True]})
vote_df
Out[95]:
name | vote | |
---|---|---|
0 | 길동 | True |
1 | 밥 | False |
2 | 낙동강 | True |
3 | 오리알 | True |
In [96]:
# vote를 기준으로 True/False에 따라 그룹화를 진행
# in matplotlib barplot
# vote_df 데이터프레임을 vote 기준으로 범주화하여 갯수 표현
vote_count = vote_df.groupby('vote').count()
vote_count
Out[96]:
name | |
---|---|
vote | |
False | 1 |
True | 3 |
In [32]:
# False와 True를 X축으로 설정한 뒤 값 할당하기
plt.bar(x = [False, True], height = vote_count['name'])
plt.show()
In [39]:
# in sns.countplot
sns.countplot(x = vote_df['vote'])
plt.show()
(3.3) 캣그림 (Cat Plot)¶
- 숫자형 변수와 하나 이상의 범주형 변수의 관계를 보여주는 함수
sns.catplot(x = "카테고리 column", y = "Data Column", data = 사용할 데이터, kind = "그래프의 형태(default = 'strip')
- 범주형 데이터와 수치형 데이터의 관계를 잘 보여줄 수 있음
In [100]:
# catplot의 강력함을 보여주기 위해서는
# 복잡한 데이터가 필요하므로 이전에 사용했던 covid 데이터 호출
covid = pd.read_csv("D:/workspaces/WinterStudy2022/datasetCovid/country_wise_latest.csv")
covid.head(5)
Out[100]:
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 |
In [101]:
# catplot = 여러개의 데이터를 묶는 하나의 방법이라고 생각해야 함.
# x = X축 지정(범주형), y = Y축 지정(수치형)
# data = 사용할 데이터, kind = 그래프 형태(default = 'strip')
# s = sns.catplot(x = "WHO Region", y = "Confirmed", data = covid, kind = 'strip')
s = sns.catplot(x = "WHO Region", y = "Confirmed", data = covid, kind = 'violin')
s.fig.set_size_inches(10, 6)
plt.show()
(3.4) 스트립그림 (Strip Plot)¶
- scatter plot과 유사하게 데이터의 수치를 표현하는 그래프
sns.stripplot(x = '카테고리 Column', y = 'Data Column', data = 사용할 데이터)
In [102]:
sns.stripplot(x = 'WHO Region', y = 'Recovered', data = covid)
plt.show()
(3.5) Swarmplot¶
- 뭉처진 값이 너무 많을 경우 밀도를 쉽게 파악할 수 없다는 Strip plot의 단점을 해결
.swarmplot(x = '카테고리 Column', y = 'Data Column', data = 사용할 데이터)
를 이용하여 사용- 단, 뭉처진 값이 너무 많을 경우 밀도를 전부 출력하지 못해 오류를 출력하기도 하나, 정상적으로 데이터는 나옴
In [51]:
# cf) swarmplot
# 뭉처진 값이 너무 많을 경우 밀도를 전부 출력하지 못해 오류를 뱉기는 하나
# 그래프는 정상적으로 나옴
sns.swarmplot(x = 'WHO Region', y = 'Recovered', data = covid)
plt.show()
D:\Python310\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) D:\Python310\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) D:\Python310\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) D:\Python310\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) D:\Python310\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)
(3.6) 히트맵 (Heatmap)¶
- 행렬 데이터의 값을 색상으로 표현해주는 그래프
sns.heatmap(사용할 "행렬"데이터)
In [52]:
# 히트맵 예제
# covid자료를 사용하여 행렬데이터 생성
covid.corr()
Out[52]:
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 |
In [103]:
# covid의 행렬 데이터를 사용하여 히트맵 출력
sns.heatmap(covid.corr())
plt.show()
'전문지식 함양 > TIL' 카테고리의 다른 글
[프로그래머스 겨울방학 인공지능 과정] Flask 기초 (0) | 2022.01.10 |
---|---|
[프로그래머스 겨울방학 인공지능 과정] 1주차 실습과제 (0) | 2022.01.09 |
[프로그래머스 겨울방학 인공지능 과정] Pandas 실습 (0) | 2022.01.06 |
[프로그래머스 겨울방학 인공지능 과정] Pandas 기초 (0) | 2022.01.05 |
[프로그래머스 겨울방학 인공지능 과정] Numpy 기초와 선형대수 정리 (0) | 2022.01.04 |