1 추론통계

1.1 추론통계의 의의

  • 통계 조사에서 조사대상이 되는 전체 집단을 모집단이라 하고, 모집단에서 뽑은 일부 자료를 표본이라고 한다.
  • 모집단에서 추출된 표본으로 부터 모수와 관련된 통계량들의 값을 계산하고, 이것을 이용하여 모집단의 특성을 알아내는 과정을 추론 통계 분석이라고 한다.
  • 추론 통계는 예측은 물론, 머신 러닝 등을 통해서 나온 분석의 결과가 통계적으로 유의한지를 검증하는 역할을 한다.

가설의 유형

  • 추론 통계에서는 귀무가설과 대립가설을 세우고, 귀무가설이 기각됨을 통해 본래 알아보고자 한 대립가설이 통계적으로 유의한 것인지를 확인한다.

귀무가설의 기각

  • 가설을 검증할 때는 귀무가설이 채택될 가능성을 본다. 보통 신뢰도 95%수준으로 본다. 따라서 귀무가설이 채택될 가능성이 평균을 중심으로 95%구간에 있으면 귀무가설은 채택되고, 대립가설은 기각된다. 즉 본래 알아보고자 한 내용은 유의하지 않게 된다.
  • 반대로 귀무가설이 채택될 가능성이 왼쪽 0.25%, 오른쪽 0.25% 구간에 속하게 되면 귀무가설은 기각되고, 대립가설이 채택된다.

p-value

  • 이때 사용된 기준을 유의수준이라고 하고, 5% 즉 0.05가 귀무가설이 기각되고 대립가설이 채택될 수 있는 기준이 된다.
  • 가설이 속할 확률인 유의확률인 p-value가 0.05보다 크면 귀무가설을 채택한다.

정규분포

  • 가설의 검증은 정규분포를 기반으로 한다.
  • 정규분표는 평균과 표준편차에 의해서 그래프의 모양과 위치가 결정되며, 각각 0과 1을 둔 것을 표준 정규분포라고 한다.
  • 정규분포의 형태
x <- seq(-5, 5 , length = 1000)                      # R은 대량의 데이터 찍을 때 1000개까지
y <- dnorm(x, mean = 0, sd = 1)
plot(x,y, type = "l", lwd = 1)
den.norm <- function(x) dnorm(x, mean = 0, sd = 2)
curve(den.norm,col = "red", add = TRUE, lty = 2)
den.norm <- function(x) dnorm(x, mean = 0, sd = 3)
curve(den.norm, col = "blue", add = TRUE, lty = 2)   # sd 값에 따른 차이 확인. 표편이 커질 수록 첨도 내려간다.

1.2 표본추출

1.2.1 단순 임의 추출 1)

  • 동일한 확률로 표본을 추출한다.
x <- c(1:10)
sample(x, 5, replace = TRUE )
## [1]  7 10  8  2  5

1.2.2 단순 임의 추출 2)

서로 다른 추출 확률을 사용한다. 원소마다 다른 가중치를 가져야 할 때 사용한다.

x <- c("A", "B", "C", "D", "E")
prob <- c(6, 1, 5, 1, 3)
sample(x, 3, replace = TRUE, prob = prob)  
## [1] "C" "C" "E"

1.2.3 층화 임의 추출

데이터의 종류별로 표본을 추출한다.

#install.packages("sampling")
library(sampling)

m <- strata(c("Species"), size = c(2, 3, 4), method = "srswor", data = iris) 
# size = 각층의 크기, srswor = 비복원 단순 임의 추출 , srswr = 복원 단순 임의 추출
getdata(iris, m)    
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species ID_unit
## 46           4.8         3.0          1.4         0.3     setosa      46
## 47           5.1         3.8          1.6         0.2     setosa      47
## 55           6.5         2.8          4.6         1.5 versicolor      55
## 65           5.6         2.9          3.6         1.3 versicolor      65
## 83           5.8         2.7          3.9         1.2 versicolor      83
## 103          7.1         3.0          5.9         2.1  virginica     103
## 110          7.2         3.6          6.1         2.5  virginica     110
## 137          6.3         3.4          5.6         2.4  virginica     137
## 148          6.5         3.0          5.2         2.0  virginica     148
##     Prob Stratum
## 46  0.04       1
## 47  0.04       1
## 55  0.06       2
## 65  0.06       2
## 83  0.06       2
## 103 0.08       3
## 110 0.08       3
## 137 0.08       3
## 148 0.08       3
class(m)
## [1] "data.frame"

연습문제 1

sample 함수에서 실제 확률값이 가중치가 되도록 표본을 추출하는 코드

item <- c("A", "B", "C", "D", "E")
sales <- c(30, 5, 25, 5, 15)
df <- data.frame(item, sales); df
##   item sales
## 1    A    30
## 2    B     5
## 3    C    25
## 4    D     5
## 5    E    15
prob <- df$sales / sum(df$sales)
class(df$item)            # vector로 만든 df 이기 때문에 추출하면 다시 원래의 형태로 돌아감
## [1] "factor"
sample(item , prob = prob)
## [1] "C" "E" "A" "B" "D"

연습문제1-2

타이타닉 데이터를 기반으로 다음 물음에 답하시오

Data <- read.csv("train.csv")
  1. 현재 제공된 타이타닉 데이터의 수는 891명이다 이 중 탑승자의 생존 여부를 단순 임의 추출을 하되, 비복원 추출을 통해 선별하시오. (5%, 15%, 50%)의 샘플을 추출하여 전체 데이터의 생존률과의 차이를 비교
a <- sample(Data$Survived, size = NROW(Data)*0.05, replace = FALSE)
b <- sample(Data$Survived, size = NROW(Data)*0.15, replace = FALSE)
c <- sample(Data$Survived, size = NROW(Data)*0.5, replace = FALSE)

mean(a); mean(b); mean(c)
## [1] 0.5
## [1] 0.3157895
## [1] 0.3617978
  1. 남성과 여성 생존율의 평균
library(sampling)
male <- subset(Data, Data$Sex == "male")      # Data[Data$sex == "male", ] 
female <- subset(Data, Data$Sex == "female")    # Data[Data$sex == "female", ] 
#Sur <- Data[Data$Survived==1, ]

m.m <- mean(male$Survived)
m.f <- mean(female$Survived)
  1. 남성과 여성의 생존율을 층화 임의 추출법으로 50명씩 추출한 뒤, 평균 생존율을 구하시오.(단 비복원추출)
#m <- strata(c("sex"), size = c(50, 50), replace = F, method = "srswor", data = sur )
#data.m <- getdata(Data, m)

m2.m <- sample(male$Survived, size = 50, replace = F)
m2.f <- sample(female$Survived, size = 50, replace = F)
mean(m2.m); mean(m2.f)
## [1] 0.12
## [1] 0.82

1.3 가설검정

1.3.1 독립성 검정

  • 두 변수 사이에 상관관계가 있는지를 살펴본다
성별과 운동량의 차이를 기록한 MASS::survey 데이터를 본다.
install.packages("MASS")
library(MASS)
## Warning: package 'MASS' was built under R version 3.5.1
data("survey")
head(survey$Exer)
## [1] Some None None None Some Some
## Levels: Freq None Some
#str(survey)

xt <- xtabs(~Sex + Exer, data = survey)  # 데이터성 테이블의 도수분포표 작성
xt
##         Exer
## Sex      Freq None Some
##   Female   49   11   58
##   Male     65   13   40
chisq.test(xt)                           # 카이제곱 검정으로 독립성 판단  
## 
##  Pearson's Chi-squared test
## 
## data:  xt
## X-squared = 5.7184, df = 2, p-value = 0.05731

1.3.2 피셔의 정확검정

  • 표본 수가 적거나, 표본이 한쪽에 치우치게 분포되어 있을 때 사용한다.
  • 카이제곱 검정이 부정확한 경우에 사용한다.
xt <- xtabs(~W.Hnd + Clap, data = survey) # 데이터 테이블의 도수분포표 작성
chisq.test(xt)
## Warning in chisq.test(xt): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  xt
## X-squared = 19.252, df = 2, p-value = 6.598e-05
fisher.test(xt)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  xt
## p-value = 0.0001413
## alternative hypothesis: two.sided

1.3.3 맥니마 검정

  • 어떤 사건을 전후로 응담자의 성향 등을 조사할 때 사용한다.
  • 귀무가설은 ‘차이가 없다’ 이다.
  • TV 유세 후 지지율의 변화, 안전벨트 단속 전후 교통사고 비교 등이 예이다.
Performance <- matrix(c(794, 86, 150, 570), nrow = 2,
                      dimnames = list("1st-Survey" = c("Approve","Disapprove"),
                                      "2nd-Survey" = c("Approve","Disapprove")))   # 이름 달아주기
Performance
##             2nd-Survey
## 1st-Survey   Approve Disapprove
##   Approve        794        150
##   Disapprove      86        570
mcnemar.test(Performance)
## 
##  McNemar's Chi-squared test with continuity correction
## 
## data:  Performance
## McNemar's chi-squared = 16.818, df = 1, p-value = 4.115e-05

1.3.4카이제곱 검정

  • 데이터가 특정 분포를 따르는지를 살펴볼 때 사용한다.
  • 귀무가설은 ‘주어진 분포를 따른다’
tb <- table(survey$W.Hnd)
chisq.test(tb, p = c(0.3, 0.7))
## 
##  Chi-squared test for given probabilities
## 
## data:  tb
## X-squared = 56.252, df = 1, p-value = 6.376e-14

1.3.5 샤피로 윌크 검정

  • 표본이 정규분포로 부터 추출된 것 인지를 살펴본다
  • 귀무가설은 ‘정규분포를 따른다’ 이다.
x <- rnorm(1000)
shapiro.test(x)
## 
##  Shapiro-Wilk normality test
## 
## data:  x
## W = 0.99858, p-value = 0.6048

1.3.6 K-s 검정

  • 콜모고로프 스미르노프 검정
  • 두 데이터가 차이가 있는지를 살펴본다
  • 귀무가설은 ‘차이가 없다’ 이다.
ks.test(rnorm(100), rnorm(90))
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  rnorm(100) and rnorm(90)
## D = 0.096667, p-value = 0.7239
## alternative hypothesis: two-sided

연습문제2-1

다음 순서를 따라, 생존여부와 성별, 좌석등급의 독립성을 검정하시오.

  1. chi-test를 사용하여 성별(sex)과 생존여부(Survived)사이의 p-value를 구하시오
#Factor인 성별, 좌석등급과의 독립성을 검정하기 위해서는 생존여뷰를 factor로 변환해야한다.
Data$Survived <- as.factor(Data$Survived)

S.S <- xtabs(~Data$Survived + Data$Sex, data = Data)
chisq.test(S.S)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  S.S
## X-squared = 260.72, df = 1, p-value < 2.2e-16
#str(Data)
  1. chi-test를 사용하여 좌석등급(Pclass)과 생존여부(Survived) 사이의 p-value를 구하시오.
P.S <- xtabs(~Data$Survived + Data$Pclass, data = Data)
chisq.test(P.S)
## 
##  Pearson's Chi-squared test
## 
## data:  P.S
## X-squared = 102.89, df = 2, p-value < 2.2e-16
  1. chi-test를 사용하여 이름(Name)과 생존여부(Survived) 사이의 p-value를 구하시오.
N.S <- xtabs(~Data$Survived + Data$Name, data = Data)
chisq.test(N.S)
## Warning in chisq.test(N.S): Chi-squared approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  N.S
## X-squared = 891, df = 890, p-value = 0.4842

연습문제2-2

  1. 60명 대상자에 대해 A,B 그룹별로 대장암에 걸렸는지 검사한 결과는 아래와 같다. 그룹과 대장암 발생 여부 사이의 관련성을 검증하시오
group <- c("A", "A", "B", "B")
cancer <- c("1.Yes", "2.No","1.Yes", "2.No")
count <- c(2, 28, 5, 25)
dat <- data.frame(group, cancer, count)
tab <- xtabs(count ~ group + cancer, data = dat)
tab
##      cancer
## group 1.Yes 2.No
##     A     2   28
##     B     5   25
fisher.test(tab)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  tab
## p-value = 0.4238
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
##  0.03189243 2.46223985
## sample estimates:
## odds ratio 
##  0.3630951
  1. 표를 만들고 맥니마 검정을 수행하여 귀무가설 기각여부를 검증하시오
  • 표 만드는 방법 1
present <- matrix(c(59, 16, 6, 80), nrow = 2,
                      dimnames = list("After" = c("present", "absent"),
                                      "Before" = c("present", "absent")))
present
##          Before
## After     present absent
##   present      59      6
##   absent       16     80
  • 표 만드는 방법 2
after.group <-c("present", "absent", "present", "absent")
before.group <- c("present", "present", "absent", "absent")
count <- c(59, 16, 6, 80)
present1 <- data.frame(after.group, before.group, count)
present1
##   after.group before.group count
## 1     present      present    59
## 2      absent      present    16
## 3     present       absent     6
## 4      absent       absent    80
pre.dat <- data.frame(after.group, before.group, count)
pre.dat
##   after.group before.group count
## 1     present      present    59
## 2      absent      present    16
## 3     present       absent     6
## 4      absent       absent    80
pre.tab <- xtabs(count ~ after.group + before.group , data = pre.dat)
pre.tab
##            before.group
## after.group absent present
##     absent      80      16
##     present      6      59

결과

mcnemar.test(present)
## 
##  McNemar's Chi-squared test with continuity correction
## 
## data:  present
## McNemar's chi-squared = 3.6818, df = 1, p-value = 0.05501
mcnemar.test(pre.tab)
## 
##  McNemar's Chi-squared test with continuity correction
## 
## data:  pre.tab
## McNemar's chi-squared = 3.6818, df = 1, p-value = 0.05501
  1. 타이타닉 데이터에서 nemeric으로 분류할 수 있는 데이터로 샤프로 월크 검정을 해보아라.
shapiro.test(Data$Age)
## 
##  Shapiro-Wilk normality test
## 
## data:  Data$Age
## W = 0.98146, p-value = 7.337e-08
shapiro.test(Data$Pclass)
## 
##  Shapiro-Wilk normality test
## 
## data:  Data$Pclass
## W = 0.71833, p-value < 2.2e-16