데이터분포의 시각화 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()
댓글
댓글 쓰기