코딩하는 타코야끼

[Matplotlib] 5강_Seaborn 본문

[T.I.L] : Today I Learned/Matplotlib

[Matplotlib] 5강_Seaborn

가스오부시 2023. 5. 13. 03:53
728x90
반응형
728x90

Seaborn

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

!pip install seaborn # seaborn 설치
import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')
print(type(tips))
tips


📍 rugplot( ), kdeplot( ), displot( )

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

🌓  rugplot( )

  • 각 데이터들의 위치를 보여준다.
plt.figure(figsize = (4,3))

# sns.rugplot(tips['total_bill'],alpha = 0.5)
sns.rugplot(data = tips, x = 'total_bill') # data: DataFrame 지정. x='컬럼명'
plt.title('Total bill의 분포')
plt.show()

🌓  kdeplot( )

  • 히스토그램을 부드러운 곡선 형태로 표현한다.
  • KDE(Kernel Density Estimation) : 확률밀도추정
# sns.kdeplot(tips['total_bill'])
sns.kdeplot(x = 'total_bill', data = tips)
plt.show()

🌓  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(data = tips, x = 'total_bill', hue = 'smoker')
plt.show()


📍 boxplot( ), violinplot( ), swamplot( )

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

🌓  boxplot( )

fig = plt.figure(figsize = (8,4))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)

# x(y): 연속형, y(x): 범주형
sns.boxplot(x = 'total_bill',
                y = 'smoker',hue = 'sex',
                 data = tips, ax = ax1)

sns.boxplot(y = 'tip', x = 'smoker', hue = 'time', data = tips, ax = ax2)

ax1.legend(bbox_to_anchor=(0,1.05), loc = 'upper right', title='sex')
plt.show()

🌓  violin plot( )

  • boxplot 위에 분포 밀도(kernel density)를 좌우 대칭으로 덮어쓰는 방식으로 데이터의 분포를 표현하므로 boxplot 보다 좀더 정확한 데이터의 분포를 볼 수 있다.
  • 매개변수는 boxplot과 동일
plt.figure(figsize = (10,5)) # 1분위부터 2분위까지의 값이 좀 크고 2분위 이후로는 조금씩 값이 떨어지고 잇다.
plt.subplot(1, 2, 1)
sns.violinplot(data = tips, x = 'tip')

plt.subplot(1, 2, 2)
sns.violinplot(data = tips, y = 'tip',   # y: 연속형, x: 범주형
               x = 'day',  
               hue = 'smoker') 
plt.show()

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

🌓  swarmplot( )

  • 실제 값들을 점으로 찍어 준다.
  • boxplot이나 violin plot의 보안해주는 역할로 쓰인다.
  • swarmplot은 가운데 분류를 기준으로 분포시키는데 실제 값이 있는 위치에 점을 찍으므로 좀더 정확하게 값이 어디에 있는지 알 수 있다.
plt.figure(figsize = (10,7))
plt.subplot(1, 2, 1)
sns.boxplot(y='tip', data = tips)
sns.swarmplot(y = 'tip', data = tips, color = 'black')   # swamplot은 boxplot과 함께 나온다 , 보통 혼자 나오지 않는다.
                                                        

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

plt.show()

🌓  countplot( )

  • 막대그래프(bar plot)을 그리는 함수
  • 범주형 변수의 고유값의 개수를 표시
  • matplotlib의 bar()
sns.countplot(data = tips, x = 'day')
plt.show()

sns.countplot(data = tips, y = 'day')
plt.show()

# 흡연 / 비흡연자 개수 요일별로 나눠서 시각화
sns.countplot( x = 'smoker', hue = 'day', data = tips,
             dodge = False, # 수평 누적막대 여부 : 기본- True
             alpha = 0.3)
plt.show()


📍 scatterplot( ), lmplot( ), jointplot( ), pairplot( )

  • 산점도를 그린다.

🌓  scatterplot( )

팔레트 - https://seaborn.pydata.org/tutorial/color_palettes.html#palette-tutorial

sns.set_palette('Set1') # 맨 먼저 적용하면 전체 적용 가능.
sns.scatterplot(data = tips, x = 'total_bill', y = 'tip', alpha = 0.5)
plt.show()

sns.scatterplot(data = tips, x = 'total_bill',
                y = 'tip', hue = 'smoker') # smoker 별로
               # palette = 'Set1')
plt.show()

🌓  lmplot( )

  • 선형회귀 적합선을 포함한 산점도를 그린다.
  • 과거데이터 기반으로 미래를 예측하다
  • 투명한 부분은 이 데이터의 오차이다.
sns.lmplot(data = tips, x = 'total_bill',
           y = 'tip', hue = 'smoker')
plt.show()

🌓  jointplot( )

  • scatter plot 과 각 변수의 히스토그램을 같이 그린다.
  • pandas DataFrame만 사용할 수 있다.
  • DataFrame
sns.jointplot(data = tips, x = 'total_bill', y = 'tip',
             height = 4)
plt.show()

🌓  pairplot( )

  • 다변수(다차원) 데이터들 간의 산점도를 보여준다.
  • 데이터프레임을 인수로 받아 그리드(grid) 형태로 각 변수간의 산점도를 그린다. 같은 변수가 만나는 대각선 영역에는 해당 데이터의 히스토그램을 그린다.
  • 수치형 데이터만 표시한다.
  • 같은 컬럼 끼리는 히스토그램으로 나타낸다.
  • 다른 컬럼 끼리는 선점도를 나타낸다.
sns.pairplot(tips)
plt.show()


📍 heatmap(), lineplot( )

🌓  heatmap( )

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

sns.heatmap(tips[['total_bill','tip','size']].corr(),
           annot = True, # annot = True 는 값 표현.
           fmt = '.3f') # 소수점 3자리수 까지 표현.
plt.show()

🌓  lineplot( )

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

index = pd.date_range('2023/01/01', freq = 'MS', periods = 10 )
values = np.random.randint(1, 100, size = (10,3))
df = pd.DataFrame(values, index = index, columns = ['no1', 'no2', 'no3'])
df

plt.figure(figsize = (10,3))
sns.lineplot(data = df, y = 'no1', x = df.index)
sns.lineplot(data = df, y = 'no2', x = df.index)
sns.lineplot(data = df, y = 'no3', x = df.index)

plt.legend(['NO1','NO2','NO3'],bbox_to_anchor = (1,1), loc = 'upper left')
plt.show()

df['cate'] = ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'C']
df

sns.lineplot(data = df, x = df.index, y = 'no1', hue = 'cate')
plt.legend(bbox_to_anchor = (1,1), loc = 'upper left')
plt.show()

 

반응형