[KT Aivle 3기 AI] 7일차. 이변량 분석(숫자 → 숫자, 범주 → 숫자)
0. 개요
KT Aivle School 3기 AI 7일차
- 강사 : 한기영 강사님
- 내용
- 단변량 분석 종합실습
- 이변량 분석
- 숫자 → 숫자 (x → Y)
- Focus : 직선
- 상관분석 (상관계수, P-value)
- 산점도(Scatter)
- 범주 → 숫자 (x → Y)
- Focus : 평균비교
- 2개 : T-test
- 3개이상 : 분산분석(ANOVA)
- sns.barplot()
- 숫자 → 숫자 (x → Y)
위 내용들을 배웠다. 실습코드 자체는 어렵지 않았지만, 통계부분의 이론이 생소해서 지금까지 중엔 제일 힘든 날이었다.
1. 단변량 분석 종합실습
간단하게 복습 겸 작성해보면
- 숫자형
- 시각화
- Histogram
- KDE Plot
- Box Plot
- 수치화 (기초통계량)
- min, max, mean, std
- 사분위수
df.describe()
로 확인 가능
- 시각화
- 범주형
- 시각화
- barplot →
sns.coutplot
으로 구현
- barplot →
- 통계량
- 범주별 빈도수, 비율
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) 정리하는 두 가지 방법
- 산점도 (Scatter)
- 그대로 점을 찍어서 그래프로 그려본다
- 가장 중요한 관점이 ‘직선’(Linearity)
- 공분산(Covariance), 상관계수(Correlation efficient)
- 각 점들이 얼마나 직선에 모여 있는지를 계산
강한관계? 약한관계?
- 얼마나 직선에 모여 있는가
- x와 Y의 관계를 얼마나 직선으로 잘 설명할 수 있는가
(2) 시각화 : 산점도 (Scatter)
plt.scatter(x, y)
orplt.scatter('x변수', 'y변수', data=df)
- 한 번에 산점도 그리기 :
sns.pairplot()
- 단점 : 변수와 데이터가 많다면
- 시간이 많이 걸림
- 일일이 확인하기 쉽지 않음
- 단점 : 변수와 데이터가 많다면
- +
sns.jointplot
,sns.regplot
도 있음
1
2
plt.scatter(air['Temp'], air['Ozone'])
plt.show()
1
2
sns.pairplot(air)
plt.show()
(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] 한계
고려하지 않는 두가지
- 직선의 기울기
- 비선형 관계
[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()
Ozone | Solar.R | Wind | Temp | |
---|---|---|---|---|
Ozone | 1.000000 | 0.280068 | -0.605478 | 0.683372 |
Solar.R | 0.280068 | 1.000000 | -0.056792 | 0.275840 |
Wind | -0.605478 | -0.056792 | 1.000000 | -0.457988 |
Temp | 0.683372 | 0.275840 | -0.457988 | 1.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()
2) 범주 → 숫자 (x → Y)
시각화
- 평균 비교 barplot (
sns.barplot
) (sns.countplot
과plt.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()
(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 이상이면 차이가 있다고 판단합니다.
- 주의!
- 분산 분석은 전체 평균대비 각 그룹간 차이가 있는 지만 알려줌. 어느 그룹 간에 차이가 있는지는 알 수 없다.
- 그래서, 보통 [사후분석]을 진행함
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)
모집단과 표본
조사하는 방법 두 가지
- 표본조사
- 추출 방식 : 많은 수, 무작위
- 장점 : 적절한 비용과 시간
- 단점 : 오차가 존재
- 전수조사
- 전체(모집단)를 조사
- 장점 : 정확! 오차 ‘0’
- 단점 : 비용, 시간 과다
표본을 뽑는 목적 → 모집단 추정
- 표본을 가지고 어떤 통계량을 계산한다면, 그 목적은 모집단을 추정하기 위함
표본평균
- 모 평균에 대한 추정치
- 추정치에는 오차가 존재, 이 오차를 표준오차
This post is licensed under CC BY 4.0 by the author.