Today I Learned

Seaborn 튜토리얼 공부(1)

by Holly Yoon

이번주엔 데이터 시각화를 중심으로 matplotlib, seaborn, plotly등을 배웠다. 강사님이 seaborn튜토리얼을 쭉 읽어보면서 공부해보면, 어떤 라이브러리를 쓰더라도 가장 중심이 되는 뼈대를 이해할 수 있다라고 추천해주셨다. 그래서 시작해본다! 

Introduction to seaborn

  • Seaborn은 파이썬에서 사용할 수 있는 통계 그래픽 라이브러리. matplotlib 기반으로 만들어졌다.
  • Seaborn 사용법
# seaborn 불러오기
import seaborn as sns

# 기본 테마를 세팅
sns.set_theme()

# 예제 데이터 불러오기
tips = sns.load_dataset("tips")

# 시각화 만들기
sns.relplot(
    data=tips,
    x="total_bill", y="tip", col="time",
    hue="smoker", style="smoker", size="size",
)
  • Seaborn 테마는 이 문서를 참고하여 바꿔볼 수 있다

 

Statistical Estimation

sns.lmplot(data=tips, x="total_bill", y="tip", col="time", hue="smoker")
  • lmplot()을 사용하면 선형회귀 모델을 활용하여 산점도(scatterplot)을 보강할 수 있다

Distributional Representations

  • 변수의 분포를 시각화할 수 있다. 히스토그램, KDE같은 계산법 기술도 지원한다.
sns.displot(data=tips, x="total_bill", col="time", kde=True)
  • KDE에 대한 자세한 설명은 이 블로그를 참고했다
    • 밀도추정이란 관측된 데이터의 분포로부터 원래 변수의 분포 특성을 추정하고자 하는 것
    • 통계에서 밀도는 일반적으로 확률밀도를 의미하며, 밀도를 추정한다는 것은 어떤 변수의 확률밀도함수를 추정한다는 것이다.
    • 확률밀도함수를 구한다면, 그 변수가 가질 수 있는 값의 범위 및 확률분포, 특성을 모두 알 수 있다.
    • 대부분의 현실세계에서는 분포 모델을 미리 알 수 없기에, 순수하게 관측된 데이터만으로 확률밀도를 추정하게 되는데, non-parametric밀도 추정의 가장 간단한 방법은 히스토그램이다.
    • 관측된 데이터로부터 히스토그램을 구해서 히스토그램을 정규화해서 확률밀도함수로 사용한다. 
    • 히스토그램은 경계의 불연속, bin크기 및 시작위치의 오차, 고차원 데이터에서는 메모리 문제로 인해 여러 painpoint가 있다.
    • KDE는 커널함수를 활용하여 히스토그램의 문제점을 해결한다.
    • 관측 데이터 값을 중심으로 커널 함수를 생성 -> 이렇게 생성된 함수를 더해 전체 갯수를 나누는 형태
    • KDE 통해 얻은 확률밀도함수는 히스토그램 확률밀도함수를 스무딩한 것으로   있다.

Plots for categorical data

  • 범주형 축을 두고 분포를 보여준다. 다양한 수준의 세분화를 제공한다 
sns.catplot(data=tips, kind="swarm", x="day", y="total_bill", hue="smoker")

Multivariate views on complex datasets

  • 정보요약을 제공하는 다양한 차트의 도표를 결합해서 보여줄 수 있다.
  • jointplot : 각 변수의 분포를 보여준다.
  • pairplot : 더 넓은 뷰를 보여주는데, 각 쌍에 대한 분포를 보여준다.

Opinionated defauls and flexible customaization

  • Seabron은 한번의 함수 호출에 완전한 그래프를 그려주는데, 입력된 label에 따라 자동적으로 그래프의 디자인을 적용하기도 한다. (ex, 범주형 변수의 hue는 다양한 색상이지만, 수치형 변수가 들어오면 gradient로 적용됨)
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)
sns.relplot(
    data=penguins,
    x="bill_length_mm", y="bill_depth_mm", hue="body_mass_g"
)

Relationship to matplotlib

  • matplotlib과 연동을 지원하기 때문에, matplotlib의 개념과 API에 대한 사전지식이 있다면, 커스터마이징이 가능하다.

블로그의 정보

Study Log by Holly

Holly Yoon

활동하기