0. 개요
KT Aivle School 3기 AI 8일차
- 강사 : 한기영 강사님
- 내용
- 이변량 분석 실습 (Y : 숫자)
- 이변량 분석 (Y : 범주)
- 범주 → 범주 (x → Y)
- 교차표(crosstab) (중요!)
- 시각화 : mosaic plot
- 수치화 : 카이제곱검정
- 숫자 → 범주 (x → Y)
- 시각화 : sns.kdeplot()
- 수치화
- 딱 떨어지는 검정법 존재 x
- x를 범주로 변환
- Y를 숫자로 변환
- 로지스틱회귀 (회귀계수, P-value)
위 내용들을 배웠다. 실습코드는 도구라고 생각하고 필요할 때 적절한 것을 가져다 쓰면되고, 데이터를 이해하고 분석하는데에 집중!
이변량 분석 종류별 시각화, 수치화 방법 정리 표
1. 이변량 분석 실습(Y : 숫자)
Y가 숫자일 때 이변량 분석 방법을 정리해보면,
- x가 숫자 (숫자 → 숫자)
- 시각화 : scatter, regplot, jointplot
- 수치화 : 상관분석
- x가 범주 (범주 → 숫자)
- 시각화 : 평균비교 sns.barplot()
- 수치화 : T-test, 분산분석(ANOVA)
2. 이변량 분석(범주 → 범주)
1) 교차표 (pd.crosstab()
)
- 범주 vs 범주를 비교하고 분석하기 위해서는 먼저 교차표를 만들어야 한다.
pd.crosstab(행, 열)
으로 생성- normalize 옵션 : 비율로 변환
- columns : 열 기준 100%
- index : 행 기준 100%
- all : 전체 기준 100%
1
| pd.crosstab(titanic['Survived'], titanic['Sex'])
|
Sex | female | male |
---|
Survived | | |
---|
0 | 81 | 468 |
---|
1 | 233 | 109 |
---|
1
| pd.crosstab(titanic['Survived'], titanic['Sex'], normalize = 'columns')
|
Sex | female | male |
---|
Survived | | |
---|
0 | 0.257962 | 0.811092 |
---|
1 | 0.742038 | 0.188908 |
---|
1
| pd.crosstab(titanic['Survived'], titanic['Sex'], normalize = 'index')
|
Sex | female | male |
---|
Survived | | |
---|
0 | 0.147541 | 0.852459 |
---|
1 | 0.681287 | 0.318713 |
---|
2) 시각화 (mosaic plot, 100% Stacked Bar)
- mosaic plot은 범주별 양과 비율을 그래프로 나타내 준다.
from statsmodels.graphics.mosaicplot import mosaic
- 범주형 변수가 아무런 상관이 없다면
- 범주 별 비율의 차이가 전혀 없는 상태가 됨
- 조금이라도 관련이 있다면, 비율 혹은 bar의 크기에 조금이라도 차이가 난다.
1
2
3
| mosaic(titanic, [ 'Pclass','Survived'])
plt.axhline(1- titanic['Survived'].mean(), color = 'r') # 전체 평균 비율
plt.show()
|
추가) 100% Stacked Bar
- 먼저 crosstab으로 집계 :
pd.crosstabl(feature, target, normalize='index')
.plot.bar(stacked=true)
- 전체 평균선 :
plt.axhline()
1
2
3
4
5
| temp = pd.crosstab(titanic['Pclass'], titanic['Survived'], normalize = 'index')
print(temp)
temp.plot.bar(stacked=True)
plt.axhline(1-titanic['Survived'].mean(), color = 'r')
plt.show()
|
1
2
3
4
5
| Survived 0 1
Pclass
1 0.370370 0.629630
2 0.527174 0.472826
3 0.757637 0.242363
|
3) 수치화 (카이제곱검정)
- 카이제곱검정 : 범주형 변수들 사이에 어떤 관계가 있는지 수치화 하는 방법
- 기대빈도 : 아무런 관련이 없을 떄 나올 수 있는 빈도
- 실제 데이터 : 관측된 값들
- 카이제곱 통계량은
- 기대빈도와 실제 데이터의 차이
- 클수록 기대빈도로부터 실제 값에 차이가 크다!
- 범주의 수가 늘어날 수록 값은 커지게 되어있음
- 자유도의 약 2배보다 크면, 차이가 있다고 본다.
자유도 간단 설명
- 범주의 수 -1
카이제곱 검정에서 자유도 계산
- ex) Pclass → Survived
- Pclass 범주 3개, Survived 범주 2개
- (3-1) * (2-1) = 2
- 카이제곱 검정 수행
- 먼저 Crosstab 집계
- 주의! Normalize 옵션을 사용하면 안됨
- 카이제곱 검정 수행
- 결과
- 카이제곱 통계량
- P-value
- 자유도
- 기대빈도 : 계산된 값
1
2
3
4
5
6
7
| # 1) 먼저 교차표 집계
table = pd.crosstab(titanic['Survived'], titanic['Pclass'])
print(table)
print('-' * 50)
# 2) 카이제곱검정
spst.chi2_contingency(table)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| Pclass 1 2 3
Survived
0 80 97 372
1 136 87 119
--------------------------------------------------
(102.88898875696056,
4.549251711298793e-23,
2,
array([[133.09090909, 113.37373737, 302.53535354],
[ 82.90909091, 70.62626263, 188.46464646]]))
|
3. 이변량 분석(숫자 → 범주)
1) 시각화 (sns.kdeplot)
- titanic에서 ‘Age’ → ‘Survived’ 예시
(1) kdeplot(, hue=’Survived’)
- common_norm = True (기본값)
- 각 면적의 합이 비율 (ex: 0.7, 0.3)
1
2
| sns.kdeplot(x='Age', data = titanic, hue ='Survived')
plt.show()
|
(2) kdeplot(, hue=’Survived’, common_norm=False)
1
2
| sns.kdeplot(x='Age', data = titanic, hue ='Survived', common_norm = False)
plt.show()
|
(3) muliple = ‘fill’ 옵션
1
2
3
| sns.kdeplot(x='Age', data = titanic, hue ='Survived', multiple = 'fill')
plt.axhline(titanic['Survived'].mean(), color = 'r')
plt.show()
|
(4) histplot
1
2
3
| sns.histplot(x='Age', data = titanic, bins = 16, hue ='Survived', multiple = 'fill')
plt.axhline(titanic['Survived'].mean(), color = 'r')
plt.show()
|
2) 수치화
- 숫자 → 범주 일 때, 딱 떨어지는 검정법이 존재하지 않음
- 따라서
- x를 범주로 변환
- Y를 숫자로 변환
- 로지스틱회귀