본문 바로가기
배우는 것들/R

데이터 과학을 위한 통계 - 4

by Ho.virus 2021. 1. 29.

3.3 재표본 추출

재표본 추출이란 관찰된 데이터 값에서 표본을 반복적으로 추출하는 것. 귀무가설 H0=H1 을 증명하기 위해 데이터 집합들을 하나로 뭉친 후 섞어 다시 나눈다. 이것을 여러 번 반복하여 분포를 만든 후 처음 검정하려던 데이터가 우연에 의한 결과인지 아닌지를 증명한다.

web_page_data = read.csv("web_page_data.csv")
session_times = read.csv("web_page_data.csv")

library("ggplot2")

ggplot(session_times , aes(x= Page, y = Time))+
  geom_boxplot()

mean_a = mean(session_times[session_times['Page'] == 'Page A', 'Time'])
mean_b = mean(session_times[session_times['Page'] == 'Page B', 'Time'])
mean_b - mean_a

박스플롯은 페이지 B가 방문객들을 더 오래잡은 것으로 나타난다.
각 그룹의 평균의 차이를 구한다.
두 그룹의 데이터를 섞고 다시 비복원 추출로 두 그룹으로 나눈다. 그 후 새로만든 그룹의 평균의 차이를 구한다.
이런 과정을 n회 반복하여 분포를 구하고, 처음 평균의 통계적 유의미성을 구한다.

perm_fun = function(x,n1,n2)
{
  n = n1 + n2
  idx_b = sample(1:n, n1)
  idx_a = setdiff(1:n, idx_b)
  mean_diff=mean(x[idx_b])-mean(x[idx_a])
  return(mean_diff)
}

위의 것이 1회 반복과정을 나타낸 코드.

perm_diffs = rep(1:1000)

for(i in 1:1000)
  perm_diffs[i]=perm_fun(session_times[,'Time'],21,15)
hist(perm_diffs,xlab='Session time differences (in seconds)')
abline(v = mean_b-mean_a)

반복문으로 1000회 반복한 뒤 히스토그램으로 분포를 나타낸다.
분포상 A페이지와 B페이지의 평균의 차이는 그렇게 유의미 하지 않을 확률이 높다.

3.4 통계적 유의성과 P값

책에 담긴 전자상거래 실험 결과를 확률로서 구현하자.

obs_pct_diff = 100*(200/23739 - 182/22588)

아까 사용했던 순열검정 함수를 이용해 전환율 차이에 대한 히스토그램을 그린다.

conversion = c(rep(0,45945),rep(1,382))

perm_diffs = rep(0,1000)
for(i in 1:1000)
  perm_diffs[i] = 100*perm_fun(conversion, 23739, 22588)
hist(perm_diffs, xlab = 'conversion rate', main = '')
abline(v = obs_pct_diff, lty = 2, lwd = 1.5)
text("   Observed\n   difference", x = obs_pct_diff,y = par()$usr[4]-20, adj = 0)

관찰된 차이(obs_pct_diff) 0.0368%의 차이는 유의미 하지 않을 확률이 높다. (랜덤 변이의 범위안에 있다.)

좀 더 정확한 검정을 위해 P값을 구해보면 다음과 같다.

p_value = mean(perm_diffs > obs_pct_diff)

p_value

p값은 0.312로 역시 유의미하다고 보기 힘들다.

가설이 이항분포를 따르기 때문에 정규분포로 p값을 근사할 수도 있다.

3.8 분산분석 ANOVA

A/B같이 두 그룹간의 분석 말고, 여러 그룹들의 데이터를 비교하는 절차를 분산분석이라고 한다.

아래는 네 웹페이지의 점착성(머무르는 시간)을 나타낸다.

four_sessions = read.csv("four_sessions.csv")

ggplot(four_sessions, aes(x = Page, y = Time) ) +
  geom_boxplot()

이 네가지 데이터를 2가지씩 분류해 비교하면 잘못된 결과가 포함될 확률이 높아진다.
95%의 유의기준을 가지고 6번 분석했을 때, 거짓이 하나라도 포함될 경우는 약 26.5%이다.
따라서 이런 방법 대신, 모든 데이터의 통계량의 차이에 대해 우연인지, 세션시간 역시 우연에 의해 차이가 나는것인지를 다루는 전체적인 총괄검정을 시행할 수 있다.

평균 대신 분산의 분포를 이용해 검정한다.

library("lmPerm")

summary(aovp(Time ~ Page, data = four_sessions))

Pr(prob) = p값으로 0.1009이다.

aov함수를 이용하면 F통계량을 이용한 검정 역시 가능하다.

summary(aov(Time ~ Page, data = four_sessions))