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")
- 현재 제공된 타이타닉 데이터의 수는 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
- 남성과 여성 생존율의 평균
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)
- 남성과 여성의 생존율을 층화 임의 추출법으로 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
다음 순서를 따라, 생존여부와 성별, 좌석등급의 독립성을 검정하시오.
- 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)
- 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
- 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
- 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
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
- 타이타닉 데이터에서 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