주제

1.  matplotlib
2. 그래프 종류
3. Seaborn

 

 

Matplotlib

  • 데이터를 도식화할 수 있는 파이썬 라이브러리
  • matplotlib의 pyplot을 이용
  • plot() - 라인 그래프(default)
    • marker : 마커 종류 지정
    • linestyle : 라인 종류 설정
    • color : 선의 색상 설정
# 마커(marker)

# '.': point marker
# 'o': circle marker
# 'v': triangle_down marker
# '+': plus marker
# '*': star marker

plt.plot(np.arange(10), np.arange(10)*2 + 10, marker='.', markersize=10)

# 라인(line)

# '-': solid line style
# '--': dashed line style
# '-.': dash-dot line style
# ':': dotted line style

plt.plot(np.arange(10), np.arange(10)*2, marker='o', linestyle='')


# 컬러(color)

# 'b': blue
# 'g': green
# 'r': red
# 'c': cyan
# 'm': magenta
# 'y': yellow
# 'k': black
# 'w': white

# alpha를 통해 투명도를 조절할 수 있습니다.

plt.plot(np.arange(10), np.arange(10)*2 - 30, marker='*', linestyle=':', color='r', alpha=1.)
title() xlabel() ylabel() xtick() ytick() legend() xlim() ylim()
플롯의 제목 x축의 레이블 y축의 레이블 x tick 설정 y tick 설정 범례 설정 x 제한 설정 y 제한 설정

 

 

 

 

다양한 그래프 종류

 

산점도

  • scatter(x, y, s='점의 넓이', c='점의 색')
# Scatterplot: plt.scatter()
# x, y 좌표로 이뤄진 데이터들을 점으로 표현하는 plot입니다.

# s는 점의 넓이를 나타냅니다. 값이 커지면 당연히 넓이도 커집니다.

x = np.random.rand(50)
y = np.random.rand(50)
# 각 데이터점마다 class를 가지고 있는 경우, class를 color로도 표현할 수 있습니다.
colors = [0]*25 + [1]*25
area = x * y * 250
plt.scatter(x, y, s=area, c=colors)
plt.show()

산점도 플롯

 

 

막대 그래프

  • bar(x, y, align='정렬', color='색')
# Barplot: plt.bar()

x = ['Math', 'Programming', 'Data Science', 'Art', 'English', 'Physics']
y = [66, 80, 60, 50, 80, 10]

# plt.figure(figsize=(6, 3))
plt.bar(x, y, align='center', alpha=0.7, color='red')
plt.xticks(x)
plt.ylabel('Number of Students')
plt.title('Subjects')

plt.show()
  • barh() - bar 플롯의 xtick을 ytick으로 바꾼다
# Barhplot (축 변환): plt.barh()
# barh 함수에서는 xticks로 설정했던 부분을 yticks로 변경합니다.

x = ['Math', 'Programming', 'Data Science', 'Art', 'English', 'Physics']
y = [66, 80, 60, 50, 80, 10]

plt.barh(x, y, align='center', alpha=0.7, color='green')
plt.yticks(x)
plt.xlabel('Number of Students')
plt.title('Subjects')

plt.show()

 

 

 

히스토그램

  • hist() - 도수분포표를 그래프로 나타낸 것. 가로축은 변수값, 세로축은 빈도나 비율
    • bins : 막대 개수 조절
    • density=True : frequency 대신 density를 y축에 나타냄
N = 10000
bins = 30

x = np.random.randn(N)

plt.hist(x, bins=bins)

plt.show()

히스토그램

 

 

파이차트

  • 각 클래스 간의 비율을 보여주는 데 효과적인 그래프
  • pie()
    • explode : 파이에서 튀어져나온 비율
    • autopct : 퍼센트를 자동으로 표기
    • shadow : 그림자 표시
    • startangle : 파이를 그리기 시작할 각도
    • texts : 레이블에 대한 텍스트 효과
    • autotexts : 파이 위에 그려지는 텍스트 효과
labels = ['Samsung', 'Huawei', 'Apple', 'Xiaomi', 'Oppo', 'Etc']
sizes = [20.4, 13.0, 10.5, 9, 7.6, 37.6]
explode = (0.3, 0, 0, 0, 0, 0)

# texts, autotexts 인자를 활용하여 텍스트 스타일링을 적용
patches, texts, autotexts = plt.pie(sizes,
		explodes=explods,
		labels=labels,
		autopct='%.1f%%',
		shadow=True,
		startangle=90)

plt.title('Smartphone pie', fontsize=15)

파이 차트

 

 

 

Heatmap

  • 다양한 값을 갖는 숫자 데이터를 열분포 형태와 같이 색상을 이용해서 시각화한 것
  • 데이터의 빈도 분포를 보여주기에 적합
  • matshow() - 다양한 값을 갖는 숫자 데이터를 열분포 형태와 같이 색상을 이용해서 시각화한 것
    • cmap : 히트맵의 색 지정
arr = np.random.standard_normal((30, 40))

# 컬러별 종류 지정
cmap = plt.get_cmap('PiYG')
# cmap = plt.get_cmap('Greys')
# cmap = plt.get_cmap('BuGn')
# cmap = plt.get_cmap('bwr')

plt.matshow(arr, cmap=cmap)
plt.colorbar(shrink=0.8, aspect=10)

plt.show()

heatmap

 

 

 

Colormap

  • colorbar() - 그래프 영역에 컬러바 포함
  • 컬러맵을 간편하게 설정하기 위한 함수가 존재 : plasma(), jet(), autumn()
# 그래프 영역에 컬러바 포함
plt.colorbar()

plt.subplot(2, 2, 2)
plt.scatter(arr[2], arr[3], c=arr[3])
plt.plasma()
plt.title('plasma')
plt.colorbar()

 

 

 

그래프에 text 삽입하기

  • text(x, y, text, fontdict) - 그래프의 적절한 위치에 텍스트를 삽입
font1 = {
	'color': 'darkred',
	'weight': 'normal',
	'size': 16
}

plt.text(1.0, 0.35, 'np.random.randn()', fontdict=font1)

 

 

 

 

Subplot

  • subplots(행 개수, 열 개수) - 하나의 화면 안에 여러 플롯을 넣는다ㅏ
    • sharex, sharey=True : 축 공유
data = np.arange(1, 51)

# 밑 그림 : 2행 3열
fig, axes = plt.subplots(2,3)

axes[0, 0].plot(data)
axes[0, 1].plot(data * data)
axes[0, 2].plot(data ** 3)
axes[1, 0].plot(data % 10)
axes[1, 1].plot(-data)
axes[1, 2].plot(data // 20)

# axes

plt.tight_layout()
plt.show()


# sharex
plt.subplots(2, 2, sharex=True, sharey=True)

 

 

이중 y축 표시하기

  • twinx() - ax1과 x축을 공유하는 새로운 Axes 객체인 ax2를 만든다
plt.style.use('default')
plt.rcParams['figure.figsize'] = (4, 3)
plt.rcParams['font.size'] = 12

x = np.arange(0, 3)
y1 = x + 1
y2 = -x - 1

fig, ax1 = plt.subplots()
ax1.plot(x, y1, color='green')

# ax2 객체 생성
ax2 = ax1.twinx()
ax2.plot(x, y2, color='deeppink')

plt.show()

이중 y축

 

 

박스 플롯

  • boxplot() - 수치 데이터의 분포를 표현
    • notch=True : 중앙값의 95% 신뢰 구간을 노치 형태로 표시
  • subplots와 함께 사용하면 한 그림 안에 여러 박스플롯을 그릴 수 있다
# 샘플 데이터 생성
spread = np.random.rand(50) * 100
center = np.ones(25) * 50
filter_high = np.random.rand(10) * 100 + 100
filter_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, filter_high, filter_low))

# 기본 박스플롯 생성
plt.boxplot(data, notch=True)
plt.tight_layout()
plt.show()

박스플롯

 

 

 

Violinplot

  • 박스플롯에 kde 곡선을 같이 그린 형태, 조금 더 세밀한 분포 확인이 가능
  • violinplot()
    • quantiles 옵션을 이용하여 표시할 분위수를 조절할 수 있다
fig, ax = plt.subplots()

violin = ax.violinplot([data_a, data_b, data_c], showmeans=True, showextrema=True,
			# shoemedian=True,
			quantiles=[[0.25, 0.75], [0.1, 0.9], [0.3, 0.7]])

plt.show()

violin plot

 

 

 

 

Seaborn

  • 파이썬에서 통계 그래픽을 만들기 위한 라이브러리
  • matplotlib을 기반으로, 판다스 데이터 구조와 밀접하게 통합
  • 판다스 데이터 프레임과 직관적으로 연계되기 때문에 쉽고 빠르게 시각화가 가능
  • 3가지의 플롯군 :
    1. Replot (relational) : 2개 이상의 변수 간의 관계를 효과적으로 나타냄
    2. Displot (distributions) : 1개 이상의 변수 값의 분포를 효과적으로 나타냄
    3. Catplot (categorical) : 범주형 데이터의 분포를 효과적으로 나타냄

 

 

1. Replot

  • 데이터 세트의 변수가 서로 어떻게 연관되어 있는지, 이 관계가 다른 변수에 어떻게 의존하는지 이해하는 데 도움을 준다
    • scatter plot
    • line plot
  • 색상, 크기 및 스타일을 사용하여 최대 3개의 추가 변수를 사용할 수 있다
    • hue : 값들이 연속형이면 색이 palette 형태로 표현됨
    • size : sizes=(a,b) 옵션을 통해 점들의 크기를 조정

1. scatterplot

import seaborn as sns

tips = sns.load_dataset('tips')

# 둘 다 같은 결과를 냄 (replot을 그냥 쓰면 기본적으로 scatter 플롯이 나온다)
sns.replot(data=tips, x='total_bills', y='tip')
sns.scatterplot(data=tips, x='total_bills', y='tip')

sns.replot(data=tips, x='total_bills', y='tip', hue='smoker', style='time', size='size')

 

2. lineplot

  • 시간과 같이 지속성을 가진 변수와 다른 변수의 관계를 나타낼 때 효과적
  • x축 값 하나에 따른 y값이 다양한 값을 가질 수 있다
    • 이 때, 여러 값들을 모아서 평균선으로, 95% 신뢰구간을 색으로 표현한다
    • errorbar=None : 신뢰구간을 표현하지 않는다
    • errorbar='sd' : 표준편차의 범위로 표시
  • 변수가 많아지면 가시성이 떨어지기 때문에 여러 플롯으로 나눠서 분석하는 것이 효과적
    • col이나 row 인자를 사용하여 플롯들을 나누고, height를 통해서 플롯의 크기를 조절
dowjones = sns.load_dataset('dowjones')

sns.replot(data=dowjones, x='Date', y='Price', kind='line')
sns.lineplot(data=dowjones, x='Date', y='Price')

# col
sns.replot(x='total_bill', y='tip', hue='smoker', col='time', data=tips)

 

 

 

 

2. Displot

  • 변수 하나 혹은 두 개의 분포를 나타낼 때 해당 변수 값이 가지는 분포 및 범위를 효과적으로 확인할 수 있다

1. histogram

  • 기본적으로 displot을 사용하면 히스토그램을 그린다
    • binwidth, bins : 막대 너비 조절
    • discrete=True : 변수가 이산형일 경우, x축 값 중앙에 막대가 위치하도록 한다
    • shrink : 막대 간 공간 조절이 가능
    • hue : 추가 변수를 조건으로 한 분포를 시각화
    • 막대가 겹치는 경우 :
      • element=step
      • multiple=stack
      • multiple=dodge

왼쪽 : step, 오른쪽 : stack

  • colrow 사용 가능
sns.displot(penguins, x='flipper_length_mm', binwidth=3)

sns.displot(tips, x='size', discrete=True, shrink=.7)

 

2. kdeplot

  • 부드러운 곡선으로 이어진 분포 시각화
    • bw_adjust : 곡선을 세밀하게 혹은 더 부드럽게 표현
    • hue : 변수 간 분포를 더 세밀하게 시각화
    • fill=True : 곡선 아래 부분을 색칠
    • heatmap / contour : hue 대신 y에 2번째 변수를 넣어 여러 변수의 분포를 표현
  • y 변수를 추가해주면 contour plot을 그린다
    • thresh, levels : 선의 간격을 조절

3. joint plot

  • 2개의 변수 간 분포와 각 변수의 분포를 동시에 보여준다

jointplot의 예시

4. pair plot

  • 각 변수 간의 pairwise 관계를 시각화
  • 고려해야할 변수는 많은데 변수 간 상관관계 파악이 필요할 경우 유용

pairplot의 예시

 

 

3. Catplot

  • replot에서 다루고자 하는 변수가 이산형 혹은 categorical인 경우 사용
    • 범주형 산점도 : strip plot, swarm plot
    • 범주형 분포도 : box plot, violin plot
    • 범주형 추정도표 : bar plot, point plot
sns.catplot(data=tips, x='day', y='total_bill')

 

1. strip plot

  • 한쪽 변수가 카테고리컬 데이터인 산점도
  • 한 범주에 속하는 모든 점이 범주형 변수에 해당하는 축을 따라 동일한 위치에 있게 된다
    • jitter : 좌우로 퍼진 정도를 조절하거나 비활성화

 

2. swarm plot

  • 점들의 중첩을 방지하는 알고리즘을 사용하여 시각화
  • 상대적으로 데이터 수가 적은 경우에만 잘 작동, 관측치 분포를 더 잘 표현

 

3. boxenplot

  • 분위수를 더 자세하게 표시

 

4. point plot

  • categorical 변수에 따라 다른 변수가 어떻게 변화하는지 효과적으로 나타냄
  • 점 추정치 중심으로 95% 신뢰구간이 표현

+ Recent posts