본문 바로가기

Data_Analysis_Track_33/Python

Python_matplotlib_05(Seaborn)

Seaborn

  • matplotlib을 기반으로 다양한 테마와 그래프를 제공하는 파이썬 시각화 패키지.-
  • http://seaborn.pydata.org/
    • 공식 사이트의 gallary에 제공하는 다양한 그래프와 예제를 확인 할 수 있다.
  • 설치: 아나콘다에는 포함되있다.
pip install seaborn
conda install seaborn

 

데이터셋 준비 (tips.csv)

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

tips = pd.read_csv('data/tips.csv')
tips.shape

 

warning이 자주 떠서 보기가 싫다면 아래 코드 실행

# warnings 무시
import warnings
warnings.filterwarnings(action = 'ignore')

1. rugplot, kdeplot, displot

- 1차원 연속형 값들의 분포를 시각화 하는 그래프

 

  • 1.1.1. rugplot
  • 각 데이터들의 위치를 보여준다.

 

sns.rugplot(x = 'total_bill', data = tips) # 값(x)='컬럼명', data=DataFrame
plt.title('Total hill의 rugplot')

  • 1.1.2. kdeplot
  • 히스토그램을 부드러운 곡선 형태로 표현한다.
  • KDE(Kernel Density Estimation) : 확률밀도추정

 

sns.kdeplot(data = tips, x='total_bill')

plt.show()

  • 1.2. displot()
  • 히스토그램을 기준으로 rugplot, kdeplot을 같이 그릴 수 있다.

 

sns.displot(data = tips
            ,x = 'total_bill'
            ,bins = 30
            ,rug=True
            ,kde=True
           )
plt.show()

 

# tips.groupby('smoker')['total_bill']
sns.displot(x = 'total_bill', hue = 'smoker', bins = 30, data = tips)
# tips 데이터프레임의 total_bill 컬럼의 히스토그램을 smoker 컬럼의 값별로 다른색으로 그린다.

  • boxplot(), violinplot(), swamplot()
  • 연속형 데이터(양적데이터)들의 분포를 확인하는 그래프를 그린다.
  • 범주별로 연속형 데이터의 분포를 비교할 수 있다.

 

  • 1.3.1. boxplot

 

plt.figure(figsize = (15, 7))
plt.subplot(1, 2, 1)
sns.boxplot(data = tips
           ,x = 'tip'
           )
plt.title('값을 x축에 위치')
plt.subplot(1, 2, 2)
sns.boxplot(data = tips
           ,y = 'tip'
           )
plt.title('값을 y축에 위치')
plt.show()

 

범주형 컬럼 smoker를 Yes인 값과 No인 값으로 나누고 성별 남과 여인 값으로 나눠서 total_bill을 확인

1차 : smoker로 나눈다, 2차 : sex로 나눈다. -> boxplot을 그린다.

fig = plt.figure(figsize = (10, 4))
ax1 = fig.add_subplot(1, 2, 1)
sns.boxplot(data = tips
            ,x = 'total_bill'
            ,y = 'smoker'
            ,ax = ax1    # ax = ax1 : 그래프를 그릴 axes(subplot) 객체를 지정
           )
ax2 = fig.add_subplot(1, 2, 2)
# 흡연 여부로 분리 -> 성별로 분리 : 4가지로 분리된다.
sns.boxplot(data = tips
            ,y = 'total_bill' # 그래프를 그릴 연속형 컬럼을 y축으로 지정
            ,x = 'smoker'     # 나눠서 그릴 범주형 컬럼을 x축으로 지정 -> 값이 yes인 것과 no인 것으로 나눠서 그린다.
            ,hue = 'sex'      # 성별에 따라서 다시 나눈다.
            ,whis = 3         # 정상범위 밖의 값을 계산할 때 사용하는 whis값 설정.(기본 : 1.5)
            ,ax = ax2
           )
plt.legend(bbox_to_anchor = (1, 1), loc = 'upper left')
plt.show()

  • 1.3.2. violin plot
  • boxplot 위에 분포 밀도(kernel density)를 좌우 대칭으로 덮어쓰는 방식으로 데이터의 분포를 표현하므로 boxplot 보다 좀더 정확한 데이터의 분포를 볼 수 있다.
  • 매개변수는 boxplot과 동일

 

plt.figure(figsize=(13, 5))
plt.subplot(1, 2 ,1)
sns.violinplot(data = tips
               ,x = 'tip'
              )
plt.subplot(1, 2, 2)
sns.violinplot(data = tips
               ,y = 'tip'
               ,x = 'smoker'
               ,hue = "day"
              )
plt.legend(bbox_to_anchor=(1,1), loc='upper left')
plt.show()

  • 1.3.3. swarmplot
  • 실제 값들을 점으로 찍어 준다.
  • boxplot이나 violin plot의 보안해주는 역할로 쓰인다.
  • swarmplot은 가운데 분류를 기준으로 분포시키는데 실제 값이 있는 위치에 점을 찍으므로 좀더 정확하게 값이 어디에 있는지 알 수 있다.

 

plt.subplot(1, 2, 1)
sns.swarmplot(data = tips
              ,x = 'tip'
             )
plt.subplot(1, 2, 2)
sns.swarmplot(data = tips
              ,y = 'tip'
             )

plt.show()

 

sns.boxplot(data = tips
            ,y = 'tip'
           )
sns.swarmplot(data = tips
              ,y = 'tip'
              ,color = 'black'  
              ,alpha = 0.5
             )
plt.show()

  • 1.3.4. countplot()
  • 막대그래프(bar plot)을 그리는 함수
  • 범주형 변수의 고유값의 개수를 표시
  • matplotlib의 bar()

 

v = tips.smoker.value_counts() # 직접 수량을 세서 그린다.
plt.bar(v.index, v)
v.plot(kind = 'bar')

 

plt.figure(figsize = (10, 10))
plt.subplot(1, 2, 1)
# x축에 지정 -> 수직막대그래프
sns.countplot(data = tips
              ,x = 'day'  # 범주형 컬럼을 지정 -> 범주값(고유값) 별로 개수를 세서 막대그래프를 그린다.
             )

# y축에 지정 -> 수평 막대 그래프
plt.subplot(1, 2, 2)
sns.countplot(data = tips
              ,y = 'day'
             )
plt.tight_layout()
plt.show()

 

dodge = True(default값), False -> 누적막대그래프로 변환

sns.countplot(data = tips
              ,x = 'day'
              ,hue = 'smoker' # hue에 지정한 컬럼의 값 별로 나눠서 그린다.
              ,dodge = False # dodge = False -> 누적막대그래프로 변환
              ,alpha = 0.5
             )
plt.show()

  • scatterplot, lmplot, jointplot, pairplot
  • 산점도를 그린다.

 

 

팔레트 설정 및 색 순서 조회

# 팔레트 설정 -> 프로그램 시작부분에서 설정
sns.set_palette('Set1')

# 현재 팔레트의 색 순서 -> color brewer 로 검색
sns.color_palette()

 

scatterplot 그리기

sns.scatterplot(data = tips
                ,x = 'total_bill'
                ,y = 'tip'
               )
plt.show()

 

hue = '컬럼명' -> 컬럼명 기준으로 나눠서 그린다.

sns.scatterplot(data = tips
                ,x = 'total_bill'
                ,y = 'tip'
                ,hue = 'smoker' # somker 컬럼 기준으로 나눠서 그린다.
                ,palette = 'pastel' # 이 그래프에서 사용할 palette를 지정
               )
plt.show()

  • 1.4.2. lmplot()
  • 선형회귀 적합선을 포함한 산점도를 그린다.

 

# 상관계수 확인
tips[['total_bill', 'tip']].corr()

 

lmplot : 그림의 선은 회귀선을 의미한다. 선의 배경색으로 칠해져 있는 부분도 맞는 범위이다.

sns.lmplot(data = tips
                ,x = 'total_bill'
                ,y = 'tip'
               )
plt.show()

 

hue로 smoker 컬럼의 값을 기준으로 나누어서 두 개의 회귀선을 그린다.

sns.lmplot(data = tips
                ,x = 'total_bill'
                ,y = 'tip'
                ,hue = 'smoker'
               )
plt.show()

  • 1.4.3. jointplot()
  • scatter plot 과 각 변수의 히스토그램을 같이 그린다.
  • pandas DataFrame만 사용할 수 있다.
  • DataFrame

 

컬럼 개별적인 분포(히스토그램)를 확인할 수 있다.

sns.jointplot(data = tips
              ,x = 'total_bill'
              ,y = 'tip'
             )
plt.show()

 

hue로 나눌 경우 개별적인 분포(히스토그램이) kdeplot으로 바뀐다.

# hue로 나눠서 그릴 경우 히스토그램이 kdeplot으로 변경된다.
sns.jointplot(data = tips
              ,x = 'total_bill'
              ,y = 'tip'
              ,hue = 'smoker'
             )
plt.show()

  • 1.4.4. pairplot
  • 다변수(다차원) 데이터들 간의 산점도를 보여준다.
  • 데이터프레임을 인수로 받아 그리드(grid) 형태로 각 변수간의 산점도를 그린다. 같은 변수가 만나는 대각선 영역에는 해당 데이터의 히스토그램을 그린다.

 

# 같은 컬럼에 대한 경우 히스토그램, 다른 컬럼에 대한 경우 산점도
sns.pairplot(tips) # dataframe을 전달. 각 컬럼(변수) 끼리의 산점도를 그림
plt.show()

  • 1.4.5. heatmap()
  • 값들에 비례해서 색깔을 다르게 해 2차원 자료로 시각화

 

diamonds.csv 파일의 연속형 값들의 관계의 상관계수 확인

dia = pd.read_csv('data/diamonds.csv')
cor = dia.corr(numeric_only = True)
cor

 

cor값을 히트맵으로 표현

# 2차원 데이터셋 (DataFrame)
sns.heatmap(cor
            ,annot = True # 히트맵 각각의 값 확인
            ,cmap = 'Blues'
           ) 
plt.show()

  • 1.4.6. lineplot
  • 선그래프
  • 시간의 흐름에 따른 값의 변화를 보여주는데 유용하다. (시계열 데이터)

 

데이터셋 준비

# 계절을 인덱스로 빼고 행과 열 뒤바꿈
df = pd.read_excel('data/강수량.xlsx')
df.set_index('계절', inplace = True)
df = df.T
df

 

plot()에 label 선언하지 않고 legend()에서 각각의 그래프 이름 부여

sns.lineplot(data = df
             ,x = df.index
             ,y = '봄'
            )
sns.lineplot(data = df
             ,x = df.index
             ,y = '겨울'
            )
plt.ylabel('강수량')
plt.legend(['봄', '겨울'], title = '강수량')
plt.show()

 

모든 컬럼에 대한 lineplot() 그리기

plt.figure(figsize = (10, 3))
sns.lineplot(data = df)
# index : x축, y : 컬럼별로 선그래프를 그림.
plt.legend(bbox_to_anchor = (1, 1), loc = 'upper left')
plt.show()