32. 집단간 차이 분석 검정 예제


r

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)





© 2019. by RaP0d

Powered by aiden