변수들의 관계 시각화(산점도와 선그래프)
seaborn의 함수중 그림 수준(figure-level) 함수인 relplot()은 지정한 데이터들의 관계성을 나타냅니다. 이러한 특성은 데이터들 사이에 관계를 나타내는 과정인 통계를 시각적으로 나타내는데 적절합니다. 이 그림수준 함수인 replot() 함수는 축수준(axes-level) 함수인 scatterplot() 또는 lineplot()의 모두 작성할 수 있습니다.
- relplot(kind="scatter") = scatterplot()
- relplot(kind="line") = lineplot()
산점도(scatter)
데이터 tips는 연속변수와 목록변수가 모두 포함된 데이터셋입니다. 연속변수들 사이의 산점도 작성은 인수인 x, y에 각 변수를 지정하는 것으로 생성됩니다.
import numpy as np import pandas as pd import yfinance as yf import matplotlib.pyplot as plt import seaborn as sns
tips=sns.load_dataset('tips') tips.head(3)
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
sns.set_theme()#기본 테마 sns.relplot(data=tips, x="total_bill", y="tip", kind="scatter") plt.show()
위 그림은 변수 total_bill과 tip에 대응하는 점들을 나타내고 있습니다. 각 점들은 다른 변수인 smoker와 연결되어 있습니다. 이 목록변수는 2개의 클래스(yes, no)로 구성되어 있으며 위 그림의 각 점들에 다른 색(color)를 부여하는 것으로 구분할 수 있습니다. 이 과정은 relplot()의 인수인 hue에 그 변수를 지정하는 것으로 달성할 수 있습니다.
sns.relplot(data=tips, x="total_bill", y="tip", hue="smoker", kind="scatter") plt.show()
위에서 지정한 제 3의 변수인 smoker의 각 클래스에 대한 maker를 다르게 하기 위해 인수 style을 적용합니다.
sns.relplot(data=tips, x="total_bill", y="tip", hue="smoker", style="smoker", kind="scatter") plt.show()
위에서 적용한 인수 hue와 style에 각기 다른 변수를 지정하는 것으로 4개의 변수를 함수에 참여시킬 수 있습니다. 즉, hue는 색으로 각 클래스를 분리하여 나타내는 데 반해 style은 marker의 모양에 따라 분류합니다.
sns.relplot(data=tips, x="total_bill", y="tip", hue="smoker", style="time", kind="scatter") plt.show()
위 그래프들에서 색상은 자동으로 조정되었습니다. 이러한 색상은 인수 palette에 의해 사용자가 지정할 수 있습니다(palette의 선택 참조).
sns.relplot(data=tips, x="total_bill", y="tip", hue="smoker", style="time", kind="scatter", palette="dark") plt.show()
변수 값에 따른 구분은 위 그림들과 같이 색상으로 실행할 수 있습니다. 또한 인수인 sizes에 변수를 지정하는 것으로 point의 크기를 다르게 나타낼 수 있습니다. 이 인수에 의한 크기는 자동적으로 이루어지지만 관련된 인수 size에 크기의 최소와 최대를 튜플로 전달하여 크기의 범위를 지정할 수 있습니다.
sns.relplot(data=tips, x="total_bill", y="tip", size="size", sizes=(10, 180)) plt.show()
선 그래프
두 변수간의 관계를 나타내기 위해 점포도와 함께 많이 사용되는 것이 선그래프입니다. 다음은 일정기간의 코스피 주가에 대한 자료입니다.
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) kos.head(3)
Open | High | Low | Close | Volume | |
---|---|---|---|---|---|
Date | |||||
2023-10-17 | 2454.139893 | 2466.870117 | 2449.419922 | 2460.169922 | 508800 |
2023-10-18 | 2452.050049 | 2465.330078 | 2450.780029 | 2462.600098 | 911500 |
2023-10-19 | 2431.919922 | 2433.449951 | 2412.550049 | 2415.800049 | 756900 |
위 자료를 표준화하고 Open과 Close의 일일 변화량과 Volume의 일간변화량을 목록화하여 추가합니다.
from sklearn.preprocessing import StandardScaler 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 |
seaborn의 선그래프 함수는 변수내의 클래스당 여러개의 값들이 존재할 경우 각 값에 대한 불확실성 범위를 제공합니다. 이것은 인수 errorbar에 의해 조절됩니다.
- errorbar='ci' → 기본값, 95% 신뢰구간
- errorbar=None → errorbar 제거
- errorbar="sd" 또는 "se" → 표준편차와 표준오차를 나타낼 수 있습니다.
- errorbar="pi" → 백분위수 너비
다음과 같이 x에 대응하는 값이 하나일 경우 불확실성 범위 즉, errorbar를 작성할 수 없습니다.
sns.relplot(data=kos, x=kos.index, y="Close", kind="line") plt.show()
다음과 같이 x축의 변수에 대해 값을 그룹화할 수 있는 경우 불확실도를 나타낼 수 있으며 위에서 언급한 인수errorbar
에 조정됩니다.
sns.relplot(data=kos1df, x='coChg', y="Close", kind="line") plt.show()
axes-level 함수인 scatterplot()과 lineplot()은 여러개 그래프를 함께 나타낼 수 있습니다. 다음은 errorbar의 인수를 달리하여 lineplot()을 작성한 결과입니다(다중 플롯 작성 참조).
fig, ax=plt.subplots(3,1, figsize=(4, 7), gridspec_kw=dict(height_ratios=[2,2,2])) sns.lineplot(x=kos1df.coChg.values, y=kos1df.Close,ax=ax[0]) sns.lineplot(x=kos1df.coChg.values, y=kos1df.Close, errorbar="se",ax=ax[1]) sns.lineplot(data=kos1df, x='coChg', y="Close", errorbar=None,ax=ax[2]) plt.show()
위 그래프들은 단순히 각 값을 선으로 연결한 것이 아닙니다. 즉, 데이터들을 그룹별로 집계하는 등의 통계적 조정에 의한 결과입니다. 이러한 조정을 완전히 차단하기 위해 다시말하면 단순히 각 값들의 연결 선을 나타내기 위해 인수 estimator=None
으로 지정합니다. 그 결과는 다음과 같습니다.
fig, ax=plt.subplots(nrows=1, ncols=2, gridspec_kw=dict(width_ratios=[4,4])) sns.scatterplot(data=kos1df, x='coChg', y="Close", ax=ax[0]) sns.lineplot(x=kos1df.coChg, y=kos1df.Close.values, estimator=None, ax=ax[1]) plt.show()
데이터의 변수 volChg를 hue와 style에 지정합니다.
sns.relplot(data=kos1df, x='coChg', y='Close', hue="volChg", col="volChg", kind="line") plt.show()
style에 의해 선의 종류가 다르게 표현되며 선과 함께 point를 함께 나타내기 위해 markers=True로 지정합니다.
sns.relplot(data=kos1df, x='coChg', y='Close', hue="volChg", style="volChg", markers=True, errorbar=None, kind="line") plt.show()
인수 size에 지정된 변수의 각 클래스에 따라 선의 굵기에 변화를 줍니다.
sns.relplot(data=kos1df, x='coChg', y='Close', hue="volChg", size="volChg", errorbar=None, kind="line") plt.show()
댓글
댓글 쓰기