- 공유 링크 만들기
- 이메일
- 기타 앱
데이터분포의 시각화(histplot & displot)
데이터 분포의 이해는 다양한 통계 분석의 기반이 됩니다. seaborn의 figure-level 함수인 displot(), jointplot(), pairplot()와 axes-level 함수인 hisplot(), kedplot(), ecdplot(), rugplot()으로 분포를 시각화 할 수 있습니다Figure-level과 Axes-level 함수 그리고 히스토그램참조).
분포의 시각화에 가장 일반적인 접근은 히스토그램(histogram)입니다. 히스토그램은 일정한 구간(bin)으로 그룹화한 변수를 기준으로 각 구간의 빈도수 또는 밀도를 대응시킨 bar plot입니다. 이 기사에서는 각 빈도에 빈도수(Count)를 나타내기 위해 histplot()
과 displot()
으로 작성에 대해 소개합니다.
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 |
히스토그램은 figure-level 함수인 displot()과 axes-level 함수인 hisplot()으로 작성할 수 있습니다. 이 두 함수는 같은 인수들을 가지고 같은 결과를 반환하지만 다중 플롯을 나타내는 방식에 차이가 있습니다. 이 함수들의 인수인 bins의 수는 데이터의 그룹화하기 위한 구간의 수를 의미하며 데이터 전체의 분산과 관찰치의 수로 자동으로 이루어지지만 인수 bins 또는 binwith를 지정하여 인위적으로 조절할 수 있습니다.
sns.set_style("darkgrid") sns.displot(data=kos1df, x="Close") plt.show()
다음은 dispplot() 대신 histplot()을 적용하여 bins와 binwidth을 적용한 것입니다. binwidth는 막대의 너비에 따라 전체 구간수(bin)가 정해집니다.
fig, axs=plt.subplots(1,2, figsize=(10, 3), gridspec_kw=dict(width_ratios=[3,3])) sns.histplot(data=kos1df, x="Close", bins=20, ax=axs[0]) g=sns.histplot(data=kos1df, x="Close", binwidth=0.9, ax=axs[1]) g.set_ylabel('') plt.show()
bins에 각 구간을 리스트 형식으로 전달할 수 있습니다. 또한 인수 discrete=True를 전달하는 것으로 히스토그램의 bins의 지정을 대신할 수 있습니다. 여러개의 플롯을 나타내기 위해 displot()
대신에 histplot()
사용합니다.
인수 shrink는 각 구간의 막대의 폭을 지정하는 것으로 기본값은 1입니다.
fig, axs=plt.subplots(2,2, figsize=(8, 7), gridspec_kw=dict(width_ratios=[3,3], height_ratios=[3,3])) a=sns.histplot(data=kos1df, x="Open", bins=[-3, -2, -1, 0, 1, 2, 3], color="brown",ax=axs[0,0]) a.set_xlabel('') b=sns.histplot(data=kos1df, x="Open", discrete=True, shrink=1, color="red", ax=axs[0,1]) b.set_xlabel('') b.set_ylabel('') c=sns.histplot(data=kos1df, x="Open", discrete=True, shrink=1.5, color="blue", ax=axs[1,0]) d=sns.histplot(data=kos1df, x="Open", discrete=True, shrink=0.5, ax=axs[1,1]) d.set_ylabel('') plt.show()
두개 이상의 클래스를 가진 제 2의 변수를 인수 hue에 지정하여 나타낼 수 있습니다. 이것은 각 클래스이 Count를 0에서 시작합니다.
fig, axs=plt.subplots(1, 2) sns.histplot(data=kos1df, x="Close", hue="volChg", edgecolor= "none", alpha=0.3, shrink=0.8, ax=axs[0]) sns.histplot(data=kos1df, x="Close", hue="volChg", edgecolor= "none", alpha=0.3, shrink=1.3, ax=axs[1]) plt.show()
위 그림은 shrink 인수를 사용하여 각 구간의 막대의 분리를 명확히 하였습니다. 이 인수의 조정으로 각 구간이 겹치게 한 경우도 그 경계는 표시됩니다. 동일한 클래스(동일한 색)일 경우 경계표시를 제거하기 위해 인수 element="step" 으로 지정합니다.
sns.displot(data=kos1df, x="Close", hue="volChg", alpha=0.3, element="step") plt.show()
위에서 언급한 것과 같이 hue에 첨가한 변수의 각 클래스에 대한 Count는 0부터 시작하므로 각 구간에 적용되는 클래스들을 구별하는 것은 쉽지 않습니다. 이 경우 mutiple="stack"으로 지정함으로서 개선할 수 있습니다. 이 인수에 의해 히스토그램은 클래스 1의 count위에 클래스 2의 count를 쌓는 형식으로 작성합니다. 또한 mutiple="dodge"인 경우 각 구간(bin)에 모든 클래스를 별도로 표시합니다.
fig, axs=plt.subplots(1, 2, figsize=(10, 3)) sns.histplot(kos1df, x="Close", hue="volChg", multiple="stack", edgecolor="none", shrink=0.9, ax=axs[0]) b=sns.histplot(kos1df, x="Close", hue="volChg", multiple="dodge", edgecolor="none", shrink=0.9, ax=axs[1]) b.set_ylabel('') plt.show()
위 그림에서 변수 volChg의 각 클래스에 대한 히스토그램을 작성하기 위해 figure-level 함수인 displot() 함수를 적용할 수 있습니다. 이 함수의 인수인 col를 적용합니다.
sns.displot(kos1df, x="Close", col="volChg") plt.show()
댓글
댓글 쓰기