아침:
성산포종합여객터미널에서 우도가는 매시간마다 들어가는 배가 있음
점심: 짜장면, 해물짬뽕
우도즐기는법
https://blog.naver.com/sk-bubu_traveler/223395437375
우도 스쿠터 타기
저녁: 갈치
아침:
성산포종합여객터미널에서 우도가는 매시간마다 들어가는 배가 있음
점심: 짜장면, 해물짬뽕
우도즐기는법
https://blog.naver.com/sk-bubu_traveler/223395437375
우도 스쿠터 타기
저녁: 갈치
점심
삼대국수회관본점
https://map.naver.com/p/entry/place/11727502?c=11.05,0,0,0,dh
카페: 김녕쪼끌락카페
구경: 김녕해수욕장
숙소: 제주 봄 그리고 가을리조트
저녁: 성산포흑돈애 성산본점
https://map.naver.com/p/entry/place/37604438?c=15.00,0,0,0,dh
https://velog.io/@finallazy/Python-multiprocessing-Pool
https://chealin93.tistory.com/288
개인의견: multi-process를 쓰거나 multi-thread를 쓰는걸 선택하는 상황에서 각각 장단점이 있다.
dask패키지 자체를 구현할때 python 기본패키지인 multiprocessing을 사용하기때문에 사용성을 높이고 속도가 좀 더 느릴 수 있다고 생각한다.
프로세스끼리는 같은 객체를 사용할 수 없고, 프로세스 수만큼 데이터나 모델이 만들어지면서 메모리 사용이 배로 늘어나게 된다.
shared memory를 사용하면 해결될 수 있지만 thread만큼 같은 객체를 공유하는데 빠르지 않다.
객체를 프로세스 내에서 새로 복사하기 때문에 multi-processing이 multi-threading보다 오래걸림.
그렇기에 한번만 선언한다면 processing이 빠름
Dask 패키지 사용 in Python (1) | 2023.11.20 |
---|
Dask는 병렬처리를 지원하는 Python Library
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()
import dask.dataframe as dd
df = dd.read_csv('file.csv')
df.groupby(df.user_id).value.mean().compute()
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()
from dask import delayed
L = []
for fn in filenames:
data = delayed(load)(fn)
L.append(delayed(process)(data))
result = delayed(summarize)(L)
result.compute()
multi-process vs multi-thread (2) | 2023.11.20 |
---|
SCM은 인과관계 모델 구조화를 의미핟나.
핵심은 do-operator로 Treatment에 영향을 주는 모든 요인을 이론적으로 차단하는 행위이다.
이론적인 관점이기 때문에 계산을 따로하지 못한다.
comfounder가 있어 treatment에 영향을 주어 보이는 확률이나 분포를 interventional probabilities 혹은 interventional distribution이라고 하는데 do-operator를 사용해 comfounder의 영향을 모두 제거하여 순수한 conditional probability로 만들 수 있고 이런 과정을 identification이라고 한다.
만약 comfounder가 관찰하기 어려운거라면?
(1) M = a + bT (alpha)
(2) Y = beta1 + beta2M + beta3T (beta)
(3) chain rule 적용으로 casual effect계산
이론적인 structural model이 있어야 분석이 가능하고 실제 적용 사례들이 많지는 않다는게 현재 상태이다.
The boo
인과관계
프레임워크가 필요하다
흄은 인과관계를 원인에 대한 필연적 결과가 아닌 이전의 경험과 아이디어로부터 결과가 연속적으로 발생한다는 관념에 불과하다라고 정의(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을 이용할 수 있음
도구변수도 이용하기 어렵다면?
Selection on observables: 관찰가능한 변수들로 선택편향을 통제해보자
matching과 regression 방법론
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
Structural Causal Model(SCM) (0) | 2023.10.16 |
---|
다중공선성을 진단하기 위해 사용되는지수로
독립변수가 여러개 있을 때, 특정 독립변수를 종속변수로하고 나머지 독립변수를 독립변수로 하여 회귀분석을 수행한다. 각 회귀식의 결정계수를 계산하여 1/1-R^2값으로 VIF를 정의한다.
상관관계가 높은 독립변수는 추정된 계수가 분산이 커진다. 얼마나 커지는지 확인할 수 있는게 VIF값이고 VIF가 크다는것은 다른 변수들로 설명가능함을 나타낸다.
https://direction-f.tistory.com/46
http://web.vu.lt/mif/a.buteikis/wp-content/uploads/PE_Book/4-5-Multiple-collinearity.html
만약 데이터프레임 안에 범주형 변수가 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()
# Calculate GVIF
GVIF = (np.linalg.det(A) * np.linalg.det(B)) / np.linalg.det(C)
return GVIF
```
이 함수는 범주형 변수에 대한 GVIF를 계산하는 함수이며, 다른 범주형 변수와 수치형 변수 간의 상호작용을 고려하여 GVIF를 계산합니다. 함수를 사용하기 전에, 데이터프레임에서 범주형 변수와 수치형 변수의 이름을 적절히 지정해주어야 합니다.
def calculate_GVIF(all_vars, var):
"""Calculate GVIF between one non-numeric variarble (var) and other variables (all_vars)"""
# Create correlation matrix (A) of non-numeric variable (var)
A = pd.get_dummies(all_vars[var], drop_first = True).corr().to_numpy()
# Seperate non-numeric variable name (var) from other variable names
columns = list(all_vars.columns)
columns.remove(var)
# Create correlation matrix (B) of other variables
B = pd.get_dummies(all_vars[columns], drop_first = True).corr().to_numpy()
# Create correlation matrix (C) of all variables
C = pd.get_dummies(all_vars, drop_first = True).corr().to_numpy()
# Calculate GVIF
GVIF = (np.linalg.det(A)*np.linalg.det(B)) / np.linalg.det(C)
return GVIF
Multiclassification imbalance problem improvement (0) | 2023.08.02 |
---|---|
LightGBM multiclassification code (0) | 2023.06.20 |
LGBM 이해 (0) | 2023.06.18 |
엔트로피 (0) | 2023.06.16 |
TPE 알고리즘 (0) | 2023.06.12 |
import statsmodels.api as sm
lm = sm.OLS(train_y, train_x)
result = lm.fit()
print(result.summary())
https://ysyblog.tistory.com/171
https://ysyblog.tistory.com/119
https://bkshin.tistory.com/entry/DATA-20-%EB%8B%A4%EC%A4%91%EA%B3%B5%EC%84%A0%EC%84%B1%EA%B3%BC-VIF
Feature selection? sklearn을 활용하면 (0) | 2023.07.19 |
---|---|
Sampling 방법 (0) | 2023.04.28 |
평가지표 (1) Accuracy와 Precision and Recall (0) | 2021.08.02 |
데이터 불균형 문제를 대하는 법 - Sampling 방법론 (0) | 2021.04.13 |
표준화(standardization)와 정규화(normalization) (0) | 2021.01.27 |
다중분류의 경우 불균형문제를 해결하기 위해 아래와같은 처리를 시도할 수 있다.
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은
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의 개선된 버전이다. 동일한 프로세스를 진행한 후 점들에 임의의 작은 값을 더해줌으로써 조금 더 사실적인 데이터가 생성된다. 즉 모든 표본이 약간 더 분산된다.
다음과 같이 실행할 수 있다.
from imblearn.over_sampling import ADASYN
strategy = {1:76, 2:76, 3:76, 5:76, 6:76, 7:76}
X_resampled, y_resampled = ADASYN(sampling_strategy=strategy).fit_resample(X, y)
count_and_plot(y_resampled)
출처: https://dining-developer.tistory.com/27
일반화된 분산팽창지수(Generalized VIF) (0) | 2023.09.13 |
---|---|
LightGBM multiclassification code (0) | 2023.06.20 |
LGBM 이해 (0) | 2023.06.18 |
엔트로피 (0) | 2023.06.16 |
TPE 알고리즘 (0) | 2023.06.12 |
통계적으로 두 그룹 간의 차이를 검정하는 가장 간단한 방법 중 하나는 "z-검정 (z-test)" 입니다. 이 방법을 사용하여 b 그룹이 a 그룹보다 큰 반응률을 가질 가능성이 있는지를 확인할 수 있습니다.
1. 귀무가설(H0)과 대립가설(H1) 설정: 이 경우 귀무가설은 "두 그룹 간의 반응률 차이가 없다"입니다. 대립가설은 "b 그룹이 a 그룹보다 더 큰 반응률을 보인다"입니다.
2. 유의수준(α) 설정: 일반적으로 유의수준은 0.05 또는 0.01로 설정됩니다.
3. 계산: z-검정 통계량을 계산합니다. 이 값을 계산하기 위해서는 두 그룹의 반응률, 표준오차 및 표본 크기가 필요합니다.
4. 결과 해석: 계산된 z-검정 통계량을 표준 정규 분포에서 비교하여 p-값을 계산합니다. p-값이 유의수준보다 낮으면 귀무가설을 기각하고 대립가설을 채택합니다. 이 경우, b 그룹이 a 그룹보다 더 큰 반응률을 보인다는 결론을 내릴 수 있습니다.
위의 방법 외에도 t-검정(t-test), 카이제곱 검정(Chi-square test), 로지스틱 회귀(Logistic regression) 등의 분석 방법을 사용하여 두 그룹 간의 차이를 검정할 수 있습니다.
import numpy as np
from scipy.stats import norm
# a 그룹과 b 그룹의 샘플 크기와 반응률을 지정합니다.
n_a = 1000
r_a = 0.15
n_b = 1000
r_b = 0.2
# z-검정 통계량을 계산합니다.
p_a = r_a
p_b = r_b
se = np.sqrt(p_a * (1 - p_a) / n_a + p_b * (1 - p_b) / n_b)
z = (p_b - p_a) / se
# p-값 계산
p_value = norm.sf(z)
# 유의수준을 0.05로 설정한 경우, p-값이 유의수준보다 작으면 귀무가설을 기각합니다.
alpha = 0.05
if p_value < alpha:
print("b 그룹이 a 그룹보다 더 큰 반응률을 보입니다.")
else:
print("두 그룹 간의 반응률 차이가 없습니다.")
모수 vs 비모수 (0) | 2021.03.29 |
---|---|
일반화 선형 모형(Generalized Linear Regression) (0) | 2020.09.09 |