본문 바로가기
R 과 데이터분석/기초 문법 ~ 머신러닝

[R 데이터분석] 13장. 집단간 차이 검정

by JoyfulS 2019. 9. 13.

# chap13_Ttest_Anova

 

# 추론통계분석

# 1-1. 단일집단 비율차이 검정 

# 1-2. 단일집단 평균차이 검정 

# 2-1. 두집단 비율차이 검정 

# 2-2. 두집단 평균차이 검정 

# 2-3. 대응 두 집단 평균차이 검정

# 3-1. 두 집단 이상 비율차이 검정 

# 3-2. 두 집단 이상 평균차이 검정 

 

 


#############################################
# 추론통계분석 - 1-1. 단일집단 비율차이 검정
#############################################
# - 단일 집단의 비율이 어떤 특정한 값과 같은지를 검증

 

### 사용된 파일은 https://joyfuls.tistory.com/4 에서 다운 받으실 수 있습니다.


# 1. 실습데이터 가져오기
setwd("C:/2_Rwork/Part-III")
data <- read.csv("one_sample.csv", header=TRUE)
head(data)
x <- data$survey

# 2. 빈도수와 비율 계산
summary(x) # 결측치 확인
length(x) # 150개
table(x) # 0:불만족(14), 1: 만족(136) 

prop.table(table(x))
# 0.1 # 0.90666667

install.packages("prettyR")
library(prettyR) # freq() 함수 사용
freq(x) 

# 3. 가설검정 
# 형식) binom.test(성공횟수, 시행횟수, p = 확률)

# - 불만족율 기준 검정
# 양측검정
binom.test(14, 150, p=0.2) # 기존 20% 불만족율 기준 검증 실시
binom.test(14, 150, p=0.2, alternative="two.sided", conf.level=0.95)
# p-value = 0.0006735 < 0.05 : 기각 
# 1) 대립가설 : 불만율에 차이가 있음 
# 2) 방향성이 있는 대립가설 검정 : 2015 > 2014
binom.test(14, 150, p=0.2, alternative="greater", conf.level=0.95)
# p-value = 0.9999 : 기각 
# 3) 방향성이 있는 대립가설 검정 : 2015 < 2014 
binom.test(14, 150, p=0.2, alternative="less", conf.level=0.95)
# p-value = 0.0003179 : 채택 


#############################################
# 추론통계분석 - 1-2. 단일집단 평균차이 검정
#############################################
# - 단일 집단의 평균이 어떤 특정한 값과 차이가 있는지를 검증
# t분포 용도: 정규분포를 따르는 집단의 평균에 대한 가설검정

# 1. 실습파일 가져오기
data <- read.csv("one_sample.csv", header=TRUE)
str(data) # 150
head(data)
x <- data$time
head(x)

# 2. 기술통계량 평균 계산
summary(x) # NA-41개
mean(x) # NA
mean(x, na.rm=T) # NA 제외 평균(방법1)

x1 <- na.omit(x) # NA 제외 평균(방법2)
mean(x1) # 5.556881

# 3. 정규분포 검정
# 정규분포(바른 분포) : 평균에 대한 검정 
# 정규분포 검정 귀무가설 : 정규분포와 차이가 없다.(o)
# shapiro.test() : 정규분포 검정 함수

shapiro.test(x1) # 정규분포 검정 함수(p-value = 0.7242 >= 0.05) 

# 4. 가설검정 - 모수/비모수
# 정규분포(모수검정) -> t.test()
# 비정규분포(비모수검정) -> wilcox.test()

# 1) 양측검정 - 정제 데이터와 5.2시간 비교
t.test(x1, mu=5.2) 
t.test(x1, mu=5.2, alter="two.side", conf.level=0.95) # p-value = 0.0001417
# t = 3.9461, df = 108, p-value = 0.0001417 < 0.05
# 해설 : 평균 사용시간 5.2시간과 차이가 있다.

# 2) 방향성이 있는 연구가설 검정 : A(5.55) > 국내(5.2) 
t.test(x1, mu=5.2, alter="greater", conf.level=0.95)
# t = 3.9461, df = 108, p-value = 7.083e-05 < 0.05 (채택)

# 3) 방향성이 있는 연구가설 검정 : A < 국내 
t.test(x1, mu=5.2, alter="less", conf.level=0.95)
# t = 3.9461, df = 108, p-value = 0.9999 > 0.05 (기각)

# 신뢰수준 vs 채택역(t/z/f 통계량)
#    90%       -1.65 ~ +1.65
#    95%       -1.96 ~ +1.96[o]
#    99%       -2.58 ~ +2.58  


#############################################
# 추론통계분석 - 2-1. 두집단 비율차이 검정
#############################################

# 1. 실습데이터 가져오기
data <- read.csv("two_sample.csv", header=TRUE)
data
head(data) # 변수명 확인

# 2. 두 집단 subset 작성
data$method # 1, 2 -> 노이즈 없음
data$survey # 1(만족), 0(불만족)

# - 데이터 정체/전처리
x<- data$method # 교육방법(1, 2) -> 노이즈 없음
y<- data$survey # 만족도(1: 만족, 0:불만족)
x;y

# 1) 데이터 확인
# 교육방법 1과 2 모두 150명 참여
table(x) # 1 : 150, 2 : 150
# 교육방법 만족/불만족
table(y) # 0 : 55, 1 : 245

# 2) data 전처리 & 두 변수에 대한 교차분석
table(x, y, useNA="ifany") 


# 3. 두집단 비율차이검증 - prop.test()

# 양측가설 검정
prop.test(c(110,135), c(150, 150)) # 14와 20% 불만족율 기준 차이 검정
prop.test(c(110,135), c(150, 150), alternative="two.sided", conf.level=0.95)
# p-value = 0.0003422 < 0.05

# 방향성이 있는 대립가설 검정 : 방법1 > 방법2  
prop.test(c(110,135), c(150, 150), alternative="greater", conf.level=0.95)

# 방향성이 있는 대립가설 검정 : 방법1 < 방법2  : p-value = 0.0001711(채택) 
prop.test(c(110,135), c(150, 150), alternative="less", conf.level=0.95)

 


#############################################
# 추론통계분석 - 2-2. 두집단 평균차이 검정
#############################################

# 1. 실습파일 가져오기
data <- read.csv("two_sample.csv")
data 
head(data) #4개 변수 확인
summary(data) # score - NA's : 73개

# 2. 두 집단 subset 작성(데이터 정제,전처리)
#result <- subset(data, !is.na(score), c(method, score))
dataset <- data[c('method', 'score')]
table(dataset$method)

head(dataset)

# 3. 데이터 분리
# 1) 교육방법 별로 분리
method1 <- subset(dataset, method==1)
method2 <- subset(dataset, method==2)

# 2) 교육방법에서 점수 추출
method1_score <- method1$score
method2_score <- method2$score

# 3) 기술통계량 
length(method1_score); # 150
length(method2_score); # 150

# 4. 분포모양 검정 : 두 집단의 분포모양 일치 여부 검정
var.test(method1_score, method2_score) # p-value = 0.3002
# 동질성 분포 : t.test()
# 비동질성 분포 : wilcox.test()

# 5. 가설검정 - 두집단 평균 차이검정
t.test(method1_score, method2_score)
t.test(method1_score, method2_score, alter="two.sided", conf.int=TRUE, conf.level=0.95)
# p-value = 0.0411 - 두 집단간 평균에 차이가 있다.

# 방향성이 있는 연구가설 검정 : 방법1 > 방법2
t.test(method1_score, method2_score, alter="greater", conf.int=TRUE, conf.level=0.95)

# 방향성이 있는 연구가설 검정 : 방법1 < 방법2 : p-value = 0.02055(채택)
t.test(method1_score, method2_score, alter="less", conf.int=TRUE, conf.level=0.95)


################################################
# 추론통계분석 - 2-3. 대응 두 집단 평균차이 검정
################################################
# 조건 : A집단  독립적 B집단 -> 비교대상 독립성 유지
# 대응 : 표본이 짝을 이룬다. -> 한 사람에게 2가지 질문
# 사례) 다이어트식품 효능 테스트 : 복용전 몸무게 -> 복용후 몸무게 

# 1. 실습파일 가져오기
getwd()
setwd("c:/2_Rwork/Part-III")
data <- read.csv("paired_sample.csv", header=TRUE)

# 2. 두 집단 subset 작성

# 1) 데이터 정제
#result <- subset(data, !is.na(after), c(before,after))
dataset <- data[ c('before',  'after')]
dataset

# 2) 적용전과 적용후 분리
before <- dataset$before# 교수법 적용전 점수
after <- dataset$after # 교수법 적용후 점수
before; after

# 3) 기술통계량 
length(before) # 100
length(after) # 100
mean(before) # 5.145
mean(after, na.rm = T) # 6.220833 -> 1.052  정도 증가


# 3. 분포모양 검정 
var.test(before, after, paired=TRUE) 
# 동질성 분포 : t.test()
# 비동질성 분포 : wilcox.test()
# p-value = 0.4738 >= 0.05 : 가설 채택 

# 4. 가설검정
t.test(before, after, paired=TRUE) # p-value < 2.2e-16 
# p-value < 2.2e-16 < 0.05 : 양측검정 가설 기각 

# 방향성이 있는 연구가설 검정 : before > after 
t.test(before, after, paired=TRUE,alter="greater",conf.int=TRUE, conf.level=0.95) 
#p-value = 1 -> x을 기준으로 비교 : x가 y보다 크지 않다.

#  방향성이 있는 연구가설 검정 : before < after 
t.test(before, after, paired=TRUE,alter="less",conf.int=TRUE, conf.level=0.95) 
# p-value < 2.2e-16 -> x을 기준으로 비교 : x가 y보다 적다.


############################################
# 추론통계분석 - 3-1. 두 집단 이상 비율차이 검정
############################################
# - 두 집단 이상 비율차이 검정

# 1. 파일가져오기 
data <- read.csv("three_sample.csv", header=TRUE)
data
head(data)

# 2. 두 집단 이상 subset 작성(데이터 정제,전처리) 
method <- data$method 
survey<- data$survey
method # 집단 
unique(method)
survey 

# 3.기술통계량(빈도분석)
table(method, useNA="ifany") # 50 50 50 -> 3그룹 모두 관찰치 50개
table(method, survey, useNA="ifany") # 그룹별 클릭수 : 1-43, 2-34, 3-37


# 4. 두 집단 이상 비율차이 검정
# prop.test(그룹별 빈도, 그룹수) -> 집단이 늘어나도 동일한 함수 사용-땡큐
prop.test(c(34,37,39), c(50,50,50)) # p-value = 0.1165 -> 귀무가설 채택
# p-value = 0.5232 > 0.05

############################################

# 추론통계분석 - 3-2. 두 집단 이상 평균차이 검정
############################################
# 두 집단 이상 평균차이 검정  = 분산분석 
# 분산분석 예
# 쇼핑몰 고객의 연령대(10, 20, 30, 40, 50)별 또는 시간대(오전/오후)별
# 구매현황 분석 
# 범주형변수(x) : 연령대, 시간대
# 연속형변수(y) : 구매현황  

# aov(y ~ x, data = dataset)


# 1. 파일 가져오기
data <- read.csv("three_sample.csv")
head(data)
# 2. 데이터 정제/전처리 - NA, outline 제거
data <- subset(data, !is.na(score), c(method, score)) 
data # method, score

# (1) 차트이용 - ontlier 보기(데이터 분포 현황 분석)
plot(data$score) # 차트로 outlier 확인 : 50이상과 음수값
barplot(data$score) # 바 차트
mean(data$score) # 14.45

# (2) outlier 제거 - 평균(14) 이상 제거
length(data$score)#91
data2 <- subset(data, score <= 14) # 14이상 제거
length(data2$score) #88(3개 제거)

# (3) 정제된 데이터 보기 
x <- data2$score
boxplot(x)
plot(x)

# 3. 집단별 subset 작성
# method: 1:방법1, 2:방법2, 3:방법3
data2$method2[data2$method==1] <- "방법1" 
data2$method2[data2$method==2] <- "방법2"
data2$method2[data2$method==3] <- "방법3"

table(data2$method2) # 교육방법 별 빈도수 

# 4. 동질성 검정 - 정규성 검정
# bartlett.test(연속형변수 ~ 범주형변수) # 독립변수(세 집단)
bartlett.test(score ~ method2, data=data2)
# p-value = 0.1905 >= 0.05

# 귀무가설 : 집단 간 분포의 모양이 동질적이다.(채택)
# 해설 : 유의수준 0.05보다 크기 때문에 귀무가설을 기각할 수 없다. 

# 동질한 경우 : aov() - Analysis of Variance(분산분석)
# 동질하지 않은 경우 - kruskal.test()

# 5. 분산검정(집단이 2개 이상인 경우 분산분석이라고 함)
# aov(종속변수 ~ 독립변수, data=data set)

# 귀무가설 : 집단 간 평균에 차이가 없다.
result <- aov(score ~ method2, data=data2)
result

# aov()의 결과값은 summary()함수를 사용해야 p-value 확인 
summary(result) 
# 9.39e-14 ***

# 6. 사후검정 : 세부 차이 검정 
TukeyHSD(result)
#                diff        lwr        upr     p adj
#방법2-방법1  2.612903  1.9424342  3.2833723 0.0000000
#방법3-방법1  1.422903  0.7705979  2.0752085 0.0000040
#방법3-방법2 -1.190000 -1.8656509 -0.5143491 0.0001911

plot(TukeyHSD(result))

# example
dim(iris) # 150   5
str(iris)
table(iris$Species)
#setosa versicolor  virginica 
#    50         50         50

# 범주형(집단)변수 : Species
# 연속형변수 : Sepal.Width

# 4. 동질성 검정 - 정규성 검정
bartlett.test(Sepal.Width ~ Species, data=iris)
# p-value = 0.3515 >= 0.05 : 귀무가설 채택 

# 5. 분산검정
result <- aov(Sepal.Width ~ Species, data=iris)
summary(result)
# <2e-16 *** : 각 집단별 평균에 차이를 보인다.

# 6. 사후검정 : 세부 차이 검정 
TukeyHSD(result)
#                      diff         lwr        upr
#versicolor-setosa    -0.658 -0.81885528 -0.4971447
#virginica-setosa     -0.454 -0.61485528 -0.2931447
#virginica-versicolor  0.204  0.04314472  0.3648553

plot(TukeyHSD(result))

install.packages("dplyr")
library(dplyr)

iris %>% group_by(Species) %>% summarise(avg = mean(Sepal.Width))
#1 setosa      3.43
#2 versicolor  2.77
#3 virginica   2.97

2.77-3.43 # -0.66
2.97-3.43 # -0.46


댓글