기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

[seaborn] 데이터분포의 시각화 3: 경험적 누적분포(ECDF)

데이터분포의 시각화 3: 경험적 누적분포(ECDF)

식 1에 의해 계산되는 경험적 누적분포함수는 데이터 분포의 정규성을 평가하거나 서로 다른 여러 표본 분포를 비교할 때 사용합니다(Kolmogorov-Smirnov Test 참조). 이 함수는 샘플 기반의 누적분포(CDF)의 계단함수(step function)을 나타냅니다.

\begin{align}&\text{ECDF}=\frac{n(i)}{N}\\ &n(i): \text{오름차순으로 정렬한 각 요소의 위치} \\&H: \text{자료의 크기} \end{align}

scipy.stats.ecdf() 함수로 계산할 수 있으며 이 함수의 속성 .probailities로 ECDF를 확인할 수 있습니다. 이 함수에 전달되는 객체는 오름차순으로 정렬된 데이터입니다.

import numpy as np
from sklearn.datasets import make_blobs
import pandas as pd
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
plt.rcParams['font.family'] ='NanumGothic'
plt.rcParams['axes.unicode_minus'] =False
import seaborn as sns
import yfinance as yf

사용할 데이터로 코스피 지수의 일일자료(^KS11)를 모듈 yfiance를 사용하여 호출합니다. 그 자료에서 에 대해 일일변화율(시가에 대한 종가의 변화율)과 일간 거래량(Volume)의 변화율을 목록화하여 첨가하여 다음코드의 결과인 kos1df 자료를 생성합니다.

st=pd.Timestamp(2023, 10, 17)
et=pd.Timestamp(2024, 10, 17)
kos=yf.download("^KS11",st, et)
kos=kos.drop('Adj Close', axis=1)
scaler=StandardScaler().fit(kos)
kos1=scaler.transform(kos)
kos1df=pd.DataFrame(kos1)
kos1df.columns=kos.columns
kos1df['coChg']=pd.qcut((kos1df.Close-kos1df.Open)/kos1df.Open*100, 10, range(10))
kos1df['volChg']=pd.qcut(kos1df.Volume.pct_change(), 5, range(5))
kos1df=kos1df.dropna()
kos1df.head(3)
Open High Low Close Volume coChg volChg
1 -1.442811 -1.449859 -1.297633 -1.325313 3.272987 3 4
2 -1.606734 -1.712166 -1.603687 -1.703523 2.085993 6 2
3 -1.935555 -2.031246 -1.992279 -2.033245 0.271720 6 1
from scipy import stats
trg1=np.sort(kos1df.Close)
trg=stats.ecdf(trg1)
trg.cdf.plot()
plt.show()

seaborn의 displot(kind="ecdf"), ecdfplot()으로 작성할 수 있습니다. 다음 그림의 그래프 (b)는 위 결과 trg.cdf.probabilities에 대해 선그래프를 작성한 것입니다.

fig,axs=plt.subplots(1,2)
sns.ecdfplot(kos1df, x="Close", ax=axs[0]).set(title="(a)")
sns.lineplot(x=trg1, y=np.append(0,trg.cdf.probabilities), ax=axs[1]). set(title="(b)")
plt.show()
sns.displot(kos1df, x="Close", kind="ecdf")
plt.show()

인수 hue에 클래스를 가진 변수를 지정하여 클래스 간의 ecdf를 비교할 수 있습니다.

sns.displot(kos1df, x="Close", hue="volChg", kind="ecdf")
plt.show()

댓글