[KT AIVLE] DX트랙 데이터 분석(4주차) 복습(가설검정, 이변량분석, T-Test, ANOVA, 카이제곱검정 )

728x90

데이터 분석 복습

6. 가설검정

가설검정(hypothesis test)

  • 수집한 데이터로 가설에 대해 타당성을 입증하는 것

 

모집단과 표본

  • 모집단: 알고 싶은 대상 전체 데이터
  • 표본: 그 대상의 일부 데이터

 

귀무가설(null hypothesis)

  • 현재까지 알려진 사실을 기준으로 설정한 가설
  • 차이가 없다

 

대립가설(alternative hypothesis)

  • 새롭게 주장하고자 하는 가설
  • 차이가 있다

 

통계적 검정

  • 표본으로부터 대립가설을 확인하고, 모집단에서도 맞을 것이라 주장
  • 분포 + 판단 기준 필요
    • p-value 계산(차이 값이 클 수록 p-value 작아 짐)
    • 0.05 보다는 p-value가 작아야, 차이가 있다고 판단

 

단측검정

  • ex) A매장과 B매장 중 어디의 수요량이 더 큰가?

 

양측검정(주로 사용)

  • ex) 매장 간에 수요량의 차이가 있나?

 

검정 통계량

  • 가설 검정을 하기 위한 차이 값
    • t통계량
    • x^2(카이제곱) 통계량
    • f 통계량
  • 각각 기준 대비 차이로 계산

 

7. 두 변수의 관계 분석(이변량분석): 숫자 → 숫자

 

산점도(scatter)

  • 두 숫자형 변수의 관계를 나타내는 그래프
  • 숫자 vs 숫자를 비교할 때 중요한 관점 직선(Linearity)
    • plt.scatter( x축 값, y축 값 )
    • plt.scatter( ‘x변수’, ‘y변수’, data = df)
    • seaborn • sns.scatterplot( ‘x변수’, ‘y변수’, data = df)

강한관계 판별

  • 얼마나 직선에 모여 있는가
  • x, y의 관계를 얼마나 직선으로 잘 설명할 수 있는가

r =1, -1: 강한관계 / r = 0: 관련 x

sns.pairplot(dataframe)

  • 숫자형 변수들에 대한 산점도를 한꺼번에 그려줌
  • 변수와 데이터가 많다면 많은 시간 소요 
sns.pairplot(air, kind='reg' ) 	# regression, 직선 표시
plt.show()

 

수치화: 상관계수, 상관분석

 

상관분석

  • 상관계수가 유의미한 지를 검정

 

상관계수(correlation coefficient)

  • 관계를 수치화
  • r로 표현
  • -1 ~ 1 사이의 값
  • -1, 1에 가까울 수록 강한 상관관계를 나타내고 0에 가까울 수록 약한 상관관계

대략적인 기준

강한 0.5 < |r| <= 1
중간 0.2 < |r| <= 0.5
약한 0.1 < |r| <= 0.2
(거의)없음 |r| <= 0.1

 

상관계수의 유의성 검정

  • 상관계수의 크기로 판단
  • 상관분석을 통해서 검정(p value로 판단)

 

spst.pearsonr

  • 피어슨 상관분석 함수
  • Nan있으면 x
  • (상관계수, p-value)로 출력
import scipy.stats as spst
spst.pearsonr(air['Temp'], air['Ozone'])

# PearsonRResult(statistic=0.6833717861490114, pvalue=2.197769800200284e-22)

 

p-value

  • 관계를 수치화 한 값이 유의미한지 판단하는 숫자
  • P-value < 0.05 이면, 두 변수 간에 관계가 있음 (상관계수가 의미 o) 
  • P-value >= 0.05 이면, 두 변수 간에 관계가 없음 (상관계수가 의미 x)

 

df.corr()

  • 전체 상관계수 확인
  • 대각선을 기준으로 위, 아래는 동일한 값

 

상관계수는 직선의 관계(선형관계)만 수치화

  • 직선의 기울기, 비선형 관계는 고려하지 않음

 

숫자 → 숫자 정리

Focus 직선(선형성, Linearity)
얼마나 직선으로 잘 설명할 수 있는가?
얼마나 직선에 점들이 모여 있는가?
시각화 산점도(scatter)
두 숫자형 변수의 관계를 눈으로 확인
직선의 관계를 확인하지만, 직선이 아닌 관계(패턴)도 확인
수치화 상관분석
상관계수: -1 혹은 1에 가까울 수록 강한 상관관계, 0에 가까울 수록 약한 상관관계 
p-value : 0.05보다 작으면 상관관계가 있다고 판단

 

8. 평균 추정과 신뢰구간

평균과 분산, 표준편차

 

분산(Var, Variance), 표준편차(SD, Standard Deviation)

  • 이탈도(deviation): 평균으로부터 얼마나 벗어나 있는지를 나타내는 값

분산

  1. 전체 원소에 대한 평균 구하기
  2. 각 원소에서 평균을 뺀 후, 제곱하기
  3. 2번에서 구한 값들의 모두 더한 후, 원소 개수로 나누기

표준편차

  • 분산의 제곱근
  • 데이터가 평균에서 얼마나 퍼져 있는지를 나타내는 측정 지표
  • 표준편차가 작을수록 데이터가 평균 주변에 모여 있고, 클수록 퍼져 있는 것을 의미
print(f'평균 : {a.mean()}')
print(f'분산 : {a.var()}')
print(f'표준편차 : {a.std()}')

 

모집단과 표본

 

전수조사

  • 전체(모집단)를 조사
  • 장점: 정확하고 오차가 없음
  • 단점: 비용, 시간 과다

표본조사

  • 추출 방식: 많은 수, 무작위
  • 장점: 적절한 비용, 시간
  • 단점: 오차 존재

 

표본평균

  • 표본(Sample)은 전체 모집단(Population)에서 추출한 일부 데이터
  • 표본평균은 해당 표본의 데이터 값들의 평균
  • 모평균에 대한 추정치
    • 모평균은 모집단의 모든 데이터 값들의 평균을 의미
μ(뮤) 모평균
σ^2(시그마) 모분산(모표준편차)
x̄ (x-bar) 표본평균
s^2 표본분산(표본표준편차

 

중심극한정리(Central Limit Theorem)

  • 표본의 크기(n)가 클 수록 정규분포 모양이 중심(Central)에 가까워지는(Limit) 좁은 형태가 됨
  • 즉, 표본의 크기가 충분히 클수록 표본 평균의 분포가 정규 분포에 가까워짐

 

표준오차(Standard Error)

  • 표본의 표본평균과 모집단의 모평균 간의 차이를 나타내는 측정 지표
  • 추정치에 존재하는 오차
  • 표준오차가 작을수록 표본평균이 모평균에 더 가깝다는 것을 의미

 

95% 신뢰구간(Confidence Interval)

  • 표준오차를 바탕으로 95% 확률 구간을 구할 수 있음
  • 신뢰구간 안에 모평균이 포함될 확률이 95%

 

9. 두 변수의 관계 분석(이변량분석): 범주 → 숫자

시각화: 범주 → 숫자

 

sns.barplot

sns.barplot(x="x축컬럼명(범주)", y="y축컬럼명(숫자)", data=data)
plt.grid()
plt.show()

그래프 가운데 검은색 선은 95% 신뢰구간을 의미

 

수치화: t-test, anova(분산분석)

 

t-test

  • 두 그룹 간의 평균 차이(t통계량)가 통계적으로 유의미한지를 검정하는 방법
  • 범주의 수 2개일 때 사용.
  • P-value < 0.05
  • t 통계량 < -2 혹은 t 통계량 > 2
  • ttest_ind(B, A, equal_var = False)
# NaN 행 제외
temp = titanic.loc[titanic['Age'].notnull()]

# 두 그룹으로 데이터 저장
died = temp.loc[temp['Survived']==0, 'Age']
survived = temp.loc[temp['Survived']==1, 'Age']

# t-test
spst.ttest_ind(died, survived)
  • TtestResult(statistic=2.06668694625381, pvalue=0.03912465401348249, df=712.0)
    • t - 통계량: 2.067 , 2보다 크므로, 차이가 있으나 크지 않음
    • P-value: 0.039, 0.05보다 작으므로, 차이가 있으나 크지 않음

 

ANOVA (ANalysis of Variance)

  • 세 개 이상의 그룹 간의 평균 차이를 비교하는 방법
  • ANOVA는 그룹 간의 평균 차이가 통계적으로 유의미한지를 검정

  • F 통계량이 큰 경우, 그룹 간의 평균 차이가 통계적으로 유의미
    • (집단 간 분산) / (집단 내 분산)
    • 집단 간 분산 = 전체 평균 − 각 집단 평균, 집단 내 분산 = 각 집단의 평균 − 개별 값
  • 분산분석(ANOVA)은 전체 평균대비 각 그룹간 차이가 있는지만 제공
  • 추가적인 사후 분석을 통해 어떤 그룹 간에 차이가 있는지를 확인
# 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)
  • F_onewayResult(statistic=57.443484340676214, pvalue=7.487984171959904e-24)
    • F 통계량: 57.44, 그룹 간의 평균 차이가 크다는 것
    • p-value: 7.49e-24 (거의 0에 가까운 매우 작은 값)

 

10. 두 변수의 관계 분석(이변량분석): 범주 → 범주

 

교차표 (Crosstab)

 

pd.crosstab(행, 열, normalize =)

  • normalize 옵션 : 비율로 변환
    • columns : 열 기준 100%
    • index : 행 기준 100%
    • all : 전체 기준 100%

 

  • normalize='columns': 각 열의 합으로 각 열의 값을 나누어 정규화한다. 따라서 각 셀의 값은 해당 열의 전체 합 대비 비율을 나타낸다.

 

  • normalize='index': 각 행의 합으로 각 행의 값을 나누어 정규화한다. 따라서 각 셀의 값은 해당 행의 전체 합 대비 비율을 나타낸다.

 

    • normalize='all': 전체 데이터의 총 합으로 모든 값을 나누어 정규화한다. 따라서 각 셀의 값은 전체 데이터의 비율을 나타낸다.

 

시각화: 범주 → 범주

 

mosaic plot

 

from statsmodels.graphics.mosaicplot 

import mosaic   

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

 

  • x축 길이는 각 객실등급별 승객비율을 의미

 

  • 3등급 객실 기준 y축은 3등급 객실 승객 중에서 사망, 생존 비율을  의미 

 

 

 

 

 

 

카이제곱검정

 

카이 제곱 통계량

  • 기대빈도실제 데이터의 차이
    • 기대빈도: 아무런 관련이 없을 때 나올 수 있는 빈도수 

  • 클수록 기대빈도로부터 실제 값에 차이가 크다는 의미.
  • 범주의 수가 늘어날 수록 값은 커지게 되어 있음.
  • 자유도의 2배 이상인 경우, 차이가 있다고 봄

 

자유도

  • 범주형 변수의 자유도
    • 범주의 수 - 1
  • 카이제곱 검정에서 자유도
    • (x 변수의 자유도) * (y  변수의 자유도)

 

카이제곱 검정

# 1) 먼저 교차표 집계- normalize 하면 안 됨
table = pd.crosstab(titanic['Survived'], titanic['Pclass'])
print(table)
print('-' * 50)

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

# 결과
# Chi2ContingencyResult(statistic=102.88898875696056, pvalue=4.549251711298793e-23, dof=2, 
# expected_freq=array([[133.09090909, 113.37373737, 302.53535354], [ 82.90909091,  70.62626263, 188.46464646]]))

 

결과

카이제곱 통계량: 102.88898875696056

P-value: 4.549251711298793e-23

자유도(dof) : Pclass 자유도(3-1) * Survived 자유도(2-1) , 2

기대빈도 : 계산된 값, ([[133.09090909, 113.37373737, 302.53535354], [ 82.90909091,  70.62626263, 188.46464646]]))

 

11. 두 변수의 관계 분석(이변량분석): 숫자 → 범주

sns.kdeplot()

  • common_norm = False
  • multiple = 'fill'
sns.kdeplot(x='Age', data = titanic, hue ='Survived',
            common_norm = False)
plt.grid()
plt.show()


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

 

12. 시계열 데이터 분석

시계열 데이터 분석

  • 데이터 분석 단위(행) 간에 시간 순서(sequence)가 있는 데이터
  • 시계열 데이터 구분은, 비즈니스 이해단계에서 문제정의시 결정 
  • 해결해야 할 문제가 시간 순서 관점이 필요한지 아닌지

 

시간의 흐름을 고려한 분석

  • 라인차트, 시계열 데이터 분해, 자기상관성

 

패턴을 데이터로 만들기 → 기존 분석 방식 적용 시도

  • 날짜 요소 추출, 이전 데이터(.shift), 이동평균(.rolling), 차분(.diff)
  • y의 차분 : 숫자인가? 변화량인가

 

차분

 

diff()

  • 특정 시점 데이터, 이전시점 데이터와의 차이 구하기
  • y에 패턴이 안 보인다면 차분 사용 고려

 

 

728x90