32. 집단간 차이 분석 검정 예제
in Study on R Programming
Overview
집단 간 차이 분석에서 각종 검정 방법에 대한 예제를 기술한 포스트
예제 파일 : 191102.zip
예제 1
library(Hmisc)
library(prettyR)
# 집단간 차이 분석
df <- read.csv("one_sample.csv", header = T)
head(df)
survey <- df$survey
# 귀무 가설 : 작년의 고객 불만율과 금년의 고객 불만율에 차이가 없다.
table(survey)
describe(survey)
freq(survey)
# 첫번째 매개변수는 긍정 변수
# 두번째는 전체(긍정136+부정14)
# p는 80퍼 센트 이상인가?
# n만큼 시행했는데 x의 값이 n의 p퍼센트 이상이니?
binom.test(x=136, n=(14+136), p=0.8)
# Exact binomial test
#
# data: 136 and (14 + 136)
# number of successes = 136, number of trials = 150, p-value = 0.0006735
# alternative hypothesis: true probability of success is not equal to 0.8
# 95 percent confidence interval:
# 0.8483615 0.9480298
# sample estimates:
# probability of success
# 0.9066667
# probability of success : 점 추정 값.
# 0.9066667
# 귀무가설을 기각 한다.
# P의 값 0.0006735
0.0006735 > 0.05
# [1] FALSE
# 결과 : 작년의 고객 불만율과 금년의 고객 불만율에 차이가 있다!
# 다른 방법
# x : success
# n : 시행 횟수
# p : 비율
# alternative : 대립 가설의 형태
## two.sided : 양측 검정
# conf.level : 신뢰도 구간
result <- binom.test(x=136, n=(14+136), p=0.8, alternative = 'two.sided', conf.level = 0.95)
names(result)
if(result$p.value > 0.05) {
cat("귀무 가설 채택\n")
} else {
cat("귀무 가설 기각\n")
}
예제 2
library(ggplot2)
library(gmodels)
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 국내에서 생산된 노트북과 A회사에서 생산된 노트북의 평균 사용 시간에 차이가 없다.
data <- read.csv('one_sample.csv', header = T)
head(data)
str(data)
time <- data$time
head(time)
range(time)
# na.omit()
time2 <- na.omit(time)
mean(time2)
res <- shapiro.test(time2)
chk_test(res)
# p value : 0.7242303
# 귀무 가설 채택
hist(time2)
# 정규분포 그래프 함수
# 직선 주위에 많이 쏠려 있으면 정규 분포에 가깝다.
qqnorm(time2)
qqline(time2, lty = 1, col = 'blue')
# t test
# mu : 모집단의 평균값(비교할 대상의 평균값)
t.test(x = time2, mu = 5.2)
# One Sample t-test
#
# data: time2
# t = 3.9461, df = 108, p-value = 0.0001417
# alternative hypothesis: true mean is not equal to 5.2
# 95 percent confidence interval:
# 5.377613 5.736148
# sample estimates:
# mean of x
# 5.556881
# 방향성을 갖는 단측 검정
# greater 옵션 : 기준치보다 큰지 아닌지 확인
ttest01 <- t.test(x = time2, mu = 5.2, alternative = 'greater', conf.level = 0.95)
# One Sample t-test
#
# data: time2
# t = 3.9461, df = 108, p-value = 7.083e-05
# alternative hypothesis: true mean is greater than 5.2
# 95 percent confidence interval:
# 5.406833 Inf
# sample estimates:
# mean of x
# 5.556881
# -> 노트북 사용 시간이 5.2시간보다 크다고 할 수 있다.
# 108 : 자유도
abs(qt(ttest01$p.value, 108)) < 3.9461
예제 3
library(ggplot2)
library(gmodels)
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 귀무가설 : 동전의 앞면과 뒷면의 비율은 차이가 없다.
res <- prop.test(x = 42, n = 100, p = 0.5)
chk_test(res)
예제 4
library(ggplot2)
library(gmodels)
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 두 집단의 평균 검정
# 교육 만족도
# 두 가지 교육 방법에 따른 시험의 평균에는 차이가 없다.
# 연구 환경
# 한국 교육 센터에서는 2가지 교육 방법(집체 교육, 개별 교육)을 이용하여 수업을 진행하고 있다.
# 1개월동안 교육을 받은 교육생 각 150명을 대상으로 실기 시험을 실시하였다.
# 두 집단간 실기 시험의 평균에 차이가 있는 지 검사한다.
#
# 가설
# 귀무 가설
# 두 가지 교육 방법에 따른 실기 시험의 평균에 차이가 없다.
#
# 연구 가설
# 두 가지 교육 방법에 따른 실기 시험의 평균에 차이가 있다.
data <- read.csv('two_sample.csv')
str(data)
summary(data)
res <- subset(data, !is.na(score), c(method, score))
# 교육방식
unique(res$method)
# 점수
range(res$score)
res
# data 분리
method01 <- subset(res, method == 1)
method02 <- subset(res, method == 2)
method01_score <- method01$score
method02_score <- method02$score
mean(method01_score)
mean(method02_score)
vt <- var.test(method01_score, method02_score)
# F test to compare two variances
#
# data: method01_score and method02_score
# F = 1.2158, num df = 108, denom df = 117, p-value = 0.3002
# alternative hypothesis: true ratio of variances is not equal to 1
# 95 percent confidence interval:
# 0.8394729 1.7656728
# sample estimates:
# ratio of variances
# 1.215768
tt <- t.test(method01_score, method02_score)
# Welch Two Sample t-test
#
# data: method01_score and method02_score
# t = -2.0547, df = 218.19, p-value = 0.0411
# alternative hypothesis: true difference in means is not equal to 0
# 95 percent confidence interval:
# -0.48296687 -0.01005133
# sample estimates:
# mean of x mean of y
# 5.556881 5.803390
chk_test(tt)
# p value : 0.04110187
# 귀무 가설 기각
ttag <- t.test(method01_score, method02_score, alternative = 'greater')
chk_test(ttag)
# p value : 0.9794491
# 귀무 가설 채택
ttal <- t.test(method01_score, method02_score, alternative = 'less')
chk_test(ttal)
# p value : 0.02055094
# 귀무 가설 기각
예제 5
library(ggplot2)
library(gmodels)
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 영업 사원 교육 효과 분석
# 두 집단의 평균이 서로 동일한지를 검증하는 것은 두 집단 평균 차이 분석이라고 한다.
# 두 그룹 간의 평균을 기준으로 차이에 의미를 부여하는 방법이다.
# 영업 사원들의 실적을 향상 시키기 위하여 어떠한 교육이 더 좋을까?
#
# 파일 이름 : 영업 사원 교육 효과 분석.R
# 관련 정보
# 항목 설명
# 예제 데이터 2가지 교육 방법별로 교육을 이수한 영업 사원들의 영업 실적으로 조사한 데이터
# 파일 이름 mymethod.csv
# 가설 귀무 가설 :
# 변수명 id : ID 번호
# method : 영업 역량 강화(1 : 집체 교육, 2 : 멘토링 교육)
# pefrormance : 영업 사원들의 영업 실적(단위 : 억원)
# 단, 입사 6개월 이내 인력은 교육을 받았지만 영업 실적 조사에서 제외하도록 한다
# performance의 값이 99으로 표시되어 있다.
# 분석 문제 교육 방법별로 교육을 이수한 사람들의 빈도 수와 영업 실적 평균 값을 구하세요.
# 실제 영업 실적 비교 대상자만의 데이터를 별도로 추출하세요.
# 두 교육 방법별 영업 실적 데이터 간에 분포 모양이 비슷한지를 검정하세요.(var.test 분석 함수 사용)
# 두 집단 간의 영업 실적에 차이가 있는 지 검증하세요.
# 첨부된 문서를 이용하여 보고 또는 논문 제출을 위한 문서를 작성해보세요.
# 관련 지식 -
# 검증 방법 var.test, t.test
# 귀무가설 : 두 집단간 영업 실적에 차이가 없다.
data <- read.csv('mymethod.csv')
head(data)
str(data)
summary(data)
data$method2 <- factor(data$method, levels = c(1, 2), labels = c('집체교육', '멘토링교육'))
data$method2[data$performance == 99] <- NA
data$performance[data$performance == 99] <- NA
data$performance
meanPerformance <- mean(data$performance, na.rm = T)
meanPerformance
tableMethod <- table(data$method2)
tableMethod
realData <- subset(data, performance != 99)
realData
metM01 <- subset(realData, method == 1)
metM02 <- subset(realData, method == 2)
mean01 <- mean(metM01$performance)
mean02 <- mean(metM02$performance)
mean01;mean02
# 분포 모양이 비슷한가?
vt <- var.test(metM01$performance, metM02$performance)
vt
chk_test(vt)
# par(mfrow = c(1:2))
qqnorm(metM01$performance, col = 'blue')
qqline(metM01$performance, lty = 1, col = 'blue')
par(new = T)
qqnorm(metM02$performance, col = 'red')
qqline(metM02$performance, lty = 1, col = 'red')
# t.test()
tt <- t.test(metM01$performance, metM02$performance)
tt
chk_test(tt)
예제 6
library(ggplot2)
library(gmodels)
library(prettyR)
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 중소 기업에서 생산한 HDTV 판매율을 높이기 위해서 프로모션을 진행한 결과
# 기존 구매 비율 보다 15% 향상되었는지를 각 단계별로 분석을 수행하여 검정하시오.
#
# 파일 이름 : hdtv.csv
#
# 연구가설(H1) : 기존 구매 비율과 차이가 있다.
# 귀무가설(H0) : 기존 구매 비율과 차이가 없다.
#
# 조건) 구매 여부 변수 : buy (1: 구매하지 않음, 2: 구매)
# 단계1: 데이터셋 가져오기
#
# 단계2: 빈도수와 비율 계산
# install.packages('prettyR')
# library(prettyR)
# table() 함수 및 freq() 등의 함수 사용해보기
#
# 단계3: 가설 검정
# binom.test()
# 양측 및 단측 검정 수행해보기
data <- read.csv('hdtv.csv')
str(data)
summary(data)
# View(data)
data$buy2 <- factor(data$buy, levels = c(1, 2), labels = c('구매하지 않음', '구매'))
data$buy2
table(data$buy2)
freq(data$buy2)
bt <- binom.test(10, 50, p = 0.15, conf.level = 0.95)
chk_test(bt)
bt <- binom.test(10, 50, p = 0.15, alternative = c('greater'), conf.level = 0.95)
chk_test(bt)
예제 7
library(ggplot2)
library(gmodels)
library(prettyR)
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 우리 나라 전체 중학교 2학년 여학생 평균 키가 148.5cm로 알려져 있는 상태에서
# A 중학교 2학년 전체 500명을 대상으로 10%인 50명을 표본으로 선정하여 표본 평균 신장을
# 계산하고 모집단의 평균과 차이가 있는지를 각 단계별로 분석을 수행하여 검정하시오.
#
# 파일 이름 : student_height.csv
#
# 단계1: 데이터셋 가져오기
#
# 단계2: 기술 통계량/결측치 확인
# 요구 사항 : height에서 결측치는 제거하고 실습하도록 하세요.
#
# 단계3: 정규성 검정
# 정규 분포가 아니면 wilcox.test() 검정을 수행해야 한다.
#
# 정규 분포(모수검정) - t.test()
# 비정규 분포(비모수검정) - wilcox.test()
#
# 단계4: 가설 검정 - 양측 검정
data <- read.csv('student_height.csv')
str(data)
summary(data)
data <- subset(data, !is.na(data$height))
data
st <- shapiro.test(data$height)
chk_test(st)
# Shapiro-Wilk normality test
#
# data: data$height
# W = 0.88711, p-value = 0.0001853
#
# p value : 0.0001852942
# 가설 기각
# data의 height 값이 정규성을 충족시키지 못하므로 wilcox 검정을 실시
wt <- wilcox.test(data$height, mu = 148.5)
chk_test(wt)
# Wilcoxon signed rank test with continuity correction
#
# data: data$height
# V = 826, p-value = 0.067
# alternative hypothesis: true location is not equal to 148.5
#
# p value : 0.06700316
# 가설 채택
## 알려져 있는 우리나라 여학생 평균 신장 정보는 차이가 없다. 가 채택 됐다.
예제 8
library(gmodels)
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 대학에 진학한 남학생과 여학생을 대상으로 진학한 대학에 대해서 만족도에 차이가 있는가를 검정하시오.
#
# 힌트) 두 집단 비율 차이 검정
#
# 파일명 : two_sample.csv
# 변수명 : gender(1,2), survey(0,1)
#
# 단계1: 실습 데이터 가져오기
#
data <- read.csv('two_sample.csv', header = T)
str(data)
summary(data)
table(is.na(data))
# 단계2: 두 집단 subset 작성
# # 데이터 정체/전처리
#
data <- subset(data, !is.na(data$survey))
dataMale <- subset(data, data$gender == 1)
dataFemale <- subset(data, data$gender == 2)
table(dataMale$survey)
table(dataFemale$survey)
# # 교차테이블 확인
#
CrossTable(data$gender, data$survey)
# 단계3: 두 집단 비율 차이 검증
pt <- prop.test(c(138, 107), c(36 + 138, 19 + 107), conf.level = 0.95)
chk_test(pt)
예제 9
library(gmodels)
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 교육 방법에 따라 시험 성적에 차이가 있는지 검정하시오.
# 힌트) 두 집단 평균 차이 검정
#
# 조건1) 파일 : twomethod.csv
# 조건2) 변수 : method(교육 방법), score(시험 성적)
# 조건3) 모델 : 교육 방법(명목) -> 시험 성적(비율)
# 조건4) 전처리 : 결측치 제거
#
# 귀무가설 : 교육 방법에 따라 시험 성적에 차이가 없다.
# 단계1: 실습파일 가져오기
#
data <- read.csv('twomethod.csv')
str(data)
summary(data)
# 단계2: 두 집단 subset 작성(데이터 정제, 전처리)
# 데이터 전처리(score의 NA 값이 있는 것은 제외시킨다)
#
nData <- subset(data, !is.na(data$score))
nData
# 단계3: 데이터 분리
# # 1) 교육 방법별로 분리
dMethod1 <- subset(nData, nData$method == 1)
dMethod2 <- subset(nData, nData$method == 2)
# # 2) 교육 방법에서 영업 실적 추출
dMeScore1 <- dMethod1$score
dMeScore2 <- dMethod2$score
# # 3) 기술 통계량
#
summary(dMeScore1)
summary(dMeScore2)
# 단계4: 분포 모양 검정
#
st1 <- shapiro.test(dMeScore1)
st2 <- shapiro.test(dMeScore2)
chk_test(st1)
# Shapiro-Wilk normality test
#
# data: dMeScore1
# W = 0.91363, p-value = 0.05618
#
# p value : 0.05617919
# 가설 채택
chk_test(st2)
# Shapiro-Wilk normality test
#
# data: dMeScore2
# W = 0.97381, p-value = 0.5559
#
# p value : 0.5559226
# 가설 채택
# 단계5: 가설 검정
# 두 집단 평균을 검정하기 위해 t.test() 함수를 사용한다.
#
tt1 <- t.test(dMeScore1, dMeScore2)
chk_test(tt1)
# Welch Two Sample t-test
#
# data: dMeScore1 and dMeScore2
# t = -5.6056, df = 43.705, p-value = 1.303e-06
# alternative hypothesis: true difference in means is not equal to 0
# 95 percent confidence interval:
# -17.429294 -8.209667
# sample estimates:
# mean of x mean of y
# 16.40909 29.22857
#
# p value : 1.302693e-06
# 가설 기각
# 귀무가설 기각
# 교육 방법에 따라 시험 성적에 차이가 있다.
예제 10
# 세 집단 비율 검정(교육 만족도)
# 세 집단을 대상으로 비율의 차이 검정을 통해서 세 집단간의 비율이 동일한지 또는 아닌지를 검정하는 방법이다.
#
# 파일 이름 : E01.세 집단 비율 검정(교육 만족도_정답).R
# three_sample.csv
#
# 연구 환경
# 한국 교육 센터에서는 3가지 교육 방법(집체 교육, 개별 교육, 혼합 교육)을 이용하여 교육을 실시하였다.
# 좀더 효과적인 교육 방법이 무엇인지를 조사해보니 다음과 같은 설문 조사 결과가 나왔다.
#
# 교육 방법과 만족도 교차 분할표
# 교육 방법 만족 불만족 참가자
# 집체 교육 34 16 50
# 개별 교육 37 13 50
# 혼합 교육 39 11 50
# 합계 110 40 150
#
# 가설
# 귀무 가설
# 세 가지 교육 방법에 따라 집단 간의 만족율에 차이가 없다.
#
# 연구 가설
# 세 가지 교육 방법에 따라 집단 간의 만족율에 차이가 있다.
data <- read.csv('three_sample.csv')
head(data)
summary(data)
method <- data$method
survey <- data$survey
test01 <- addmargins(table(method, survey, useNA = 'ifany')) # NA값이 있으면 무시한다.
test02 <- table(method, survey, useNA = 'ifany')
# 귀무가설: 세가지 교육 방법에 따라 집간 간의 만족율에 차이가 없다.
three <- prop.test(x = test02[,2], n = test01[1:3,3])
three
three$p.value > 0.05
예제 11
# 귀무 가설 채택 여부
# param : test result
chk_test <- function(res) {
print(res)
cat('p value : ', res$p.value, '\n')
if(res$p.value > 0.05) {
cat('가설 채택', '\n')
} else {
cat('가설 기각 ', '\n')
}
}
# 분산 분석(교육 방법에 따른 실기 시험 평균)
# 분산 분석은 T 검정과 동일하게 평균에 의한 차이 검정 방법이다.
# 차이점은 분산 분석일 경우 세 집단 이상의 평균 차이를 검정하는 것이다.
#
# 파일 이름 : F01.분산 분석(교육 방법에 따른 평균_정답).R
# three_sample.csv
#
# 연구 환경
# 한국 교육 센터에서는 3가지의 교육 방법(집체 교육, 개별 교육, 혼합 교육)을
# 이용하여 각 50명씩 실기 시험을 실시하였다.
# 세 집단간 실기 시험의 평균에 차이가 있는 지 검사한다.
#
# 가설
# 귀무 가설
# 세 가지 교육 방법에 따른 실기 시험의 평균에 차이가 없다.
#
# 연구 가설
# 세 가지 교육 방법에 따른 실기 시험의 평균에 차이가 있다.
data <- read.csv('three_sample.csv')
head(data)
summary(data)
# remove missing value, outlier
data <- subset(data, !is.na(score), c(method, score))
data <- subset(data, score < 70)
boxplot(data$score)
plot(data$score)
# recode
data$method2[data$method == 1] = '방법 1'
data$method2[data$method == 2] = '방법 2'
data$method2[data$method == 3] = '방법 3'
# check frequency
table(data$method2)
# make data frame
x <- table(data$method2)
y <- tapply(data$score, data$method2, mean)
df <- data.frame(교육방법 = x, 성적 = y)
df
# bartlett test
# bartlett.test(종속변수 ~ 독립변수, data)
# 동질성 테스트
bart <- bartlett.test(score ~ method2, data)
chk_test(bart)
# 귀무 가설
# 세 가지 교육 방법에 따른 실기 시험의 평균에는 차이가 없다.
# aov
# Pr(>F) == p-value
res <- aov(score ~ method2, data)
names(res)
summary(res)
thsd <- TukeyHSD(res)
thsd$method2
plot(thsd)