Chapter 2 Survey and Descriptive statistics

  • 양적 연구의 첫 번째 단계는 데이터 수집이라고 할 수 있습니다.

  • 조직심리학 연구방법론 첫 시간에는 Qualtrics를 활용하여 설문을 수집하고, 해당 데이터의 척도계산, 조건별 기초 통계량(평균, 표준편차) 을 제시하는 것을 배웠습니다.

  • 연습용 설문은 TIPI(성격 5요인) 검사 10문항, RSES(자아 존중감) 검사 10문항으로 구성되어 있습니다.

  • 응답자 20명이 목표이며, ‘나’‘나의 지도교수’로 10명씩 임의 배정되도록 설계했습니다.

  • 설문응답이 완료된 후, Qualtrics에서 데이터를 다운받아 R로 분석하는 과정을 간단하게 정리했습니다.

2.1 Data Import

  • Qualtrics에서는 csv, tsv, sav, excel 등 다양한 포맷으로 데이터를 다운 받을 수 있으며,
    저는 SPSS용 파일포맷인 sav 형태로 다운받아 활용했습니다.
  • 다운 받은 sav 파일을 R 프로젝트 폴더에 복사합니다.
  • 폴더 위치를 모르시는 경우, getwd() 함수를 활용하여 폴더 위치를 파악하실 수 있습니다.
# 현재 제가 작업하고 있는 폴더는 아래와 같습니다. 
getwd()
## [1] "/Users/raymondkim/Desktop/Psy_Methology"
# 위 위치에 파일을 옮겨줍니다. 
  • 이제 haven package를 통해 sav 데이터를 불러옵니다.
library(haven)

# data 변수에 sav 데이터를 넣어줍니다. 
data <- read_spss("data_210316.sav")

# head, str, View 함수 등을 통해 데이터가 어떻게 생겼나 확인해봅니다. 

head(data)
## # A tibble: 6 x 42
##   StartDate           EndDate                         Status IPAddress Progress
##   <dttm>              <dttm>                       <dbl+lbl> <chr>        <dbl>
## 1 2021-03-15 05:24:09 2021-03-15 05:24:09 1 [Survey Preview] ""             100
## 2 2021-03-15 05:24:48 2021-03-15 05:24:48 1 [Survey Preview] ""             100
## 3 2021-03-15 05:25:09 2021-03-15 05:25:09 1 [Survey Preview] ""             100
## 4 2021-03-15 05:25:48 2021-03-15 05:25:48 1 [Survey Preview] ""             100
## 5 2021-03-15 06:40:02 2021-03-15 06:40:05 1 [Survey Preview] ""             100
## 6 2021-03-15 07:04:30 2021-03-15 07:04:32 1 [Survey Preview] ""             100
## # … with 37 more variables: Duration__in_seconds_ <dbl>, Finished <dbl+lbl>,
## #   RecordedDate <dttm>, ResponseId <chr>, RecipientLastName <chr>,
## #   RecipientFirstName <chr>, RecipientEmail <chr>, ExternalReference <chr>,
## #   LocationLatitude <chr>, LocationLongitude <chr>, DistributionChannel <chr>,
## #   UserLanguage <chr>, Q1 <dbl+lbl>, Q2 <dbl+lbl>, Q3 <dbl+lbl>, Q4 <dbl+lbl>,
## #   Q5 <dbl+lbl>, Q6 <dbl+lbl>, Q7 <dbl+lbl>, Q8 <dbl+lbl>, Q9 <dbl+lbl>,
## #   Q10 <dbl+lbl>, Q11 <dbl+lbl>, Q12 <dbl+lbl>, Q13 <dbl+lbl>, Q14 <dbl+lbl>,
## #   Q15 <dbl+lbl>, Q16 <dbl+lbl>, Q17 <dbl+lbl>, Q18 <dbl+lbl>, Q19 <dbl+lbl>,
## #   Q20 <dbl+lbl>, Q21 <dbl+lbl>, Q22 <dbl+lbl>, Q23 <dbl+lbl>,
## #   condition <chr>, A____________________... <chr>
str(data)
## tibble[,42] [33 × 42] (S3: tbl_df/tbl/data.frame)
##  $ StartDate               : POSIXct[1:33], format: "2021-03-15 05:24:09" "2021-03-15 05:24:48" ...
##  $ EndDate                 : POSIXct[1:33], format: "2021-03-15 05:24:09" "2021-03-15 05:24:48" ...
##  $ Status                  : dbl+lbl [1:33] 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0...
##    ..@ label        : chr "응답 유형"
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:12] 0 1 2 4 8 9 12 16 17 32 ...
##    .. ..- attr(*, "names")= chr [1:12] "IP Address" "Survey Preview" "Survey Test" "Imported" ...
##  $ IPAddress               : chr [1:33] "" "" "" "" ...
##   ..- attr(*, "label")= chr "IP 주소"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ Progress                : num [1:33] 100 100 100 100 100 100 100 100 100 100 ...
##   ..- attr(*, "label")= chr "진행 상태"
##   ..- attr(*, "format.spss")= chr "F40.2"
##   ..- attr(*, "display_width")= int 5
##  $ Duration__in_seconds_   : num [1:33] 0 0 0 0 2 2 23 47 3 55 ...
##   ..- attr(*, "label")= chr "기간(초)"
##   ..- attr(*, "format.spss")= chr "F40.2"
##   ..- attr(*, "display_width")= int 5
##  $ Finished                : dbl+lbl [1:33] 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1...
##    ..@ label        : chr "마침"
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:2] 0 1
##    .. ..- attr(*, "names")= chr [1:2] "False" "True"
##  $ RecordedDate            : POSIXct[1:33], format: "2021-03-15 05:24:10" "2021-03-15 05:24:50" ...
##  $ ResponseId              : chr [1:33] "R_1GHug1pWZ1h34TI" "R_dgPqSWQkybdACBj" "R_2azwsJwZ4VczLNt" "R_3eyN16AHa6nt44W" ...
##   ..- attr(*, "label")= chr "응답 ID"
##   ..- attr(*, "format.spss")= chr "A50"
##   ..- attr(*, "display_width")= int 15
##  $ RecipientLastName       : chr [1:33] "" "" "" "" ...
##   ..- attr(*, "label")= chr "수신자 성"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ RecipientFirstName      : chr [1:33] "" "" "" "" ...
##   ..- attr(*, "label")= chr "수신자 이름"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ RecipientEmail          : chr [1:33] "" "" "" "" ...
##   ..- attr(*, "label")= chr "수신자 이메일"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ ExternalReference       : chr [1:33] "" "" "" "" ...
##   ..- attr(*, "label")= chr "외부 데이터 참조"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ LocationLatitude        : chr [1:33] "37.5984954833984375" "37.5984954833984375" "37.5984954833984375" "37.5984954833984375" ...
##   ..- attr(*, "label")= chr "위치 위도"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ LocationLongitude       : chr [1:33] "126.978302001953125" "126.978302001953125" "126.978302001953125" "126.978302001953125" ...
##   ..- attr(*, "label")= chr "위치 경도"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ DistributionChannel     : chr [1:33] "preview" "preview" "preview" "preview" ...
##   ..- attr(*, "label")= chr "배포 채널"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ UserLanguage            : chr [1:33] "KO" "KO" "KO" "KO" ...
##   ..- attr(*, "label")= chr "사용자 언어"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ Q1                      : dbl+lbl [1:33] NA, NA, NA, NA,  2,  2,  1,  1,  2,  1,  2,  1,  1,  1,...
##    ..@ label        : chr "안녕하세요. \n\n본 설문은 조직심리학 연구방법론 수업을 위한 설문조사입니다. \n \n\n성격특성을 검사하는 TIPI 검"| __truncated__
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:2] 1 2
##    .. ..- attr(*, "names")= chr [1:2] "1" "2"
##  $ Q2                      : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  1,  1, NA,  1, NA,  1,  1,  1,...
##    ..@ label        : chr "첫번째 검사는 5 요인의 성격 특성을 측정하는 \n\nTen-Item Personality Inventory(TIPI) 검사를 한국어로 번역한 것"| __truncated__
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num 1
##    .. ..- attr(*, "names")= chr "1"
##  $ Q3                      : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  1,  1, NA,  2, NA,  4,  4,  7,...
##    ..@ label        : chr "[Field-condition]는 외향적이며, 열정적이라고 생각한다"
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점\n(전혀 동의하지 않는다)\n" "2점\n(다소 동의하지 않는다)\n" "3점\n(동의하지 않는다)" "4점\n(보통이다)\n" ...
##  $ Q4                      : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  4,  6, NA,  4, NA,  7,  4,  3,...
##    ..@ label        : chr "[Field-condition]는 비판적이며, 논쟁하기 좋아한다고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q5                      : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  6,  7, NA,  5, NA,  7,  4,  7,...
##    ..@ label        : chr "[Field-condition]는 믿음직하며, 스스로 절제하는 편이라고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q6                      : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  3,  3, NA,  4, NA,  7,  5,  1,...
##    ..@ label        : chr "[Field-condition]는 근심이 많고, 쉽게 화가 나는 편이라고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q7                      : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  7,  2, NA,  3, NA,  3,  2,  1,...
##    ..@ label        : chr "[Field-condition]는 새로운 경험에 개방적이고, 복잡다단한 편이라고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q8                      : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  2,  3, NA,  5, NA,  4,  4,  5,...
##    ..@ label        : chr "[Field-condition]는 내성적이며, 조용한 편이라고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q9                      : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  3,  3, NA,  4, NA,  2,  6,  7,...
##    ..@ label        : chr "[Field-condition]는 동정심이 많고, 다정다감한 편이라고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q10                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  5,  5, NA,  4, NA,  3,  5,  1,...
##    ..@ label        : chr "[Field-condition]는 정리정돈을 잘 하지 못하고, 덤벙대는 편이라고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q11                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA,  6,  5, NA,  5, NA,  3,  2,  7,...
##    ..@ label        : chr "[Field-condition]는 차분하며, 감정의 기복이 적은 편이라고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q12                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,  4,  4,  1,...
##    ..@ label        : chr "[Field-condition]는 변화를 싫어하고, 창의적이지 않은 편이라고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:7] 1 2 3 4 5 6 7
##    .. ..- attr(*, "names")= chr [1:7] "1점(전혀 동의하지 않는다)" "2점(다소 동의하지 않는다)" "3점(동의하지 않는다)" "4점(보통이다)" ...
##  $ Q13                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  1, NA,  1, NA,  1,  1,  1,...
##    ..@ label        : chr "두번째 검사는 자아존중감을 측정하는 \n\nRosenberg Self Esteem Scale (RSES) 검사를 한국어로 번역한 것입니다. \n\"| __truncated__
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num 1
##    .. ..- attr(*, "names")= chr "1"
##  $ Q14                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  4, NA,  1, NA,  3,  4,  4,...
##    ..@ label        : chr "나는 내가 적어도 다른 사람만큼 가치 있는 사람이라고 느낀다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q15                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  2, NA,  1, NA,  4,  3,  4,...
##    ..@ label        : chr "나는 내가 좋은 장점을 많이 갖고 있다고 느낀다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q16                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  4, NA,  3, NA,  4,  1,  1,...
##    ..@ label        : chr "나는 내가 실패자라고 느끼는 경향이 있다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q17                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  1, NA,  4, NA,  1,  4,  4,...
##    ..@ label        : chr "나도 다른 사람들이 하는 만큼은 할 수 있다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q18                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  1, NA,  4, NA,  4,  4,  1,...
##    ..@ label        : chr "나는 내가 다른 사람 앞에 자랑스러워 할 만한 것이 별로 없다고 느낀다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q19                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  4, NA,  1, NA,  4,  4,  4,...
##    ..@ label        : chr "나는 나 자신에 대해 긍정적인 태도를 지니고 있다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q20                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  3, NA,  3, NA,  1,  1,  4,...
##    ..@ label        : chr "대체로, 나는 나 자신에 만족한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q21                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  2, NA,  1, NA,  4,  4,  1,...
##    ..@ label        : chr "나는 나 자신을 조금 더 존중할 수 있기를 바란다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q22                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  2, NA,  4, NA,  2,  4,  2,...
##    ..@ label        : chr "나는 때때로, 나 자신이 쓸모 없는 존재라고 느낀다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ Q23                     : dbl+lbl [1:33] NA, NA, NA, NA, NA, NA, NA,  3, NA,  4, NA,  1, NA,  3,...
##    ..@ label        : chr "나는 때때로, 내가 유능하지 못하다고 생각한다."
##    ..@ format.spss  : chr "F40.0"
##    ..@ display_width: int 5
##    ..@ labels       : Named num [1:4] 1 2 3 4
##    .. ..- attr(*, "names")= chr [1:4] "1점(전혀 그렇지 않다)" "2점(그렇지 않다)" "3점(그렇다)" "4점(매우 그렇다)"
##  $ condition               : chr [1:33] "" "" "" "" ...
##   ..- attr(*, "label")= chr "condition"
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15
##  $ A____________________...: chr [1:33] "" "" "" "" ...
##   ..- attr(*, "label")= chr "새 필드 생성 또는 드롭다운에서 선택..."
##   ..- attr(*, "format.spss")= chr "A2000"
##   ..- attr(*, "display_width")= int 15

2.2 Data Pre-Processing

  • 데이터가 잘 들어왔는지 확인했으면, 이제 데이터 전처리를 해줄 차례입니다.
  • 전처리에 주로 사용하는 tidyverse, dplyr 패키지를 로드해줍니다.
library(tidyverse)
## ─ Attaching packages ──────────────────── tidyverse 1.3.1 ─
## ✓ ggplot2 3.3.3     ✓ purrr   0.3.4
## ✓ tibble  3.1.0     ✓ dplyr   1.0.5
## ✓ tidyr   1.1.3     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.1
## ─ Conflicts ───────────────────── tidyverse_conflicts() ─
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(dplyr)
  • colnames 함수를 통해 어떤 열들이 포함되어 있는지를 확인해봅니다.
data %>% colnames
##  [1] "StartDate"                "EndDate"                 
##  [3] "Status"                   "IPAddress"               
##  [5] "Progress"                 "Duration__in_seconds_"   
##  [7] "Finished"                 "RecordedDate"            
##  [9] "ResponseId"               "RecipientLastName"       
## [11] "RecipientFirstName"       "RecipientEmail"          
## [13] "ExternalReference"        "LocationLatitude"        
## [15] "LocationLongitude"        "DistributionChannel"     
## [17] "UserLanguage"             "Q1"                      
## [19] "Q2"                       "Q3"                      
## [21] "Q4"                       "Q5"                      
## [23] "Q6"                       "Q7"                      
## [25] "Q8"                       "Q9"                      
## [27] "Q10"                      "Q11"                     
## [29] "Q12"                      "Q13"                     
## [31] "Q14"                      "Q15"                     
## [33] "Q16"                      "Q17"                     
## [35] "Q18"                      "Q19"                     
## [37] "Q20"                      "Q21"                     
## [39] "Q22"                      "Q23"                     
## [41] "condition"                "A____________________..."
  • 총 42개의 열이 있으며, 이중 현재 제가 필요로 하는 열은 Q1 ~ condition까지 입니다.

  • 18번째 열이 Q1, 41번째 열이 condition이므로, data 변수의 18번쨰부터
    41번째까지만 가져와서 새로운 변수를 생성합니다.

  • head 함수를 통해 보면, NA 값이 포함된 열들이 있습니다.
    현재는 imputation과 같은 Missing Data 처리를 해줄 필요가 없기에,
    na.omit() 함수를 통해 전부 제거하겠습니다..

# 18번째(Q1)부터 41번쨰 열(condition)까지 새로운 변수로 정의
static_data <- data[,18:41]

# 10번째 행까지 확인
head(static_data)
## # A tibble: 6 x 24
##       Q1    Q2    Q3    Q4    Q5    Q6    Q7    Q8    Q9   Q10   Q11   Q12   Q13
##   <dbl+> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 NA        NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
## 2 NA        NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
## 3 NA        NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
## 4 NA        NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
## 5  2 [2]    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
## 6  2 [2]    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
## # … with 11 more variables: Q14 <dbl+lbl>, Q15 <dbl+lbl>, Q16 <dbl+lbl>,
## #   Q17 <dbl+lbl>, Q18 <dbl+lbl>, Q19 <dbl+lbl>, Q20 <dbl+lbl>, Q21 <dbl+lbl>,
## #   Q22 <dbl+lbl>, Q23 <dbl+lbl>, condition <chr>
# 결측치 제거 전 관측치 수 : 33개
static_data%>%nrow()
## [1] 33
# 결측치가 포함되어 있는 관찰값 제거

static_data%>%na.omit -> static_data

2.3 Descriptive statistics

2.3.1 데이터 확인

  • 이제 분석할 데이터를 완벽하게 추출했습니다.
  • 조금 복잡하지만, 추출한 데이터의 구조를 str() 함수로 보면, tibble 로 되어 있고,
    각 열마다 속성(attribute)이 붙어 있음을 볼 수 있습니다.
  • 이제 static_data를 가지고 척도계산, 조건별 기초통계량을 제시할 수 있습니다.
  • 실제로 연구를 진행한다면, 문항간 상관이나 표준편차를 보며 불성실 응답을 걸러내겠지만,
    지금은 데이터가 20개밖에 없어서 해당 과정은 건너뛰겠습니다.
# 결측치 제거 후 데이터 수 : 20개
static_data%>%nrow
## [1] 20
# '나' 조건 설문 응답 
static_data%>%subset(condition=='나')%>%nrow
## [1] 10
# 10개 확인함

# '나의 지도교수' 설문 응답 
static_data%>%subset(condition=='나의 지도교수')%>%nrow
## [1] 10
# 10개 확인함

2.3.2 변수계산(1)

  • TIPI 검사문항 기준으로 5요인을 추출해보겠습니다.

  • TIPI 검사는 10개 질문 기준으로 아래와 같이 계산하여 5요인 점수를 추출합니다.

  • 질문은 아래와 같습니다.

    Q1. 나/나의 지도교수는 외향적이며, 열정적이라고 생각한다. (외향성)
    Q2. 나/나의 지도교수는 비판적이며, 논쟁하기를 좋아한다고 생각한다. (친화성)
    Q3. 나/나의 지도교수는 믿음직하며, 스스로 절제하는 편이라고 생각한다. (성실성)
    Q4. 나/나의 지도교수는 근심이 많고, 쉽게 화가나는 편이라고 생각한다. (정서적 안정성)
    Q5. 나/나의 지도교수는 새로운 경험에 개방적이고, 복잡다단한 편이라고 생각한다. (경험 개방성)
    Q6. 나/나의 지도교수는 내성적이며, 조용한 편이라고 생각한다. (외향성)
    Q7. 나/나의 지도교수는 동정심이 많고, 다정다감한 편이라고 생각한다. (친화성)
    Q8. 나/나의 지도교수는 정리정돈을 잘 하지 못하고, 덤벙대는 편이라고 생각한다. (성실성)
    Q9. 나/나의 지도교수는 차분하며, 감정의 기복이 적은 편이라고 생각한다. (정서적 안정성)
    Q10. 나/나의 지도교수는 변화를 싫어하고 창의적이지 않은 편이라고 생각한다. (경험 개방성)
요인 계산방법 성인평균 성인높음 성인 낮음
성실성 {Q3+(8-Q8)}/2 4.61 6.0이상 3.2이하
친화성 {Q7+(8-Q2)}/2 4.61 5.9이상 3.5이하
정서적 안정성 {Q9+(8-Q4)}/2 4.61 5.9이상 2.9이하
경험 개방성 {Q5+(8-Q10)}/2 4.61 5.8이상 2.4이하
외향성 {Q1+(8-Q6)}/2 3.98 5.6이상 2.4이하
  • 가장 기본 함수를 활용하여 변수를 계산하고, 새로 생성해서 static_data 변수에 열로 추가해보겠습니다.

  • 그냥 수식으로 쓰듯 적어주면 됩니다.

  • Raw Data에서는 Q1은 동의/비동의를 묻고, Q2는 설문 시작하기 버튼 입력값에 할애되어 있어서,
    원 문항 번호에서 2씩 더해서 수식을 구성했습니다.

static_data$conscientiousness <- (static_data$Q5+(8-static_data$Q10))/2
static_data$agreeableness <- (static_data$Q9+(8-static_data$Q4))/2
static_data$Neuroticism <- (static_data$Q11+(8-static_data$Q6))/2
static_data$Openness <- (static_data$Q7+(8-static_data$Q12))/2
static_data$Extraversion <- (static_data$Q3+(8-static_data$Q8))/2

▶︎ Gosling et al,. 2003의 A very brief measure of the Big-Five personality domains 논문을 참고했습니다.

2.3.3 조건별 기초 통계량(1)

  • 변수 계산을 했으니, 이제 기초통계량을 확인해봅니다.
  • 기초 통계량에는 평균, 중앙값, 표준편차, IQR 등이 있습니다.
  • 조견별로 나눠야 하니, 조건별로 데이터부터 나눠보겠습니다.
# '나' 조건 설문 응답자 변수 생성
static_data%>%subset(condition=='나')->static_data_me

# 열 이름 확인
static_data_me%>%colnames
##  [1] "Q1"                "Q2"                "Q3"               
##  [4] "Q4"                "Q5"                "Q6"               
##  [7] "Q7"                "Q8"                "Q9"               
## [10] "Q10"               "Q11"               "Q12"              
## [13] "Q13"               "Q14"               "Q15"              
## [16] "Q16"               "Q17"               "Q18"              
## [19] "Q19"               "Q20"               "Q21"              
## [22] "Q22"               "Q23"               "condition"        
## [25] "conscientiousness" "agreeableness"     "Neuroticism"      
## [28] "Openness"          "Extraversion"
# 5요인 계산 값만 추출 

static_data_me[,25:29]->MyTIPI

# '나의 지도교수' 응답자 변수 생성
static_data%>%subset(condition=='나의 지도교수')-> static_data_prof

# 5요인 계산 값만 추출 

static_data_prof[,25:29]->MyprofTIPI
  • 이제 ‘나’ 와 ‘나의 지도교수’ 조건별 응답자 데이터를 각각 MyTIPI와 MyprofTIPI 변수에 넣어주었습니다.

  • stargazer 패키지를 통해 기초 통계량을 간단히 출력해볼 수 있습니다.

library(stargazer)
## 
## Please cite as:
##  Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.2. https://CRAN.R-project.org/package=stargazer
# stargazer 패키지를 활용하기 위해 tibble 타입인 MyTIPI를 data frame으로 변환합니다. 
  
MyTIPI%>%as.data.frame(stringAsFalse=FALSE)->MyTIPI

# 이제 html 형태로 기초통계표를 출력해봅니다. 

stargazer(MyTIPI, title ="My condition, Descriptive statistics", digits=2, type='html',out = 'MyTIPI.html', summary.stat = c('mean','sd','median','min','max'))
My condition, Descriptive statistics
Statistic Mean St. Dev. Median Min Max
conscientiousness 5.30 0.98 5.2 4 6
agreeableness 4.10 0.66 4.00 3.00 5.00
Neuroticism 4.30 0.89 4.25 3.00 6.00
Openness 4.60 0.88 4.50 3.50 6.50
Extraversion 4.15 1.20 4.00 2.50 6.00
MyprofTIPI%>%as.data.frame(stringAsFalse=FALSE)->MyprofTIPI

stargazer(MyTIPI, title ="My professor condition, Descriptive statistics", digits=2, type='html',out = 'MyprofTIPI.html', summary.stat = c('mean','sd','median','min','max'))
My professor condition, Descriptive statistics
Statistic Mean St. Dev. Median Min Max
conscientiousness 5.30 0.98 5.2 4 6
agreeableness 4.10 0.66 4.00 3.00 5.00
Neuroticism 4.30 0.89 4.25 3.00 6.00
Openness 4.60 0.88 4.50 3.50 6.50
Extraversion 4.15 1.20 4.00 2.50 6.00

2.3.4 변수계산(2)

  • 이번에는 로젠버그 자아존중감 측정 데이터의 변수계산을 진행하겠습니다.

  • 우선 앞선 데이터에서 RSES 질문만 가져옵니다.
    colnames 함수를 통해 Q14 ~ Q23은 14열부터 23열까지임을 확인했습니다.

  • 질문은 다음과 같습니다.

  Q1. 나는 내가 적어도 다른 사람만큼 가치 있는 사람이라고 느낀다. 
  Q2. 나는 내가 좋은 장점을 많이 갖고 있다고 느낀다.  
  Q3. 나는 내가 실패자라고 느끼는 경향이 있다. *
  Q4. 나도 다른 사람들이 하는 만큼은 할 수 있다. 
  Q5. 나는 내가 다른 사람 앞에 자랑스러워 할 만한 것이 별로 없다고 느낀다. *
  Q6. 나는 나 자신에 대해 긍정적인 태도를 지니고 있다.  
  Q7. 대체로, 나는 나 자신에 만족한다. 
  Q8.나는 나 자신을 조금 더 존중할 수 있기를 바란다. *
  Q9. 나는 때때로, 나 자신이 쓸모 없는 존재라고 느낀다. * 
  Q10. 나는 때때로, 내가 유능하지 못하다고 생각한다. *
   * 역문항

  • 위 문항번호와 다르게, Raw Data는 Q14부터 시작합니다.
static_data_me%>%colnames
##  [1] "Q1"                "Q2"                "Q3"               
##  [4] "Q4"                "Q5"                "Q6"               
##  [7] "Q7"                "Q8"                "Q9"               
## [10] "Q10"               "Q11"               "Q12"              
## [13] "Q13"               "Q14"               "Q15"              
## [16] "Q16"               "Q17"               "Q18"              
## [19] "Q19"               "Q20"               "Q21"              
## [22] "Q22"               "Q23"               "condition"        
## [25] "conscientiousness" "agreeableness"     "Neuroticism"      
## [28] "Openness"          "Extraversion"
# 나의 RSES를 추출합니다.  
static_data_me[,14:23]->myRSES

# 나의 지도교수님의 RSES를 추출합니다. 
static_data_prof[,14:23]->myprofRSES
  • RSES 검사도 10개의 질문으로 이루어져 있지만, Q16, Q18, Q21, Q22, Q23은 역문항입니다.
  • 4점 리커트 척도로 되어 있기 때문에, 각 항목 값을 5에서 빼주면 자연스럽게 역코딩이 됩니다.
  • 역문항 코딩이 잘 되었는지 확인하고자 하실 때는 R의 기초함수인 table() 함수를 활용하시면 됩니다.
# 역문항 코딩을 진행합니다. 
myRSES%>%as.data.frame(stringAsFalse=FALSE)->myRSES

# 역문항 코딩한 값을 넣어줄 변수를 생성합니다. 
myRSES_rev <- myRSES
myprofRSES_rev <- myprofRSES

#5개 문항을 역코딩 해줍니다. Q16, Q18, Q21, Q22, Q23
myRSES_rev$Q16<- 5-myRSES$Q16
myRSES_rev$Q18<- 5-myRSES$Q18
myRSES_rev$Q21<- 5-myRSES$Q21
myRSES_rev$Q22<- 5-myRSES$Q22
myRSES_rev$Q23<- 5-myRSES$Q23

myprofRSES%>%as.data.frame(stringAsFalse=FALSE) ->myprofRSES

myprofRSES_rev$Q16<- 5-myprofRSES$Q16
myprofRSES_rev$Q18<- 5-myprofRSES$Q18
myprofRSES_rev$Q21<- 5-myprofRSES$Q21
myprofRSES_rev$Q22<- 5-myprofRSES$Q22
myprofRSES_rev$Q23<- 5-myprofRSES$Q23

# 역문항 코딩 이후, 점수 계산을 위해 1씩 빼줘야 합니다. 
# 0~3점 분포로 계산을 해야 하네요. 

myRSES_rev-1->myRSES_rev
myprofRSES_rev-1->myprofRSES_rev
  • 역문항 전환 뒤 10문항의 평균으로 이제 변수계산을 해줍니다.
  • RSES는 선행연구를 찾아보니, 역문항 코딩만 하고 전체 점수를 합쳐서 활용하는 것 같습니다.
  • 자아존중감은 아래 기준으로 수준을 판단합니다.
구분 낮음 보통 높음
RSES 총점 0~14점 15~24점 25~30점

2.3.5 조건별 기초 통계량(2)

myRSES_rev%>%apply(1,sum)-> myRSES_rev$RSES

# 11번째 열인 RSES 합의 기술통계만 테이블로 표시합니다.
stargazer(myRSES_rev[11], title ="My condition, Self Esteem", digits=2, type='html',out = 'MyRSES.html', summary.stat = c('mean','sd','median','min','max'))
My condition, Self Esteem
Statistic Mean St. Dev. Median Min Max
RSES 22.40 3.84 21 18 28
myprofRSES_rev%>%apply(1,sum)-> myprofRSES_rev$RSES
myprofRSES_rev%>%as.data.frame(stringAsFALSE=FALSE) ->myprofRSES_rev

# 나의 지도교수님에 대한 TIPI 응답을 한 인원에 대해 별도 테이블을 구성합니다. 
# 마찬가지로 11번째 열인 RSES 합의 기술통계만 테이블로 표시합니다. 
stargazer(myprofRSES_rev[11], title ="My Professor condition, Self Esteem", digits=2, type='html',out = 'MyprofRSSES.html', summary.stat =c('mean','sd','median','min','max'))
My Professor condition, Self Esteem
Statistic Mean St. Dev. Median Min Max
RSES 21.90 7.72 25.5 10 30
  • 자아 존중감은 두 조건 응답자 평균은 모두 보통 이상으로 나옵니다.

  • 데이터 클리닝은 다음 강의에서 다룰 예정으로 알고 있기에, 기초통계 표 작성은 이정도로 마무리하겠습니다.