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 데이터를 넣어줍니다.
<- read_spss("data_210316.sav")
data
# 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 함수를 통해 어떤 열들이 포함되어 있는지를 확인해봅니다.
%>% colnames data
## [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)까지 새로운 변수로 정의
<- data[,18:41]
static_data
# 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개
%>%nrow() static_data
## [1] 33
# 결측치가 포함되어 있는 관찰값 제거
%>%na.omit -> static_data static_data
2.3 Descriptive statistics
2.3.1 데이터 확인
- 이제 분석할 데이터를 완벽하게 추출했습니다.
- 조금 복잡하지만, 추출한 데이터의 구조를 str() 함수로 보면, tibble 로 되어 있고,
각 열마다 속성(attribute)이 붙어 있음을 볼 수 있습니다.
- 이제 static_data를 가지고 척도계산, 조건별 기초통계량을 제시할 수 있습니다.
- 실제로 연구를 진행한다면, 문항간 상관이나 표준편차를 보며 불성실 응답을 걸러내겠지만,
지금은 데이터가 20개밖에 없어서 해당 과정은 건너뛰겠습니다.
# 결측치 제거 후 데이터 수 : 20개
%>%nrow static_data
## [1] 20
# '나' 조건 설문 응답
%>%subset(condition=='나')%>%nrow static_data
## [1] 10
# 10개 확인함
# '나의 지도교수' 설문 응답
%>%subset(condition=='나의 지도교수')%>%nrow static_data
## [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씩 더해서 수식을 구성했습니다.
$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 static_data
▶︎ Gosling et al,. 2003의 A very brief measure of the Big-Five personality domains 논문을 참고했습니다.
2.3.3 조건별 기초 통계량(1)
- 변수 계산을 했으니, 이제 기초통계량을 확인해봅니다.
- 기초 통계량에는 평균, 중앙값, 표준편차, IQR 등이 있습니다.
- 조견별로 나눠야 하니, 조건별로 데이터부터 나눠보겠습니다.
# '나' 조건 설문 응답자 변수 생성
%>%subset(condition=='나')->static_data_me
static_data
# 열 이름 확인
%>%colnames static_data_me
## [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요인 계산 값만 추출
25:29]->MyTIPI
static_data_me[,
# '나의 지도교수' 응답자 변수 생성
%>%subset(condition=='나의 지도교수')-> static_data_prof
static_data
# 5요인 계산 값만 추출
25:29]->MyprofTIPI static_data_prof[,
이제 ‘나’ 와 ‘나의 지도교수’ 조건별 응답자 데이터를 각각 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으로 변환합니다.
%>%as.data.frame(stringAsFalse=FALSE)->MyTIPI
MyTIPI
# 이제 html 형태로 기초통계표를 출력해봅니다.
stargazer(MyTIPI, title ="My condition, Descriptive statistics", digits=2, type='html',out = 'MyTIPI.html', summary.stat = c('mean','sd','median','min','max'))
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 |
%>%as.data.frame(stringAsFalse=FALSE)->MyprofTIPI
MyprofTIPI
stargazer(MyTIPI, title ="My professor condition, Descriptive statistics", digits=2, type='html',out = 'MyprofTIPI.html', summary.stat = c('mean','sd','median','min','max'))
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부터 시작합니다.
%>%colnames static_data_me
## [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를 추출합니다.
14:23]->myRSES
static_data_me[,
# 나의 지도교수님의 RSES를 추출합니다.
14:23]->myprofRSES static_data_prof[,
- RSES 검사도 10개의 질문으로 이루어져 있지만, Q16, Q18, Q21, Q22, Q23은 역문항입니다.
- 4점 리커트 척도로 되어 있기 때문에, 각 항목 값을 5에서 빼주면 자연스럽게 역코딩이 됩니다.
- 역문항 코딩이 잘 되었는지 확인하고자 하실 때는 R의 기초함수인 table() 함수를 활용하시면 됩니다.
# 역문항 코딩을 진행합니다.
%>%as.data.frame(stringAsFalse=FALSE)->myRSES
myRSES
# 역문항 코딩한 값을 넣어줄 변수를 생성합니다.
<- myRSES
myRSES_rev <- myprofRSES
myprofRSES_rev
#5개 문항을 역코딩 해줍니다. Q16, Q18, Q21, Q22, Q23
$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
myRSES_rev
%>%as.data.frame(stringAsFalse=FALSE) ->myprofRSES
myprofRSES
$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
myprofRSES_rev
# 역문항 코딩 이후, 점수 계산을 위해 1씩 빼줘야 합니다.
# 0~3점 분포로 계산을 해야 하네요.
-1->myRSES_rev
myRSES_rev-1->myprofRSES_rev myprofRSES_rev
- 역문항 전환 뒤 10문항의 평균으로 이제 변수계산을 해줍니다.
- RSES는 선행연구를 찾아보니, 역문항 코딩만 하고 전체 점수를 합쳐서 활용하는 것 같습니다.
- 자아존중감은 아래 기준으로 수준을 판단합니다.
구분 | 낮음 | 보통 | 높음 |
---|---|---|---|
RSES 총점 | 0~14점 | 15~24점 | 25~30점 |
2.3.5 조건별 기초 통계량(2)
%>%apply(1,sum)-> myRSES_rev$RSES
myRSES_rev
# 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'))
Statistic | Mean | St. Dev. | Median | Min | Max |
RSES | 22.40 | 3.84 | 21 | 18 | 28 |
%>%apply(1,sum)-> myprofRSES_rev$RSES
myprofRSES_rev%>%as.data.frame(stringAsFALSE=FALSE) ->myprofRSES_rev
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'))
Statistic | Mean | St. Dev. | Median | Min | Max |
RSES | 21.90 | 7.72 | 25.5 | 10 | 30 |
자아 존중감은 두 조건 응답자 평균은 모두 보통 이상으로 나옵니다.
데이터 클리닝은 다음 강의에서 다룰 예정으로 알고 있기에, 기초통계 표 작성은 이정도로 마무리하겠습니다.