2D KDE Plot의 특정 면적에 해당되는 지점 및 중심 구하기

Mozen

·

2023. 10. 22. 00:54

반응형

 

1. 2D KDE(Kernel Density Estimation) Plot 

2D KDE (Kernel Density Estimation) plot은 두 변수의 결합 분포를 시각화하는 데 사용되는 도구입니다. "KDE"는 연속적인 확률 밀도 함수를 추정하는 데 사용되는 비모수적 방법을 나타냅니다. 이 방법에서 "커널"이라는 스무딩 함수를 사용하여 각 데이터 포인트 주변에 작은 '힐(hill, 언덕)' 또는 '분포'를 생성하며, 이 모든 작은 분포들을 합치면 전체 데이터의 밀도를 나타내는 하나의 부드러운 표면이 생성됩니다.

2D KDE plot의 주요 특징 및 사용 사례는 다음과 같습니다:

  1. 데이터의 분포 확인: 2D KDE는 스캐터 플롯과 달리 두 변수의 결합 분포를 보다 명확하게 시각화할 수 있습니다. 데이터 포인트가 너무 밀집되어 있는 영역에서도 밀도의 변화를 파악할 수 있습니다.
  2. 변수 간의 관계 파악: 두 변수 사이의 상관 관계나 패턴을 빠르게 파악하는 데 도움이 됩니다.
  3. 밀도의 높은 영역 식별: 데이터의 밀도가 높은 영역, 즉 "봉우리"를 쉽게 식별할 수 있습니다. 이러한 영역은 데이터의 주요 클러스터나 집중적인 영역을 나타낼 수 있습니다.
반응형

1D 및 2D KDE plot을 그리는 방법은 아래 글을 참고하시길 바랍니다.

2023.10.21 - [파이썬, 데이터, 데이터 시각화] - Seaborn 라이브러리를 이용한 KDE Plot 및 2D KDE Plot 그리기

 

Seaborn 라이브러리를 이용한 KDE Plot 및 2D KDE Plot 그리기

1. Seaborn 라이브러리란? Seaborn은 Python의 데이터 시각화 라이브러리로, Matplotlib을 기반으로 하여 보다 아름답고 의미 있는 데이터 시각화를 위한 편리한 인터페이스를 제공합니다. Seaborn의 주요

mozenworld.tistory.com

 

 

2. 2D KDE Plot 면적이 98%가 되는 지점 구하기

Data 2의 값을 기준으로 해당 값 이하의 2D KDE plot 면적이 98%가 되는 지점을 찾기 위해서는 커널 밀도 추정을 사용한 후 누적 분포 함수(CDF, cumulative distribution function)를 계산하면 됩니다. 아래는 이 과정을 수행하는 방법입니다:

  1. gaussian_kde를 사용하여 2D KDE를 계산합니다.
  2. y 축을 따라 x 축의 전체 범위에 대해 누적 분포를 계산합니다.
  3. 이 누적 분포가 0.98에 가장 가깝게 되는 지점을 찾습니다.

아래 코드는 Data 2의 값을 기준으로 해당 값 이하의 2D KDE plot 면적이 98%가 되는 지점을 빨간색 점선으로 표시합니다:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# 샘플 데이터 생성
data1 = np.random.randn(1000)
data2 = np.random.randn(1000) + 2

# 2D KDE plot 그리기
sns.kdeplot(x=data1, y=data2, cmap='Blues', fill=True)

# KDE 계산
kde = gaussian_kde(np.vstack([data1, data2]))

# y 값을 기준으로 누적 분포 계산
y_grid = np.linspace(data2.min(), data2.max(), 1000)
cdf = np.array([kde.integrate_box([-np.inf, -np.inf], [np.inf, y_val]) for y_val in y_grid])

# 누적 분포가 0.98에 가장 가깝게 되는 지점 찾기
y_98_percentile = y_grid[np.abs(cdf-0.98).argmin()]

print(f"Data 2 value for 98% of the 2D KDE area: {y_98_percentile}")

# 해당 지점을 그래프에 표시
plt.axhline(y_98_percentile, color='red', linestyle='--')
plt.xlabel('Data 1')
plt.ylabel('Data 2')
plt.title('2D KDE Plot with 98% Line')
plt.show()

2D KDE Plot에서 Data 2를 기준으로 면적이 98%되는 지점을 찾은 결과

 

 

3. 2D KDE Plot의 중심을 구하는 방법

2D KDE plot의 중심을 구하는 방법 중 가장 일반적인 것은 2D KDE의 최댓값을 찾는 것입니다. 이는 KDE plot에서 가장 높은 밀도를 갖는 지점, 즉 데이터의 중심에 가장 가깝다고 볼 수 있는 지점입니다.

아래는 2D KDE plot의 중심 좌표를 찾는 방법입니다:

  1. gaussian_kde를 사용하여 2D KDE를 계산합니다.
  2. 주어진 데이터의 범위 내에서 KDE의 값을 평가하고, 가장 높은 값을 갖는 지점의 좌표를 찾습니다.

아래 코드는 2D KDE plot의 중심 좌표를 빨간색 점으로 그래프에 표시하는 과정을 코드로 구현한 것입니다:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# 샘플 데이터 생성
data1 = np.random.randn(1000)
data2 = np.random.randn(1000) + 2

# 2D KDE 계산
kde = gaussian_kde(np.vstack([data1, data2]))

# 데이터 범위 내의 격자 생성
x_grid = np.linspace(data1.min(), data1.max(), 100)
y_grid = np.linspace(data2.min(), data2.max(), 100)
X, Y = np.meshgrid(x_grid, y_grid)

# 각 격자 지점에서의 KDE 값을 평가
Z = kde.evaluate(np.vstack([X.ravel(), Y.ravel()]))

# 최댓값을 갖는 지점 찾기
idx_max = np.argmax(Z)
x_center, y_center = X.ravel()[idx_max], Y.ravel()[idx_max]

print(f"Center of 2D KDE: x = {x_center}, y = {y_center}")

# 2D KDE plot 그리기 및 중심 좌표 표시
sns.kdeplot(x=data1, y=data2, cmap='Blues', fill=True)
plt.scatter(x_center, y_center, color='red', s=50, label='Center')
plt.xlabel('Data 1')
plt.ylabel('Data 2')
plt.legend()
plt.title('2D KDE Plot with Center')
plt.show()

2D KDE Plot의 중점을 구한 결과

반응형