Notice
Recent Posts
Recent Comments
Link
01-02 02:57
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

AI 전문가가 되고싶은 사람

분산 분석 ( ANOVA) 및 이변량 분석 복습 본문

기자단 활동

분산 분석 ( ANOVA) 및 이변량 분석 복습

Kimseungwoo0407 2024. 3. 1. 15:21

● 분산 분석 ( ANOVA )

- 여러 집단 간에 차이 비교 : 기준은 전체 평균

- F 통계량 = 전체 평균 - 각 집단 평균 / 각 집단의 평균 - 개별 값 ( 값이 대략 2~3 이상이면 차이가 있다고 판단 )

 

ex ) 셋 이상 집단(범주)의 숫자 비교 ( f_oneway(A,B,C) ) 

- 귀무가설 (H0) : 객실 등급별 나이는 차이가 없다

- 대립가설 (H1) : 객실 등급별 나이에는 차이가 있다

* 분산분석은 전체 평균대비 각 그룹간 차이가 있는 지만 알려주기 때문에 어느 그룹 간에 차이가 있는지는 알 수 없음

* 그래서, 보통 사후분석을 진행

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

import scipy.stats as spst

# 타이타닉 데이터
titanic = pd.read_csv('https://raw.githubusercontent.com/DA4BAM/dataset/master/titanic.0.csv')
# Pclass(3 범주) --> Age
sns.barplot(x="Pclass", y="Age", data=titanic)
plt.grid()
plt.show()

# 1) 분산 분석을 위한 데이터 만들기
# NaN 행 제외
temp = titanic.loc[titanic['Age'].notnull()]
# 그룹별 저장
P_1 = temp.loc[temp.Pclass == 1, 'Age']
P_2 = temp.loc[temp.Pclass == 2, 'Age']
P_3 = temp.loc[temp.Pclass == 3, 'Age']

 

따로 구별해준 뒤에 분산분석 해야함

spst.f_oneway(P_1, P_2, P_3)

p-value가 0.05보다 작으므로 객실등급별 나이 차이가 있다.

 

● 요약

- 평균 비교 ( 시각화 ) : barplot(sns.barplot)

- 평균 비교 ( 수치화) : 범주 2개 : t-test, 범주 3개 이상 : 분산분석(ANOVA)

 

● 이변량분석 ( 범주 vs 범주 )

- 교차표(crosstab)를 통해 시각화 및 chi-squared test 사용

# 두 범주별 빈도수를 교차표로 만들어 봅시다.
pd.crosstab(titanic['Survived'], titanic['Embarked'])

 

- 만든 교차표를 사용하여 mosaic plot을 그려서 비교

# Pclass별 생존여부를 mosaic plot으로 그려 봅시다.
# titanic['Survived'].mean()은 생존자의 평균을 나타낸다.
# 따라서 1 -titanic['Survived'].mean()은 사망자의 평균을 나타낸다
mosaic(titanic, [ 'Embarked','Survived'])
plt.axhline(1- titanic['Survived'].mean(), color = 'r')
plt.show()

- mosaic plot으로 시각화했을 때 Embarked 별로 비율 차이가 있기 때문에 두 범주형 변수는 상관 있어보인다.

 

- 수치화 : 카이제곱검점 ( 범주형 변수들 사이에 어떤 관계가 있는지, 수치화하는 방법 )

이 글을 보고 나니까 쉽게 이해가 되었다

https://medistat.tistory.com/25

 

[이론] 카이 제곱 검정 (Chi-squared test)

[이론] 카이 제곱 검정 (Chi-squared test) 범주형 자료의 분포에 유의미한 차이가 있는지 검정하기 위해 카이 제곱 검정 (Chi-squared test)를 시행하곤 한다. 깊은 이야기를 하기 전에 이번 글에서는 카이

medistat.tistory.com

 

# 1) 먼저 교차표 집계
table = pd.crosstab(titanic['Survived'], titanic['Embarked'])
print(table)
print('-' * 50)

# 2) 카이제곱검정
spst.chi2_contingency(table)

- p-value 값이 0.05보다 작다. -> Survived 변수와 Embarked변수는 서로 상관이 있다! 라고 할 수 있음

 

● 숫자 -> 범주 : 시각화

- sns.kdeplot() : common_norm = False : 생존자, 사망자 각각 kdeplot 그리기

                            multiple = 'fill' : 모든 구간에 대한 100% 비율로 kdeplot 그리기 

 

Family 변수 값별로 생존자 사망자 kdeplot 그리기

sns.kdeplot(x='Family', data = titanic, hue ='Survived'
            , multiple = 'fill')
plt.axhline(titanic['Survived'].mean(), color = 'r')
plt.show()

  • 그래프를 보면 혼자 탑승한 경우(가족 구성원 수가 1) 생존한 승객과 생존하지 못한 승객의 비율이 상대적으로 비슷한 것으로 나타납니다.
  • 가족 구성원 수가 2 또는 3인 경우에는 생존한 승객의 비율이 높은 경향이 있습니다.
  • 가족 구성원 수가 증가함에 따라 생존하지 못한 승객의 비율이 더 높아지는 경향이 나타납니다.