오답노트

[데이터 분석] 이변량 분석 - 범주 데이터와 수치 데이터 본문

Python/데이터 분석

[데이터 분석] 이변량 분석 - 범주 데이터와 수치 데이터

권멋져 2022. 8. 12. 19:23

범주 데이터와 수치 데이터 비교

범주 데이터와 수치 데이터를 비교하는 방법은 평균을 비교하는 것이다.

하지만 평균은 실제와의 오차가 큰 경우가 존재하기에 무조건 신뢰할 수 있는 데이터는 아니다.

 

즉, 실제 값과 평균 값의 오차가 작을수록 신뢰할만한 데이터라고 할 수 있다.

 

표준 편차

한 집단에서 평균을 구할 때, 집단의 값들이 평균으로부터 얼마나 벗어나 있는지를 나타내는 값이다.

 

표본 평균

표본은 모집단에서 임의의 수 만큼 값을 선정하는 것이다. (Sampling)

표본 평균은 모집단에서부터 임의로 값들을 선정하여 평균을 계산하는 것을 의미한다.

이것은 모집단의 추정치가 된다. 하지만 처음 평균에 대한 신뢰도를 의심할 때와 마찬가지로 표본 평균과 모집단의 평균이 일치하기는 힘들다.

 

표준 오차

모집단의 평균, 모평균과 표본 평균의 차이를 추정한 것이 표준 오차이다. 이 표준 오차로부터 평균의 신뢰구간을 파악할 수 있다.

 

중심극한 정리

모집단의 분포의 모양이 정규분포가 아니더라도 표본 평균을 구할때, 표본의 개수가 많아질수록 표본 평균의 분포는 정규분포에 가까워진다.

 

이 정규 분포로부터 모평균과 모분산(모집단의 분산)을 알아낼 수 있다.

 

95% 신뢰구간

모집단의 값이 속할 것이라 간주되는 값들의 범위를 만드는것이다.

표본 평균을 100번 만든다고 했을때, 95번은 각 표본으로 부터 구한 신뢰구간이 모평균을 포함한다는 의미다.

 

정규분포에서 신뢰구간은 -1.96 ~ +1.96 구간이 95%이다

 

시각화

boxplot을 사용해 변수(x) -> 타겟(y) 관계를 시각화할 수 있다.

 

sns.barplot(x='Sex',y='Fare',data=titanic)
plt.grid()
plt.show()

7.1 boxplot

범주간 평균의 차이가 클수록 변수와 타겟의 상관관계는 강하다고 볼 수 있다.

 

수치화

t-test

두 평균의 차이를 표준오차로 나눈 값을 t 통계량이라고 한다. 기본적으로 두 평균의 차이라고도 볼 수 있다.

보통은 t 값이 -2 보다 작거나, 2보다 크면 상관관계가 강하다고 볼 수 있다.

 

t값을 구하는 함수를 살펴보자

 

import scipy.stats as spst
spst.ttest_ind(범주1 시리즈, 범주2 시리즈)

 

범주 데이터에 해당하는 범주의 개수가 2개일 때 사용할 수 있다. 그리고 인자가 되는 데이터에 NaN이 존재해서도 안된다.

titanic['Sex']
male = titanic.loc[titanic['Sex']== 'male','Fare']
female = titanic.loc[titanic['Sex']== 'female','Fare']

spst.ttest_ind(male,female)
# Ttest_indResult(statistic=-5.529140269385719, pvalue=4.2308678700429995e-08)

t 통계량은 statistic 값을 보면 된다. -5.5는 -2보다 작으므로 대립 가설이 채택될 수 있다.

 

anova

분산 분석의 영문인 ANalysis Of VAriance의 약자다.

anova에서 f 통계량은 집단 간 분산을 집단 내 분산으로 나눴을 때 f 통계량이 커야 상관관계가 강하다고 볼 수 있다.즉, (집단 간 분산) > (집단 내 분산) 이고, 집단 내 분산이 작으면 작을 수록 상관관계가 강해진다.보통 f 값은 2~3 이상이면 상관관계가 강하다고 판단한다.

 

f 값을 구하는 함수를 살펴보자

 

import scipy.stats as spst
spst.f_oneway(범주1 시리즈, 범주2 시리즈, 범주3 시리즈,...)

 

범주 데이터에 해당하는 범주의 개수가 2개 이상일 때 사용할 수 있다.

 

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)
# F_onewayResult(statistic=57.443484340676214, pvalue=7.487984171959904e-24)

 

f 통계량은 statistic 값을 보면 된다. 57은 3 이상이므로 대립 가설이 채택될 수 있다.