1. 연속형 변수 이변량 분석
변수간의 관계를 파악하기 위해 사용되는 방법에는 시각화와 수치화가 대표적이다.
보통 두 방식을 모두 살펴보면서 관계를 해석하는 것이 올바른 해석을 위해 필요하다.
1-1. 시각화
1-1-a. 산점도
plt.scatter() 함수나 sns.scatterplot() 함수를 사용하는데,
파라미터는 동일하다.
plt.scatter(x='Temp', y='Ozone', data=air)
sns.scatterplot(x='Temp', y='Ozone', data=air)
Python
복사
<< 참고 >>
레이블값(target)에 대한 변수들의 산점도를 한 팔레트안에 그리고 싶다면 아래와 같이 지정하고
•
fig, ax = plt.subplots( x, y, figsize=(a,b))
fig, ax = plt.subplots(1,3, figsize=(10,3))
# ax 파라미터를 설정해주면 된다.
sns.scatterplot(air['Temp'], air['Ozone'], ax=ax[0])
sns.scatterplot(air['Wind'], air['Ozone'], ax=ax[1])
sns.scatterplot(air['Solar.R'], air['Ozone'], ax=ax[2])
plt.tight_layout() # 여러 그래프를 그려줄 때는 설정해주는 것이 좋다.
plt.show()
Python
복사
<< 참고 >> Pairplot
•
숫자형 변수들에 대해 산점도와 히스토그램을 한꺼번에 그려준다.
•
시간이 많이 걸린다는 단점이 있다.
sns.pairplot(air, kind='reg') # kind 파라미터로 원하는 그래프를 추가할 수 있다.
Python
복사
<< 참고 >> Jointplot
•
두 연속형 변수에 대해서 산점도와 각각의 분포를 함께 시각화해준다.
sns.jointplot(x='Temp', y='Ozone', data=air)
plt.show()
Python
복사
<< 참고 >> Regplot
두 연속형 변수에 대해 산점도와 회귀선을 함께 시각화해준다.
sns.regplot(x='Solar.R', y='Ozone', data=air)
plt.show()
Python
복사
1-1-b. heatmap (상관계수 분포)
변수들간의 상관계수를 한눈에 볼 수 있는 방법은 여러가지가 있다.
<< 참고 >> sns.heatmap()
•
변수들의 상관계수값을 구한 데이터를 넣어줘야 한다.
plt.figure(figsize=(8,8))
sns.heatmap(air.corr(),
annot=True, # 상관계수값 표기 여부
fmt = '.3f', # 숫자포맷
cmap = 'RdYlBu_r', # 칼라맵
vmin = -1, vmax = 1) # 값의 최소, 최대값 설정
plt.show()
Python
복사
1-2. 수치화
1-2-a. 상관계수, p-value
•
상관계수 r
◦
공분산을 표준화한 값
◦
-1 ≤ r ≤ 1
◦
-1, 1에 가까울수록 강한 선형관계를 나타냄
◦
보통 0.5 이상을 강한 상관관계, 0.5이하를 중간 상관관계, 0.2 이하를 약한 상관관계, 0에 가까울수록 선형관계가 없다고 봄.
import scipy.stats as spst # scipy 패키지에서 stats 모듈을 사용한다.
# 상관계수와 p-value 함께 계산
spst.pearsonr(air['Temp'], air['Ozone'])
Python
복사
PearsonRResult(statistic=0.6833717861490114, pvalue=2.197769800200284e-22)
해석은 상관계수값이 0.68로, 강한 상관관계가 보이며 유의확률값이 0.05보다 훨씬 작으므로 통계적으로 상관관계가 있음을 검증했다라고 보면 된다.
<< 참고 >> scipy.stats.pearsonr()
•
두 변수간의 상관관계와 p-value값을 구해준다.
•
값에 결측치가 있을 경우, 계산되지 않기때문에 결측치를 제외한 나머지로 계산을 수행해야 한다.
<< 참고 >> corr()
데이터프레임의 모든 변수간의 상관계수를 구해준다.
air.corr()
Python
복사
<< 참고 >> heatmap
2. 범주형 변수 - 범주형 레이블
2-1. 시각화
•
모자익 그래프
from statsmodels.graphics.mosaicplot import mosaic
Python
복사
mosaic(data, [feature, target])
plt.axhline(1-data[target].mean(), color='r')
plt.show()
Python
복사
•
교차표
pd.crosstab(data[target], data[feature])
Python
복사
Gender | Female | Male |
Attrition | ||
0 | 157 | 248 |
1 | 66 | 129 |
pd.crosstab(data[target], data[feature], normalize='columns') # 열 기준으로 정규화
Python
복사
Gender | Female | Male |
Attrition | ||
0 | 0.704036 | 0.657825 |
1 | 0.295964 | 0.342175 |
2-2. 수치화
•
카이제곱검정
# 교차표 필요 (normalize 하면 안됨)
table = pd.crosstab(data[target], data[feature])
# 카이제곱검정
result = spst.chi2_contingency(table)
print('카이제곱통계량 :', result[0])
print('p-value :', result[1])
print('자유도 :', result[2])
Python
복사
2. 연속형 변수 - 범주형 레이블
2-1. 시각화
•
kdeplot (확률밀도함수)
① kdeplot( , hue = 'Survived')
•
생존여부의 비율이 유지된 채로 그려짐
•
두 그래프의 아래 면적의 합이 1
② kdeplot( , hue = 'Survived', common_norm = False)
•
생존여부 각각 아래 면적의 합이 1인 그래프
③ kdeplot( , hue = 'Survived', multiple = 'fill')
•
나이에 따라 생존여부 비율을 비교해볼 수 있음. (양의 비교가 아닌 비율!)
sns.kdeplot(x = feature, data=data, hue=target, common_norm=False)
plt.show()
Python
복사
common_norm = False : 곡선 밑 넓이 1 지정
sns.kdeplot(x=feature, data=data, hue=target, multiple='fill')
plt.axhline(data[target].mean(), color='r')
plt.show()
Python
복사
이직을 한 직원들과 하지 않은 직원들의 연령 분포는 비슷하나, 이직을 한 직원들의 평균 연령대가 20대 중후반 ~ 30대 중반까지에서 가장 높게 형성되고 있음을 확인할 수 있다.
~ 30대 초반까지 이직률이 가장 높고, 30대 중반서부터는 평균 이직률보다 이직률이 떨어지는 것을 확인할 수 있는데, 결혼 적령기 및 경제적 안정기에 들어감으로써 직원들의 직장 자리잡기가 이뤄지는 시기로 해석된다.
sns.histplot(x='Age', data = titanic, bins = 16
, hue ='Survived', multiple = 'fill')
plt.axhline(titanic['Survived'].mean(), color = 'r')
plt.show()
Python
복사
bins를 설정하면, 히스토그램 형태로 보여주면서 연속형 변수의 어떤 지점에서 밀도가 높게 나오는지 확인할 수 있다.
•
histogram
sns.histplot(x='Age', data=titanic, hue='Survived')
plt.show()
Python
복사