STUDY

[Seaborn Tutorial] An introduction to seaborn

moru_xz 2023. 2. 8. 22:47

An introduction to seaborn

import seaborn as sns
# 테마 기본값
sns.set_theme
>> <function seaborn.rcmod.set_theme(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=True, rc=None)>
# 데이터 로드
tips = sns.load_dataset('tips')
tips

sns.relplot(data = tips, x = 'total_bill', y = 'tip')

sns.relplot(data = tips, x = 'total_bill', y = 'tip',
           col = 'time')

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

  • hue : 색을 통한 의미 구분
sns.relplot(data = tips, x = 'total_bill', y = 'tip',
           col = 'time', hue = 'smoker', style = 'smoker')

sns.relplot(data = tips, x = 'total_bill', y = 'tip',
           col = 'time', hue = 'smoker', style = 'smoker', size = 'size')

  • matplotlib을 이용해서 Plot을 그림
  • interactive
  • jupyter나 IPython 인터페이스에서 사용하는 것이 아니면 matplotlib.pyplot.show()을 해야 플롯을 볼 수 있음
  • load_dataset()통해서 example데이터 불러올 수 있음
  • pandas.read_csv()통해서도 데이터 불러올 수 있음

A high-level API for statistical graphics

  • .replot()
  • 'kind' parameter 통해 scatter과 line으로 바꿀 수 있음 (scatter가 default)
  • 시간 나타내는 관계는 line 사용
dots = sns.load_dataset('dots')
dots

sns.relplot(data = dots)

sns.relplot(data = dots, kind = 'line', x = 'time', y = 'firing_rate',
           col = 'align', hue = 'choice', size = 'coherence')

sns.relplot(data = dots, kind = 'line', x = 'time', y = 'firing_rate',
           col = 'align', hue = 'choice', size = 'coherence',
           style = 'choice')

  • style = 'choice' 선 모양
sns.relplot(data = dots, kind = 'line', x = 'time', y = 'firing_rate',
           col = 'align', hue = 'choice', size = 'coherence',
           style = 'choice', facet_kws=dict(sharex=False),)

  • kind : 그래프 종류
  • hue : 범주형 데이터에만 사용
  • facet_kws=dict(sharex=False) : x축과 y축을 보기 좋게 범위 설정
sns.relplot(data = dots, kind = 'line', x = 'time', y = 'firing_rate',
           col = 'align', hue = 'choice', size = 'coherence',
           style = 'choice', facet_kws=dict(sharex=False)) ;

Statistical estimation

fmri = sns.load_dataset('fmri')
fmri

sns.relplot(data = fmri, kind = 'line', 
           x = 'timepoint', y = 'signal',
           col = 'region', hue = 'event', style = 'event')

  • 복잡한 데이터셋은 x축에 따른 y값으로 하나가 아닌 다양한 값을 가지고 있음
  • 이때 seaborn은 x값에 따라 나타난 다양한 값 모아서 평균을 낸 값을 선으로 연결
  • 평균으로부터 95%의 신뢰구간을 색으로 표현
  • 이 신뢰구간 bootstrrapping기법으로 계산 -> 데이터 크면 이게 시간 많이 잡아먹어서 이거 끄는 방법도 ok
  • scatterplot에 linear regression model(선형회귀 모델) 사용하면 기술통계를 넘을 수 있다. (더 성능이 좋다? 이런, 더 다양하게 볼 수 있는?) -> lmplot()
tips

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

Distriutional representations

  • 통계적 분석을 위해서는 데이터셋에 대한 확률변수를 알아야 함
  • displot()은 분포의 시각화에 도움을 준다.
  • KDE(커널 밀도 추정)
sns.displot(data = tips, x = 'total_bill', col = 'time')

sns.displot(data=tips, x="total_bill", col="time", kde=True)
# histogram을 smoothing한 (kde)

sns.displot(data=tips, kind="ecdf", x="total_bill", col="time", hue="smoker")

sns.displot(data=tips, kind="ecdf", x="total_bill", col="time", hue="smoker", rug=True)

  • kind = ecdf는 경험적 누적분포 함수
  • n개의 데이터 포인트 각각에서 1/n 씩 점프하는 계단 함수
  • rug = True : 러그플롯, 모든 데이터 포인트를 축 위에 작은 선분으로 나타내는 것, 선분그래츠의 각 선분은 실제 데이터들의 위치

Plots for categorical data (범주형 데이터)

  • replot() 안에 산점도 방식과 선 그래프방식이 있는 것 처럼 범주형 변수를 시각화 하는 방식에도 두 가지 방식
  • catplot()로 통일되어 있는 API는 kind 통해 표현
tips

sns.catplot(data = tips, kind ='swarm', x = 'day', y ='total_bill', hue = 'smoker')

sns.catplot(data=tips, kind="violin", x="day", y="total_bill", hue="smoker", split=True)

  • kde 표현도 가능
  • 수염상자그림과 kde 혼합해 분포 묘사
sns.catplot(data=tips, kind="violin", x="day", y="total_bill", hue="smoker")

  • split=True 면 하나로 !
sns.catplot(data=tips, kind="bar", x="day", y="total_bill", hue="smoker")

Multivariate views on complex datasets

  • jointplot() 은 single relationship
penguins = sns.load_dataset("penguins")
sns.jointplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", hue="species")

  • pairplot()은 더 넓은 관점에서
sns.pairplot(data=penguins, hue="species")

  • 단일관계에 대해 표현, 두 변수간의 합동 분포를 각 변수 주변 분표에 표시

Lower-level tools for building figures

g = sns.PairGrid(penguins, hue="species", corner=True)
g.map_lower(sns.kdeplot, hue=None, levels=5, color=".2")
g.map_lower(sns.scatterplot, marker="+")
g.map_diag(sns.histplot, element="step", linewidth=0, kde=True)
g.add_legend(frameon=True)
g.legend.set_bbox_to_anchor((.61, .6))

  • corner = True 중복 반 날리기

Opinionated defaults and flexible customization

  • 단일 함수로 호출해서 완전한 그래픽(?) 생성 가능
  • hue가 수치데이터면 연속적인 그라데이션으로 -> 아니면 그냥 파랑! 초록! 주황!
sns.relplot(
    data=penguins,
    x="bill_length_mm", y="bill_depth_mm", hue="island"
)

sns.relplot(
    data=penguins,
    x="bill_length_mm", y="bill_depth_mm", hue="body_mass_g"
)

  • seaborn은 customization 가능
  • 표준화 된 parameter가 있지만 사용자가 수정 가능
  • matplotlib 사용해서 컨트롤 가능
sns.set_theme(style="ticks", font_scale=1.25)
g = sns.relplot(
    data=penguins,
    x="bill_length_mm", y="bill_depth_mm", hue="body_mass_g",
    palette="crest", marker="x", s=100,
)
g.set_axis_labels("Bill length (mm)", "Bill depth (mm)", labelpad=10)
g.legend.set_title("Body mass (g)")
g.figure.set_size_inches(6.5, 4.5)
g.ax.margins(.15)
g.despine(trim=True)

Relationship to matplotlib

  • Seaborn 기능만을 사용하여 생산성을 높일 수 있지만, 그래픽의 전체 사용자 지정에는 matplotlib의 개념과 API에 대한 지식이 필요
  • Matplotlib은 포괄적이고 강력한 API를 가지고 있으며, 그림의 속성을 원하는 대로 변경할 수 있음

'STUDY' 카테고리의 다른 글

[DACON] Data Leakage  (0) 2023.04.03
[A/B Testing] Overview of A/B Testing  (0) 2023.03.21
[Python] Numpy (배열 연산 / 배열 입출력)  (0) 2023.02.12
[Python] Numpy (배열 조회 / 배열 변환)  (0) 2023.02.12
[Python] Numpy(배열 생성)  (0) 2023.02.12