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의 주요 특징 및 사용 사례는 다음과 같습니다:
- 데이터의 분포 확인: 2D KDE는 스캐터 플롯과 달리 두 변수의 결합 분포를 보다 명확하게 시각화할 수 있습니다. 데이터 포인트가 너무 밀집되어 있는 영역에서도 밀도의 변화를 파악할 수 있습니다.
- 변수 간의 관계 파악: 두 변수 사이의 상관 관계나 패턴을 빠르게 파악하는 데 도움이 됩니다.
- 밀도의 높은 영역 식별: 데이터의 밀도가 높은 영역, 즉 "봉우리"를 쉽게 식별할 수 있습니다. 이러한 영역은 데이터의 주요 클러스터나 집중적인 영역을 나타낼 수 있습니다.
1D 및 2D KDE plot을 그리는 방법은 아래 글을 참고하시길 바랍니다.
2023.10.21 - [파이썬, 데이터, 데이터 시각화] - Seaborn 라이브러리를 이용한 KDE Plot 및 2D KDE Plot 그리기
2. 2D KDE Plot 면적이 98%가 되는 지점 구하기
Data 2의 값을 기준으로 해당 값 이하의 2D KDE plot 면적이 98%가 되는 지점을 찾기 위해서는 커널 밀도 추정을 사용한 후 누적 분포 함수(CDF, cumulative distribution function)를 계산하면 됩니다. 아래는 이 과정을 수행하는 방법입니다:
- gaussian_kde를 사용하여 2D KDE를 계산합니다.
- y 축을 따라 x 축의 전체 범위에 대해 누적 분포를 계산합니다.
- 이 누적 분포가 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()
3. 2D KDE Plot의 중심을 구하는 방법
2D KDE plot의 중심을 구하는 방법 중 가장 일반적인 것은 2D KDE의 최댓값을 찾는 것입니다. 이는 KDE plot에서 가장 높은 밀도를 갖는 지점, 즉 데이터의 중심에 가장 가깝다고 볼 수 있는 지점입니다.
아래는 2D KDE plot의 중심 좌표를 찾는 방법입니다:
- gaussian_kde를 사용하여 2D KDE를 계산합니다.
- 주어진 데이터의 범위 내에서 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()
'파이썬, 데이터, 데이터 시각화' 카테고리의 다른 글
Google Colab 기초: 클라우드에서 Python 프로그래밍 시작하기 (0) | 2024.04.16 |
---|---|
파이썬 문자열 다루기 - 문자열 관련 함수 (0) | 2024.04.07 |
파이썬 문자열 다루기 - 리스트 순회와 인덱싱 (0) | 2024.04.05 |
데이터(data)와 데이터 리터러시(data literacy)가 중요한 이유 (2) | 2024.04.02 |
Seaborn 라이브러리를 이용한 KDE Plot 및 2D KDE Plot 그리기 (2) | 2023.10.21 |