다변량 확률밀도 기반 베이지안 분류와 시각화 기법

우도 함수: 조건부 확률밀도 추정

본 문서는 붓꽃(Iris) 데이터셋을 활용하여 베이지안 분류 모델의 핵심 요소인 우도 함수(likelihood function)를 탐구한다. 분석 대상 특성으로는 꽃받침 길이(sepal length)와 꽁치폭(sepal width) 두 가지를 사용하며, 이를 통해 조건부 확률밀도함수 \( f_{X_1,X_2|Y}(x_1,x_2|C_k) \) 를 추정한다. 특정 클래스 \( C_k \) (예: Setosa)에 속하는 50개의 샘플을 추출한 후, 이들 데이터 포인트를 기반으로 가우시안 커널 밀도 추정(Gaussian KDE)을 수행하여 2차원 확률밀도 곡면을 구성할 수 있다. 그 결과로 도출된 밀도 함수는 정규화되어 있으며, 전체 영역에 대한 적분 값은 1이 된다. 도형 1은 클래스 Setosa에 대한 우도 함수의 3D 곡면을 보여준다. 해당 곡면에서 가장 높은 피크는 꽃받침 길이 약 4.8~5.2cm, 폭 약 3.2~3.6cm 구간에 위치하며, 이는 해당 영역 내에서 관측값이 발생할 가능성이 가장 높음을 의미한다.
도형 1. Setosa 종의 조건부 확률밀도 곡면 Virginica 및 Versicolor 종에 대해서도 동일한 방식으로 밀도 곡면을 생성할 수 있으며, 각각의 분포 형태는 서로 다른 패턴을 나타낸다. 이러한 다변량 밀도 추정은 베이지안 분류기에서 사후확률 계산의 기반이 된다.

정규분포 데이터의 시각화: 히스토그램, 상자그림, 바이올린 차트 비교

통계적 분포를 효과적으로 표현하기 위해 다양한 시각화 기법을 병행 사용할 수 있다. 아래 코드는 표준정규분포로부터 생성된 샘플에 대해 히스토그램과 커널밀도추정(KDE), 상자그림(boxplot), 바이올린 차트(violin plot)를 동시에 시각화하는 예제이다.
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams

# 폰트 설정: 한글 및 수식 호환
plt.rcParams['font.family'] = ['Times New Roman', 'SimSun']
rcParams['xtick.direction'] = 'in'
rcParams['ytick.direction'] = 'in'

def visualize_distribution(data, title):
    fig, axes = plt.subplots(3, 1, figsize=(8, 6), sharex=True)
    
    # 상단: 히스토그램 + 커널밀도추정
    sns.histplot(data, kde=True, ax=axes[0], color='skyblue', alpha=0.7)
    axes[0].set_title("히스토그램 및 커널밀도", fontsize=11)
    axes[0].set_ylabel("빈도")
    
    # 중단: 상자그림
    sns.boxplot(x=data, ax=axes[1], color='lightcoral')
    axes[1].set_title("상자그림", fontsize=11)
    axes[1].set_xlabel("")
    axes[1].set_ylabel("값")
    
    # 하단: 바이올린 차트
    violin_parts = sns.violinplot(x=data, ax=axes[2], color='lightgreen')
    axes[2].set_title("바이올린 차트", fontsize=11)
    axes[2].set_ylabel("분포 밀도")
    
    fig.suptitle(title, fontsize=13)
    plt.tight_layout()
    plt.show()

# 난수 생성 및 시각화 호출
sample_size = 10000
normal_sample = np.random.standard_normal(sample_size)
visualize_distribution(normal_sample, "표준정규분포 시각화 비교")
결과 해석: - **히스토그램 + KDE**: 데이터의 빈도와 연속적인 밀도 추정을 동시에 제공. - **상자그림**: 사분위수, 이상치, 중심 경향성을 명확히 표현하지만, 분포의 형태는 반영하지 못함. - **바이올린 차트**: KDE 기반의 밀도 곡선을 좌우 대칭으로 표현하여, 특정 값 구간에서의 밀집 정도를 직관적으로 보여줌.

바이올린 차트 구성 요소와 반환 객체

sns.violinplot() 함수는 시각화 외에도 내부 구성 요소에 접근할 수 있는 객체를 반환한다. 이 반환값은 그래프 요소들을 담은 딕셔너리 형태로, 다음과 같은 키를 포함한다:
  • bodies: 각 바이올린의 채워진 면적을 구성하는 PolyCollection 객체 리스트.
  • cmedians: 중앙값을 나타내는 선의 LineCollection.
  • cquantiles: 지정된 분위수 위치의 선들.
  • cmins, cmaxes: 분포의 최소/최대 경계선.
  • cbars: 사분위수 범위를 나타내는 바.
비활성화된 요소(예: 중앙값 표시 off)는 해당 키에 빈 리스트가 할당된다. 이를 활용하면 차트의 특정 요소를 후처리하거나 애니메이션 효과를 추가할 수 있다.

seaborn을 이용한 고급 상자그림 작성

seaborn은 pandas DataFrame과 긴밀하게 연동되어 있어, 범주형 데이터에 대한 상자그림 작성이 매우 직관적이다. sns.boxplot() 함수는 다음과 같은 주요 매개변수를 지원한다:
sns.boxplot(
    data=df,
    x='category_column',
    y='value_column',
    hue='grouping_variable',
    palette='Set2',
    width=0.7,
    fliersize=4,
    whis=1.5  # IQR 배수 기준 이상치 식별
)
주의사항:
  • DataFrame 형식의 입력을 권장하며, 배열이나 리스트도 지원하나 기능 제한 있음.
  • 온라인 데이터셋(sns.load_dataset()) 사용 시 네트워크 문제 발생 가능. 로컬 캐시 또는 다운로드 재시도 필요.
  • palette 인자는 색상 체계를 정의하며, 미리 정의된 테마(Cividis, viridis 등) 또는 사용자 정의 리스트 가능.
이러한 시각화 도구들은 베이지안 분류 전 단계에서 각 클래스별 특성 분포를 탐색하고, 가정(예: 정규성)을 검증하는 데 필수적이다.

태그: Bayesian classification Gaussian KDE Violin Plot boxplot Seaborn

7월 26일 14:52에 게시됨