import dask.array as da
f = h5py.File('myfile.hdf5')
x = da.from_array(f['/big-data'], chunks = (1000, 1000))
x - x.mean(axis=1).compute()
Dask DataFrame
import dask.dataframe as dd
df = dd.read_csv('file.csv')
df.groupby(df.user_id).value.mean().compute()
Dask Bag
import dask.bag as db
b = db.read_text('file.json.gz').map(json.loads)
b.pluck('name').frequencies().topk(10, lamba pair: pair[1]).compute()
Dask Delayed
from dask import delayed
L = []
for fn in filenames:
data = delayed(load)(fn)
L.append(delayed(process)(data))
result = delayed(summarize)(L)
result.compute()
핵심은 do-operator로 Treatment에 영향을 주는 모든 요인을 이론적으로 차단하는 행위이다.
이론적인 관점이기 때문에 계산을 따로하지 못한다.
comfounder가 있어 treatment에 영향을 주어 보이는 확률이나 분포를 interventional probabilities 혹은 interventional distribution이라고 하는데 do-operator를 사용해 comfounder의 영향을 모두 제거하여 순수한 conditional probability로 만들 수 있고 이런 과정을 identification이라고 한다.
backdoor criterion: causal association 혹은 causal relationship(X -> Y) 를 제외한 모든 backdoor path를 막는 변수들의 집합 (예를 들면, compounder는 막고, collider는 막지 않는것)
backdoor adjustment: 모든 변수를 condition하거나 control 하는것
frontdoor adjustment
만약 comfounder가 관찰하기 어려운거라면?
(1) M = a + bT (alpha)
(2) Y = beta1 + beta2M + beta3T (beta)
(3) chain rule 적용으로 casual effect계산
이론적인 structural model이 있어야 분석이 가능하고 실제 적용 사례들이 많지는 않다는게 현재 상태이다.
흄은 인과관계를 원인에 대한 필연적 결과가 아닌 이전의 경험과 아이디어로부터 결과가 연속적으로 발생한다는 관념에 불과하다라고 정의(necessary connection) 인과율 회의론 혹은 인과율 부정: 어떤게 진짜 인과관계인가?
실증주의: 검증가능한 법칙에 의해 세상이 돌아간다. => 인과관계가 필요하다. 관념적인 연결고리가 아닌 과학적인 방법으로 검증할 수 있는 수단이 필요함 => 인과관계 프레임워크의 필요성 (공통의 이해틀이 필요함)
인과관계에 대한 다양한 접근
1. theory based hypothetical causation - logical imperative 2. Statistics based approach - population에서 샘플링 한것들의 인과추론 결과가 bias 없이 - seeking unbiasedness 3. Design based - control/ treatment 를 나누는 방식으로 인과관계 정의 - removing selection bias 4. Structure based - 얽혀있는 구조를 들어내기 - estimating causal structures
강점 단점
Statistics ~ Endogeneity? 수학적으로 계산 가능하다는 점이 강점 여러 통계 모형이 있을때 endogeneity를 얼마나 줄일 수 있는가 비교가 가능하다 (instrumental variable: 고부변수 ~ confounding variable을 상쇄시키는 변수) 데이터 분석전략에 대해 구체적인 가이드를 주지 못한다는 것이 단점
Design based approach 
1-2
Potential outcomes framework
Rubin: treatment를 정의할 수 없다면 potential outcomes 을 수행할 수 없음 연구자가 적절한 디자인을 설정해야한다. => 리서치
counterfactual은 potential outcome framework 에서 가장 중요한 개념 문제점? 동일한 사람의 개인이 treatment를 받고 안받고를 동시에 경험할 수 없는 현실적 문제가 있음 그렇기때문에 결과에 대한 정확한 정의가 필요한 counterfactual은 현실에서 얻을 수 없고 갖고 있는 데이터는 control 그룹뿐이다.
Potential outcome framework에서 가장 방해가 되는 요인은 selection bias이다. 애초에 treatment가 없는 상황에서도 treated와 untreated간의 차이가 있다면 인과추론결과를 보는데 방해가 될것이다. Selection bias를 줄여 우리가 관측하는 observed effect와 causal effect가 같아질 수 있다. Ceteris paribus 원칙(라틴어: 모든것이 동등하다면): reatment가 없는 상황에서도 control과 treatment의 변수들이 평균적으로 비슷하도록 디자인 조정하는것이 중요하다. 라는 결론
1-3 Comparable control group 찾는 사례 이전에 경제성장은 개인의 자금과 내부 발전으로 이루어진다는 endogenous growth model에 기반했지만 개발도상국과 선진국간의 차이가 좁혀지지 않음이 제도에 있다라고 보는 신제도학
예시 맥시코의 노갈래스, 에리조나의 노갈래스 쌍둥이 도시 (북한, 남한은 애초에 비교 대상이안됨) 종교, 문화, 지리적 요인이 비교가능하고 비슷한 상태 하지만 절반은 미국, 절반은 맥시코의 제도하에 있게되었고 미국이 3-4배 이상 잘산다
1995년 시카고 폭염참사 폭염이 사회적인 대응이 필요한 인식이란 개념이 없었던 시절 Causal mindset의 훌륭한 연구사례
인구커뮤니티의 성향차이로 폭염을 이겨낼 수 있었다 없었다의 인과추론 mindset을 볼 수 있음 인과추론을 가능하게 하는건 어떤 테크닉이나 통계적인 모델이 아님, 중요한건 리서치 디자인이다 비교 가능한 데이터를 수집하는 것이 중요하다는 사례
Control variable(통제변수): 탐구하기를 원치 않는 변수
같은 신장(거의 counterfactual인)을 기증해도 받는 사람의 행동을 학습한 observation learning 이론이 있다. 이 observation learning 이론을 뒷받침하는 인과추론 디자인으로 창의적인 사례였다.
2-1. 
단일 방법론 중 가장 신뢰도가 높은건 RCT Meta analysis는 반복적인 여러 인과관계 증거를 종합하여 명확하게 추론하는 방법
2-2 샘플수가 클수록 그룹의 법칙이 이론과 가까워진다. Random assignment~ 큰수의 법칙과 동일 Sample 수가 충분하다면 무작위배정으로 두 그룹이 평균적으로 비슷하게 구성할 수 있다. 우리가 모르는 다른 요인을 충분히 제거해야 한다. 예를 들어, 순서가 들어간 경우
Random assignment를 거의 완벽하게 수행한다면 복잡한 통계모형 없이 인과관계 추론이 가능하다는 장점이 있다. 애초에 비교가능하지 않은 대상을 가지고 비교분석을 하면 인과적추론이 어렵다. 예시) 이가탄 연구 회사에서는 A/B test가 RCT이다.
2-3. Quasi-experiment : random assignment를 할수 없어 실험과 비슷한 상황을 찾아 분석하는 것
실험연구와 달리 독립변수가 종속변수의 원인이다. 라는 결론에 도달할수는 없지만 원인들 중 하나일것이다. 라는 결론을 내릴 수 있다. 다른 변수의 영향을 무시할 수 없기 때문에
Causal inference flow chart 1. 연구목적이 인과추론인 경우인가? 2. Random assigment가 가능한가? 3. treatment가 무엇이고 control과 treatment group 구분할수있는지? => quasi experiment가 가능해지는 시점 4. 전후 데이터가 모두 있는지?
Quasi experiment의 방법 3가지: Self-selection(연구 대상자가 treatment를 받을지 말지), exogenous shock(의도하지 않은 외부 shock에 의한 구분 ~ 자연재해, 정치적 변동, 금융위기 등, natural experiment라고 부른다), discontinuity(어떤 threshold로 나눈 상황)
Exogenous shock은 DID + matching분석법, discontinuity는 RD로 분석
근데 만약? 전후 데이터가 충분하지 않으면? treatment를 예측할 수 있지만, error항과 연관이 없는지? 그러면 instrumental variable을 이용할 수 있음
regression같은 경우는 선형적인 관계가 있다는 가정하에 통제변수와 종속변수간의 관계를 찾아내고 matching은 sample수가 줄어들 수는 있지만 control과 treatment군을 평균적으로 비슷하게 matching하여 연구하는 것
RCT와 quasi-experiment의 차이는 control과 treatment군을 어떻게 배정하는지의 차이
우리가 주의해야하는 것: treatment 없이도 어떻게 control그룹이 treatment그룹과 유사할 수 있을까?
Exogenous shock 예시) 미국의 shale boom이 생긴 지역과 아닌 지역이 local finance에 영향이 있다, 없다 Shale이 묻혀있을지 예상하지 못한 상황에서 지역별로 경제상황이 크게 영향을 줄 것이 없다고 가정하고 분석하는 상황이다. 그렇기 때문에 Natural experiment는 RCT와 가장 유사한 효과를 내는 quasi experiment다.
Self selection 예시) sns에서의 활동이 기업을 방문하는데 영향이 있는지? sns활동은 참가자의 자발적인 행위 두 집단이 비교 가능한지에 대해서는 natural experiment에 비해서 엄밀하게 citrus paribus를 검증할 필요가 있음
Discontinuity 예시) 음주의 영향 미국에서 19세를 기준으로 음주에 의한 사망에 영향이 있는지 등을 분석가능 어떤 threshold 값의 직전후로 treatment와 control 그룹을 나눔
2-4) 이중차분법 DID

여기서 control그룹이 counterfactual과 가깝다면 control 그룹을 통해서 countfacutal을 유추할 수 있지 않을까?
T’a - Tb = treatment를 받지 않았을때 시간에 따른 자연스러운 변화 (관찰할 수 없는 값) Ca - Cb = treatment를 받지 않는 그룹이 treatment를 받았을때의 변화량 아래껄로 위를 대체함으로써 Counterfactual에 가까운값을 추정할 수 있지 않을까? 원래는 Ta - T’a를 추정하는데 T’a를 치환하여 분석할 수 있음 DID는 시간에 따른 변화량만! 컨트롤 그룹으로 치환한다.
시간에 따른 변화량이 일정하다: parallel trends assumption Research design에서 선택편향을 없앨 수 있는 가정을 identification assumption이라고 부름 시간에 따른 변화량이 비슷해야한다. 평행하게 변화해야한다.
예시) Apple-nbc battle 
그럼 만약 comparable control group을 찾을 수 없다면 quasi-experiment를 사용할 수 없는가? No matching은 control과 treatment의 각 변수의 평균으로 둘으 최대한 유사하게 만들어주는 목적
1. Propensity score matching (propensity score: treatment group에 속할 확률) ⁃ 단점: 변수가 많다면 balance가 잘 안맞을 수 있다 2. Coarsened Exact Matching ⁃ 모든 변수가 같은 값인 sample들을 매칭 ⁃ 동일한 구간에 속한 값들은 같다고 보고 matching ⁃ https://bigdaheta.tistory.com/62
다중공선성을 진단하기 위해 사용되는지수로 독립변수가 여러개 있을 때, 특정 독립변수를 종속변수로하고 나머지 독립변수를 독립변수로 하여 회귀분석을 수행한다. 각 회귀식의 결정계수를 계산하여 1/1-R^2값으로 VIF를 정의한다. 상관관계가 높은 독립변수는 추정된 계수가 분산이 커진다. 얼마나 커지는지 확인할 수 있는게 VIF값이고 VIF가 크다는것은 다른 변수들로 설명가능함을 나타낸다.
만약 데이터프레임 안에 범주형 변수가 3개이고, 수치형 변수가 3개인 경우에는 다음과 같이 GVIF 함수를 수정할 수 있습니다.
```python def calculate_GVIF(all_vars, var): """ Calculate GVIF for one categorical variable (var) and other variables (all_vars) """ # Create correlation matrix (A) of the categorical variable (var) A = pd.get_dummies(all_vars[var], drop_first=True).corr().to_numpy()
# Select the names of all other categorical variables cat_columns = [col for col in all_vars.columns if all_vars[col].dtype == 'object' and col != var]
# Create correlation matrix (B) of other categorical variables B = pd.get_dummies(all_vars[cat_columns], drop_first=True).corr().to_numpy()
# Select the numeric columns num_columns = [col for col in all_vars.columns if all_vars[col].dtype in ['int64', 'float64']]
# Create correlation matrix (C) of numeric variables C = all_vars[num_columns].corr().to_numpy()
Algorithm Over Sampling | 알고리즘을 통한 오버샘플링(SMOTE, ADASYN)
Cost-sensitive learning
python에서 imblearn이라는 패키지에서 sampling function들을 사용할 예정이다.
# 필요 모듈 임포트
import imblearn
print(imblearn.__version__)
import pandas as pd
from collections import Counter
from matplotlib import pyplot
# 필요 함수 정의
def count_and_plot(y):
counter = Counter(y)
for k,v in counter.items():
print('Class=%d, n=%d (%.3f%%)' % (k, v, v / len(y) * 100))
pyplot.bar(counter.keys(), counter.values())
pyplot.show()
클래스에 하나도 존재하지 않는 경우도 있을 것이고 예측하려는 타켓의 수는 모두 다를 것이다.
Under sampling은 가장 작은 class의 개수에 맞춰 샘플개수가 줄어들 것이고, Over는 가장큰 수에 맞춰 증가할 것이다.
Under sampling은 잠재적 정보량이 많은 데이터를 지울 수 있는 문제가 있다. RandomUnderSampler는 Undersampler의 한 방법이고 다른 방법들도 많이 있다.
from imblearn.under_sampling import RandomUnderSampler
X_resampled, y_resampled = RandomUnderSampler(random_state=0).fit_resample(X, y)
count_and_plot(y_resampled)
Oversamping은 같은 데이터를 복제하여 over-fitting 문제를 야기한다.
from imblearn.over_sampling import RandomOverSampler
X_resampled, y_resampled = RandomOverSampler(random_state=0).fit_resample(X, y)
count_and_plot(y_resampled)
SMOTE sampling은
먼저 소수 클래스에서 각각의 샘플들의 knn(k-nearest neighbors)을 찾는다.
그리고 그 이웃들 사이에 선을 그어 무작위 점을 생성한다.
from imblearn.over_sampling import SMOTE
X_resampled, y_resampled = SMOTE(random_state=0).fit_resample(X, y)
count_and_plot(y_resampled)
ADASYN은 SMOTE의 개선된 버전이다. 동일한 프로세스를 진행한 후 점들에 임의의 작은 값을 더해줌으로써 조금 더 사실적인 데이터가 생성된다. 즉 모든 표본이 약간 더 분산된다.
단일 변수 선택법은 각각의 독립변수를 하나만 사용한 예측모형의 성능을 이용하여 가장 분류성능 혹은 상관관계가 높은 변수만 선택하는 방법이다. 사이킷런 패키지의 feature_selection 서브패키지는 다음 성능지표를 제공한다.
하지만 단일 변수의 성능이 높은 특징만 모았을 때 전체 성능이 반드시 향상된다는 보장은 없다.
아래 일변량 변수선택 예제이다.
from sklearn.feature_selection import SelectPercentile
# SelectPercentile을 사용하여 특성의 50%를 선택하는 모델 생성
select = SelectPercentile(percentile=50)
# 특성 선택
select.fit(X_train, y_train)
X_train_selected = select.transform(X_train)
feature_selection 서브패키지는 성능이 좋은 변수만 사용하는 전처리기인 SelectKBest 클래스도 제공한다.
지도 학습 머신러닝 모델을 사용하여 특성의 중요도를 평가, 가장 중요한 것만 선택 (최종학습과는 무관함, 모델이 같을 필요 없음)
해당 모델은 각 특성의 중요도를 측정하여 순서로 매길 수 있어야 함
결정트리 기반의 모델들은 각 특성의 중요도를 featureimportances에 저장하므로 이를 활용할 수 있음
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
# (지도 학습 모델로 계산된) 중요도가 지정한 임계치보다 큰 모든 특성 선택하는 모델제작
# 절반 가량의 특성이 선택될수 있도록 중간값을 임계치로 사용
select1 = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=0),
threshold='median')
# 특성 선택
select1.fit(X_train, y_train)
X_train_selected1 = select1.transform(X_train)
3. 반복적 특성선택
특성을 하나도 선택하지 않은 상태로 시작해 어떤 종료 조건을 도달할 때까지 하나씩 추가하는 방법
모든 특성을 가지고 시작해 어떤 종료 조건이 될 때까지 하나씩 제거하는 방법
두 가지 방법 중 하나를 활용해 특성을 결정한다.
from sklearn.feature_selection import RFE
# 특성 선택
select2 = RFE(RandomForestClassifier(n_estimators=100, random_state=0),
n_features_to_select=40)
# 특성 선택
select2.fit(X_train, y_train)
X_train_selected2 = select2.transform(X_train)