본문 바로가기
[업무 지식]/Seaborn

[FacetGrid] Overlapping densities (‘ridge plot’)

by 에디터 윤슬 2024. 11. 13.

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style="white", rc={"axes.facecolor": (0, 0, 0, 0)})


sns.set_theme(): Seaborn의 테마를 설정합니다. 여기서는 style="white"로 설정하여 배경을 흰색으로 지정하고, 
rc={"axes.facecolor": (0, 0, 0, 0)}로 축의 배경을 투명하게 설정합니다.

# Create the data
rs = np.random.RandomState(1979)
x = rs.randn(500)
g = np.tile(list("ABCDEFGHIJ"), 50)
df = pd.DataFrame(dict(x=x, g=g))
m = df.g.map(ord)
df["x"] += m
df


rs = np.random.RandomState(1979): 난수 생성기의 시드를 고정하여 실행할 때마다 동일한 결과를 얻도록 합니다.
x = rs.randn(500): 평균이 0이고 표준편차가 1인 정규 분포에서 난수를 500개 생성합니다.
g = np.tile(list("ABCDEFGHIJ"), 50): A부터 J까지의 알파벳을 반복하여 총 500개의 카테고리 데이터를 생성합니다.
df = pd.DataFrame(dict(x=x, g=g)): x와 g 데이터를 사용하여 데이터프레임을 생성합니다.
m = df.g.map(ord): 각 카테고리(g)를 ASCII 값으로 변환합니다.
df["x"] += m: 각 카테고리의 ASCII 값을 x 값에 더해 데이터에 변형을 가합니다. 이로 인해 각 카테고리의 데이터가 서로 다른 위치에 분포하게 됩니다.

python

  • FacetGrid 초기화 및 커널 밀도 추정 플롯 그리기
# Initialize the FacetGrid object
pal = sns.cubehelix_palette(10, rot=-.25, light=.7)
g = sns.FacetGrid(df, row="g", hue="g", aspect=15, height=.5, palette=pal)

sns.cubehelix_palette(): 색상 팔레트를 생성합니다. 여기서는 총 10개의 색상을 사용하며(10), 회전(rot=-.25)과 밝기(light=.7)를 조정합니다.
sns.FacetGrid(): FacetGrid는 여러 개의 서브플롯을 생성하는 객체입니다. 
여기서는 row="g"로 각 카테고리별로 행(row)을 나누어 플롯을 그립니다. 
hue="g"는 각 카테고리에 따라 색상을 다르게 지정하며, aspect=15, height=.5는 플롯의 크기를 설정합니다.
# Draw the densities in a few steps
g.map(sns.kdeplot, "x",
      bw_adjust=.5, clip_on=False,
      fill=True, alpha=1, linewidth=1.5)
g.map(sns.kdeplot, "x", clip_on=False, color="w", lw=2, bw_adjust=.5)

첫 번째 g.map(): 각 카테고리에 대해 커널 밀도 추정(KDE)을 그립니다.
bw_adjust=.5: KDE에서 대역폭을 조정하는 파라미터입니다. 값이 작을수록 더 세밀한 곡선을 그립니다.
fill=True: KDE 아래 영역을 색상으로 채웁니다.
두 번째 g.map(): 흰색 선(color="w")으로 외곽선을 추가하여 플롯을 더 명확하게 만듭니다.
  • 참조선 추가 및 레이블 설정
# passing color=None to refline() uses the hue mapping
g.refline(y=0, linewidth=2, linestyle="-", color=None, clip_on=False)

g.refline(): y축 값이 0인 위치에 참조선을 추가합니다. 
color=None은 카테고리에 따라 참조선의 색상을 다르게 지정하도록 합니다.
# Define and use a simple function to label the plot in axes coordinates
def label(x, color, label):
    ax = plt.gca()
    ax.text(0, .2, label, fontweight="bold", color=color,
            ha="left", va="center", transform=ax.transAxes)

g.map(label, "x")

레이블 함수 정의 및 적용: 각 플롯에 해당 카테고리(label)를 표시하는 함수입니다. 
ax.text()를 사용하여 텍스트를 추가하며, color=color로 해당 카테고리의 색상을 적용합니다.
  • 서브플롯 간격 조정 및 축 세부 사항 제거
# Set the subplots to overlap
g.figure.subplots_adjust(hspace=-.25)

# Remove axes details that don't play well with overlap
g.set_titles("")
g.set(yticks=[], ylabel="")
g.despine(bottom=True, left=True)

subplots_adjust(hspace=-.25): 서브플롯 간의 간격을 겹치도록 조정하여 시각적으로 연결된 느낌을 줍니다.
축 세부 사항 제거: y축 눈금과 레이블을 제거하고 불필요한 축 경계선을 없앱니다(despine()).

 

유사한 사용 데이터

  • 음악 장르별 음원 특성 분석:
    • 다양한 음악 장르(A~J)에 대해 음원의 특정 특성(예: 주파수 대역폭)을 분석할 때 사용할 수 있습니다. 각 장르마다 음원의 주파수 분포가 어떻게 다른지 KDE 플롯으로 시각화할 수 있습니다.
  • 소비자 유형별 구매 패턴 분석:
    • 여러 소비자 유형(A~J)에 대해 구매 금액 또는 구매 횟수 분포를 분석할 때 사용할 수 있습니다. 소비자 그룹별로 구매 패턴이 어떻게 다른지 KDE 플롯으로 시각화할 수 있습니다.
  • 유전자 발현 분석:
    • 여러 유전자 그룹(A~J)에 대한 발현 수준 데이터를 분석할 때 사용할 수 있습니다. 유전자 그룹별 발현 수준 분포를 KDE 플롯으로 시각화하여 비교할 수 있습니다.

요약

  • 이 코드는 Seaborn의 FacetGrid와 커널 밀도 추정(KDE)을 사용하여 여러 카테고리(A~J)의 데이터 분포를 시각화하는 방법을 보여줍니다. 실제 사례로는 음악 장르 분석이나 소비자 구매 패턴 분석 등 다양한 분야에서 활용될 수 있습니다.