Skip to content
주제
Seaborn
Seaborn 히스토그램: Python에서 분포 플롯 만들기

Seaborn 히스토그램: Python에서 분포 플롯 만들기

Updated on

데이터의 분포를 이해하는 것은 통계 분석과 의사 결정에 매우 중요합니다. 그러나 많은 데이터 전문가들은 패턴과 이상값을 드러내는 명확하고 유익한 분포 플롯을 만드는 데 어려움을 겪습니다. 일반 플로팅 도구는 종종 광범위한 사용자 정의가 필요하고 시각적으로 매력적이지 않은 결과를 생성합니다.

Seaborn의 히스토그램 함수는 최소한의 코드로 아름다운 분포 플롯을 만들기 위한 고수준 인터페이스를 제공하여 이 문제를 해결합니다. 라이브러리는 빈 크기, 색상 및 스타일링에 대한 적절한 기본값을 자동으로 선택하면서 필요할 때 세밀한 제어를 제공합니다.

이 가이드는 기본 플롯부터 고급 사용자 정의 기술까지 seaborn에서 히스토그램을 마스터하는 데 필요한 모든 것을 다룹니다. sns.histplot()sns.displot() 사용 방법, 비닝 전략 제어, KDE 곡선 오버레이, 여러 분포 비교 및 일반적인 함정 피하기를 배웁니다.

📚

히스토그램이란?

히스토그램은 데이터 범위를 빈으로 나누고 각 빈의 관측값 수를 계산하여 연속 변수의 분포를 표시합니다. 각 막대의 높이는 해당 빈 범위 내 데이터 포인트의 빈도 또는 밀도를 나타냅니다.

히스토그램은 다음을 식별하는 데 도움이 됩니다:

  • 중심 경향성(대부분의 값이 군집되는 위치)
  • 데이터의 확산 및 변동성
  • 왜도 및 이상값
  • 다봉 분포(여러 피크)

Seaborn은 히스토그램을 만들기 위한 두 가지 주요 함수를 제공합니다: 축 수준 플롯용 histplot()과 자동 패싯화 지원이 있는 그림 수준 플롯용 displot()입니다.

sns.histplot()을 사용한 기본 히스토그램

histplot() 함수는 seaborn에서 히스토그램을 만들기 위한 주요 도구입니다. 강력한 사용자 정의 옵션을 갖춘 간단한 인터페이스를 제공합니다.

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
 
# 샘플 데이터 생성
np.random.seed(42)
data = np.random.normal(100, 15, 1000)
 
# 기본 히스토그램 생성
sns.histplot(data=data)
plt.title('기본 Seaborn 히스토그램')
plt.xlabel('값')
plt.ylabel('카운트')
plt.show()

이것은 세부 사항과 노이즈의 균형을 맞추는 Freedman-Diaconis 규칙을 기반으로 자동으로 결정된 빈 크기로 히스토그램을 생성합니다.

DataFrame의 데이터의 경우:

import pandas as pd
 
# DataFrame 생성
df = pd.DataFrame({
    'values': np.random.normal(100, 15, 1000),
    'category': np.random.choice(['A', 'B', 'C'], 1000)
})
 
# DataFrame에서 히스토그램 플롯
sns.histplot(data=df, x='values')
plt.show()

빈 제어: 크기, 수 및 범위

빈 선택은 히스토그램이 패턴을 드러내는 방식에 극적인 영향을 미칩니다. 빈이 너무 적으면 분포가 지나치게 단순화되고, 빈이 너무 많으면 노이즈가 생성됩니다.

빈 수 지정

# 30개의 빈으로 히스토그램 생성
sns.histplot(data=data, bins=30)
plt.title('30개 빈이 있는 히스토그램')
plt.show()

빈 너비 설정

# 특정 빈 너비 설정
sns.histplot(data=data, binwidth=5)
plt.title('빈 너비 = 5인 히스토그램')
plt.show()

빈 경계 정의

# 사용자 정의 빈 경계
bin_edges = [70, 80, 90, 100, 110, 120, 130]
sns.histplot(data=data, bins=bin_edges)
plt.title('사용자 정의 빈 경계가 있는 히스토그램')
plt.show()

빈 범위 제어

# 히스토그램 범위 제한
sns.histplot(data=data, binrange=(80, 120))
plt.title('제한된 범위의 히스토그램(80-120)')
plt.show()

KDE 오버레이 추가

커널 밀도 추정(KDE)은 확률 밀도 함수의 부드러운 추정을 제공하여 분포의 전체적인 모양을 볼 수 있도록 도와줍니다.

# KDE 오버레이가 있는 히스토그램
sns.histplot(data=data, kde=True)
plt.title('KDE 오버레이가 있는 히스토그램')
plt.show()

KDE 곡선만 표시할 수도 있습니다:

# KDE만 (히스토그램 막대 없음)
sns.kdeplot(data=data)
plt.title('KDE 곡선만')
plt.show()

또는 여러 시각화를 결합할 수 있습니다:

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
 
# 히스토그램만
sns.histplot(data=data, ax=axes[0])
axes[0].set_title('히스토그램만')
 
# KDE만
sns.kdeplot(data=data, ax=axes[1])
axes[1].set_title('KDE만')
 
# 둘 다 결합
sns.histplot(data=data, kde=True, ax=axes[2])
axes[2].set_title('히스토그램 + KDE')
 
plt.tight_layout()
plt.show()

stat 매개변수 이해

stat 매개변수는 각 빈에 대해 계산되는 통계를 제어하며 y축 해석에 영향을 줍니다.

stat 값설명사용 사례
count관측값 수(기본값)절대 빈도 표시
frequencycount와 동일count의 대체 이름
density면적이 1이 되도록 정규화다른 샘플 크기의 분포 비교
probability높이의 합이 1이 되도록 정규화빈의 확률 표시
percent백분율로서의 확률확률보다 직관적
fig, axes = plt.subplots(2, 3, figsize=(15, 8))
 
stats = ['count', 'frequency', 'density', 'probability', 'percent']
 
for idx, stat_type in enumerate(stats):
    ax = axes[idx // 3, idx % 3]
    sns.histplot(data=data, stat=stat_type, kde=True, ax=ax)
    ax.set_title(f'stat="{stat_type}"')
 
# 추가 서브플롯 제거
fig.delaxes(axes[1, 2])
 
plt.tight_layout()
plt.show()

다른 샘플 크기의 분포를 비교할 때는 density를 사용하세요. 총 면적이 1이 되도록 히스토그램을 정규화합니다.

hue를 사용한 여러 분포 비교

hue 매개변수를 사용하면 단일 플롯에서 다양한 카테고리 간의 분포를 비교할 수 있습니다.

# 다중 카테고리 데이터 생성
df = pd.DataFrame({
    'values': np.concatenate([
        np.random.normal(90, 10, 500),
        np.random.normal(105, 12, 500),
        np.random.normal(100, 8, 500)
    ]),
    'group': ['A'] * 500 + ['B'] * 500 + ['C'] * 500
})
 
# hue로 플롯
sns.histplot(data=df, x='values', hue='group', kde=True)
plt.title('그룹별 여러 분포')
plt.show()

multiple을 사용한 오버레이 동작 제어

multiple 매개변수는 여러 분포가 표시되는 방식을 결정합니다:

multiple 값설명사용 시기
layer투명도로 오버레이(기본값)모양 및 겹침 비교
dodge막대를 나란히 배치빈당 차이 강조
stack막대를 수직으로 쌓기합계 및 비율 표시
fill정규화된 높이로 쌓기비율에 집중
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
 
multiple_types = ['layer', 'dodge', 'stack', 'fill']
 
for idx, mult_type in enumerate(multiple_types):
    ax = axes[idx // 2, idx % 2]
    sns.histplot(data=df, x='values', hue='group',
                 multiple=mult_type, ax=ax)
    ax.set_title(f'multiple="{mult_type}"')
 
plt.tight_layout()
plt.show()

그림 수준 플롯을 위한 sns.displot() 사용

histplot()은 축 수준 함수이지만 displot()은 자동 패싯화와 같은 추가 기능을 제공하는 그림 수준 함수입니다.

# 기본 displot (전체 그림 생성)
sns.displot(data=df, x='values', hue='group', kde=True)
plt.show()

displot()의 장점

  1. colrow 매개변수를 사용한 자동 패싯화
  2. 서브플롯 간 일관된 크기 조정
  3. 기본적으로 플롯 외부의 범례
  4. 히스토그램, KDE 및 ECDF 간 쉬운 전환
# 패싯화 차원 추가
df['dataset'] = np.random.choice(['Train', 'Test'], len(df))
 
# 패싯화된 플롯 생성
sns.displot(data=df, x='values', hue='group',
            col='dataset', kde=True, height=4, aspect=1.2)
plt.show()

kind로 플롯 유형 전환

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
 
# 히스토그램
sns.displot(data=df, x='values', kind='hist', kde=True)
plt.title('kind="hist"')
 
# KDE
sns.displot(data=df, x='values', kind='kde')
plt.title('kind="kde"')
 
# ECDF (경험적 누적 분포 함수)
sns.displot(data=df, x='values', kind='ecdf')
plt.title('kind="ecdf"')
 
plt.tight_layout()
plt.show()

함수 비교 표

기능histplot()displot()distplot() (사용 중단)matplotlib hist()
레벨축 레벨그림 레벨축 레벨축 레벨
패싯화아니요예(col/row)아니요아니요
KDE 지원아니요(수동)
Hue 지원제한적아니요
다중 분포layer/dodge/stack/filllayer/dodge/stack/fill아니요아니요
Stat 옵션5개 옵션5개 옵션제한적제한적
기본 스타일모던모던모던기본
상태현재현재사용 중단표준
최적 사용서브플롯, 통합독립 실행형 플롯, 패싯화레거시 코드기본 플롯

권장 사항: plt.subplots()로 여러 서브플롯을 만들 때는 histplot()을 사용하세요. 독립 실행형 시각화나 패싯화가 필요한 경우 displot()을 사용하세요.

histplot() 매개변수 참조

매개변수유형기본값설명
dataDataFrameNone입력 데이터 구조
x, y벡터/문자열Nonex 및 y축의 변수
hue벡터/문자열None색상의 그룹화 변수
weights벡터/문자열None관측값의 가중치
stat문자열"count"계산할 통계(count/frequency/density/probability/percent)
binsint/벡터"auto"빈의 수 또는 빈 경계
binwidthfloatNone빈의 너비
binrange튜플None빈의 범위(min, max)
discreteboolNone변수를 이산으로 처리
cumulativeboolFalse누적 분포 계산
common_binsboolTrue모든 hue 레벨에 동일한 빈 사용
common_normboolTrue모든 hue 레벨에 동일한 정규화 사용
multiple문자열"layer"여러 분포를 플롯하는 방법(layer/dodge/stack/fill)
element문자열"bars"시각적 표현(bars/step/poly)
fillboolTrue막대/다각형 채우기
shrinkfloat1막대 너비 스케일
kdeboolFalseKDE 곡선 추가
kde_kwsdictNoneKDE의 추가 매개변수
line_kwsdictNoneKDE 라인의 매개변수
threshfloat0빈을 제거하는 임계값
pthreshfloatNone비율로서의 임계값
pmaxfloatNone표시할 최대 비율
cbarboolFalse컬러바 추가(이변량용)
cbar_axAxesNone컬러바용 축
cbar_kwsdictNone컬러바 매개변수
palette문자열/리스트None색상 팔레트
hue_order리스트Nonehue 레벨의 순서
hue_norm튜플Nonehue의 정규화
color색상None모든 요소의 단일 색상
log_scalebool/튜플False축에 로그 스케일 사용
legendboolTrue범례 표시
axAxesNone플롯할 matplotlib 축

고급 사용자 정의

사용자 정의 색상 및 스타일링

# 각 카테고리의 사용자 정의 색상
custom_palette = {'A': '#FF6B6B', 'B': '#4ECDC4', 'C': '#45B7D1'}
 
sns.histplot(data=df, x='values', hue='group',
             palette=custom_palette, alpha=0.6,
             edgecolor='black', linewidth=1.5)
plt.title('사용자 정의 색상 히스토그램')
plt.show()

테두리 색상 및 투명도

# 빈 테두리 강조
sns.histplot(data=data, bins=20, edgecolor='black',
             linewidth=2, alpha=0.7, color='skyblue')
plt.title('두드러진 테두리가 있는 히스토그램')
plt.show()

로그 스케일

여러 자릿수에 걸친 데이터의 경우 로그 스케일을 사용하세요:

# 로그 정규 데이터 생성
log_data = np.random.lognormal(3, 1, 1000)
 
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
 
# 선형 스케일
sns.histplot(data=log_data, ax=axes[0])
axes[0].set_title('선형 스케일')
 
# 로그 스케일
sns.histplot(data=log_data, log_scale=True, ax=axes[1])
axes[1].set_title('로그 스케일')
 
plt.tight_layout()
plt.show()

누적 분포

누적 히스토그램은 각 빈까지의 관측값의 누적 합계를 보여줍니다:

# 누적 히스토그램
sns.histplot(data=data, cumulative=True, stat='density',
             element='step', fill=False)
plt.title('누적 분포')
plt.ylabel('누적 밀도')
plt.show()

이것은 백분위수를 결정하고 분포를 비교하는 데 유용합니다.

시각적 요소 변경

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
 
elements = ['bars', 'step', 'poly']
 
for ax, elem in zip(axes, elements):
    sns.histplot(data=data, element=elem, kde=True, ax=ax)
    ax.set_title(f'element="{elem}"')
 
plt.tight_layout()
plt.show()

이변량 히스토그램(2D 히스토그램)

Seaborn은 두 변수의 결합 분포를 시각화하기 위해 2D 히스토그램을 만들 수 있습니다:

# 상관된 2D 데이터 생성
np.random.seed(42)
x = np.random.normal(100, 15, 1000)
y = x + np.random.normal(0, 10, 1000)
 
# 2D 히스토그램
sns.histplot(x=x, y=y, bins=30, cbar=True)
plt.title('2D 히스토그램(이변량 분포)')
plt.show()

이변량 분석을 위한 KDE와 결합

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
 
# 2D 히스토그램
sns.histplot(x=x, y=y, bins=30, cbar=True, ax=axes[0])
axes[0].set_title('2D 히스토그램')
 
# KDE 등고선 플롯
sns.kdeplot(x=x, y=y, fill=True, cmap='viridis', ax=axes[1])
axes[1].set_title('2D KDE 플롯')
 
plt.tight_layout()
plt.show()

Hue를 사용한 이변량

# 카테고리 추가
categories = np.random.choice(['그룹 1', '그룹 2'], 1000)
 
sns.histplot(x=x, y=y, hue=categories, bins=20)
plt.title('Hue가 있는 2D 히스토그램')
plt.show()

일반적인 실수와 피하는 방법

실수 1: 빈이 너무 많거나 적게 사용

문제: 과도한 평활화는 패턴을 숨기고, 빈이 너무 많으면 노이즈가 생성됩니다.

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
 
# 빈이 너무 적음
sns.histplot(data=data, bins=5, ax=axes[0])
axes[0].set_title('빈이 너무 적음(5) - 과도하게 평활화')
 
# 적절한 수
sns.histplot(data=data, bins=30, ax=axes[1])
axes[1].set_title('적절한 빈(30)')
 
# 빈이 너무 많음
sns.histplot(data=data, bins=100, ax=axes[2])
axes[2].set_title('빈이 너무 많음(100) - 노이즈가 많음')
 
plt.tight_layout()
plt.show()

해결책: 자동 빈 선택부터 시작한 다음 데이터 특성에 따라 조정하세요. 정규 분포에는 Sturges 규칙(bins = log2(n) + 1)을, 왜곡된 데이터에는 Freedman-Diaconis 규칙을 사용하세요.

실수 2: 다른 샘플 크기의 분포 비교

문제: 원시 카운트는 총 관측값이 다른 분포를 비교하기 어렵게 만듭니다.

# 다른 샘플 크기
small_sample = np.random.normal(100, 15, 200)
large_sample = np.random.normal(100, 15, 2000)
 
df_samples = pd.DataFrame({
    'value': np.concatenate([small_sample, large_sample]),
    'sample': ['작음(n=200)'] * 200 + ['큼(n=2000)'] * 2000
})
 
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
 
# 잘못됨: count 사용
sns.histplot(data=df_samples, x='value', hue='sample',
             stat='count', ax=axes[0])
axes[0].set_title('잘못됨: Count(비교 어려움)')
 
# 올바름: density 사용
sns.histplot(data=df_samples, x='value', hue='sample',
             stat='density', common_norm=False, ax=axes[1])
axes[1].set_title('올바름: Density(비교 쉬움)')
 
plt.tight_layout()
plt.show()

해결책: stat='density' 또는 stat='probability'를 사용하고 common_norm=False를 설정하세요.

실수 3: 겹치는 분포 무시

문제: 높은 불투명도의 기본 레이어 모드는 겹침을 보이지 않게 만듭니다.

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
 
# 나쁨: 불투명한 막대가 겹침을 숨김
sns.histplot(data=df, x='values', hue='group',
             alpha=1.0, ax=axes[0])
axes[0].set_title('나쁨: 불투명한 막대')
 
# 좋음: 투명도가 겹침을 표시
sns.histplot(data=df, x='values', hue='group',
             alpha=0.5, ax=axes[1])
axes[1].set_title('좋음: 투명한 막대')
 
plt.tight_layout()
plt.show()

해결책: 투명도에는 alpha=0.5를 사용하거나 막대를 나란히 배치하려면 multiple='dodge'를 사용하세요.

실수 4: 축에 적절한 레이블을 붙이지 않음

문제: 특히 다른 stat 값을 사용할 때 y축이 무엇을 나타내는지 불분명합니다.

# 좋은 관행: 명확한 레이블
sns.histplot(data=data, stat='density', kde=True)
plt.title('값의 분포')
plt.xlabel('값')
plt.ylabel('밀도')
plt.show()

해결책: 특히 stat='density' 또는 stat='probability'를 사용할 때 y축에 항상 명확한 레이블을 붙이세요.

실수 5: 사용 중단된 distplot() 사용

문제: 이전 코드는 distplot()을 사용하는데, 이는 사용 중단되었고 덜 유연합니다.

# 이전 방법(사용 중단)
# sns.distplot(data)  # 사용하지 마세요
 
# 새로운 방법
sns.histplot(data=data, kde=True)
plt.show()

해결책: 히스토그램의 경우 histplot()으로, KDE 곡선의 경우 kdeplot()으로 마이그레이션하세요.

PyGWalker로 데이터를 대화식으로 시각화

seaborn은 우수한 정적 히스토그램 시각화를 제공하지만 PyGWalker는 분포를 동적으로 탐색할 수 있는 대화식 대안을 제공합니다. PyGWalker는 pandas DataFrame을 대화식 Tableau와 같은 인터페이스로 변환하여 코드를 작성하지 않고도 히스토그램을 만들고 비닝을 조정하며 시각화 유형 간에 전환할 수 있습니다.

import pygwalker as pyg
import pandas as pd
import numpy as np
 
# 샘플 데이터 생성
df = pd.DataFrame({
    'values': np.random.normal(100, 15, 1000),
    'category': np.random.choice(['A', 'B', 'C'], 1000),
    'score': np.random.uniform(0, 100, 1000)
})
 
# 대화식 탐색기 시작
pyg.walk(df)

히스토그램 분석을 위한 PyGWalker의 장점:

  • 드래그 앤 드롭 인터페이스: 변수를 선반으로 드래그하여 히스토그램 생성
  • 동적 비닝: 슬라이더로 빈 카운트를 대화식으로 조정
  • 다중 변수 탐색: 변수 간에 빠르게 전환하여 분포 비교
  • 내보내기 기능: 인사이트를 이미지로 저장하거나 대화식 보고서 공유
  • 코딩 불필요: 비기술 팀원이 독립적으로 데이터 탐색 가능

대화식 데이터 시각화를 시작하려면 github.com/Kanaries/pygwalker (opens in a new tab)를 방문하세요.

실제 예제: 시험 점수 분석

히스토그램 기술을 적용하여 다양한 학급의 시험 점수 분포를 분석해 봅시다:

# 현실적인 시험 데이터 생성
np.random.seed(42)
n_students = 500
 
exam_data = pd.DataFrame({
    'score': np.concatenate([
        np.random.normal(75, 10, 200),  # 학급 A
        np.random.normal(68, 15, 150),  # 학급 B
        np.random.normal(82, 8, 150)    # 학급 C
    ]),
    'class': ['학급 A'] * 200 + ['학급 B'] * 150 + ['학급 C'] * 150,
    'study_hours': np.random.uniform(0, 40, n_students)
})
 
# 점수를 유효한 범위로 클리핑
exam_data['score'] = exam_data['score'].clip(0, 100)
 
# 포괄적인 시각화 생성
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
 
# KDE가 있는 전체 분포
sns.histplot(data=exam_data, x='score', kde=True,
             bins=30, ax=axes[0, 0])
axes[0, 0].set_title('전체 점수 분포')
axes[0, 0].axvline(exam_data['score'].mean(), color='red',
                    linestyle='--', label=f'평균: {exam_data["score"].mean():.1f}')
axes[0, 0].legend()
 
# 학급 비교
sns.histplot(data=exam_data, x='score', hue='class',
             stat='density', common_norm=False,
             alpha=0.5, bins=25, ax=axes[0, 1])
axes[0, 1].set_title('학급별 점수 분포')
 
# 비율을 위한 스택 뷰
sns.histplot(data=exam_data, x='score', hue='class',
             multiple='stack', bins=25, ax=axes[1, 0])
axes[1, 0].set_title('스택 분포(총 카운트)')
 
# 누적 분포
sns.histplot(data=exam_data, x='score', hue='class',
             stat='density', element='step', fill=False,
             cumulative=True, common_norm=False, ax=axes[1, 1])
axes[1, 1].set_title('학급별 누적 분포')
 
plt.tight_layout()
plt.show()
 
# 요약 통계 출력
print(exam_data.groupby('class')['score'].describe())

이 예제는 다음을 보여줍니다:

  • 평균 참조선이 있는 전체 분포 분석
  • 다른 학급 크기에 대해 정규화된 밀도 비교
  • 각 학급의 기여도를 보여주는 스택 시각화
  • 백분위수 분석을 위한 누적 분포

FAQ

히스토그램에 적합한 빈 수를 선택하는 방법은?

최적의 빈 수는 데이터 크기와 분포에 따라 다릅니다. Seaborn의 자동 빈 선택(Freedman-Diaconis 규칙 기반)은 대부분의 경우 잘 작동합니다. 수동 선택의 경우 정규 분포에는 Sturges 규칙을 사용하세요: bins = log2(n) + 1(1000개 샘플의 경우 일반적으로 10-20개 빈), 또는 일반 데이터에는 제곱근 규칙: bins = sqrt(n)을 사용하세요. 다양한 값을 실험하고 과도한 노이즈를 생성하지 않고 패턴을 드러내는 값을 선택하세요. 비교를 위해 여러 플롯에서 일관된 빈 크기가 필요한 경우 bins 대신 binwidth를 사용하세요.

seaborn의 histplot과 displot의 차이점은 무엇인가요?

histplot()은 특정 matplotlib 축 객체에 플롯하는 축 수준 함수로, plt.subplots()로 복잡한 다중 플롯 그림을 만드는 데 적합합니다. displot()은 전체 그림을 만들고 colrow 매개변수로 자동 패싯화를 지원하는 그림 수준 함수입니다. 여러 서브플롯이 있는 기존 matplotlib 그림에 히스토그램을 통합할 때는 histplot()을 사용하세요. 독립 실행형 시각화나 여러 범주형 변수에 걸쳐 패싯화된 플롯을 만들어야 할 때는 displot()을 사용하세요. 두 함수 모두 빈, KDE, hue 및 통계를 제어하기 위한 동일한 핵심 매개변수를 지원합니다.

히스토그램에 stat='density'와 stat='probability' 중 어느 것을 사용해야 하나요?

히스토그램 면적을 1로 만들어야 할 때는 stat='density'를 사용하세요. 이는 확률 밀도 함수와 비교 가능하게 만들고 이론적 분포를 오버레이하는 데 이상적입니다. y축을 각 빈의 데이터 비율로 해석하려면 stat='probability'(또는 stat='percent')를 사용하세요. 모든 빈 높이의 합이 1(또는 100%)이 됩니다. 다른 샘플 크기의 분포를 비교하거나 통계 분석을 수행할 때는 stat='density'를 선택하세요. 프레젠테이션에서 더 직관적인 해석을 위해 또는 비기술 청중에게 결과를 설명할 때는 stat='probability'를 선택하세요.

여러 겹치는 분포로 히스토그램을 만드는 방법은?

hue 매개변수를 사용하여 데이터를 그룹으로 분할하는 범주형 변수를 지정하세요. multiple 매개변수로 오버레이 동작을 제어하세요: 투명한 겹치는 막대에는 'layer'(기본값)를 사용하고, 나란히 막대에는 'dodge'를 사용하고, 합계를 보여주는 수직으로 쌓인 막대에는 'stack'을 사용하거나, 비율을 보여주는 정규화된 쌓인 막대에는 'fill'을 사용하세요. 겹치는 영역을 보이게 하려면 alpha=0.5를 설정하세요. 다른 샘플 크기의 분포를 비교할 때는 공정한 비교를 보장하기 위해 항상 stat='density' 또는 stat='probability'common_norm=False와 함께 사용하세요. 각 분포의 전체적인 모양을 강조하려면 kde=True로 KDE 곡선을 추가하세요.

seaborn의 distplot이 사용 중단된 이유는 무엇이며 대신 무엇을 사용해야 하나요?

Seaborn은 버전 0.11.0에서 distplot()을 사용 중단했습니다. 매개변수 명명이 일관되지 않은 단일 함수에 여러 기능을 결합했기 때문입니다. 대체 함수는 더 명확한 인터페이스와 더 많은 유연성을 제공합니다: 히스토그램에는 histplot()을, 커널 밀도 추정에는 kdeplot()을, 경험적 누적 분포 함수에는 ecdfplot()을, 러그 플롯에는 rugplot()을 사용하세요. 이러한 새로운 함수는 더 나은 매개변수 이름, 더 많은 사용자 정의 옵션, hue 기반 그룹화에 대한 기본 지원 및 다른 seaborn 함수와의 일관된 동작을 제공합니다. 이전 코드를 마이그레이션하려면 가장 일반적인 사용 사례의 경우 sns.distplot(data)sns.histplot(data, kde=True)로 바꾸세요.

결론

Seaborn 히스토그램은 최소한의 코드로 데이터 분포를 시각화하는 강력하고 유연한 방법을 제공합니다. histplot() 함수는 비닝, 통계 및 그룹화에 대한 세밀한 제어를 제공하며, displot()은 패싯화된 시각화를 단순화합니다. bins, stat, huemultiple과 같은 매개변수를 마스터함으로써 패턴, 이상값 및 그룹 간 차이를 드러내는 출판 품질의 분포 플롯을 만들 수 있습니다.

주요 요점:

  • 초기 탐색에는 자동 빈 선택을 사용하고 명확성을 위해 조정하세요
  • 다른 샘플 크기의 분포를 비교할 때 stat='density'를 적용하세요
  • huemultiple 매개변수를 활용하여 여러 분포를 효과적으로 비교하세요
  • 부드러운 분포 모양을 보여주기 위해 KDE 오버레이를 추가하세요
  • matplotlib 서브플롯과의 통합을 위해 histplot()을 선택하고 독립 실행형 패싯화된 플롯을 위해 displot()을 선택하세요

시험 점수, 과학적 측정 또는 비즈니스 메트릭을 분석하든 seaborn 히스토그램은 데이터 분포를 이해하고 인사이트를 효과적으로 전달하는 데 도움이 됩니다. 포괄적인 탐색적 데이터 분석을 위해 이러한 기술을 PyGWalker와 같은 대화식 도구와 결합하세요.

📚