본문 바로가기

Deep Learning + AI

데이터분석응용 in R_3월 내용, 문제로 전체 훑기

반응형

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

 

# 집단 비교


######################################
# 맥도날드 예제

맥도날


??t.test

# 표본평균 데이터가 없어서
# t.test로 풀 수 없음

######################################
# 문화별 섭식장애 예제

호주vs인도


Aus <- c(7,3,3,2,3,8,8,5,8,5,
         5,4,6,10,10,5,1,1,4,3,
         5,7,1,9,2,5,2,12,15,4)

Ind <- c(5,4,4,5,5,7,8,8,9,8,
         3,2,5,4,4,6,7,7,5,6,
         4,3,2,7,6,2,8,9,7,6)

# Aus와 Ind를 합쳐서 하나의 데이터 프레임으로 만들기
stud <- data.frame(
  group = factor(c(rep("Aus", length(Aus)), rep("Ind", length(Ind)))),
  score = c(Aus, Ind)
)

# 그룹별 시각화
par(mar = c(3, 3, 2, 1)) # 마진 줄이기
stud.b <- boxplot(score ~ group, data = stud, 
                  xlab = "Group", ylab = "Score", 
                  main = "Barplot of Scores by Group")

# 최솟값/1분위수/중앙값/3분위수/최댓값 정보 제시
stud.b$stats

# 그룹간 등분산성 체크
library(car)
leveneTest(score ~ group, data = stud)
# 등분산성 만족

# t.test로 그룹간 차이 검정
t.test(score ~ group, data = stud, var.equal = TRUE)
# 등분산성 만족하므로 var.equal = TRUE로 설정
# p-value가 0.8914로 0.05보다 크므로 귀무가설 채택
# 두 그룹 간에 유의미한 차이가 없다고 결론


######################################
# 사전/사후 테스트 비교

사전/사후 테스트


Before <- c(3,5,4,6)
After <- c(7,8,6,7)

# Befor와 After를 합쳐서 하나의 데이터 프레임으로 만들기
test <- data.frame(
  group = factor(c(rep("Bef", length(Before)), rep("Aft", length(After)))),
  score = c(Before, After)
)

# 둘의 관계 산점도
par(mar = c(3, 3, 2, 1))
plot(Before, After, xlab = "Before", ylab = "After")

cor(Before, After)
# 상관계수 0.3으로 양의 상관관계 존재

# 전, 훈는 등분산성이 존재한다고 가정하고 감
# leveneTest 생략

t.test(Before, After, paired = TRUE)
# p-value가 0.03이므로 귀무가설 기각
# 즉, 둘은 유의미한 차이가 있다.
# 다시말해, 독서는 독해력에 영향을 미친다.


######################################
# 유치원 참여시간과 언어점수와의 관계

유치원 검


Time5 <- c(87,86,76,56,78,98,77,66,75,67)
Time10 <- c(87,85,99,85,79,81,82,78,85,91)
Time20 <- c(89,91,96,87,89,90,89,96,96,93)

# 세 그룹을 하나의 데이터 프레임으로 만들기
kinder <- data.frame(
  group = factor(c(rep("t5", length(Time5)), rep("t10", length(Time10)), rep("t20", length(Time20)))),
  score = c(Time5, Time10, Time20)
)

# 기술통계량 확인
library(psych)
describeBy(kinder$score, kinder$group)

# 세 그룹 간의 차이 검정
# 등분산성 체크
leveneTest(score ~ group, data = kinder)
# 등분산성 만족

# 검정 전 시각화
kind.b <- boxplot(score ~ group, data = kinder, xlab = "Group", ylab = "Score", main = "Boxplot of Scores by Group")

# 최솟값/1분위수/중앙값/3분위수/최댓값 정보 제시
kind.b$stats

# ANOVA 검정(기본적으로 등분산 가정)
aov_result <- aov(score ~ group, data = kinder)
summary(aov_result)
# p-value가 0.001로 0.05보다 작으므로 귀무가설 기각  
# 세 그룹 간에 유의미한 차이가 존재한다고 결론

#근데 어디가?? 사후검정하자.
# TukeyHSD로 사후검정
TukeyHSD(aov_result)
# t5와 t20 사이의 p adj가 작아 귀무 기각
# t5와 t20사이에 유의미한 차이가 존재한다.

# two-way ANOVA면 사후검정 전에
# interaction 효과도 봐야한다.


###################################### 
# 두개의 요인(운동강도, 성별)의 체중 감량에 대한 영향

체중 감량 효과 검증
체중 감량 검증2


# 운동강도: 낮음, 높음
# 성별: 남성, 여성

# 데이터
high.m <- c(76,78,76,76,76,74)
high.f <- c(65,90,65,90,65,90)
low.m <- c(88,76,76,76,56,76)
low.f <- c(65,67,67,87,78,56)

weightlss <- data.frame(
  activity = factor(c(rep("high", length(high.m)+length(high.f)), 
                      rep("low", length(low.f)+length(low.m)))),
  sex = factor(c(rep("male", length(high.m)), rep("female", length(high.f)),
                 rep("male", length(high.m)), rep("female", length(high.f))
  )),
  score = c(high.m, high.f, rbind(low.m, low.f))
)

# 기술통계량
library(psych)
describeBy(weightlss$score, group=list(weightlss$activity, weightlss$sex))


# 1. t.test

# 등분산성 검증
library(car)
leveneTest(score ~ activity, data = weightlss)
# p-value가 0.6626이므로 등분산성 만족

# boxplot
weightlss.b <- boxplot(score ~ activity, 
                       data = weightlss, 
                       xlab = "Activity", ylab = "Score", 
                       main = "Boxplot of Scores by Activity")

# 최솟값/1분위수/중앙값/3분위수/최댓값 정보 제시
weightlss.b$stats

t.test(score ~ activity, data = weightlss, var.equal = TRUE)
# p-value가 0.285이므로 귀무가설 채택
# 운동 강도에 따른 체중 감량의 차이가 없다.

# 2. 두가지 요인에 따른 감량 효과
# 운동강도, 성별, 그리고 상호작용 효과까지 보기 위해 
# two-way ANOVA
m2 <- aov(score ~ activity+sex+activity*sex, 
          data = weightlss)
# activity*sex의 귀무는 
# (고,남), (고,여), (저,남), (저,여)의 평균이 모두 같다.

summary(m2)
# 모두 귀무 채택


# 이대로 끝내긴 아쉬우므로
# ch16ds1 데이터셋으로 다시 two-way ANOVA 해보자.
ch16ds1 <- read.csv("./datasets/ch16ds1.csv")

m2.2 <- aov(Loss ~ Treatment + Gender + Treatment*Gender, 
            data = ch16ds1)

summary(m2.2)
# 이 경우 Treatment:Gender만 유의하다.
# 즉, 운동강도에 따른 loss의 평균이 같다.
# 성별에 따른 loss의 평균이 같다.
# 운동강도와 성별에 따른 평균이 같지 않다.


# 그럼 어떤 경우가 같지 않은것이지?
# 두가지 요인에 따른 loss를
# 시각화 plot으로 알아보자.
par(mar = c(3, 3, 2, 1))
interaction.plot(x.factor = ch16ds1$Treatment,
                 trace.factor = ch16ds1$Gender,
                 response = ch16ds1$Loss,
                 fixed = TRUE,
                 leg.bty = "b",
                 xlab = "Treatment",
                 ylab = "Weight Loss",
                 trace.label = "Gender",
                 ylim = c(60,85))

# 사후 검증도 해보자.
TukeyHSD(m2.2)
# low.f와 high.f에 차이가 있다.
# low.m와 low.f에 차이가 있다.
# 따라서 여성의 운동강도에 따라 효과가 다르다.
# 저강도 운동은 성별에 따라 효과가 다르다.


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

 

# 연관성분석

 

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


# 우리가 여기서 다루는 것은
# 1. cor을 이용한 수치형 간 상관분석
# 2. chisq.test 또는 CrossTable을 이용한
#    범주형간 상관분석

######################################
# 지역-구매의사별 교차표

지역&구매의사


buy <- c('yes', 'no', 'yes', 'no')
region <- c(1,1,2,2)
value <- c(154,52,7,112)

# xtabs로 테이블 만들기
buy.table <- xtabs(value ~ as.factor(region) + buy)
buy.table

# CrossTable로 연관성 분석
library(gmodels)
CrossTable(buy.table, expected = TRUE)
# p-value가 0.0000이므로 귀무가설 기각
# 둘은 연관성이 존재한다.

# chisq.test로 연관성 분석2
chisq.test(buy.table)
# 마찬가지로 귀무기각. 연관성있다.

######################################
# 투표자의 소득 수준에 따른 찬반 결과

소득수준&찬반


yes.no <- c(rep('yes',3), rep('no',3))
income <- c('low','middle','high',
            'low','middle','high')
value <- c(182, 213,203,154,138,110)
inc.table <- xtabs(value ~ yes.no + income)
inc.table

# CrossTable
library(gmodels)
CrossTable(inc.table, expected = TRUE)
# p-value가 0.01이므로 귀무가설 기각
# 소득 수준과 찬반 결과는 연관성이 존재한다.

# chisq.test
chisq.test(inc.table)
# 마찬가지로 귀무기각. 연관성있다.


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

전공&직장


# 전공에 따른 희망 직종 빈도 관계 분석
major <- c(rep('산업공학',5), 
           rep('컴퓨터공학',5), 
           rep('경영학',5),
           rep('경제학',5))
job <- c(rep(c('A', 'B', 'C', 'D', 'E'),4))
value <- c(39, 18, 12, 31, 14,
           35, 23, 18, 35, 13,
           27, 16, 17, 24, 8,
           9, 12, 8, 19, 22
           )

major.table <- xtabs(value ~ major + job)
major.table

# CrossTable
library(gmodels)
CrossTable(major.table, expected = TRUE)
# p-value가 0.004이므로 귀무가설 기각

# chisq.test
chisq.test(major.table)
# 마찬가지로 귀무기각. 연관성있다.

반응형