시각화
matplotlib 모듈
- matplotlib 모듈은 파이썬에서 데이터를 효과적으로 시각화하기 위해서 만든 라이버러리 이다.
- matplotlib은 MATLAB(과학 및 공학 연산을 위핚 소프트웨어)의 시각화 기능을 모델링해서 만들어졌다.
- matplotlib 모듈을 이용하면 2차원 선 그래프(line), 산점도(scatter), 막대그래프(bar chart), 히스토그램(histogram), 파이 그래프(pie chart) 등을 그릴 수 있다.
- matplotlib 모듈은 아나콘다가 설치 될 때 같이 설치 되므로, 따로 설치 하지 않아도 된다.
1. 선그래프
# To add a new cell, type '# %%'
# To add a new markdown cell, type '# %% [markdown]'
# %%
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# %%
plt.plot([1,2,3,4])
plt.show()
# %%
plt.plot([0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0])
plt.xlabel('x-axis') # x축 라벨
plt.ylabel('y-axis') # y축 라벨
plt.show()
# %%
import platform
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
x = [1,2,3,4,5]
y = [1,2,3,4,5]
plt.xlabel('x축') # x축 라벨 ( 한글 라벨 )
plt.ylabel('y축') # y축 라벨
plt.plot(x,y)
plt.show()
# %%
x = [0, 1, 2, 3, 4, 5, 6]
y = [1, 4, 5, 8, 9, 5, 3]
plt.figure(figsize=(8,6)) # 크기 설정
plt.plot(x,y,color='green') # 선색깔: green
plt.show()
# %%
x = [1,2,3,4,5]
y = [1,2,3,4,5]
plt.plot(x,y,'bv')
plt.show()
# plot()은 b- 옵션이 기본값 : 파란색(b) 라인(-)이라는 뜻
# 선그래프 : 'r-', 'g-', 'b-'
# 점그래프 : 'ro', 'go', 'bo'
# 아래세모 그래프 : 'rv', 'gv', 'bv'
# ro 옵션은 빨갂색(r)으로 o표시를 의미함
# bv 옵션은 파란색(b)으로 v표시를 의미함
# %%
x = [0, 1, 2, 3, 4, 5, 6]
y = [1, 4, 5, 8, 9, 5, 3]
# 점선 그래프
plt.figure(figsize=(8,6)) # 크기 설정
plt.plot(x, y, color='green', linestyle='dashed') # 점선 그래프
plt.show()
# %%
x = [0, 1, 2, 3, 4, 5, 6]
y = [1, 4, 5, 8, 9, 5, 3]
# 점선 : plot()함수에 linestyle='dashed' 추가
# 마커 표시 : plot()함수에 marker = 'o' 추가
plt.figure(figsize=(8,6))
plt.plot (x, y,
color='red',
linestyle='dashed',
marker='o')
plt.show()
# %%
x = [0, 1, 2, 3, 4, 5, 6]
y = [1, 4, 5, 8, 9, 5, 3]
# 점선 : plot()함수에 linestyle='dashed' 추가
# 마커 표시 : plot()함수에 marker = 'o' 추가
# 마커 색깔 : plot()함수에 markerfacecolor = 'red'
# 마커 크기 : plot()함수에 markersize = 12
plt.figure(figsize=(8,6))
plt.plot(x, y,
color='green',
linestyle='dashed',
marker='o',
markerfacecolor='red',
markersize=9)
plt.show()
2. 산점도
- 산점도는 2개의 요소로 이루어짂 데이터 집합의 관계 (예를들면, 키와 몸무게와의 관계, 공부시간과 시험점수와의 관계, 기온과 아이스크린 판매량과의 관계)를 시각화하는데 유용하다.
- 산점도를 그리기 위해서는
plot()
함수 대신에scatter()
함수 사용함
산점도 형식
plt.scatter( x, y[, s = size, c = colors, marker = ‘marker_string ‘, alpha = alpha_f]) []는 옵션
- s : 마커의 크기
- c : 마커의 색깔
- marker : 마커 모양
- alpha : 투명도 : 0(완전 투명) ~ 1(완전 불투명)
- 옵션을 지정하지 않으면, 기본값 (s=40, c=‘b’, marker=‘o’, alpha=1 )으로 지정
# To add a new cell, type '# %%'
# To add a new markdown cell, type '# %% [markdown]'
# %%
import numpy as np
import matplotlib.pyplot as plt
import platform
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
# %%
x = np.array([0,1,2,3,4,5,6,7,8,9])
y = np.array([9,8,7,9,8,3,2,4,3,4])
plt.figure(figsize=(10,6))
plt.scatter(x,y, alpha=0.5) # alpha 투명도 설정
plt.show()
# %%
# marker 의 모양 변경 : scatter()함수에 marker = '>' 추가
# marker의 크기 변경 : s = 50
# x의 값에 따라 y축 값의 색상을 바꾸는 colormap 추가
# scatter()함수에 c=colormap
# plt.colorbar()
# colormap = x
plt.figure(figsize=(8,6))
plt.scatter(x,y , s = 5 , c=x, marker='>') # x 값은 0~9까지
plt.colorbar() # colormap 만들기
plt.show()
# %%
# 도시 지정
city = ['서울', '인천', '대전', '대구', '울산', '부산', '광주']
# 인구 밀도(명/km^2): 2017년 통계청 자료
pop_den = [16154, 2751, 2839, 2790, 1099, 4454, 2995]
# 위도(latitude)와 경도(longitude)
lat = [37.56, 37.45, 36.35, 35.87, 35.53, 35.18, 35.16]
lon = [126.97, 126.70, 127.38, 128.60, 129.31, 129.07, 126.85]
size = np.array(pop_den) * 0.2 # 마커의 크기 지정
colors = ['r', 'g', 'b', 'c', 'm', 'k', 'y'] # 마커의 색 지정
plt.scatter(lon, lat, s=size, c=colors, alpha=0.5)
plt.xlabel('경도(lonitude)')
plt.ylabel('위도(latitude)')
plt.title('지역별 인구 밀도(2017)')
# 지역명 출력
for x, y, name in zip(lon, lat, city) :
plt.text(x, y, name)
plt.show()
3. 막대 그래프
- 막대그래프는 값을 막대의 높이를 나타내므로 여러 항목의 수량이 많고 적음을 한눈에 파악핛 수 있다.
- 따라서 여러 항목의 데이터를 서로 비교할 때 주로 이용한다.
막대그래프 형식
plt.bar( x, height [, width = width_f, color = colors, tick_label = tick_labels, align = ‘center’ (기본) , label = labels ] )
[ ] 안은 옵션임.x : height와 길이가 일치하는 데이터로 x축에 표시될 위치를 지정
- height : 시각화 하고자 하는 막대 그래프 데이터
- width : [0, 1]사이의 실수를 지정해 막대의 폭을 조정, width 옵션을 입력하지 않으면 기본값인 0.8이 입력
- color : fmt옵션의 컬러지정 약어로 막대그래프의 색을 지정
- tick_label : 막대 그래프 x축의 tick 라벨 이름을 지정 (기본값은 숫자 라벨)
- align : 막대 그래프의 위치를 가운데로 할지(center) 한쪽으로 치우치게 할지(edge) 설정 (기본값은 center)
- label : 범례에 사용될 문자열을 지정
# To add a new cell, type '# %%'
# To add a new markdown cell, type '# %% [markdown]'
# %%
import numpy as np
import matplotlib.pyplot as plt
import platform
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
# %%
member_IDs = ['m_01', 'm_02', 'm_03', 'm_04'] # 회원 ID
before_ex = [27, 35, 40, 33] # 운동 시작 전
after_ex = [30, 38, 42, 37] # 운동 한 달 후
# 1. 기본 값으로 막대 그래프 출력
n_data = len(member_IDs) # 회원이 네 명이므로 전체 데이터 수는 4
index = np.arange(n_data) # NumPy를 이용해 배열 생성 (0, 1, 2, 3)
plt.bar(index, before_ex) # bar(x,y)에서 x=index, y=before_ex 로 지정
plt.show()
# %%
# 2. tick_label : x축 tick 라벨 설정 (회원 ID로 설정)
plt.bar(index, before_ex, tick_label = member_IDs)
plt.show()
# %%
# 3. color : 막대 그래프의 색 설정
colors=['r', 'g', 'b', 'm'] # m : 자홍색(magenta)
plt.bar(index, before_ex, color = colors, tick_label = member_IDs)
plt.show()
# %%
# 4. width : 막대 그래프의 폭 설정 ( 기본값 : 0.8 )
plt.bar(index, before_ex, tick_label = member_IDs, width=0.4)
plt.show()
# %%
# 5. plt.barh() : 수평 막대 그래프
colors=['r', 'g', 'b', 'm']
plt.barh(index, before_ex, color = colors, tick_label = member_IDs)
plt.show()
# %%
# 6. 최종 그래프 출력
# c:청록색(cyan), m:자홍색(magenta)
barWidth = 0.4 # 바의 폭과, 두번재 그래프의 이동 위치 지정
plt.bar(index, before_ex, color='c', align='edge', width = barWidth, label='before') # 운동전 그래프
plt.bar(index + barWidth, after_ex , color='m', align='edge', width = barWidth, label='after') # 운동후 그래프
plt.xticks(index + barWidth, member_IDs)
plt.legend()
plt.xlabel('회원 ID')
plt.ylabel('윗몸일으키기 횟수')
plt.title('운동 시작 전과 후의 근지구력(복근) 변화 비교')
plt.show()
3. 히스토그램
- 히스토그램(histogram)은 데이터를 정ㅇ해진 간격으로 나눈 후 그 간격 안에 들어간 데이터 개수를 막대로 표시한 그래프로, 데이터가 어떤 분포를 갖는지를 볼 때 주로 사용한다.
- 히스토그램은 도수 분포표를 막대 그래프로 시각화 한것이다.
- 히스토그램은 주로 통계 분야에서 데이터가 어떻게 분포하는지 알아 볼때 많이 사용한다.
1) 히스토그램 형식
plt.hist ( x [,bins = bins_n 혹은 ‘auto’ ] )
[] 옵션- x : 변량 데이터
- bins : 계급의 개수 ( 기본값은 10 ) *bins = ‘auto’ 가 입력되면, x에 맞게 자동으로 bins에 값이 들어갔다.
2) 도수 분포표
- 용어
- 변량(variate) : 자료를 측정해 숫자로 표시한 것
- ex) 점수, 키, 몸무게, 판매량, 시간 등
- 계급(class) : 변량을 정해짂 갂격으로 나눈 구간
- ex) 시험점수를 60~70, 70~80, 80~90, 90~100점 구간으로 나눔
- 계급의 간격(class width) : 계급을 나눈 크기 (기본값은 10)
- 도수(frequency) : 나눠진 계급에 속하는 변량의 수
- ex) 각 계급에서 발생핚 수
- 도수 분포표(frequency distribution table) : 계급에 도수를 표시한 것
- 변량(variate) : 자료를 측정해 숫자로 표시한 것
3) 도수 분포표 예제
- 히스토그램을 그리기 위해서는 우선 도수 분포표에 대해서 이해해야 핚다.
- 어떤 학급에서 수학 시험 결과를 이용해 도수 분포표를 맊드는 과정
실습
변량 생성
학생 25명의 수학 시험 결과
76, 82, 84, 83, 90, 86, 85, 92, 72, 71, 100, 87, 81, 76, 94, 78, 81, 60, 79, 69,74, 87, 82, 68, 79
계급 간격 설정 및 계급 생성 – 계급간격 : 5, 계급 : 8개
변량 중 가장 작은 숫자가 60이고, 가장 큰 숫자가 100이므로 60에서 100까지 일정 갂격(여기서는 5로 설정)으로 나눠서 8개의 계급으로 설정
60~65, 65~70, 70~75, 75~80, 80~85, 85~90, 90~95, 95~100
계급별 도수 확인 및 도수 분포표 만들기
각 계급에 몇 개의 변량이 들어 있는지를 확인해 계급별로 도수를 구한다. 각 도수를 시각적으로 쉽게 볼 수 있도록 마크(O)로 도수를 표시핛 수 있다.
도수 분포표
계급 | 도수 | 마크로 표시 |
---|---|---|
60(이상) ~ 65(미만) | 1 | O |
65 ~ 70 | 2 | OO |
70 ~ 75 | 3 | OOO |
75 ~ 80 | 5 | OOOOO |
80 ~ 85 | 6 | OOOOOO |
85 ~ 90 | 4 | OOOO |
90 ~ 95 | 3 | OOO |
95 ~ 100 | 1 | O |
# To add a new cell, type '# %%'
# To add a new markdown cell, type '# %% [markdown]'
# %%
import numpy as np
import matplotlib.pyplot as plt
import platform
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
# %%
# 25명 학생들의 수학성적
math = [76, 82, 84, 83, 90, 86, 85, 92, 72, 71, 100, 87, 81, 76, 94, 78, 81, 60, 79, 69, 74, 87, 82, 68, 79]
# %%
# 히스토그램 : 기본값 10개의 계급
plt.hist(math)
plt.show()
# %%
# 60에서 100까지 계급의 크기를 5간격으로 8개의 계급으로 나눠서 출력
plt.hist(math, bins=8) # 계급의 크기 bin=8
plt.xlabel('시험점수')
plt.ylabel('도수(frequency)')
plt.title('수학시험의 히스토그램')
plt.grid() # 격자 모양
plt.show()
4. 파이 그래프
- 파이(pie) 그래프는 원앆에 데이터의 각 항목이 차지하는 비율맊큼 부채꼴의 크기를 갖는 영역으로 이루어진 그래프이다.
- 파이 그래프는 젂체 데이터에서 각 항목이 차지핚 비율을 비교할 때 많이 사용핚다.
파이 그래프 형식
plt.pie(x [, labels = label_seq , #부채꼴에 출력되는 문자열
autopct = '%.1f', # 비율 표시 형식
shadow = False, # 그림자효과 True
explode = explode_seq, # 부채꼴부분이 원에서 돌출
counterclock = True, # 부채꼴이 그려지는 순서 기본값은 반시계방향(True) 혹은 False
startangle = 0 ]) # 처음 부채꼴부분이 그려지는 각도(기본값은 0, 3시방향시작)
# To add a new cell, type '# %%'
# To add a new markdown cell, type '# %% [markdown]'
# %%
import numpy as np
import matplotlib.pyplot as plt
import platform
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
# %%
fruit = ['사과', '바나나', '딸기', '오렌지', '포도']
result = [7, 6, 3, 2, 2]
# %%
# 1. 파이 그래프
plt.pie(result)
plt.show()
# %%
# 2. 파이 그래프 크기 설정
plt.figure(figsize=(5, 5))
plt.pie(result)
plt.show()
# %%
# 3. 라벨과 비율 설정
# '%.1f%%' -> 비율 설정, 소수첫째 자리에 '%' 붙여서
plt.figure(figsize=(5,5))
plt.pie(result,
labels=fruit,
autopct='%.1f%%')
plt.show()
# %%
# 4. 각도 90도에서 시작해서 시계방향으로 설정
plt.figure(figsize=(5,5))
plt.pie(result,
labels=fruit,
autopct='%.1f%%',
startangle=90,
counterclock=False)
plt.show()
# %%
# 5. 그림자 효과 추가하고 '사과' 부채꼴만 강조
explod_value = (0.1, 0, 0, 0.1, 0)
plt.figure(figsize=(5,5))
plt.pie(result,
labels=fruit,
autopct='%.1f%%',
startangle=90,
counterclock=False,
explode=explod_value,
shadow=True)
plt.show()