Table Of Contents

데이터마이닝의 이론과 실제 기말고사 연습문제3

연습문제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

skim_variable n_missing complete_rate ordered n_unique top_counts
학부 0 1 FALSE 2 아동: 92, 사복: 65
학년 0 1 FALSE 4 2학년: 59, 4학년: 38, 3학년: 36, 1학년: 24

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
교양강의운영 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