Post

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

0. 개요

KT Aivle School 3기 AI 7일차

  • 강사 : 한기영 강사님
  • 내용
    • 단변량 분석 종합실습
    • 이변량 분석
      1. 숫자 → 숫자 (x → Y)
        • Focus : 직선
        • 상관분석 (상관계수, P-value)
        • 산점도(Scatter)
      2. 범주 → 숫자 (x → Y)
        • Focus : 평균비교
        • 2개 : T-test
        • 3개이상 : 분산분석(ANOVA)
        • sns.barplot()

위 내용들을 배웠다. 실습코드 자체는 어렵지 않았지만, 통계부분의 이론이 생소해서 지금까지 중엔 제일 힘든 날이었다.

1. 단변량 분석 종합실습

간단하게 복습 겸 작성해보면

  • 숫자형
    • 시각화
      • Histogram
      • KDE Plot
      • Box Plot
    • 수치화 (기초통계량)
      • min, max, mean, std
      • 사분위수
      • df.describe()로 확인 가능
  • 범주형
    • 시각화
      • barplot → sns.coutplot으로 구현
    • 통계량
      • 범주별 빈도수, 비율
      • df[var].value_counts() / df[var].shape[0]으로 구현

2. 이변량 분석

  • 우리는 두 변수와의 관계를 살펴보기 위해, 두 가지 도구(시각화, 수치화)를 이용한다.
  • 모든 도구들은 뒷받침하는 가정(전제)이 있다.
  • 따라서 한계가 있으므로, 보이는게 전부가 아님!
  • 특히 수치화 도구(가설검정 도구)는 많은 가정이 전제 된다.
  • 이번 과정에서는 도구를 사용하는데에 집중한다.

간단 요약 표

x\y숫자형 그래프숫자형 통계량
숫자형산점도(Scatter)직선
상관분석
- 상관계수
- P-value
범주형sns.barplot평균비교
2개 : t-test
3개 : 분산분석(ANOVA)

1) 숫자 → 숫자 (x → Y)

(1) 정리하는 두 가지 방법

  1. 산점도 (Scatter)
    • 그대로 점을 찍어서 그래프로 그려본다
    • 가장 중요한 관점이 ‘직선’(Linearity)
  2. 공분산(Covariance), 상관계수(Correlation efficient)
    • 각 점들이 얼마나 직선에 모여 있는지를 계산

강한관계? 약한관계?

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

(2) 시각화 : 산점도 (Scatter)

  • plt.scatter(x, y) or plt.scatter('x변수', 'y변수', data=df)
  • 한 번에 산점도 그리기 : sns.pairplot()
    • 단점 : 변수와 데이터가 많다면
      • 시간이 많이 걸림
      • 일일이 확인하기 쉽지 않음
  • + sns.jointplot, sns.regplot도 있음
1
2
plt.scatter(air['Temp'], air['Ozone'])
plt.show()

output_3_0

1
2
sns.pairplot(air)
plt.show()

output_4_0

(3) 수치화 : 상관계수, 상관분석

  • 눈으로 그래프를 살펴보며 관계를 파악하는 것은 쉽지 않다!
  • 따라서, 관계를 숫자로 계산해서 비교
    • 직선의 관계를 수치화 → 상관계수(correlation coefficient)
    • 상관계수가 유의미한 지를 검정(test) → 상관분석

[1] 상관계수

상관계수는 ‘𝑟’ 표현된다.

  • -1 ~ 1 사이의 값
  • 상관계수끼리 비교 가능
  • -1, 1에 가까울 수록 강한 상관관계를 나타냄

경험에 의한 대략의 기준 (절대적인 기준이 절대 아닙니다.)

  • 강한 : 0.5<𝑟≤1
  • 중간 : 0.2<𝑟≤0.5
  • 약한 : 0.1<𝑟≤0.2
  • (거의)없음 :𝑟≤0.1

[2] P-value (유의확률)

  • 관계를 수치화 한 값(상관계수)이 유의미한 지 판단하는 숫자 판단 기준 (유의 수준)
  • P-value < 0.05 이면, 두 변수 간에 관계가 있다. (상관계수가 의미가 있다.)
  • P-value ≥ 0.05 이면, 두 변수 간에 관계가 없다. (상관계수가 의미가 없다.)
  • P-value는 1보다 클 수 없음

[3] 한계

고려하지 않는 두가지

  1. 직선의 기울기
  2. 비선형 관계

corr1

corr2

[4] 코드 실습

spst.pearsonr

  • (피어슨)상관분석 함수
  • 주의 : NaN이 있으면 계산되지 않음
  • 결과 : (상관계수, P-value)
1
2
3
import scipy.stats as spst

spst.pearsonr(air['Temp'], air['Ozone'])
1
(0.6833717861490116, 2.1977698002001775e-22)

데이터 프레임 한꺼번에 상관계수 구하기

  • df.corr()을 사용하면 모든 숫자형 변수들 상호간에 상관계수 계산
1
air.corr()
OzoneSolar.RWindTemp
Ozone1.0000000.280068-0.6054780.683372
Solar.R0.2800681.000000-0.0567920.275840
Wind-0.605478-0.0567921.000000-0.457988
Temp0.6833720.275840-0.4579881.000000

상관계수를 Heatmap으로 시각화

1
2
3
4
5
6
7
plt.figure(figsize = (8, 8))
sns.heatmap(air.corr(), 
            annot = True,            # 숫자(상관계수) 표기 여부
            fmt = '.3f',             # 숫자 포멧 : 소수점 3자리까지 표기
            cmap = 'RdYlBu_r',       # 칼라맵
            vmin = -1, vmax = 1)     # 값의 최소, 최대값값
plt.show()

output_11_0

2) 범주 → 숫자 (x → Y)

시각화

  • 평균 비교 barplot (sns.barplot) (sns.countplotplt.bar와는 다른 것임!)

수치화

  • 범주가 2개 : 두 평균의 차이 비교
  • 범주가 3개 이상 : 전체 평균과 각 범주의 평균 비교

(1) 시각화

  • 평균 값을 비교하는 barplot
  • 신뢰구간(오차범위)
    • 평균값이 얼마나 믿을 만 한가?
    • 좁을 수록 믿을 만 하다.
    • 데이터가 많을 수록, 편자가 적을 수록 신뢰구간은 좁아진다.
  • sns.barplot()으로 구현 (sns.countplot()plt.bar()와는 다른 것임!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
plt.subplot(1, 3, 1)
sns.barplot(x="Survived", y="Age", data=titanic)
plt.grid()

plt.subplot(1, 3, 2)
sns.boxplot(x='Survived', y = 'Age', data = titanic)
plt.grid()

plt.subplot(1, 3, 3)
sns.barplot(x='Pclass', y='Age', data=titanic)
plt.grid()

plt.tight_layout()
plt.show()

output_13_0

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

  • 범주가 2개일 때와 3개 이상일 때 평균을 비교하는 방법이 조금 달라짐
  • t-test와 anova 둘 다 범주형 x와 숫자형 Y의 관계를 검정하기 위한 도구
  • 또한, 평균을 비교하여 차이를 검정(test) 한다.

[1] t-test

  • 범주의 수가 2개일 때 사용
  • 두 그룹간 평균에 차이가 있는가?
  • t 통계량
    • 두 그룹의 평균 간 차이를 표준오차로 나눈 값
    • 두 평균의 차이로 이해해도 좋다.
  • t 통계량이 유의한지 검정
    • t-test를 수행하면, t 통계량과 P-value를 구할 수 있다.
    • P-value가 0.05 보다 작으면 차이가 유의미하다.
    • t 통계량이 -2보다 작거나, 2보다 크면, 차이가 있다고 본다.
  • spst.ttest_ind(B, A)로 구현
    • A와 비교할 때 B의 평균이 큰가?
1
2
3
4
5
6
7
8
# NaN 행 제외
temp = titanic.loc[titanic['Age'].notnull()]

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

spst.ttest_ind(died, survived)
1
Ttest_indResult(statistic=2.06668694625381, pvalue=0.03912465401348249)

[2] ANOVA(분산분석)

  • ANalysis Of VAriance
  • 3개 이상 범주의 숫자 비교
  • 전체 평균과 각 그룹 평균에 차이가 있는가?
  • 𝐹 통계량 = $\frac{\text{집단 간 분산}}{\text{집단 내 분산}}$ = $\frac{\text{전체 평균 - 각 집단 평균}}{\text{각 집단의 평균 - 개별 값}}$
    • 값이 대략 2~3 이상이면 차이가 있다고 판단합니다.

anova

  • 주의!
    • 분산 분석은 전체 평균대비 각 그룹간 차이가 있는 지만 알려줌. 어느 그룹 간에 차이가 있는지는 알 수 없다.
    • 그래서, 보통 [사후분석]을 진행함
  • spst.f_oneway(A, B, C) 로 구현
    • 전체 평균과 A, B, C 각각의 평균은 차이가 있는가?
1
2
3
4
5
6
7
8
# 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)
1
F_onewayResult(statistic=57.443484340676214, pvalue=7.487984171959904e-24)

3. 기타

1) 평균

평균은 익숙하면서도, 낯선 개념이다?

  • 평균과 분산
  • 모집단과 표본
  • 표본평균으로 어떻게 모평균을 추정할 수 있을까?
  • 중심극한정리
  • 95% 신뢰구간

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

  • 한 집단을 설명하기 위해서, 대푯값으로 평균을 계산했을 때,
  • 값들이 평균으로부터 얼마나 벗어나 있는지를 나타내는 값. (이탈도, deviation)

모집단과 표본

조사하는 방법 두 가지

  1. 표본조사
    • 추출 방식 : 많은 수, 무작위
    • 장점 : 적절한 비용과 시간
    • 단점 : 오차가 존재
  2. 전수조사
    • 전체(모집단)를 조사
    • 장점 : 정확! 오차 ‘0’
    • 단점 : 비용, 시간 과다

표본을 뽑는 목적 → 모집단 추정

  • 표본을 가지고 어떤 통계량을 계산한다면, 그 목적은 모집단을 추정하기 위함

표본평균

  • 모 평균에 대한 추정치
  • 추정치에는 오차가 존재, 이 오차를 표준오차
This post is licensed under CC BY 4.0 by the author.

[KT Aivle 3기 AI] 6일차. 시계열 데이터, 데이터 분석 방법론, 시각화, 단변량 분석

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