본문 바로가기
Python

파이썬 seaborn - 기초문법

by 앵남(Andy) 2021. 9. 24.

글 개요

파이썬에서 시각화를 하려면 matplotlib 라이브러리 이외에 seaborn 라이브러리도 존재합니다. seaborn은 조금 더 이쁘게 그래프를 그릴 수 있게 도와줍니다. 

 

글 본문

일단, 그래프를 그려주기 위해서 numpy 라이브러리로 데이터를 생성하고 그래프를 그려보겠습니다. 

import numpy as np 
import matplotlib.pyplot as plt
import seaborn as sns 

# 마이너스 부호때문에 한글깨짐 현상을 막아주는 코드입니다.
plt.Params['axes.unicode_minus'] = False 

# 0 ~ 14사이 100개의 데이터를 만들어주는 코드입니다.
x = np.linspace(0, 14, 100)

y = np.sin(x)
y2 = 2* np.sin(x+0.5)
y3 = 3* np.sin(x+1.0)
y4 = 4* np.sin(x+1.5)


# 첫 번째로 matplotlib를 사용하여 시각화 를 해보겠습니다. 
plt.figure(figsize=(10,10))
# 실선 그래프를 그려주는 plot함수
# plot함수로 그리는 방법 1
plt.plot(x,y)
plt.plot(x,y1)
plt.plot(x,y2)
plt.plot(x,y3)
plt.plot(x,y4)
plt.show()
# plot 함수로 그리는 방법 2
plt.plot(x,y,x,y1,x,y2,x,y3,x,y4)
plt.show()

 

결과

plt.plot()함수도 이쁘게 그릴 수 있지만 seaborn 라이브러리를 사용하면 조금 더 이쁘게 그릴 수 있습니다. 

# 도화지 그림판 선택 1. white, whitegrid, dark, darkgrid
sns.set_style('darkgrid')
plt.figure(figsize=(10,10))
plt.plot(x,y,x,y1,x,y2,x,y3,x,y4)

결과

간단한 코드로 시각화 그림이 조금 더 이뻐졌습니다.

 

seaborn 라이브러리가 가지고 있는 데이터 불러오기

seaborn라이브러리는 기본적으로 몇개의 데이터를 가지고 있습니다. 첫 번째로 tips라는 데이터를 가지고와서 시각화를 더 연습해보겠습니다.

import seaborn as sns


tips = sns.load_dataset('tips')
tips
# 간단한 데이터프레임 정보 보기 
tips.info()

결과 1

 

결과 2

tips라는 데이터는 244개 데이터를 가지고 있고 카테고리컬 한 데이터는 4개 float 타입 데이터는 2개 정수형 데이터는 1개 정도 있는걸 볼 수 있습니다. 

 

위 데이터로 seaborn 라이브러리를 이용해서 시각화를 해보겠습니다.

 

Boxplot 함수 

boxplot함수는 데이터를 박스 형태로 표현할 수 있습니다. 

import matplotlib.pyplot as plt
import seaborn as sns


plt.figure(figsize=(10,10))
sns.boxplot(x= tips['total_bill'])
plt.show()

결과1

박스 안에 있는 선은 평균 값이 아닌 median 즉 중앙 값이라는 것입니다.  boxplot함수를 더 연습해보겠습니다. 

import matplotlib.pyplot as plt
import seaborn as sns


plt.figure(figsize=(10,10))
sns.boxplot(x= tips['day'], y= tips['total_bill'])
plt.show()

결과

보통 boxplot함수는 카테고리컬 한 데이터와 수치형 데이터와 같이 사용하는걸 볼 수 있습니다. x 축에 데이터는 카테고리 데이터고 y축은 수치형 데이터를 사용하는 것처럼요 ! 

 

boxplot함수는 hue라는 옵션과  plaette라는 옵션이 있습니다. hue라는 옵션에는 카테고리컬 변수를 넣어줘야합니다. 

import matplotlib.pyplot as plt 
import seaborn as sns

plt.figure(figsize=(10,10))
sns.boxplot(x = tips['day'], y = tips['total_bill'], hue=tips['smoker'], palette = 'Set1')

 

swarmplot 함수

swarmplot함수는 산점도 처럼 시각화를 할 수 있습니다. 보통 swarmplot은 boxplot이랑 같이 사용하면 데이터에 대한 이해가 더 잘될거같습니다.

import matpltlib.pyplot as plt
import seaborn as sns


plt.figure(figsize=(10,10))
sns.swarmplot(x = 'day', y = 'total_bill', data = tips, color = '0.5')
plt.show()

color 라는 옵션은 산점도의 색상을 결정하는 옵션입니다. 보통 0 ~ 1 사이값으로 넣어주셔야 합니다. 1에 가까울 수록 밝은 색상이 나옵니다. 

 

boxplot with swarmplot 함수 사용

boxplot 함수와 swarmplot를 같이 사용하는 것을 보여드리겠습니다. 

import matplotlib.pyplot as plt
import seaborn as sns



plt.figure(figsize=(10,10))
sns.boxplot(x = 'day', y = 'total_bill', data = tips)
sns.swarmplot(x = 'day', y = 'total_bill', data = tips, color='0.25')
plt.show()

lmplot 함수 

lmplot함수는 보통 데이터의 상관관계를 파악할 때 사용하는 함수입니다. 

import matplotlib.pyplot as plt
import seaborn as sns



sns.set_style('darkgrid')
sns.lmplot(x = 'total_bill', y = 'tip' data = tips, height = 7)

height라는 옵션은 plt.figure(figsize=(x,y)) 함수와 비슷합니다. 도화지의 크기를 결정합니다. 

 

lmplot()함수에서 hue옵션을 사용할 수 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns



sns.set_style('darkgrid')
sns.lmplot(x = 'total_bill', y = 'tip', data= tips, hue = 'smoker', height = 7)

 

heatmap 함수

heatmap 데이터의 경향을 파악할 수 있습니다.

일단, 저는 seaborn 라이브러리에 있는 데이터들중 flights라는 데이터를 가지고 heatmap으로 시각화를 해보겠습니다.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd


flights = sns.load_dataset('flights')
# 데이터 정보 파악
flights.info()

# pivot_table만들기
flights = pd.pivot_table(flights, index='month', columns = 'year', values='passengers')
flights.head()


plt.figure(figsize=(10,10))
sns.heatmap(data=flights, annot=True, fmt = 'd')
plt.show()

pivot_table
heatmap

sns.heatmap()함수의 annot= True 옵션은 시각화 안에 있는 숫자 즉 정수형들로 표시되어있는 숫자들을 보여줄건지 말건지를 정하는 옵션입니다. 그리고 fmt옵션은 이 숫자들을 정수형 타입으로 보여줄건지 실수형 타입으로 보여줄건지 선택할 수 있습니다. fmt = 'd' 정수형 fmt = 'f' 실수형입니다. 

 

 

pair plot 함수

pairplot 함수는 여러개의 데이터의 분포를 시각화해 볼 수 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset('iris')
sns.set_style('ticks')
sns.pairplot(iris)
plt.show()

여기서 hue옵션을 주면 데이터 경향을 더 자세하게 파악할 수 있습니다. 

import matplotlib.pyplot as plt
import seaborn as sns



sns.pairplot(iris, hue = 'speceies')
plt.show()

 

또한, 원하는 컬럼을 pairplot할 수 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns

sns.pairplot(iris, x_vars = ['sepal_width', 'sepal_height'],
				   y_vars = ['petal_width', 'petal_height'])
plt.show()

lmplot함수 더 다루기

import matplotlib.pyplot as plt
import seaborn as sns

anscombe = sns.load_dataset('anscombe')
sns.style('darkgrid')
sns.lmplot(x = 'x', y = 'y', data = anscombe.query('dataset==I'), ci = None, height = 7)
plt.show()

또한, 마커 크기를 조정할 수 있습니다. 

sns.set_style('darkgrid')
sns.lmplot(x= 'x', y = 'y', data = anscombe.query("dataset=='I'"),ci = None, height = 7, scatter_kws={'s':100}) # ci 옵션은 신뢰구간 선택
plt.show()

 

 

# order 옵션
sns.set_style('darkgrid')
sns.lmplot(x= 'x',
           y = 'y',
           data = anscombe.query("dataset=='II'"),
           order = 1,
           ci = None, 
           height = 7, 
           scatter_kws={'s':100}) # ci 옵션은 신뢰구간 선택
plt.show()

order option을 2번을 주면 curve을 줄 수 있습니다. 

# order 옵션
sns.set_style('darkgrid')
sns.lmplot(x= 'x',
           y = 'y',
           data = anscombe.query("dataset=='II'"),
           order = 2,
           ci = None, 
           height = 7, 
           scatter_kws={'s':100}) # ci 옵션은 신뢰구간 선택
plt.show()

 

outliner 때문에 직선이 제대로 그려지지 않을 수 있습니다. 그럴 때 robust = True를 사용해주면 직선을 보다 잘 그릴 수 있습니다.

# outliner 동떨어져있는 애들을 다루는 옵션
sns.set_style('darkgrid')
sns.lmplot(x= 'x',
           y = 'y',
           data = anscombe.query("dataset=='III'"),
           robust= True,
           ci = None, 
           height = 7, 
           scatter_kws={'s':80}) # ci 옵션은 신뢰구간 선택
plt.show()

 

혹시 robust 옵션이 적용이 안될 때  !pip install statsmodels를 설치해주시고 다시 실행해주시면 정상적으로 작동이 됩니다.!

'Python' 카테고리의 다른 글

파이썬 -folium 지도시각화  (0) 2021.09.29
Python - 진법  (0) 2021.09.27
pandas 기초정리-3  (0) 2021.09.23
파이썬 matplotlib 기초-2  (0) 2021.09.19
파이썬 matplotlib 기초  (0) 2021.09.18

댓글