Post

[KT Aivle 3기 AI] 8일차. 이변량 분석(Y : 범주)

0. 개요

KT Aivle School 3기 AI 8일차

  • 강사 : 한기영 강사님
  • 내용
    • 이변량 분석 실습 (Y : 숫자)
    • 이변량 분석 (Y : 범주)
      1. 범주 → 범주 (x → Y)
        • 교차표(crosstab) (중요!)
        • 시각화 : mosaic plot
        • 수치화 : 카이제곱검정
      2. 숫자 → 범주 (x → Y)
        • 시각화 : sns.kdeplot()
        • 수치화
          • 딱 떨어지는 검정법 존재 x
            1. x를 범주로 변환
            2. Y를 숫자로 변환
            3. 로지스틱회귀 (회귀계수, P-value)

위 내용들을 배웠다. 실습코드는 도구라고 생각하고 필요할 때 적절한 것을 가져다 쓰면되고, 데이터를 이해하고 분석하는데에 집중!

이변량 분석 종류별 시각화, 수치화 방법 정리 표

이변량 분석

1. 이변량 분석 실습(Y : 숫자)

Y가 숫자일 때 이변량 분석 방법을 정리해보면,

  1. x가 숫자 (숫자 → 숫자)
    • 시각화 : scatter, regplot, jointplot
    • 수치화 : 상관분석
  2. 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'])
Sexfemalemale
Survived
081468
1233109
1
pd.crosstab(titanic['Survived'], titanic['Sex'], normalize = 'columns')
Sexfemalemale
Survived
00.2579620.811092
10.7420380.188908
1
pd.crosstab(titanic['Survived'], titanic['Sex'], normalize = 'index')
Sexfemalemale
Survived
00.1475410.852459
10.6812870.318713

2) 시각화 (mosaic plot, 100% Stacked Bar)

  • mosaic plot은 범주별 양과 비율을 그래프로 나타내 준다.
  • from statsmodels.graphics.mosaicplot import mosaic
  • 범주형 변수가 아무런 상관이 없다면
    • 범주 별 비율의 차이가 전혀 없는 상태가 됨
    • 조금이라도 관련이 있다면, 비율 혹은 bar의 크기에 조금이라도 차이가 난다.

mosaic

1
2
3
mosaic(titanic, [ 'Pclass','Survived'])
plt.axhline(1- titanic['Survived'].mean(), color = 'r') # 전체 평균 비율
plt.show()

output_7_0

추가) 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

output_9_1

3) 수치화 (카이제곱검정)

  • 카이제곱검정 : 범주형 변수들 사이에 어떤 관계가 있는지 수치화 하는 방법

chi_eq

  • 기대빈도 : 아무런 관련이 없을 떄 나올 수 있는 빈도
  • 실제 데이터 : 관측된 값들
  • 카이제곱 통계량
    • 기대빈도와 실제 데이터의 차이
    • 클수록 기대빈도로부터 실제 값에 차이가 크다!
    • 범주의 수가 늘어날 수록 값은 커지게 되어있음
    • 자유도의 약 2배보다 크면, 차이가 있다고 본다.

자유도 간단 설명

  • 범주의 수 -1
  • 카이제곱 검정에서 자유도 계산

    • ex) Pclass → Survived
      • Pclass 범주 3개, Survived 범주 2개
      • (3-1) * (2-1) = 2
  • 카이제곱 검정 수행
    • 먼저 Crosstab 집계
      • 주의! Normalize 옵션을 사용하면 안됨
    • 카이제곱 검정 수행
    • 결과
      1. 카이제곱 통계량
      2. P-value
      3. 자유도
      4. 기대빈도 : 계산된 값
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()

output_13_0

(2) kdeplot(, hue=’Survived’, common_norm=False)

  • common_norm = False
    • 각 면적의 합이 1
1
2
sns.kdeplot(x='Age', data = titanic, hue ='Survived', common_norm = False)
plt.show()

output_15_0

(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()

output_17_0

(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()

output_19_0

2) 수치화

  • 숫자 → 범주 일 때, 딱 떨어지는 검정법이 존재하지 않음
  • 따라서
    1. x를 범주로 변환
      • 카이제곱
    2. Y를 숫자로 변환
      • 상관분석
    3. 로지스틱회귀
      • 회귀계수, P-value
This post is licensed under CC BY 4.0 by the author.

[KT Aivle 3기 AI] 7일차. 이변량 분석(숫자 → 숫자, 범주 → 숫자)

[KT Aivle 3기 AI] 9~10일차. 미니프로젝트 1