넷플릭스 게임 사용자의 모험
이 글은 넷플릭스 (Netflix) 에서의 분석 엔지니어링 (Analytics Engineering) 관련 업무의 범위를 공유하기 위한 여러 편의 글 중 두 번째 글이며, 최근에 열렸던 분석 엔지니어링 컨퍼런스에서 발표된 내용이기도 합니다. 더 많은 내용이 궁금하신가요? 첫 번째 ...
가설 검정이란 무엇이며, 가설 검정의 다양한 방법에 대해 알아보자.
import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import math
# 특정 값과 표본평균의 검정 (One sample test)
np.random.seed(6) # 재현성을 위한 random seed 고정
# 모집단
population_ages1 = stats.poisson.rvs(loc=18, mu=35, size=150000)
population_ages2 = stats.poisson.rvs(loc=18, mu=10, size=100000)
population_ages = np.concatenate((population_ages1, population_ages2))
# 표본집단(미네소타)
minnesota_ages1 = stats.poisson.rvs(loc=18, mu=30, size=30)
minnesota_ages2 = stats.poisson.rvs(loc=18, mu=10, size=20)
minnesota_ages = np.concatenate((minnesota_ages1, minnesota_ages2))
print( population_ages.mean() )
print( minnesota_ages.mean() )
# 표본평균과 모평균 검정
stats.ttest_1samp(a= minnesota_ages, # Sample data
popmean= population_ages.mean()) # Pop mean
43.000112, 39.26
Ttest_1sampResult(statistic=-2.5742714883655027, pvalue=0.013118685425061678)
import seaborn as sns
# 미국 전체 인구와 미네소타 주민의 나이 분포도
sns.distplot(population_ages1) # US
sns.distplot(population_ages2) # MN
plt.show()
귀무가설을 채택(=’차이가 없다’고 판정) 해서는 안된다.
귀무가설(차이가 없다)이 기가되었을 때 귀무가설은 옳지 않다. 즉, ‘차이가 없는 것은 아니다(=차이가 없다)’고 해석하지만, 귀무가설이 기가되지 않았을 때의 해석에는 주의할 필요가 있다.
귀무가설이 기각되지 않더라도 귀무가설을 채택해서 그 내용(차이가 없다)이 옳다고 판정해서는 안 된다. 왜냐하면 실험을 다시 하거나 데이터를 늘리면 귀무가설을 기각할 수 있을지도 모르기 때문이다. 우선 이번 실험에서 관측한 데이터에서는 유의미한 차이가 검출되지 않았을 뿐일 수 있다. 그러므로 귀무가설이 기각되지 않은 경우라도 채택하지 않고 ‘판정을 보류’해 두는 것이 좋다.
이와 같이 가설검정은 어디까지나 ‘귀무가설을 기각’하기 위한 절차일 뿐, 귀무가설이 옳다는 것을 증명하기 위한 것이 아니다.
import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import math
import seaborn as sns
# 특정 값과 표본평균의 검정 (One sample test)
np.random.seed(6) # 재현성을 위한 random seed 고정
# 귀무가설: 비교대상인 특정값과 같은 모집단에서 표본이 추출되었다고 생각한다.
sample0 = stats.norm.rvs(size = 10000)
sample1 = stats.norm.rvs(size = 10000)
sns.distplot(sample0)
sns.distplot(sample1)
plt.title('Under Null Hypothesis')
plt.show()
# 대립가설: 특정값과는 다른 모집단에서 표본을 추출했다고 생각한다.
sample0 = stats.norm.rvs(size = 10000)
sample1 = stats.norm.rvs(size = 10000, loc = 3)
sample2 = stats.norm.rvs(size = 10000, loc = -3)
sns.distplot(sample0)
sns.distplot(sample1)
sns.distplot(sample2)
plt.title('Under Alternative Hypothesis')
plt.show()
# 대립가설: 특정값과는 다른 모집단에서 표본을 추출했다고 생각한다.
sample0 = stats.norm.rvs(size = 10000)
sample1 = stats.norm.rvs(size = 10000, loc = 5)
sample2 = stats.norm.rvs(size = 10000, loc = -5)
sns.distplot(sample0)
sns.distplot(sample1)
sns.distplot(sample2)
plt.title('Significance Level')
plt.show()
어느 방향의 유의 차에만 관심이 있는 경우(100쪽의 비열성 시험 등). 편측검정의 가설은 아래와 같아져 양측검정보다도 귀무가설을 기각하기 쉬워진다.
from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 분산이 동일한 두 집단의 독립표본 t 검정
# 대립가설: 두 집단의 표본평균이 다르다.
sample1 = stats.norm.rvs(size = 10000, loc = 5)
sample2 = stats.norm.rvs(size = 10000, loc = -5)
sample_diff = sample1 - np.mean(sample2)
sns.distplot(sample_diff)
plt.title('Independent T-test, Homoskedasticity')
plt.show()
# t 검정
stats.ttest_ind(sample1, sample2, equal_var = True)
Ttest_indResult(statistic=706.5325745021204, pvalue=0.0)
# 분산의 가법성
sample1 = stats.norm.rvs(loc = 0, scale = 2, size = 1000)
sample2 = stats.norm.rvs(loc = 0, scale = 1, size = 1000)
print("Standard deviation of sample1: ", np.std(sample1))
print("Standard deviation of sample2: ",np.std(sample2))
print("sqrt(Var(sample1) + Var(sample2)) = ", np.sqrt(np.var(sample1) + np.var(sample2)))
print("Standard deviation of sample1 + sample2: ",np.std(sample1 + sample2))
Standard deviation of sample1: 2.049210176804546
Standard deviation of sample2: 1.0250768862507638
sqrt(Var(sample1) + Var(sample2)) = 2.291297661030727
Standard deviation of sample1 + sample2: 2.290148153634864
# 분산이 다른 두 집단의 독립표본 t 검정
sample1 = stats.norm.rvs(loc = 0, scale = 2, size = 1000)
sample2 = stats.norm.rvs(loc = 0, scale = 1, size = 1000)
sample_diff = sample1 - np.mean(sample2)
sns.distplot(sample_diff)
plt.title('Independent T-test, Heteroskedasticity')
plt.show()
# t 검정
stats.ttest_ind(sample1, sample2, equal_var = False)
Ttest_indResult(statistic=1.1429674560564032, pvalue=0.2532392979727782)
# 등분산검정
sample1 = stats.norm.rvs(loc = 0, scale = 1, size = 150) # 표준편차가 2
sample2 = stats.norm.rvs(loc = 0, scale = 3, size = 150) # 표준편차가 1
sample_f = (sample1 ** 2 / len(sample1) - 1) / (sample2 ** 2 / len(sample2) - 1)
sns.distplot(sample_f)
plt.title('Homoskedasticity Test using F distribution')
plt.show()
피험자 | 투약 전 (x1) | 투약 후 (x2) | 차이 d (d = x1 - x2) |
---|---|---|---|
A | 180 | 120 | 60 |
B | 200 | 150 | 50 |
C | 250 | 150 | 100 |
평균 | ˉx1 = 210 | ˉx1 = 140 | ˉd = 70 |
# 대응표본 평균 차이 검정
sample1 = stats.norm.rvs(loc = 210, scale = 10, size = 100) # 투약 전
sample2 = stats.norm.rvs(loc = 140, scale = 10, size = 100) # 투약 후
sample_d = sample1 - sample2
sample_null = stats.norm.rvs(loc = 0, scale = 10, size = 100) # 귀무가설 하의 분포
# 각 개체별 차이의 분포
sns.distplot(sample1)
sns.distplot(sample2)
sns.distplot(sample_d)
sns.distplot(sample_null)
plt.title('Distribution of differences')
plt.show()
print(stats.ttest_rel(sample1, sample2))
Ttest_relResult(statistic=52.6587698758965, pvalue=3.2711937349211003e-74)
# 세 가지 사례에 대한 예제
sample_before = np.array([180, 200, 250])
sample_after = np.array([120, 150, 150])
stats.ttest_rel(sample_before, sample_after) # p-value < 0.05: 귀무가설을 기각할 충분한 증거가 있다고 할 수 있다.
Ttest_relResult(statistic=4.58257569495584, pvalue=0.04446691409409084)
A 라인 | B 라인 | |
---|---|---|
우량품 | 60장 | 80장 |
불량품 | 40장 | 120장 |
수율 | 60/100 = 0.6 | 80 / 200 = 0.4 |
# 액정 패널 사례로 비율 차이에 대한 검정 해보기
from statsmodels.stats.proportion import proportions_ztest
counts = np.array([60, 80])
nobs = np.array([100, 200])
stat, pval = proportions_ztest(counts, nobs)
print('p-value of the proportion test: ' + '{0:0.3f}'.format(pval))
p-value of the proportion test: 0.001
# 독립표본 평균차이 검정: 비열성 시험, 차이가 없는 경우
sample1 = stats.norm.rvs(loc = 100, scale = 10, size = 1000)
sample2 = stats.norm.rvs(loc = 80, scale = 10, size = 1000)
delta = 20
# 표본의 분포 살펴보기
sns.distplot(sample1)
sns.distplot(sample2)
plt.title('Distribution of samples')
plt.show()
# 비열성 검정
print(stats.ttest_ind(sample1 - delta, sample2, equal_var = True)) # 검정 결과 p-value > 0.05 이므로 두 집단에 차이가 있다고 할 충분한 근거를 찾지 못했다.
# 독립표본 평균차이 검정: 비열성 시험, 차이가 있는 경우
sample1 = stats.norm.rvs(loc = 100, scale = 10, size = 1000)
sample2 = stats.norm.rvs(loc = 80, scale = 10, size = 1000)
delta = 15
# 표본의 분포 살펴보기
sns.distplot(sample1)
sns.distplot(sample2)
plt.title('Distribution of samples')
plt.show()
# 비열성 검정
print(stats.ttest_ind(sample1 - delta, sample2, equal_var = True)) # 검정 결과 p-value < 0.05 이므로 두 집단에 차이가 있다고 할 충분한 근거를 찾았다.
Ttest_indResult(statistic=1.1237929964226825, pvalue=0.2612358561621533)
Ttest_indResult(statistic=10.626771098429602, pvalue=1.0704093372541964e-25)
이 글은 넷플릭스 (Netflix) 에서의 분석 엔지니어링 (Analytics Engineering) 관련 업무의 범위를 공유하기 위한 여러 편의 글 중 두 번째 글이며, 최근에 열렸던 분석 엔지니어링 컨퍼런스에서 발표된 내용이기도 합니다. 더 많은 내용이 궁금하신가요? 첫 번째 ...
듀오링고의 350% 성장의 뒷 이야기, 리더보드, 연속 학습, 알림, 그리고 혁신적인 그로스 모델 들어가기에 앞서
듀오링고의 350% 성장의 뒷 이야기, 리더보드, 연속 학습, 알림, 그리고 혁신적인 그로스 모델 들어가기에 앞서
듀오링고의 350% 성장의 뒷 이야기, 리더보드, 연속 학습, 알림, 그리고 혁신적인 그로스 모델
원문: Meaningful metrics: How data sharpened the focus of product teams
원문: Sequential Testing at Booking.com
가장 좋은 방법은 당연히 영어 밖에 사용하지 못하는 환경에 강제로 처해지는 것이겠지만 그것이 어려우니…
고민의 흔적을 보여주세요
을 찾습니다.
원문: Charts & Accessibility
모수, 큰 수의 법칙, 그리고 중심극한정리에 대하여
그리고 여러분들도 (아마도) 하지 않아야 하는 이유
회사 서비스의 추천 시스템을 개선하기 위해 팀 내에서 (아직까진 두 명이긴 하지만) 지난 두 달 동안 스터디를 진행했습니다. 얼마 전 두 번째 스터디가 끝났고 이에 대한 회고를 해보려고 합니다.
원문: Dark Side of Data: Privacy by Emre Rencberoglu
원문: RStudio Projects and Working Directories: A Beginner’s Guide by Martin Chan
원문: TidyTuesday GitHub Repository
원문: How programming languages got their names
원문: How to Make Meetings Less Terrible 팟캐스트: How to Make Meetings Less Terrible (Ep. 389)
생키 다이어그램 (Sankey Diagram) 은 흐름(Flow) 다이어그램의 한 종류로써 그 화살표의 너비로 흐름의 양을 비율적으로 보여준다.
2년 전 일본어로 책을 내긴 했지만 대부분의 독자들이 이 책을 읽을 수는 없을 것 같았다.
자기회귀 모형이란 무엇인가?
회귀분석을 실행하기 위해 필요한 가정과 조건들에 대해 알아보자.
통계적 검정과 회귀분석에서 자주 사용되는 정규성 가정과 정규성 검정에 대해 알아보자.
여러 통계 검정과 모형에서 사용되는 독립성 가정에 대해 알아보자.
시계열 모형 중 ARMA 모형에대해 알아보자.
시각화에서 주의할 점인 넓이를 표시하는 원칙에 대해 알아보자.
평균 양쪽의 z-값들 사이의 넓이를 구하는 방법에 대해 알아보자.
분산분석의 개념과 방법에 대해 알아보자.
분산분석(ANOVA; ANalysis Of VAriance) 와 회귀분석의 개념을 섞은 공분산분석(ANCOVA; ANalysis of COVAriance)에 대해 알아보자. 이 글을 이해하기 위해서는 아래의 글을 먼저 읽는 것이 좋다.
Akaike’s Information Criterion 의 정의와 이를 구하는 방법에 대해 알아보자.
수정된 R제곱과 그 용도에 대해서 알아보자.
통계 용어 중 정확도(Accuracy)와 정밀도(Precision) 에 대해서 알아보자.
절대 오차와 평균 절대 오차에 대해서 알아보자.
가설 검정이란 무엇이며, 가설 검정의 다양한 방법에 대해 알아보자.
회귀분석이란 무엇이며, 회귀분석 과정에서 사용하는 용어와 다양한 방법에 대해 알아보자.
이 글은 MathJax 를 GitHub Pages Jekyll blog 에 추가하는 방법을 다룬다. 이탤릭체로 된 부분은 본문에는 없고 제가 따라하면서 고치거나 추가한 부분이니 참고하세요.
모집단과 표본집단을 이용하는 경우 통계학에서 말하는 10% 조건이 무엇인지에 대해 알아보자.
여러분의 GitHub 블로그에 Jupyter notebook 을 바꿔서 올릴 수 있도록 도와줄 글입니다. 직접 바꾸는 방법은 1회성 글들을 위해서 추가했고, 변환 과정과 파일 이동, 그리고 여러분의 블로그에 올리는 것까지 한 번에 할 수 있는 자동화 bash 를 만드는 자세한 방법...
68 95 99.7의 법칙이란 무엇인가?
단위근 검정 방법 중 하나인 Augmented Dickey Fuller 검정에 대해 알아보자.
이 자료는 데이터 과학과 관련된 특정 주제에 대한 연재물이며, 다룰 주제는 다음과 같다. 회귀분석, 군집화, 신경망, 딥러닝, 의사결정나무, 앙상블, 상관관계, 파이썬, R, 텐서플로우, SVM, 데이터 축소, 피쳐 선택, 실험 계획법, 교차검증, 모델 피팅 등. 이 글을 계속 받...