logo

[데이터 시각화 소개] 누적 분포의 시각화

누적 분포는 어떤 변수의 값이 특정 값 이하가 되는 확률을 보여줍니다. 즉, 분포 함수의 값을 x로 하여, 그 값 이하의 모든 가능성을 누적하여 그림으로 나타낸 것입니다. 이를 통해, 데이터의 분포와 중앙 경향성, 분산 정도를 이해할 수 있습니다.

데이터 시각화에서 누적 분포를 표현하는 방법 중 하나는 누적 분포 함수(CDF, Cumulative Distribution Function)을 사용하는 것입니다. CDF는 모든 가능한 값의 누적 확률을 제공하여, 값의 분포를 쉽게 파악할 수 있게 합니다. 이는 어떤 값 이하에서 관측된 데이터 포인트의 비율을 나타내며, 데이터 세트 내에서 각 값의 상대적인 위치를 파악하는 데 유용합니다.

 

Python을 사용한 누적 분포 시각화

Python의 seaborn 라이브러리는 데이터 시각화를 위한 고수준 인터페이스를 제공하며, 누적 분포를 시각화하기 위해 사용할 수 있습니다. seaborn에는 직접적으로 누적 분포를 그려주는 함수는 없지만, 히스토그램을 그리는 distplot 함수의 kdehist_kws 인자를 조합해서 누적 분포를 그릴 수 있습니다. 최근 버전의 seaborn에서는 histplot 함수로 변경되었습니다.

아래는 seaborn을 사용해 누적 분포를 시각화하는 방법의 예시입니다. 먼저, 필요한 라이브러리를 불러옵니다:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

다음으로, 누적 분포를 그릴 데이터를 생성합니다. 여기서는 np.random.normal을 사용하여 정규 분포에서 무작위 샘플을 생성합니다:

# 0을 평균으로하고, 1을 표준편차로하는 정규분포에서 100개의 샘플을 생성
data = np.random.normal(0, 1, size=100)

그리고 seabornhistplot 함수를 사용하여 누적 분포를 시각화합니다. cumulative=Truestat='density' 옵션을 전달하여 누적 밀도 분포를 그립니다.

sns.histplot(data, cumulative=True, stat='density', kde=True, color='blue')
plt.xlabel('Value')
plt.ylabel('CDF')
plt.title('Cumulative Distribution Function (CDF)')
plt.show()

이 코드는 데이터의 누적 분포 함수를 시각화하여, 데이터 값 범위 내에서 누적 밀도를 보여줍니다. 생성된 그래프에서 y축의 CDF 값은 x축의 특정 값 이하의 데이터 포인트 비율을 나타냅니다. 그 결과로, 데이터 세트의 전반적인 분포와 중심 경향성을 더 명확하게 이해할 수 있습니다.


 

ECDF (Empirical Cumulative Distribution Function)

ECDF의 정의

ECDF, 또는 경험적 누적 분포 함수는 주어진 데이터 세트에서 각 데이터 포인트가 관측될 확률을 나타내는 함수입니다. ECDF는 특정 값이나 그보다 작은 값을 갖는 관측치의 비율로 정의됩니다. 수학적으로, XX가 데이터 집합의 관측값이라면, 해당 데이터 집합에 대한 ECDF F(x)F(x)는 다음과 같이 계산됩니다:

F(x)=1ni=1nI(xix) F(x) = \frac{1}{n} \sum_{i=1}^{n} I(x_i \leq x)

여기서, nn은 데이터 포인트의 총 개수이고, II는 지시 함수(indicator function)로서, 주어진 조건이 참일 때 1의 값을, 거짓일 때 0의 값을 가집니다. xix_i는 데이터 세트의 ii번째 관측값을 나타내고, xx는 관측값의 특정 지점을 나타냅니다.

ECDF의 용도 및 장점

ECDF는 데이터의 분포를 파악하고 데이터 세트의 이상치를 식별하는데 유용합니다. 또한, 다음과 같은 이점을 제공합니다:

  • 데이터 전체의 분포를 쉽게 시각화하고 해석할 수 있습니다.
  • 데이터 세트의 경향성, 분산 정도, 이상치 등을 판단할 수 있습니다.
  • 두 데이터 세트를 간단히 비교하고 다른 분포들 간의 차이를 쉽게 발견할 수 있습니다.

ECDF 해석하기

데이터 분포 이해

ECDF 그래프에서 x축은 데이터 값의 범위를 나타내고, y축은 해당 값 이하의 데이터가 차지하는 비율을 나타냅니다. ECDF가 급격히 상승하는 지점은 데이터가 밀집된 지점을 나타내고, 완만한 부분은 데이터가 희박한 구간을 나타냅니다. 마찬가지로, ECDF가 1에 도달하는 지점은 최대값을 나타냅니다.

이상치 식별

이상치는 ECDF 그래프에서 별도의 점이나 데이터 분포에서 분리된 부분으로 나타나기도 합니다. ECDF의 급격한 변화는 종종 이상치의 존재를 나타냅니다.

Python과 seaborn을 사용한 ECDF 그리기 예시 코드

Seaborn 라이브러리는 직접적인 ECDF plotting 기능을 제공하지 않지만, ECDF를 계산하고 그리는데 필요한 도구들을 제공합니다. 다음은 seaborn을 이용하여 ECDF를 그리는 예시입니다.

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 넘파이 배열로 샘플 데이터 생성
data = np.random.randn(100)

# ECDF 계산
sorted_data = np.sort(data)
yvals = np.arange(1, len(sorted_data)+1) / float(len(sorted_data))

# seaborn을 사용하여 그리기
plt.figure(figsize=(8, 5))
sns.lineplot(x=sorted_data, y=yvals, marker='o', linestyle='none')
plt.title('ECDF of Sample Data')
plt.xlabel('Data Points')
plt.ylabel('ECDF')
plt.grid(True)
plt.show()

이 코드는 100개의 무작위 데이터 포인트로 구성된 데이터 세트에 대한 ECDF를 시각화한 것입니다. Seaborn의 lineplot 함수를 사용하여 ECDF를 그리고 있으며, 각 데이터 포인트가 누적 분포에 기여하는 방식을 보여줍니다.


 

Q-Q (Quantile-Quantile) Plot

Q-Q 플롯의 정의

Q-Q (Quantile-Quantile) 플롯은 두 확률분포의 분위수를 비교하는 시각적 도구입니다. X축에는 기준 분포의 분위수가, Y축에는 비교 분포의 분위수가 위치합니다. 특히, 어떤 데이터 집합의 분포가 특정 이론적 분포(예: 정규 분포)를 따르는지 확인하는 데 자주 사용됩니다.

Q-Q 플롯의 용도 및 장점

  • 정규성 검정: 데이터가 정규 분포를 따르는지 여부를 판단할 수 있습니다. 이는 많은 통계적 분석 및 모델링 기법에서 중요한 전제 조건입니다.
  • 다양한 분포 비교: 정규 분포뿐만 아니라, 어떤 이론적 분포든 기준으로 하여 데이터 집합을 비교할 수 있습니다. 예를 들어, t분포, 지수분포 등과의 비교도 가능합니다.
  • 이상치 탐지: 데이터의 이상치를 시각적으로 확인할 수 있습니다.

Q-Q 플롯 해석하기

  • 정규성 검정: 데이터가 정규 분포를 따른다면, Q-Q 플롯에서 점들이 대략 직선 위에 위치할 것입니다. S자 형태 또는 다른 패턴이 나타나면 정규 분포를 따르지 않는 것으로 간주될 수 있습니다.
  • 다른 분포와의 비교: 기준으로 한 분포의 특성에 따라, 데이터가 해당 분포를 따를 경우 점들은 특정 경로를 따르게 됩니다. 직선이 아닌 경로는 타 분포의 특성을 반영합니다.
 

Python 코드 예시 (Seaborn 활용)

아래 예시 코드는 Seaborn 라이브러리를 사용하여 정규 분포를 따르는 데이터와 실제 데이터의 Q-Q 플롯을 그리는 방법을 보여줍니다.

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

# 정규 분포에서 무작위로 데이터 생성
data = np.random.normal(loc=0, scale=1, size=100)

# Seaborn을 이용한 Q-Q 플롯 그리기
sns.qqplot(data, line ='45')  # Seaborn에는 직접적인 qqplot 함수가 없으며, statsmodels 라이브러리의 qqplot을 사용할 수 있습니다.
plt.show()

# statsmodels을 사용하는 대체 방법
import statsmodels.api as sm
sm.qqplot(data, line ='45')
plt.show()

참고: 위 코드는 Seaborn 라이브러리만 사용하려 했으나, Seaborn에는 qqplot이 직접적으로 구현되어 있지 않습니다. 따라서 qqplot을 생성하기 위해 statsmodels.apiqqplot 함수를 활용하였습니다. line ='45' 옵션은 이론적인 대각선(45도 직선)을 추가하여 데이터의 정규성을 더 쉽게 판단할 수 있도록 합니다.

이 예시에서는, 데이터가 정규 분포를 따르고 있다면, 점들이 대각선(45도) 근처에 배열되어야 합니다. 이상치가 있거나 분포가 정규 분포에서 벗어나는 경우, 점들이 이 선에서 멀어지게 되며, 이를 통해 데이터 분포의 특성을 파악할 수 있습니다.


 

P-P (Probability-Probability) Plot

P-P 플롯의 정의

P-P (Probability-Probability) 플롯은 두 확률분포의 누적확률 함수(cumulative probability functions)를 서로 비교하기 위해 사용되는 시각화 도구입니다. 구체적으로, 이 플롯은 한 데이터 집합의 누적확률을 X축에, 다른 데이터 집합의 누적확률을 Y축에 표시하여, 두 분포가 얼마나 유사한지를 시각적으로 표현합니다.

P-P 플롯의 용도 및 장점

P-P 플롯은 주로 이론적인 분포와 실제 데이터의 분포를 비교하는 데 사용됩니다. 예를 들어, 실제 데이터가 특정 이론적 분포(예: 정규분포)를 따르는지 여부를 평가하는 데 유용합니다. 이 시각화 방법은 다음과 같은 장점을 가지고 있습니다:

  • 분포 유사성 평가: 전체적인 분포 형태의 유사성을 평가하는 데 적합합니다.
  • 이정항 비교: 두 분포 간의 특정 백분위수나 누적확률 수준에서의 차이를 명확하게 비교할 수 있습니다.
  • 꼬리 부분 분석: 분포의 꼬리 부분을 비교함으로써, 이상치에 대한 민감성이나 극단값의 존재 여부를 평가할 수 있습니다.

P-P 플롯 해석하기

P-P 플롯은 해석이 비교적 직관적입니다. 만약 두 분포가 완전히 일치한다면, 플롯은 대각선(45도 선)을 따라 형성됩니다. 다음은 P-P 플롯 해석의 주요 포인트입니다:

  • 분포의 유사성 분석: 대각선에서 크게 벗어나지 않는 플롯은 두 분포가 서로 유사하다는 것을 나타냅니다.
  • 꼬리 부분 비교를 통한 분포의 차이 이해: 플롯의 끝부분이 대각선에서 벗어날 경우, 분포의 꼬리 부분이 서로 다르다는 것을 의미합니다. 특히, 하위 꼬리 또는 상위 꼬리에서의 이탈은 해당 분포 영역에서 차이를 보여줍니다.

Python 예제 코드

P-P 플롯을 그려보겠습니다. 이번 예제에서는 Seaborn 라이브러리와 SciPy를 함께 사용하여 정규분포로부터 생성된 데이터 샘플과 정규분포 간의 P-P 플롯을 생성합니다.

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

# 정규 분포에서 1000개의 샘플 생성
np.random.seed(0)
sample = np.random.normal(loc=0, scale=1, size=1000)

# 이론적인 정규 분포와 실제 데이터 샘플 간의 P-P 플롯 생성
fig = plt.figure()
res = stats.probplot(sample, dist="norm", plot=plt)

# 플롯에 타이틀 추가
plt.title('P-P Plot of Normal Distribution vs. Sample Data')

# 플롯 보여주기
plt.show()

이 코드는 정규분포에서 추출된 샘플 데이터와 이론적인 정규분포 사이의 P-P 플롯을 생성합니다. 결과 플롯에서 데이터 포인트가 대체로 45도 선(대각선)을 따라 배치되어 있으면, 샘플 데이터가 정규분포를 따른다고 해석할 수 있습니다. 만약 점들이 대각선에서 크게 벗어난다면, 실제 데이터 분포와 정규분포 사이의 유의미한 차이가 있다는 것을 시사합니다.

Previous
히스토그램