데이터 분석을 위한 통계 기초
통계학을 배우는 이유
- 데이터 = 패턴 + 노이즈
- 측정의 불완전성
- 데이터에 포함된 잡음
- 제 3의 변수
- 통계의 역할: 다양한 요소를 고려해 합리적 결론을 유도
- 통계학과 머신러닝의 차이
- 근본적인 차이는 없음
- 머신러닝 = 인공지능 + 통계학
- 통계학은 모형의 타당성에, 머신러닝은 예측 성능에 좀 더 관심을 기울이는 경향이 있음
사례와 변수
사례(case)
- 데이터 수집의 단위 (제품, 실험, 고객 등)
- 데이터를 표로 나타낼때는, 한 행(row)에 표시
변수(variable)
- 사례에 따라 달라지는 특성 (만족도, 성능, 색상 등)
- 데이터를 표로 나타낼때는, 한 열(column)에 표시
모집단과 표본
- 모집단(population): 연구의 관심이 되는 집단 전체
- 표본(sample): 특정 연구에서 선택된 모집단의 부분 집합 (사례들의 집합)
기술 통계(descriptive)는 표본을 요약하고 묘사하며, 추론 통계(inferential)는 표본을 통해 모집단에 대한 추측을 함
범주형 변수 (categorical variable)
- 2개 이상의 범주(category)를 값으로 가지는 변수
연속형 변수 (continuous variable)
- 실수로 표현할 수 있는 변수
- 간격이 일정
- 계산이 의미가 있음
범주형과 연속형이 헛갈릴 때는, 앞에 평균이라는 단어를 붙여보면 됨 -> 평균 국적?x / 평균 나이o
기술 통계
- 중심 경향치: 데이터가 어디에 몰려있는가?
- 분위수: 데이터에서 각각의 순위가 어느 정도인가?
- 변산성 측정치: 데이터가 어떻게 퍼져있는가?
1
2
3
4
| import pandas as pd
import seaborn as sns
df = pd.read_excel("data/car.xlsx")
df.head()
|
| mileage | model | price | year | my_car_damage | other_car_damage |
---|
0 | 63608 | K3 | 970 | 2017 | 0 | 564596 |
---|
1 | 69336 | K3 | 1130 | 2015 | 1839700 | 1140150 |
---|
2 | 36000 | K3 | 1380 | 2016 | 446520 | 2244910 |
---|
3 | 19029 | K3 | 1390 | 2017 | 889000 | 4196110 |
---|
4 | 97090 | K3 | 760 | 2015 | 2339137 | 2029570 |
---|
중심 경향치
평균 (mean)
- 평균은 극단값의 영향을 크게 받음
$\bar X = \frac{1}{N} \sum_{i=1}^{N}X_i$
- 값들을 크기 순으로 정렬했을 때 중간에 위치한 값
- 값이 짝수개인 경우, 가운데 두 값의 평균
- 히스토그램으로 그리면 쉽게 볼 수 있음
1
| _ = sns.histplot(data=df, x="price", bins=30)
|
최빈값 (mode)
- 가장 많은 사례에서 관찰된 값
- 연속형 변수보다는 범주형 변수에서 유용
- 연속형 변수에서는 구간을 나누어 최빈값을 구하는 경우가 많음
1
| df["model"].value_counts()
|
1
2
3
| Avante 205
K3 69
Name: model, dtype: int64
|
분위수 (quantile)
- 데이터에서 값의 순위 0 ~ 1를 표현 (100을 곱해 percentile로 표현하기도 함)
- 최소값 = 0.0 = 0%
- 중간값 = 0.5 = 50%
- 최대값 = 1.0 = 100%
1
2
| # 최대/최소
df["price"].min(), df["price"].max()
|
1
2
| # 분위수
df["price"].quantile(.25)
|
사분위수 (quartile)
- 데이터를 4등분하는 위치
- 제 1사분위수 = $\frac{1}{4}$ 지점 = 25%
- 제 2사분위수 = $\frac{2}{4}$ 지점 = 50% = 중간값
- 제 3사분위수 = $\frac{3}{4}$ 지점 = 75%
- 제 4사분위수 = $\frac{4}{4}$ 지점 = 100%
- …
변산성 변수
범위 (range)
사분위간 범위 (IQR, InterQuartile Rane)
- 제 3사분위수 - 제 1사분위수 or 75% - 25%
- 극단값은 최소값 or 최대값 근처에 있으므로 극단값의 영향이 적음
상자 그림 (box plot)
- 제 1사분위수 ~ 제 3사분위수를 상자로 표현
- 중간값은 상자의 가운데 굵은 선으로 표시
- 최소/최대값은 수염(whisker)으로 표시
- 수염의 길이는 IQR의 1.5배까지, 넘어가는 경우 점으로 표시
1
| _ = sns.boxplot(data=df, y="price")
|
1
| _ = sns.boxplot(data=df, x="model", y="price")
|
편차 (deviation)
분산 (variance)
$Var(X) = \frac{1}{N}\sum_{i=1}^{N}(X_i -\bar X)^2$
- 편차 제곱의 평균
- 직관적이지는 않지만 수학적으로 중요한 성질이 있음
- 표준편차(standard deviation), $SD(X) = \sqrt{Var(X)}$를 많이 사용
- 평균 절대 편자(MAD, Mead Abs Divation),
- $MAD = \frac{1}{N}\sum abs(X_i-\bar X)$
1
2
| # 분산
df["price"].var()
|
1
2
| # 표준 편차
df["price"].std()
|
추론 통계
- 모집단(population): 연구의 관심 대상이 되는 집단 전체
- 표본(sample): 특정한 연구에서 선택된 모집단의 부분 집합
- 표집(sampling): 모집단에서 표본을 추출하는 절차
- 표본 통계량을 일반화하여 모집단에 대해 추론하는 것
모수와 통계량
- 모수(popluation parameter): 모집단의 특성을 기술하는 양
- 통계량(sample statistic): 표본에서 얻어진 수로 계산한 값 (=통계치)
- 통계량으로부터 모수를 추정
추정 (estimation)
- 통계량으로부터 모수를 추측하는 절차
- 점추정 (point): 가장 가능성이 높은 모수 하나를 추정
- 구간추정 (interval): 모수가 있을 가능성이 높은 범위를 추정
표집 오차 (sampling err)
- 모집단과 표본의 차이 (확률적인 현상임)
- 동일한 모집단에서 동일한 절차를 거쳐 추출한 표본끼리도 차이가 존재
- 표본의 크기가 클수록 표집 오차는 작아짐
신뢰구간 (confidence interval)
- 신뢰구간 = 표본 통계량 $\pm$ 오차 범위
- 대표적인 구간 추정 방법
- 모수의 근처 $\pm$ 오차 범위 내에 있을 확률이 높음 -> 표본 통계량에서 $\pm$ 오차 범위 내에 모수가 있을 확률이 높음
- 영향을 주는 요소
- 신뢰수준 $\downarrow$
- 표본의 변산성 $\downarrow$
- 표본의 크기 $\uparrow$
신뢰구간을 구하는 방법
- 일정한 수학적 가정으로부터 표집 분포를 유도
- 부트스트래핑(bootstrapping): 현재 가진 표본에서 재표집을 반복해, 표집 오차를 시뮬레이션
중심극한정리 (Central Limit Theorem)
- 표본이 클 수록, 표본 평균의 분포가 정규 분포에 수렴
- 평균=$\mu$, 표준편차=$\sigma$인 분포에서, 서로 독립이며 동일한 분포를 따르는 무작위 표본을 뽑았을 때 표본의 크기가 n일 경우,
- 표본 평균의 표집 분포는 평균=$\mu$이고 표준편차가 $\frac{\sigma}{\sqrt{n}}$인 정규분포를 따름
- 모집단의 분포에 무관
- 표본의 분포가 정규 분포에 수렴하는 것이 아님
1
2
3
4
5
6
| import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import uniform, norm
x = np.linspace(-.5, 1.5, 1000)
p = uniform.pdf(x)
_ = plt.plot(x, p)
|
표본 분포
대체로 모집단의 분포(=균등분포)와 비슷
1
2
3
| # 균등 분포에서 데이터 100개를 무작위 추출
x = uniform.rvs(size=100)
_ = plt.hist(x)
|
표집 분포 (sampling distribution)
1
2
3
4
| # 64개의 데이터를 뽑아 평균 내기를 1000회 반복 -> 1000개의 표본과 표본 평균
m = [uniform.rvs(size=64).mean() for _ in range(1000)]
_ = plt.hist(m)
_ = plt.xlim(0, 1)
|
부트스트래핑
1
| from scipy.stats import bootstrap
|
1
| bootstrap([df["price"]], np.mean, confidence_level=.95)
|
1
| BootstrapResult(confidence_interval=ConfidenceInterval(low=813.9817518248175, high=893.4647838446508), standard_error=20.19969976807167)
|
신뢰수준 (confidence level)
- 신뢰구간을 무한히 넓게 예측하면, 100% 모수를 포함 (신뢰수준 100%)
- 예측을하는 이유는 행동을 하거나 결정을하기 위해서 -> 넓은 구간의 예측은 쓸모가 없음
- 신뢰구간을 좁게 예측하면, 모수를 포함하지 못하는 경우가 생김
- 신뢰구간을 극단적으로 좁히면, 신뢰수준이 지나치게 낮아 쓸모가 없음
- 95% ,99% 등 일정한 신뢰수준으로 타협해 사용함
유의수준 (significance level)
- 유의수준 = 100% - 신뢰수준
- 추정한 구간이 모수를 포함하지 못할 확률
혼동 주의
- 일상적 표현에서는 신뢰도가 높으면 (측정)오차가 적음 -> 측정의 관점
- 통계에서 신뢰수준이 높으면 오차범위가 넓음 -> 추론의 관점
Student의 t 분포 (중심 극한 정리의 연장선)
- 통계학자 윌리엄 고셋이 발견한 확률 분포
- 모분산을 알면, 평균의 신뢰구간을 구할 때 중심 극한 정리에 따라 정규분포를 사용
- 모분산을 모르면, t 분포를 사용
- 표본의 크기가 충분히 크면, t 분포는 정규분포에 근사
충분히 크면 (sufficiently large)
- 어떤 변수 n에 따라 참 거짓이 변하는 명제 P(n)가 있을 때,
- n > N에서 P(n)이 항상 참인 어떤 N이 존재하는 경우
- n이 충분히 크면 참인 명제: $\frac{1}{n^2}<0.0001$
- n이 충분히 크면 거짓인 명제: $\sin{n}<0.5$
- n의 크기보다 점점 특정한 결론으로 수렴하는 형태에 관한 표현
1
2
| # Python 통계 분석 라이브러리
import pingouin as pg
|
단일표본 t 검정
1
| pg.ttest(df["price"], 0)
|
| T | dof | alternative | p-val | CI95% | cohen-d | BF10 | power |
---|
T-test | 42.483582 | 273 | two-sided | 2.486212e-122 | [814.1, 893.22] | 2.566527 | 2.773e+118 | 1.0 |
---|
1
| pg.ttest(df["price"], 0, confidence=.99)
|
| T | dof | alternative | p-val | CI99% | cohen-d | BF10 | power |
---|
T-test | 42.483582 | 273 | two-sided | 2.486212e-122 | [801.537871688669, 905.7832961945428] | 2.566527 | 2.773e+118 | 1.0 |
---|
통계적 가설 검정 (statistical hypothesis testing) -> 반증주의
- 유의 수준 결정
- 귀무가설 설정 (기각할(nullif) 가설)
- p값: 귀무가설의 모수를 포함할 때까지 신뢰구간을 넓혔을 떄의 유의 수준
p값 < 유의수준: 귀무가설을 기각 -> 통계적으로 유의하다
- 상관이 없는데, 우연히 이렇게 나올 가능성은 너무 작다. 그러니깐 상관이 있는걸로 인정하겠다
실증주의와 반증주의
- 과학의 가설 검정은 실증주의이지만, 통계적 가설 검정은 반증주의임
- 반증 가능성
통계적 유의함의 의미
- 유의수준 내에서 귀무가설을 기각할 수 있을만큼의 증거가 있음
- 표본의 크기가 충분하다는 의미로 이해
- 현실적으로 유의미한것은 아님
통계적 가설 검정에서 오류의 종류
- 1종 오류 (False Alarm): 귀무가설이 참일 때 기각
- 2종 오류 (Miss): 귀무가설이 거짓이나 기각 못함
동일 조건에서 유의 수준을 낮추면 1종 오류$\downarrow$, 2종 오류$\uparrow$
상관 분석
상관계수 (correlation coefficient)
- 두 변수의 연관성을 -1 ~ +1 범위의 수치로 나타낸 것
- 두 변수의 연관성을 파악하기 위해 사용 (두 변수의 관계의 강함, 절대값이 클 수록 관계가 강함)
- 본격적인 분석 전에 탐색적 분석을 위해 많이 사용
- 데이터 진단에도 사용(설문 등의 경우 관련 문항 간에는 높은 상관 관계가 있어야 함)
상관계수의 해석
- 부호
- +: 두 변수가 같은 방향으로 변화
- -: 두 변수가 반대 방향으로 변화
- 크기
- 0: 두 변수가 독립, 한 변수의 변화로 다른 변수의 변화를 예측하지 못함
- 1: 한 변수의 변화와 다른 변수의 변화가 정확히 일치
- 낮음: ~0.1
- 중간: 0.1~0.5
- 높음: 0.5~
엄밀한 근거에 바탕을 둔 것은 아니며, 실제 의사결저에서는 상대적으로 비교하는 것이 바람직
피어슨 적률 상관계수
$p(X,Y) = {cov(X,Y) \over \sigma X \sigma Y}$
- 가장 대표적인 상관계수
- 선형적인 상관계수를 측정
- 공분산을 두 변수의 표준편차로 나눔
상관계수와 비단조적 관계
- 상관계수는 우상향 또는 우하향하는 단조적 관계를 표현
- 복잡한 비단조적 관계는 잘 나타내지 못함
- 상관계수가 낮다고 해서 관계가 없는 것은 아님
1
| pg.corr(df["price"], df["mileage"])
|
| n | r | CI95% | p-val | BF10 | power |
---|
pearson | 274 | -0.67616 | [-0.74, -0.61] | 5.809388e-38 | 5.069e+34 | 1.0 |
---|
1
| _ = sns.scatterplot(data=df, x="mileage", y="price")
|
1
| pg.corr(df["price"], df["year"])
|
| n | r | CI95% | p-val | BF10 | power |
---|
pearson | 274 | 0.828908 | [0.79, 0.86] | 1.388002e-70 | 1.004e+67 | 1.0 |
---|
1
| _ = sns.scatterplot(data=df, x="year", y="price")
|
피어슨 상관계수
- r: 상관계수
- CI95%: 95% 신뢰 구간
- p-value: 가설 검정을 위한 p값
상관계수의 신뢰구간
+~+
: 모집단에서 두 변수의 관계가 +
-~+
: 모집단에서 두 변수의 관계는 -, 0, +
모두 가능-~-
: 모집단에서 두 변수의 관계가 -
상관계수의 가설 검정
- 모집단에서 두 변수가 상관 관계가 없다 -> (
corr=0
)이라는 귀무가설을 수립 - 귀무가설이 참일 때, 관찰된 통계량 이상의 결과가 관찰될 가능성 (p값)을 계산
- p값과 유의수준을 비교
- p < 유의수준: 귀무가설을 기각하고 모집단에서 두 변수가 상관관계가 있다고 결론
- p >= 유의수준: 결론을 유보 (관련이 있을 수도 없을 수도 있음)
p-value
- 증거의 부족함
- 0~1 범위, 일반적으로 0.05를 기준으로 함 (유의수준 5%)
p<.05
이면, 기울기가 +
또는 -
라고 결론 내릴 수 있음
연습문제
1
2
| sp = pd.read_excel("data/sp500_gold.xlsx")
pg.corr(sp["SPX"], sp["GLD"])
|
| n | r | CI95% | p-val | BF10 | power |
---|
pearson | 194 | 0.466896 | [0.35, 0.57] | 6.778106e-12 | 1.261e+09 | 1.0 |
---|
- SPX와 GLD의 상관 계수
0.466896
- 95% 신뢰 구간
[0.35,0.57]
(모집단에서 무한히 관측했을 경우 나오는 범위)
모집단에서 어쨌든 +
가 나온다 - 유의수준 5%에서 가설 검정
p-value가 0.05(6.778106e-12
) 보다 작다
-> 통계적으로 유의한 상관이 있다 (유의수준 5%)
1
| _ = sns.scatterplot(data=sp, x="SPX", y="GLD")
|
회귀 분석
지도학습 (supervised learning)
- 독립 변수 x를 이용해, 종속 변수 y를 예측하는 것
- 독립 변수(independent var): 예측의 바탕이 되는 정보, 인과관계에서 원인, 입력값
- 종속 변수(dependent var): 예측의 대상, 인과관계에서 결과, 출력값
종속 변수의 종류에 따른 구분
- 회귀분석(regression): 종속변수가 연속 (예측-실제가 작은것이 중요)
- 분류분석(classification): 종속변수가 범주형 (예측과 실제가 맞는것이 중요)
선형 모델 (linear model)
$\hat{y} = wx + b$
- $\hat{y}$: y의 예측치
- x: 독립변수
- w: 가중치 또는 기울기
- b: 절변 (x=0일때, y의 예측치)
잔차 (residual)
$r = y-\hat{y}$
잔차분산
$\frac{1}{N}\sum{(y-\hat{y})^2}$
- 잔차를 제곱하여 평균낸 것
- 잔차분산이 크다 -> 예측이 잘 맞지 않음
- 잔차분산이 작다 -> 예측이 잘 맞음
최소제곱법 (Ordinary Least Squares)
- 잔차분산이 최소가 되게하는 w, b등 계수를 추정
- 가장 널리사용되는 추정방법
price ~ mileage
= $price = w \times mileage + b$
1
2
3
4
| # 회귀분석
from statsmodels.formula.api import ols
ols("price ~ mileage", data=df).fit().summary()
|
OLS Regression ResultsDep. Variable: | price | R-squared: | 0.457 |
---|
Model: | OLS | Adj. R-squared: | 0.455 |
---|
Method: | Least Squares | F-statistic: | 229.1 |
---|
Date: | Fri, 03 Jun 2022 | Prob (F-statistic): | 5.81e-38 |
---|
Time: | 15:39:50 | Log-Likelihood: | -1895.7 |
---|
No. Observations: | 274 | AIC: | 3795. |
---|
Df Residuals: | 272 | BIC: | 3803. |
---|
Df Model: | 1 | | |
---|
Covariance Type: | nonrobust | | |
---|
| coef | std err | t | P>|t| | [0.025 | 0.975] |
---|
Intercept | 1258.7668 | 30.599 | 41.137 | 0.000 | 1198.526 | 1319.008 |
---|
mileage | -0.0052 | 0.000 | -15.136 | 0.000 | -0.006 | -0.005 |
---|
Omnibus: | 0.258 | Durbin-Watson: | 1.101 |
---|
Prob(Omnibus): | 0.879 | Jarque-Bera (JB): | 0.108 |
---|
Skew: | 0.032 | Prob(JB): | 0.947 |
---|
Kurtosis: | 3.074 | Cond. No. | 1.83e+05 |
---|
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.83e+05. This might indicate that there are
strong multicollinearity or other numerical problems.
1
| _ = sns.lmplot(data=df, x="mileage", y="price")
|
회귀계수 추정 결과
Intercept
는 절편 b, 나머지는 각 변수의 계수- 계수 추정 결과는, 아래 순
- 표준오차, t값은 p-value를 구하기 위한 중간 결과 -> 해석이 필요 없음
회귀계수의 가설검정
- 모집단에서 기울기=0을 귀무가설로 p값 계산
- p < 유의수준(통상 5%) -> 기울기 != 0으로 결론
- p >= 유의수준 -> 결론을 유보
1
2
| new_df = {"mileage":[10000, 20000]}
new_df = pd.DataFrame(new_df)
|
1
2
3
| 0 1206.483684
1 1154.200600
dtype: float64
|
결정 계수 또는 R제곱
- R제곱(R-Squared): 회귀분석에서 예측의 정확성을 알기 쉽게 표현한 지표 (0~1)
- R제곱=0: 분석 결과가 y의 예측에 도움이 안됨
- R제곱=1: y를 완벽하게 예측할 수 있음
- 단순회귀분석(독립변수가 1개인 회귀분석)의 경우, 회귀분석의 R제곱=독립변수와 종속변수의 피어슨 상관계수의 제곱
독립 변수가 범주형인 경우
- 범주형 변수는 기울기를 곱할 수 없음
- 연속 변수로 변환하여 모형에 투임
- 여러 가지 방법이 있으나, 더미 코딩을 가장 많이 사용함
더미 코딩 (dummy coding)
- 범주형 변수에 범주가 k개 있을 경우, k-1개의 더미 변수를 대신 투입
- 범주 중에 하나를 기준(reference)로 지정
- 기본적으로 ABC 순으로 먼저 나오는 것이 기준 (변경 가능)
- 기준을 제외한 범주들은 범주별로 더미 변수를 하나씩 가짐
- 더미변수는 해당 범주일 경우에만 고려
- 더미변수의 기울기는 기준과의 차이를 의미
연습문제
독립변수: marriage
종속변수: rating
1
2
| hr = pd.read_excel("data/hr.xlsx")
hr.head(2)
|
| department | job_level | marriage | rating | overtime |
---|
0 | Sales | Salaried | single | 4 | 14 |
---|
1 | Engineering | Hourly | single | 4 | 8 |
---|
1
| ols("rating ~ marriage", data=hr).fit().summary()
|
OLS Regression ResultsDep. Variable: | rating | R-squared: | 0.007 |
---|
Model: | OLS | Adj. R-squared: | 0.006 |
---|
Method: | Least Squares | F-statistic: | 9.848 |
---|
Date: | Fri, 03 Jun 2022 | Prob (F-statistic): | 0.00173 |
---|
Time: | 17:20:06 | Log-Likelihood: | -2182.3 |
---|
No. Observations: | 1470 | AIC: | 4369. |
---|
Df Residuals: | 1468 | BIC: | 4379. |
---|
Df Model: | 1 | | |
---|
Covariance Type: | nonrobust | | |
---|
| coef | std err | t | P>|t| | [0.025 | 0.975] |
---|
Intercept | 2.9208 | 0.040 | 72.678 | 0.000 | 2.842 | 3.000 |
---|
marriage[T.single] | -0.1751 | 0.056 | -3.138 | 0.002 | -0.284 | -0.066 |
---|
Omnibus: | 50.923 | Durbin-Watson: | 1.980 |
---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 26.234 |
---|
Skew: | 0.127 | Prob(JB): | 2.01e-06 |
---|
Kurtosis: | 2.397 | Cond. No. | 2.67 |
---|
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
- single의 rating은 얼마로 예측?
2.9208 - 0.1751
= 2.7457
- married의 rating은 얼마로 예측?
2.9208
- 모집단에서 둘의 차이가 있다고 할 수 있나?
미혼이 기혼보다 점수가 낮다
p-value < 0.05이므로 차이가 있다 -> 차이가 큰지 적은지를 의미하는것은 아님
유의미하다
- 통계적: 현재 수준의 데이터로 식별할 만큼의 차이가 있다
- 주관적: 차이가 큰지 적은지와 같은 사람마다 기준이 다른것
혼돈의 여지가 있으므로 통계적으로 유의미하다는 아예 사용하지 않는것이 좋음
범주가 2개인 경우
1
| array(['K3', 'Avante'], dtype=object)
|
1
| ols("price ~ model", data=df).fit().summary()
|
OLS Regression ResultsDep. Variable: | price | R-squared: | 0.011 |
---|
Model: | OLS | Adj. R-squared: | 0.007 |
---|
Method: | Least Squares | F-statistic: | 3.039 |
---|
Date: | Fri, 03 Jun 2022 | Prob (F-statistic): | 0.0824 |
---|
Time: | 15:41:33 | Log-Likelihood: | -1977.9 |
---|
No. Observations: | 274 | AIC: | 3960. |
---|
Df Residuals: | 272 | BIC: | 3967. |
---|
Df Model: | 1 | | |
---|
Covariance Type: | nonrobust | | |
---|
| coef | std err | t | P>|t| | [0.025 | 0.975] |
---|
Intercept | 833.4146 | 23.144 | 36.009 | 0.000 | 787.850 | 878.980 |
---|
model[T.K3] | 80.3970 | 46.121 | 1.743 | 0.082 | -10.402 | 171.196 |
---|
Omnibus: | 13.893 | Durbin-Watson: | 0.528 |
---|
Prob(Omnibus): | 0.001 | Jarque-Bera (JB): | 15.007 |
---|
Skew: | 0.573 | Prob(JB): | 0.000551 |
---|
Kurtosis: | 3.002 | Cond. No. | 2.48 |
---|
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
- Avante가 기준, K3의 더미변수(
model[T.K3]
)가 추가 - 예상가격
- Avante: 833
- K3: 833+80 = 913
기준 범주 바꾸기
ols("price ~ C(model, Treatment("K3"))", data=df).fit()
C
함수로 변수를 범주형으로 지정하고, Treatment
로 기준 범주를 지정
범주가 3개인 경우
1
2
| dep = pd.read_excel("data/depression.xlsx")
dep.head(2)
|
| y | age | x2 | x3 | TRT |
---|
0 | 56 | 21 | 1 | 0 | A |
---|
1 | 41 | 23 | 0 | 1 | B |
---|
y: 치료 효과
TRT: 치료 방법
1
| ols("y ~ TRT", data=dep).fit().summary()
|
OLS Regression ResultsDep. Variable: | y | R-squared: | 0.172 |
---|
Model: | OLS | Adj. R-squared: | 0.122 |
---|
Method: | Least Squares | F-statistic: | 3.424 |
---|
Date: | Fri, 03 Jun 2022 | Prob (F-statistic): | 0.0445 |
---|
Time: | 15:45:49 | Log-Likelihood: | -137.86 |
---|
No. Observations: | 36 | AIC: | 281.7 |
---|
Df Residuals: | 33 | BIC: | 286.5 |
---|
Df Model: | 2 | | |
---|
Covariance Type: | nonrobust | | |
---|
| coef | std err | t | P>|t| | [0.025 | 0.975] |
---|
Intercept | 62.3333 | 3.359 | 18.557 | 0.000 | 55.500 | 69.167 |
---|
TRT[T.B] | -10.4167 | 4.750 | -2.193 | 0.035 | -20.081 | -0.752 |
---|
TRT[T.C] | -11.0833 | 4.750 | -2.333 | 0.026 | -20.748 | -1.419 |
---|
Omnibus: | 0.553 | Durbin-Watson: | 1.488 |
---|
Prob(Omnibus): | 0.758 | Jarque-Bera (JB): | 0.544 |
---|
Skew: | -0.267 | Prob(JB): | 0.762 |
---|
Kurtosis: | 2.721 | Cond. No. | 3.73 |
---|
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
연습문제
독립변수(x): Income
종속변수(y): Consumption
1
2
| us = pd.read_excel("data/uschange.xlsx")
us.head()
|
| Date | Consumption | Income | Production | Savings | Unemployment |
---|
0 | 1970-01-01 | 0.615986 | 0.972261 | -2.452700 | 4.810312 | 0.9 |
---|
1 | 1970-04-01 | 0.460376 | 1.169085 | -0.551525 | 7.287992 | 0.5 |
---|
2 | 1970-07-01 | 0.876791 | 1.553271 | -0.358708 | 7.289013 | 0.5 |
---|
3 | 1970-10-01 | -0.274245 | -0.255272 | -2.185455 | 0.985230 | 0.7 |
---|
4 | 1971-01-01 | 1.897371 | 1.987154 | 1.909734 | 3.657771 | -0.1 |
---|
1
| pg.corr(us["Income"], us["Consumption"])
|
| n | r | CI95% | p-val | BF10 | power |
---|
pearson | 187 | 0.398779 | [0.27, 0.51] | 1.577409e-08 | 7.007e+05 | 0.999922 |
---|
- Income과 Consumption의 상관 계수
0.398779
- 95% 신뢰 구간
[0.27,0.51]
(모집단에서 무한히 관측했을 경우 나오는 범위)
모집단에서 어쨌든 +
가 나온다 - 유의수준 5%에서 가설 검정
p-value가 0.05(1.577409e-08
) 보다 작다
-> 통계적으로 유의한 상관이 있다 (유의수준 5%) -> 모집단에서 상관=0인데, 표본에서 이만큼 나올 확률은 낮음
1
| ols("Consumption ~ Income", data=us).fit().summary() # 종속 ~ 독립
|
OLS Regression ResultsDep. Variable: | Consumption | R-squared: | 0.159 |
---|
Model: | OLS | Adj. R-squared: | 0.154 |
---|
Method: | Least Squares | F-statistic: | 34.98 |
---|
Date: | Fri, 03 Jun 2022 | Prob (F-statistic): | 1.58e-08 |
---|
Time: | 16:21:51 | Log-Likelihood: | -169.62 |
---|
No. Observations: | 187 | AIC: | 343.2 |
---|
Df Residuals: | 185 | BIC: | 349.7 |
---|
Df Model: | 1 | | |
---|
Covariance Type: | nonrobust | | |
---|
| coef | std err | t | P>|t| | [0.025 | 0.975] |
---|
Intercept | 0.5451 | 0.056 | 9.789 | 0.000 | 0.435 | 0.655 |
---|
Income | 0.2806 | 0.047 | 5.915 | 0.000 | 0.187 | 0.374 |
---|
Omnibus: | 16.528 | Durbin-Watson: | 1.696 |
---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 29.145 |
---|
Skew: | -0.454 | Prob(JB): | 4.69e-07 |
---|
Kurtosis: | 4.707 | Cond. No. | 2.08 |
---|
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
- 절편
0.5451
- 기울기
0.2806
-> 수입이 1 증가하면, 소비는 0.28 증가하는 관계 - 신뢰구간
Incomde: [0.187, 0.374]
- 가설검정 해석
p<0.05 -> 기울기가 0이 아니다 -> 기울기가 있다 or 유의미하다
다중회귀분석
- 독립변수가 2개 이상인 회귀분석
+
로 변수를 구분
통계적 통제
- 독립 변수 x와 상관관계가 높은 요소 z가 존재할 경우, z가 종속변수 y에 미치는 영향이 x의 기울기에 간접 반영될 수 있음
- 실험적 통제: 데이터에서 z를 일정하게 유지하여 z의 영향을 제거
- 통계적 통제: z를 모형에 독립변수로 함께 포함하여 x의 기울기에 z의 영향이 간접 반영되지 않도록 함
표준화 (standardization)
${X - \mu} \over \sigma$
- 변수별로 퍼진 정도(분산)을 비슷하게 맞춰주는 절차
- 표준화를 진행하면, 평균=0, 표준편차=1이 됨
- 단위가 다른 변수의 기울기를 비교할 때 사용 -> 단위를 없애는 효과
- 관계식에서는
y ~ scale(x1) + scale(x2)
형식으로 사용
과대적합 (overfitting)
- 최소제곱법(OLS)은 잔차분산이 가장 작은 계수를 추정
- 주어진 표본에 가장 맞는 계수를 찾게 됨
- 표집 오차가 존재하기 때문에, 주어진 표본에 지나치게 맞는데 계수를 추정하면 모집단의 계수와 다를 수 있음
수정 R제곱과 AIC, BIC
- 독립변수의 개수가 다른 모형을 비교할 경우, R제곱으로는 비교가 어려움
- R제곱은 독립변수가 많을수록 높아지는 경향이 있음
- 독립변수의 개수를 이론적으로 보정한 수정 R제곱, AIC, BIC 등의 지수 사용
- 수정 R제곱(Adjusted R-Squared): R제곱을 보정 -> 클 수록 좋음
- AIC와 BIC: 잔차분산을 보정 -> 작을 수록 좋음
수정 R제곱 (Adjusted R-Squared)
$Adjusted \space R^2 = 1 - {RSS/(n-k-1) \over TSS/(n-1)}$
n: 표본의 크기, k: 독립변수의 개수
- 독립 변수를 추가하면 $R^2$이 작아지도록 보정
- 수정 R제곱이 클 수록 좋은 모형
- 모형 간 비교의 용도
- 한 모형이 종속변수의 분산을 설명하는 비율을 볼 때는 R제곱을 봐야함
$AIC = n \log ({RSS \over n}) + 2k$
$BIC = n \log ({RSS \over n}) + k\log{n}$
교차 검증
- 수정 R제곱, AIC, BIC 등은 이론적 보정이므로 과적합을 정확히 반영 못함
- 데이터가 충분히 많다면, 데이터를 여러 개의 셋으로 나누어 교차 검증
- 한 데이터 셋의 분석 결과를 다른 데이터셋에 적용하여 예측 오차를 확인 (예측 오차가 적은 모형이 좋은 모형)
- 이론적 가정에 의존하지 않으므로, 데이터가 충분히 많을 때는 교차 검증을 권장
교차 검증의 종류
- LpO CV (Leave-p-out)
- p개를 제외한 모든 사례로 추정에 사용
- p개는 가능한 모든 방법으로 조합
- 조합이 지나치게 많아 비현실적
- LOOCV (Leave-one-out)
- K-Fold: 데이터를 크게 k개의 셋으로 나누고, 한 셋 씩 테스트 셋으로 사용 (k번 교차검증)
- holdout: 데이터를 훈련 셋과 테스트 셋으로 한 번만 나누어 1회 교차 검증
교차 검증의 결과
- 훈련 오차와 테스트 오차가 모두 높은 경우
- 훈련 오차와 테스트 오차가 모두 낮음 -> 이상적인 모형
- 훈련 오차는 낮고, 테스트 오차는 높은 경우
데이터 분할
1
2
3
| from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(df, test_size=0.2, random_state=42) # 원자료, 테스트 데이터의 비율
|
변수의 변형
- 선형 모형은 독립 변수와 종속 변수의 선형적 관계를 가정한다는 한계
- 독립 변수를 비선형 변환하면 일부 극복 가능 (R과 python은 관계식에 수학 함수를 사용하면 자동으로 변수 변환)
로그 함수
- 오른쪽 위로 갈 수록 완만해지는 형태
- 데이터에 적용하면, 오른쪽을 왼쪽으로 끌어당기는 효과
- 독립 변수에 오른쪽으로 크게 떨여지 있는 값이 있는 경우, 로그 함수를 적용해 간격을 일정하게 만들 수 있음
1
| ols("price ~ np.log(mileage)", df).fit()
|
1
| <statsmodels.regression.linear_model.RegressionResultsWrapper at 0x1f45d755340>
|
함수
- 관계식에 덧셈, 곱셈, 거듭제곱 등을 할 경우 적용이 불가
I
함수를 이용해 아래와 같은 계산이 가능
$y = ax^2+bx+c$ 같은 모형을 관계식으로 만들 경우 -> y ~ I(x**2)+x
절편이 없는 모형
$y = wx + 0$을 표시하기 위해, 관계식에 0+
를 추가
y ~ 0 + x
절편의 이동
- 절편은
x=0
일 때의 예측치 - 절편을
x=100
일 때의 예측치로 바꾸려면, 일괄적으로 x
에서 100을 빼면 됨 - 분석 자체에는 영향이 없으나, 절편의 해석이 더 쉬워질 수 있음
y ~ I(x - 100)
상호작용 (interaction)
- 상호작용 항: 두 독립변수의 곱으로 이뤄진 항 -> $y = x + m + xm$
- 관계식으로 쓸 때는
:
을 사용 -> y ~ x + m + x:m
-> y ~ x*m
같이 축약할 수 있음 (*의 일반적인 의미와 용법이 다름)
상호작용의 해석
- x는 연속형, m은 이분 범주형이라고 할 때,
y ~ x + m
: m에 따라 x의 절편이 바뀌는 것으로 해석y ~ x + x:m
: m에 따라 x의 기울기가 바뀌는 것으로 해석y ~ x + m + x:m
: m에 따라 x의 기울기와 절편이 바뀌는 것으로 해석
증거의 사다리
인과관계의 증거 수준
- 실험적 통제
- 무작위 대조군
- 준실험
- 반사실
실험적 통제 (experimental control)
- 처치를 제외한 다른 모든 조건을 동일하게 유지
- 인과관계를 확인할 수 있는 최선의 조건
- 매우 한정된 조건에서만 가능
무작위 대조군 (randomized controlled trials)
- 모든 조건을 완벽하게 통제할 수 없을 경우
- 실험군과 대조군에 무작위 할당
- 표집 오차가 있을 수 있음
준실험 (quasi-experiment)
- 대조군이 없거나 무작위 할당을 하지 않았지만 실험과 비슷한 상황
- 자연적으로 무작위 할당과 비슷한 결과가 생긴 경우
반사실 (counterfactual)
- 순수한 관찰 결과만을 가지고 인과관계를 추측
- 어떤 일이 벌어지지 않았을 때 일어날 일을 예측하는 모형이 필요
- 모형의 예측과 실제의 결과를 비교하여 인과관계를 추론
횡단 비교와 종단 비교
- 횡단 비교(cross-sectional): 동일 시점에서 다른 대상이나 집단을 비교
- 종단 비교(longitudinal): 동일 대상을 다른 시점 간 비교
이중차분법 (Difference-in-Differences)
- 실험이 불가능한 상황에서 사용하는 준실험적 방법
- 실험군 B에 어떤 처치를 했으나 대조군이 없을 때
- 실험군과 비슷한 집단 A를 이용해 비교
- $d = (B_2 - B_1) - (A_2 - A_1)$
결과 해석
- d=0: 실험군 B에서 변화는 대조군 A에서 변화와 비슷 (처치 효과 없음)
- d!=0: 실험군 B에서 대조군 A와 다른 변화를 관찰 (처치 효과 있음)
평행 추세의 가정 (parallel trend assumption)
- 처치 효과가 없다면 실험군과 대조군이 비슷하게 변할 것이라는 가정
- 가정이 성립하지 않으면, 이중차분법의 결과는 무의미
- 가능한 비슷한 A와 B를 비교하는것이 중요
회귀분석을 통한 이중차분법
- 상호작용을 이용
- $y = a \cdot GROUP + b \cdot POINT + d \cdot (GROUP \times POINT) + e$
1
2
| nj = pd.read_excel("data/njmin3.xlsx")
nj.head(2)
|
| CO_OWNED | SOUTHJ | CENTRALJ | PA1 | PA2 | DEMP | nj | bk | kfc | roys | wendys | d | d_nj | fte |
---|
0 | 0 | 0 | 1 | 0 | 0 | 12.0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 15.0 |
---|
1 | 0 | 0 | 1 | 0 | 0 | 6.5 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 15.0 |
---|
fte
=전일제 환산 고용률, nj
=뉴저지(1)/펜실베니아(0), d
=최저임금 인상 전(0)/후(1)
1
| ols("fte ~ nj + d + nj:d", data=nj).fit().summary()
|
OLS Regression ResultsDep. Variable: | fte | R-squared: | 0.007 |
---|
Model: | OLS | Adj. R-squared: | 0.004 |
---|
Method: | Least Squares | F-statistic: | 1.964 |
---|
Date: | Fri, 03 Jun 2022 | Prob (F-statistic): | 0.118 |
---|
Time: | 17:03:35 | Log-Likelihood: | -2904.2 |
---|
No. Observations: | 794 | AIC: | 5816. |
---|
Df Residuals: | 790 | BIC: | 5835. |
---|
Df Model: | 3 | | |
---|
Covariance Type: | nonrobust | | |
---|
| coef | std err | t | P>|t| | [0.025 | 0.975] |
---|
Intercept | 23.3312 | 1.072 | 21.767 | 0.000 | 21.227 | 25.435 |
---|
nj | -2.8918 | 1.194 | -2.423 | 0.016 | -5.235 | -0.549 |
---|
d | -2.1656 | 1.516 | -1.429 | 0.154 | -5.141 | 0.810 |
---|
nj:d | 2.7536 | 1.688 | 1.631 | 0.103 | -0.561 | 6.068 |
---|
Omnibus: | 218.742 | Durbin-Watson: | 1.842 |
---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 804.488 |
---|
Skew: | 1.268 | Prob(JB): | 2.03e-175 |
---|
Kurtosis: | 7.229 | Cond. No. | 11.3 |
---|
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
Comments powered by Disqus.