연습문제3
대학에서는 재학생을 대상으로 교육과정에 대한 현황조사를 실시하였다.
학부(2개학부)와 학년(1~4학년)에 따라 비교과운영은 차이가 있는 가?
학부와 학년간에는 상호작용효과가 있는지 검증하세요.
학부: 1=사복, 2=아동
학년: 1=1학년, 2=2학년, 3=3학년, 4=4학년")
이원분산분석 : 종속 변수가 한 개이고 독립 변수가 두 개인 실험 집단에서 집단 간 차이를 분석하는 기법
1.기본 package 설정
1.1 library 로드
library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.5 v purrr 0.3.4
## v tibble 3.1.6 v dplyr 1.0.8
## v tidyr 1.2.0 v stringr 1.4.0
## v readr 2.1.2 v forcats 0.5.1
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(tidymodels)
## -- Attaching packages -------------------------------------- tidymodels 0.2.0 --
## v broom 0.8.0 v rsample 0.1.1
## v dials 0.1.1 v tune 0.2.0
## v infer 1.0.0 v workflows 0.2.6
## v modeldata 0.1.1 v workflowsets 0.2.1
## v parsnip 0.2.1 v yardstick 0.0.9
## v recipes 0.2.0
## -- Conflicts ----------------------------------------- tidymodels_conflicts() --
## x scales::discard() masks purrr::discard()
## x dplyr::filter() masks stats::filter()
## x recipes::fixed() masks stringr::fixed()
## x dplyr::lag() masks stats::lag()
## x yardstick::spec() masks readr::spec()
## x recipes::step() masks stats::step()
## * Use suppressPackageStartupMessages() to eliminate package startup messages
library(rstatix)
##
## 다음의 패키지를 부착합니다: 'rstatix'
## The following objects are masked from 'package:infer':
##
## chisq_test, prop_test, t_test
## The following object is masked from 'package:dials':
##
## get_n
## The following object is masked from 'package:stats':
##
## filter
library(skimr)
2.데이터 불러오기
edu_tb <- read_csv('data3.csv',
col_names = TRUE,
locale=locale('ko', encoding='euc-kr'), # 한글
na=".") %>%
round(2) %>% # 소수점 2자리로 반올림
mutate_if(is.character, as.factor) %>%
mutate(학부 = factor(학부,
levels=c(1:2),
labels=c("사복","아동"))) %>%
mutate(학년 = factor(학년,
levels=c(1:4),
labels=c("1학년","2학년","3학년","4학년")))
## Rows: 157 Columns: 6
## -- Column specification --------------------------------------------------------
## Delimiter: ","
## dbl (6): 학부, 학년, 교양강의운영, 전공강의운영, 비교과운영, 종합점수
##
## i Use `spec()` to retrieve the full column specification for this data.
## i Specify the column types or set `show_col_types = FALSE` to quiet this message.
str(edu_tb)
## tibble [157 x 6] (S3: tbl_df/tbl/data.frame)
## $ 학부 : Factor w/ 2 levels "사복","아동": 1 1 1 1 1 1 1 1 1 1 ...
## $ 학년 : Factor w/ 4 levels "1학년","2학년",..: 1 1 1 1 1 1 2 2 2 2 ...
## $ 교양강의운영: num [1:157] 42.9 32.1 50 50 78.6 42.9 42.8 76.2 54.7 83.3 ...
## $ 전공강의운영: num [1:157] 50 28.6 50 50 64.3 53.6 59.5 80.9 57.1 85.7 ...
## $ 비교과운영 : num [1:157] 25 30 50 50 70 25 40 70 36.6 90 ...
## $ 종합점수 : num [1:157] 37.4 31.5 48.7 50.9 73.9 48.7 58.6 68.7 53 81.3 ...
edu_tb
## # A tibble: 157 x 6
## 학부 학년 교양강의운영 전공강의운영 비교과운영 종합점수
## <fct> <fct> <dbl> <dbl> <dbl> <dbl>
## 1 사복 1학년 42.9 50 25 37.4
## 2 사복 1학년 32.1 28.6 30 31.5
## 3 사복 1학년 50 50 50 48.7
## 4 사복 1학년 50 50 50 50.9
## 5 사복 1학년 78.6 64.3 70 73.9
## 6 사복 1학년 42.9 53.6 25 48.7
## 7 사복 2학년 42.8 59.5 40 58.6
## 8 사복 2학년 76.2 80.9 70 68.7
## 9 사복 2학년 54.7 57.1 36.6 53
## 10 사복 2학년 83.3 85.7 90 81.3
## # ... with 147 more rows
3.기술통계분석
상호작용호과에 관심있는 변수를 2번째 표시 (학년)
skim(edu_tb)
Data summary
Name |
edu_tb |
Number of rows |
157 |
Number of columns |
6 |
_______________________ |
|
Column type frequency: |
|
factor |
2 |
numeric |
4 |
________________________ |
|
Group variables |
None |
Variable type: factor
학부 |
0 |
1 |
FALSE |
2 |
아동: 92, 사복: 65 |
학년 |
0 |
1 |
FALSE |
4 |
2학년: 59, 4학년: 38, 3학년: 36, 1학년: 24 |
Variable type: numeric
교양강의운영 |
0 |
1 |
49.73 |
18.83 |
0 |
40.4 |
50.0 |
59.5 |
100.0 |
▁▃▇▂▁ |
전공강의운영 |
0 |
1 |
54.37 |
19.41 |
0 |
45.2 |
50.0 |
64.3 |
100.0 |
▁▂▇▃▂ |
비교과운영 |
0 |
1 |
45.82 |
18.98 |
0 |
35.0 |
50.0 |
56.6 |
93.3 |
▁▅▇▅▁ |
종합점수 |
0 |
1 |
50.66 |
15.97 |
0 |
41.7 |
49.7 |
60.0 |
92.8 |
▁▂▇▃▁ |
edu_tb %>%
group_by(학부, 학년) %>%
get_summary_stats(비교과운영)
## # A tibble: 8 x 15
## 학부 학년 variable n min max median q1 q3 iqr mad mean
## <fct> <fct> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 사복 1학년 비교과운영 6 25 70 40 26.2 50 23.8 18.5 41.7
## 2 사복 2학년 비교과운영 24 0 90 42.5 33.3 64.1 30.8 16.1 46.4
## 3 사복 3학년 비교과운영 18 0 70 48.3 36.6 60 23.4 17.3 46.1
## 4 사복 4학년 비교과운영 17 0 93.3 53.3 43.3 56.6 13.3 14.8 49.6
## 5 아동 1학년 비교과운영 18 0 76.6 42.5 31.2 50 18.8 11.1 39.9
## 6 아동 2학년 비교과운영 35 0 93.3 45 28.3 50 21.7 14.8 42.1
## 7 아동 3학년 비교과운영 18 36.6 80 51.6 50 66.6 16.6 12.4 57.0
## 8 아동 4학년 비교과운영 21 6.6 73.3 50 35 50 15 19.7 44.7
## # ... with 3 more variables: sd <dbl>, se <dbl>, ci <dbl>
4.그래프 그리기(박스그래프,히스토그램)
edu_tb %>%
ggplot(mapping = aes(x = 학부,
y = 비교과운영,
color = 학부)) +
geom_boxplot() +
facet_wrap(~ 학년)
edu_tb %>%
ggplot(mapping = aes(x = 비교과운영)) +
geom_histogram(bins = 10, # binwidth=1,000: 값차이
color = "white",
fill = "steelblue") +
facet_wrap(~ 학부*학년) # 그룹별 분리
상호작용 검정
edu_tb %>%
group_by(학년, 학부) %>%
summarise(비교과운영 = mean(비교과운영)) %>%
ggplot(mapping = aes(x = 학년,
y = 비교과운영,
color = 학부)) +
geom_line(mapping = aes(group = 학부)) +
geom_point()
## `summarise()` has grouped output by '학년'. You can override using the
## `.groups` argument.
5.이상치 제거
이상치 확인
edu_tb %>%
select(학부, 학년, 비교과운영) %>%
group_by(학부, 학년) %>%
identify_outliers(비교과운영) %>%
print(n=50)
## # A tibble: 8 x 5
## 학부 학년 비교과운영 is.outlier is.extreme
## <fct> <fct> <dbl> <lgl> <lgl>
## 1 사복 3학년 0 TRUE FALSE
## 2 사복 4학년 23.3 TRUE FALSE
## 3 사복 4학년 0 TRUE TRUE
## 4 사복 4학년 93.3 TRUE FALSE
## 5 아동 1학년 0 TRUE FALSE
## 6 아동 2학년 93.3 TRUE FALSE
## 7 아동 4학년 73.3 TRUE FALSE
## 8 아동 4학년 6.6 TRUE FALSE
edu_tb %>%
ggplot(mapping = aes(x = 학년,
y = 비교과운영)) +
geom_boxplot() +
labs(y = "비교과운영")
edu_tb <- edu_tb %>%
filter(!(학부 == c("사복") & 학년 == "4학년" & 비교과운영 <= 24)) %>%
filter(!(학부 == c("사복") & 학년 == "4학년" & 비교과운영 >= 93)) %>%
filter(!(학부 == c("아동") & 학년 == "2학년" & 비교과운영 >= 93)) %>%
filter(!(학부 == c("아동") & 학년 == "4학년" & 비교과운영 <= 7)) %>%
filter(!(학부 == c("아동") & 학년 == "4학년" & 비교과운영 >= 73))
6.정규분포 검정 : 0.05 보다 크므로 정규분포를 따른다.
edu_tb %>%
select(학부, 학년, 비교과운영) %>%
group_by(학부, 학년) %>%
shapiro_test(비교과운영)
## # A tibble: 8 x 5
## 학부 학년 variable statistic p
## <fct> <fct> <chr> <dbl> <dbl>
## 1 사복 1학년 비교과운영 0.871 0.230
## 2 사복 2학년 비교과운영 0.975 0.795
## 3 사복 3학년 비교과운영 0.945 0.348
## 4 사복 4학년 비교과운영 0.972 0.900
## 5 아동 1학년 비교과운영 0.963 0.659
## 6 아동 2학년 비교과운영 0.950 0.119
## 7 아동 3학년 비교과운영 0.940 0.295
## 8 아동 4학년 비교과운영 0.952 0.419
7.등분산 검정(대상 집단의 분산이 같은지 다른지를 통계적으로 검정하는 방법)
이분산일때는 하단의 Welch’s ANOVA test 참조
edu_tb %>%
levene_test(비교과운영 ~ 학부*학년)
## # A tibble: 1 x 4
## df1 df2 statistic p
## <int> <int> <dbl> <dbl>
## 1 7 143 1.21 0.303
유의값(p-value)이 .05 이상인 경우에는 귀무가설을 지지하여 ’분산에 차이가 없다.’고 말할 수 있다.
8.등분산 ANOVA
등분산일때 ANOVA분석
twa_result <- aov(비교과운영 ~ 학부 + 학년 + 학부:학년,
data=edu_tb)
tidy(twa_result)
## # A tibble: 4 x 6
## term df sumsq meansq statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 학부 1 201. 201. 0.678 0.412
## 2 학년 3 2368. 789. 2.67 0.0500
## 3 학부:학년 3 1869. 623. 2.10 0.102
## 4 Residuals 143 42327. 296. NA NA
모든 그룹의 평균의 차이는 없다
summary(twa_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## 학부 1 201 200.6 0.678 0.412
## 학년 3 2368 789.5 2.667 0.050 .
## 학부:학년 3 1869 622.9 2.104 0.102
## Residuals 143 42327 296.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
edu_tb %>%
anova_test(비교과운영 ~ 학부 + 학년 + 학부:학년)
## Coefficient covariances computed by hccm()
## ANOVA Table (type II tests)
##
## Effect DFn DFd F p p<.05 ges
## 1 학부 1 143 0.197 0.658 0.001
## 2 학년 3 143 2.667 0.050 0.053
## 3 학부:학년 3 143 2.104 0.102 0.042
상호작용이 없을 경우 : 마지막 부록 참조
9.사후검정(Multicamparison test )
상호작용이 있을 경우 : 그룹별로 나누어서 분석
상호작용이 없을 경우 : 각 변수별 주효과 분석(t-test, ANOVA분석)
Fisher LSD
edu_tb %>%
group_by(학년)%>%
pairwise_t_test(비교과운영 ~ 학부,
p.adj="bonferroni")
## # A tibble: 4 x 10
## 학년 .y. group1 group2 n1 n2 p p.signif p.adj p.adj.signif
## * <fct> <chr> <chr> <chr> <int> <int> <dbl> <chr> <dbl> <chr>
## 1 1학년 비교과운영 사복 아동 6 18 0.832 ns 0.832 ns
## 2 2학년 비교과운영 사복 아동 24 34 0.278 ns 0.278 ns
## 3 3학년 비교과운영 사복 아동 18 18 0.0458 * 0.0458 *
## 4 4학년 비교과운영 사복 아동 14 19 0.141 ns 0.141 ns
p값이 0.05보다 크므로 상호작용이 없다.
부록: 상호작용 없을 경우
상호작용이 없을 경우 : 상호작용효과(학부:학년) 제거하고 다시 분석
상호작용이 없을 경우 : 각 변수별 주효과 분석(t-test, ANOVA분석)
twa_result <- aov(비교과운영 ~ 학부 + 학년,
data=edu_tb)
tidy(twa_result)
## # A tibble: 3 x 6
## term df sumsq meansq statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 학부 1 201. 201. 0.663 0.417
## 2 학년 3 2368. 789. 2.61 0.0539
## 3 Residuals 146 44196. 303. NA NA
edu_tb %>%
pairwise_t_test(비교과운영 ~ 학부,
p.adj="bonferroni")
## # A tibble: 1 x 9
## .y. group1 group2 n1 n2 p p.signif p.adj p.adj.signif
## * <chr> <chr> <chr> <int> <int> <dbl> <chr> <dbl> <chr>
## 1 비교과운영 사복 아동 62 89 0.424 ns 0.424 ns
edu_tb %>%
pairwise_t_test(비교과운영 ~ 학년,
p.adj="bonferroni")
## # A tibble: 6 x 9
## .y. group1 group2 n1 n2 p p.signif p.adj p.adj.signif
## * <chr> <chr> <chr> <int> <int> <dbl> <chr> <dbl> <chr>
## 1 비교과운영 1학년 2학년 24 58 0.525 ns 1 ns
## 2 비교과운영 1학년 3학년 24 36 0.0154 * 0.0924 ns
## 3 비교과운영 2학년 3학년 58 36 0.022 * 0.132 ns
## 4 비교과운영 1학년 4학년 24 33 0.102 ns 0.611 ns
## 5 비교과운영 2학년 4학년 58 33 0.19 ns 1 ns
## 6 비교과운영 3학년 4학년 36 33 0.398 ns 1 ns
p값이 0.05보다 작은 그룹 중에 1학년과 3학년의 그룹과 2학년과 3학년의 그룹의 차이만 있다. 나머지 그룹은 차이가 없다.
Leave a comment