
지지도(A, B): A와B를 동시에 포함한 거래의 비율
: P(A∩B) / 전체
신뢰도(A, B): A의 거래 중 B도 같이 구매한 거래의 비율(조건부 확률)
: P(A∩B) / P(A)
향상도(A, B): A를 구매했을 때 B를 구매하는 확률이, B를 무작위로 구매할 확률보다 얼마나 우수한지에 대한 확률
: P(A∩B) / P(A) x P(B) = Conf(A→B) / P(B)
Lift) = 1: A와 B는 독립Lift > 1: 양의 상관관계(유의미), A 구매 시, B 구매 확률 증가Lift < 1: 음의 상관관계, A 구매 시, B 구매 확률 감소import numpy as np
N = len(df)
countA = df['colA'].sum()
countB = df['colB'].sum()
countA_B = len(df[(df['colA'] == True) & (df['colB'] == True)])
# 지지도
support = countA_B / N
# 신뢰도
confidence = coundA_B / countA
# 향상도
Lift = confidence / (countB / N)
: 단위 시간 당 접속 횟수, 발생 건수 등
from scipy import stats
# 평균
mu = 3
# 정확히 N명, N번
prob = stats.poisson.pmf(N, mu)
# N번 이상
prob = stats.poisson.cdf(N, mu)
# 적어도 N번
prob = 1 - stats.poisson.cdf(N, mu)
pmf(k, mu): 정확히 k번 발생할 확률 리턴cdf(k, mu): 0~k번까지 발생할 누적 확률: 카이제곱 검정_독립성 검정 stats.chi2_contingency
from scipy import stats
chi2, p_value, dof, expected = stats.chi2_contingency(data)
# data는 행렬(2차원)
# 기대빈도
res = expected[x][y]
p_value < 0.05라면 두 변수는 독립이 아니다.dof: 자유도expected: 기대빈도: n번의 시도에서 성공 or 실패, 각 시도의 성공 확률 => 베르누이 분포
: n번의 시도 중 정확히 k번 성공할 확률 => 이항분포
from scipy import stats
# 베르누이 분포 계산
# 성공 수 / 전체 횟수
n = len(df)
prob_bi = df['Success'].sum() / n
# 이항 분포 계산
k = 60 #(특정 값, 문제에서 제시)
prob = stats.binom.pmf(k, n, prob_bi)
stats.binom.pmf(k, n, p): 이항분포k: 정확히 성공할 횟수n: 전체 시도 횟수p: 각 시도에서 성공할 확률: 점추정(표본 평균) = 전체 데이터의 평균(.mean())
: 구간추정 = t-분포를 통한 신뢰구간 추정(stats.t.interval(신뢰도, 자유도, 표본평균, 표준오차))
from scipy import stats
import numpy as np
# 점추정(표본 평균)
sample_mean = df['colA'].mean()
# 신뢰구간
# 95% 기준
confidence = 0.95
# 자유도 dof = n - 1
n = len(df['colA'])
dof = n-1
# 표본 표준편차
sample_std = df['colA'].std(ddof = 1)
# 표준 오차
standard_error = sample_std / np.sqrt(n)
std_err = stats.sem(df['colA'])
# t-분포
lower, upper = stats.t.interval(confidence, dof, loc = sample_mean, scale = standard_error)
stats.t.interval() 파라미터confidence: 신뢰도dof: 자유도loc: 표본 평균scale: 표준 오차: 주 효과 2개, 상호작용 효과 1개 확인
: 변수x가 변수y에 미치는 영향 확인, 변수 x1, x2가 y에 미치는 영향 확인
1. 최소제곱법(ols())를 통한 선형 회귀 모델
2. 해당 모델을 anova_lm으로 분산분석: 3개 이상 집단의 평균이 서로 같은지, 다른지
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
model = ols('종속변수 ~ 독립변수1*독립변수2', data = df).fit()
anova_table = anova_lm(model)
f_colA = anova_table.loc['colA', 'F']
p_colA = anova_table.loc['colA', 'PR(>F)']
f_inter = anova_table.loc['colA:colB', 'F']
p_inter = anova_table.loc['colA:colB', 'PR(>F)']
anova_table 해석
df: 집단 수 - 1Residual의 df: 전체 데이터 수 - 집단 수sum_sq: 부서 간 평균 차이로 인해 발생한 변동성, 클수록 부서별 차이가 심하다는 뜻FPR(>F)accuracy-score: 예측 결과에 대한 정확도
log-likelihood: 모델이 주어진 데이터를 얼마나 잘 설명하는지에 대한 지표
: 보통 음수값, 0에 가까울수록 모델 성능 좋다.
from sklearn.metrics import accuracy_score
...
pred = model.predict(X_test)
accuracy = accuracy_score(df['colA'], pred')
log-likelihood = model.llf
: 모델이 데이터를 얼마나 못 맞추고 있는지
: 수가 작을수록 모델이 실제 데이터를 잘 설명하고 있음.
=> -2 * model.llf
from stats.formula.api import logit
...
model = logit(...).fit()
# 잔차이탈도
residual_deviance = -2 * model.llf
: 모델의 가성비 지표
AIC = 2k - 2*ln(k), k는 변수 개수
: 이탈도에 변수 개수 만큼의 패널티, 값이 작을수록 좋음
BIC = ln(n)*k - 2*ln(k), n은 데이터 개수
: AIC보다 변수 개수에 엄격, 데이터가 많아질수록 변수 추가에 까다로움
: 값이 작을수록 좋음
from statsmodels.formula.api import logit
model = logit( ... ).fit()
model.aic
model.bic
: 윌콕슨 검정(Wilcoxon Signed-Rank Test)
stats.wilcoxon, alternative=? 필수from scipy import stats
# 기준값과 데이터의 차이 계산
diff = df['colA'] - st # st(기준값)은 문제에서 제시
# 윌콕슨 부호순위 검정
# 중앙값이 기준값보다 클 것이다(greater)
statistics, p_value = stats.wilcoxon(diff, alternative='greater')