package import

# rm(list=ls())
# install.packages('readxl')
library(readxl)
# install.packages('dplyr')
library(dplyr)
## Warning: 패키지 'dplyr'는 R 버전 4.2.2에서 작성되었습니다
## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# install.packages(lme4)
library(lme4)
## Warning: 패키지 'lme4'는 R 버전 4.2.2에서 작성되었습니다
## 필요한 패키지를 로딩중입니다: Matrix
# install.packages("lmerTest")
library(lmerTest)
## Warning: 패키지 'lmerTest'는 R 버전 4.2.2에서 작성되었습니다
## 
## 다음의 패키지를 부착합니다: 'lmerTest'
## The following object is masked from 'package:lme4':
## 
##     lmer
## The following object is masked from 'package:stats':
## 
##     step
# install.packages("ggplot2")
library(ggplot2)
# install.packages("sciplot")
library(sciplot)
# install.packages("openxlsx")
library("openxlsx")
## Warning: 패키지 'openxlsx'는 R 버전 4.2.2에서 작성되었습니다
# rm(list=ls())

directory 설정

getwd()
## [1] "C:/Users/csjja/Desktop"
setwd("C:\\Users\\csjja\\Desktop\\pn_data")
dir()
## [1] "cdi_coding.xlsx"          "cdi_merge_23.csv"        
## [3] "cdi_merge_23_0221.csv"    "complete_cdi_coding.xlsx"
## [5] "pn_Analysis_2.html"       "result.xlsx"             
## [7] "긍부정.xlsx"

feedback

  • subjcet를 가져오기
  • 3가지 카테고리(일상생활, 동사, 형용사)를 분류할 필요 없이 합쳐서 전체로 하기
  • 몇 개나 일치하는지, 일치하는 것들의 점수를 가져와서 calculate
  • paste를 다루는 문제(collapse)에 도움받음

CDI data import and clean

  • CDI data
    • 시트 1: raw response
    • 시트2,3,4: 시트1을 정리하고 cdi점수가 적혀있음.
  • data import
  • cdi 시트에서 참여자만 불러옴(보호자 이메일을 참여자로 대신함)
# cdi data import
cdi_all <- read_excel("result.xlsx",
              sheet = "설문지 응답 시트1",
              # range = "K1:K114", # cell range to read from
              col_names = TRUE, # TRUE to use the first row as column names
              na = "NA");head(cdi_all) # Character vector of strings to use for missing values
## New names:
## • `` -> `...57`
## • `` -> `...58`
## • `` -> `...59`
## • `` -> `...60`
## • `` -> `...61`
## • `` -> `...62`
## • `` -> `...63`
## • `` -> `...64`
## • `` -> `...65`
## • `` -> `...66`
## • `` -> `...67`
## • `` -> `...68`
## • `` -> `...69`
## • `` -> `...70`
## • `` -> `...71`
## • `` -> `...72`
## • `` -> `...73`
## • `` -> `...74`
## • `` -> `...75`
## • `` -> `...76`
## • `` -> `...77`
## • `` -> `...78`
## • `` -> `...79`
## • `` -> `...80`
## • `` -> `...81`
## • `` -> `...82`
## • `` -> `...83`
## • `` -> `...84`
## • `` -> `...85`
## • `` -> `...86`
## • `` -> `...87`
## • `` -> `...88`
## # A tibble: 6 × 96
##   타임스탬프          `본 검사지를 복제, 송…` `피검자의 개인…` `나는 이 연구에…`
##   <dttm>              <chr>                   <chr>            <chr>            
## 1 2020-04-16 12:39:31 동의                    동의             예               
## 2 2020-04-16 14:58:38 동의                    동의             예               
## 3 2020-04-16 17:20:23 동의                    동의             예               
## 4 2020-04-17 11:24:11 동의                    동의             예               
## 5 2020-04-17 15:02:27 동의                    동의             예               
## 6 2020-04-17 15:56:40 동의                    동의             예               
## # … with 92 more variables:
## #   `나는 이 연구에서 수집되는 나에 대한 정보는 연구 목적 이외에는 사용되지 않으며 현행 법률과 연구윤리심사위원회 규정이 허용하는 범위 내에서 연구자가 수집하고 처리한다는 것을 이해합니다.` <chr>,
## #   `나는 언제라도 이 연구의 참여를 철회할 수 있고, 이러한 결정이 나에게 어떠한 불이익도 되지 않을 것이라는 것을 알고 있습니다.` <chr>,
## #   `아동 성별` <chr>, `아동 생일` <dttm>, `검사 날짜` <dttm>,
## #   `보호자 연락처` <chr>, `보호자 이메일` <chr>, `아버지의 나이` <chr>,
## #   `아버지의 직업` <chr>, `아버지의 교육수준` <chr>,
## #   `아버지의 월별평균소득` <chr>, `어머니의 나이` <chr>, …
#참여자만
# cdi_par <- cdi_all["보호자 이메일"]
# cdi_par1 <- cdi_all["아동 생일"]
cdi_par <- cbind(cdi_all["보호자 이메일"], cdi_all["아동 생일"])
  • cdi raw 응답 불러옴
cdi_raw <- read_excel("result.xlsx",
                  sheet = "설문지 응답 시트1",
                  range = "Z1:AU114", # cell range to read from
                  col_names = TRUE, # TRUE to use the first row as column names
                  na = "NA");head(cdi_raw) # Character vector of strings to use for missing values
## # A tibble: 6 × 22
##   `1. 소리 (11)`    `2. 탈 것 (13)` `3. 장난감 및 …` `4. 동물 (41)` `5. 옷 (20)`
##   <chr>             <chr>           <chr>            <chr>          <chr>       
## 1 꽥꽥, 꿀꿀, 똑똑… 기차, 배, 버스… 공, 로봇, 블럭,… 개, 개구리, …  가방, 기저… 
## 2 꽥꽥, 꿀꿀, 똑똑… 기차, 배, 버스… 공, 로봇, 블럭,… 개, 개구리, …  가방, 구두,…
## 3 꿀꿀, 똑똑, 멍멍… 기차, 버스, 비… 공, 인형, 종이,… 개, 개구리, …  바지        
## 4 꽥꽥, 꿀꿀, 똑똑… 배, 버스, 비행… 공, 블럭, 장난…  개, 거북이, …  기저귀, 바… 
## 5 꿀꿀, 똑똑, 멍멍… 기차, 버스, 비… 공, 블럭, 연필,… 개, 개미, 고…  가방, 기저… 
## 6 꽥꽥, 꿀꿀, 똑똑… 기차, 배, 버스… 공, 로봇, 블럭,… 개, 개구리, …  가방, 구두,…
## # … with 17 more variables: `6. 가구 및 방안 (21)` <chr>, `7. 음식 (58)` <chr>,
## #   `8. 신체부위 (31)` <chr>, `9. 가정용품 (36)` <chr>,
## #   `10. 외부사물 (26)` <chr>, `11. 일상생활 (14)` <chr>,
## #   `12. 장소 (25)` <chr>, `13. 양, 정도 (14)` <chr>, `14. 사람 (33)` <chr>,
## #   `15. 의문사 (11)` <chr>, `16. 동사 (150)` <chr>, `17. 형용사 (52)` <chr>,
## #   `18. 끝맺는 말 (15)` <chr>, `19. 조사 (12)` <chr>,
## #   `20. 연결하는 말 (6)` <chr>, `21. 위치 (8)` <chr>, `22. 시간 (17)` <chr>
  • cdi_raw(cdi raw 응답 data)의 열 이름 정리;편의를 위해
names(cdi_raw)#열이름 확인
##  [1] "1. 소리 (11)"             "2. 탈 것 (13)"           
##  [3] "3. 장난감 및 문구류 (14)" "4. 동물 (41)"            
##  [5] "5. 옷 (20)"               "6. 가구 및 방안 (21)"    
##  [7] "7. 음식 (58)"             "8. 신체부위 (31)"        
##  [9] "9. 가정용품 (36)"         "10. 외부사물 (26)"       
## [11] "11. 일상생활 (14)"        "12. 장소 (25)"           
## [13] "13. 양, 정도 (14)"        "14. 사람 (33)"           
## [15] "15. 의문사 (11)"          "16. 동사 (150)"          
## [17] "17. 형용사 (52)"          "18. 끝맺는 말 (15)"      
## [19] "19. 조사 (12)"            "20. 연결하는 말 (6)"     
## [21] "21. 위치 (8)"             "22. 시간 (17)"
names(cdi_raw) <- gsub("[0-9]", "", names(cdi_raw))
names(cdi_raw) <- gsub("[[:punct:]]","",names(cdi_raw))
names(cdi_raw) <- gsub(" ", "",names(cdi_raw))
names(cdi_raw)
##  [1] "소리"           "탈것"           "장난감및문구류" "동물"          
##  [5] "옷"             "가구및방안"     "음식"           "신체부위"      
##  [9] "가정용품"       "외부사물"       "일상생활"       "장소"          
## [13] "양정도"         "사람"           "의문사"         "동사"          
## [17] "형용사"         "끝맺는말"       "조사"           "연결하는말"    
## [21] "위치"           "시간"
  • 보호자 이메일(열이름)을 subject로 변경
  • 뒤에서 left_join할 때 열이름을 통일시켜주기위한 목적.
# rename(테이블이름, "바꿀 이름" = "원래 이름")
cdi_par <- rename(cdi_par, "subject" = "보호자 이메일")
cdi_par <- rename(cdi_par, "Birthdate" = "아동 생일")
  • 긍부정 점수를 매기는데 사용할 3개 카테고리만 선택
categ <- cdi_raw[,c(11,16,17)] # 3 category만 선택
head(categ)
## # A tibble: 6 × 3
##   일상생활                                                         동사  형용사 
##   <chr>                                                            <chr> <chr>  
## 1 고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안… 가, … 가벼워…
## 2 고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안… 가, … 가벼워…
## 3 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 화이팅                       (불)… 미워, …
## 4 고마워, 네/응, 돼, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양… 가, … 귀여워…
## 5 고마워, 네/응, 돼, 만세, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양… 가, … 같아/… 
## 6 고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안… 가, … 가벼워…
merged <- paste(categ$일상생활, categ$동사, categ$형용사)#3개 카테고리를 하나로 merge

df dataframe 생성

  • 문제가 발생함: 하나의 행으로 모든 데이터가 들어감
    • 해결책: subject와 함께 merged 데이터를 새로운 데이터 프레임으로 생성.
#보호자 이메일과 3개 카테고리 합친것을 df으로 만듦
as.character(cdi_par$`subject`) -> subject # subject를 character로 만듦.
as.character(cdi_par$`Birthdate`) -> Birthdate # subject를 character로 만듦.

data.frame(subject, Birthdate) -> df
data.frame(df, merged) -> df
  • df안에 새로운 빈열 생성.
df$pn_pos_value <- rep(" ", length(df$subject)) # pn_value 열 생성
df$pn_neg_value <- rep(" ", length(df$subject)) # pn_value 열 생성
df$pn_pos_num <- rep(0, length(df$subject))# pn_num 열 생성
df$pn_neg_num <- rep(0, length(df$subject))# pn_num 열 생성

P(ositive)/N(egative) data import and clean

  • 긍부정 파일 import
pn <- read_excel("C:\\Users\\csjja\\Desktop\\pn_data\\긍부정.xlsx",
                 sheet = "230108_최종에서_수정1",
                 # range = "A1:D35", 
                 col_names = TRUE,
                 na = "NA")
## New names:
## • `` -> `...1`
# pn_saved <- pn # save data
# 긍정: 15개, 부정어 25개
  • pn 데이터 정제
str(pn)
## tibble [40 × 4] (S3: tbl_df/tbl/data.frame)
##  $ ...1          : num [1:40] 1 2 3 4 5 6 7 8 9 10 ...
##  $ Words         : chr [1:40] "고마워" "놀아" "괜찮아" "귀여워" ...
##  $ SentiWord_Dict: num [1:40] 2 1 1 2 2 2 2 1 2 1 ...
##  $ P/N           : chr [1:40] "P" "P" "P" "P" ...
unique(pn$`P/N`) #변수 확인
## [1] "P" "N"
is.na(unique(df$'merged'))
##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 긍부정 리스트 수정 후 필요없어짐.
# pn[pn$"P/N"=="N/M(iddle)",] #n/m인 행 확인 --> 넘어져
# pn[pn$"P/N"=="N/M(iddle)","P/N"] = "N" 


# 콤마를 기준으로 merged 데이터(paste했을 때 하나의 행으로 된 것)를 list화 
# It looks unnecessary
# strsplit(merged, ',') -> merged.list
  • pn을 긍정 data와 부정 data로 나누기
pn_pos <- pn[1:15,]
pn_neg <- pn[16:40,]

긍부정어 개수, 점수 계산

긍부정어 개수 계산

  • for문 돌려서 일치하는 단어가 있으면 paste해서 df$pn_pos_vlaue에 넣고-> 개수를 세서 전체 개수(15)로 나눠서 pn_pos_num에 넣기(긍정어)
for (i in 1:length(df$subject)){
  vec <- gsub(',', ' ', df$merged[i])
  vec <- gsub(' +', ' ', vec)
  list <- strsplit(vec, ' ')
  if (length(pn_pos$Words[which(as.vector(pn_pos$Words) %in% list[[1]])]) == 0) {
    df$pn_pos_value[i] <- NA
    df$pn_pos_num[i] <- 0
  } else {
    df$pn_pos_value[i] <- paste(pn_pos$Words[which(pn_pos$Words %in% list[[1]])], collapse = ",") #일치하는 단어 paste하기
    df$pn_pos_num[i] <- length(pn_pos$Words[which(pn_pos$Words %in% list[[1]])])/15 # df$pn_vlaue의 개수세기
  }
}

df$pn_pos_num <- as.numeric(df$pn_pos_num)

# 소숫점 2번째까지
df$pn_pos_num <- sprintf("%.2f", df$pn_pos_num)
  • for문 돌려서 일치하는 단어가 있으면 paste해서 df$pn_neg_vlaue에 넣고-> 개수를 세서 전체 개수(25)로 나눠서 pn_neg_num에 넣기(부정어)
for (i in 1:length(df$subject)){
  vec <- gsub(',', ' ', df$merged[i])
  vec <- gsub(' +', ' ', vec)
  list <- strsplit(vec, ' ')
  if (length(pn_neg$Words[which(as.vector(pn_neg$Words) %in% list[[1]])]) == 0) {
    df$pn_neg_value[i] <- NA
    df$pn_neg_num[i] <- 0
  } else {
    df$pn_neg_value[i] <- paste(pn_neg$Words[which(pn_neg$Words %in% list[[1]])], collapse = ",") #일치하는 단어 paste하기
    df$pn_neg_num[i] <- length(pn_neg$Words[which(pn_neg$Words %in% list[[1]])])/25 # df$pn_vlaue의 개수세기
  }
}

매칭되는 긍부정어의 점수 가져오기

  • for문으로df$pn_value과 일치하는 긍정 단어의 pn_pos$SentiWord_Dict 값 가져오기(긍정어)
# 긍정
for (i in 1:length(df$subject)){
  vet <- gsub(',', ' ', df$pn_pos_value[i])
  vet <- gsub(' +', ' ', vet)
  list <- strsplit(vet, ' ')
  if (length(pn_pos$Words[which(as.vector(pn_pos$Words) %in% list[[1]])]) == 0) {
    df$pn_pos_value_score[i] <- 0
  } else {
    df$pn_pos_value_score[i] <- paste(pn_pos$SentiWord_Dict[which(pn_pos$Words %in% list[[1]])], collapse = ",") #일치하는 단어의 SentiWord_Dict의 점수 넣기
  }
}

head(df, n=2)
##                subject  Birthdate
## 1 godtheeb@hanmail.net 2017-04-13
## 2 munhee1981@naver.com 2017-04-07
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            merged
## 1 고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양치, 응가/똥, 화이팅, 하지마 가, 가리켜, 가져, 간지럽혀, 건너, 걸어, 고쳐, 그려, 기다려, 깎아, (컵을)깨, (불)꺼, 꺼내, 꽂아, 끊어져, 끌어, 끼워, 나가, 나와, (물건을)날라, 날라가, (차에서)내려, 내려가, 넘어져, (통에)넣어, 노래 불러, 놀아, (물건을)놓아, 누워, (무엇을)눌러, (무엇에)눌려, 다녀, 다쳐, 닦아, 닫아, 달려, 당겨, 던져, 덮어, 도와, 돌려, 돌아, 두드려, (여기에)둬, (물건을)들어, (소리를)들어, 들어가, 때려, (물에)떠, 떨어뜨려, 떨어져, 떼(어), 뛰어, 마셔, 만들어, (빨래/싸움)말려, 말해, 맛봐, (주사를)맞아, (음식을)먹어, (음식을)먹여, 멈춰, 몰라, 물어, 밀어, (약)발라, 박수쳐, 버려, 벗어, 보여, 봐, 부딪쳐, 부숴, (물을)부어, 불러, (풍선을)불어, 붙여, 빗어, 빠져, 빨아, 빼, 빼앗아, 뽀뽀해, 뽑아, (물건을)사, 사랑해, (그 자리에)서, 수영해, 숨어, 시작해, 신어, (물건을)실어, 싸워, (모자)써, 쏟아, 씻어, 안아, 안해, 앉아, 알아, 열어, 올라가, 올려, 와, 요리해, 운전해, 울어, 웃어, (승부에)이겨, 일어나/일어서, 일해, 읽어, 입어, (잠)자, 잘라, 잡아, 죽어, 줘, 쫓아, 찍어, (공을)차, 찾아, 춤춰, 치워, 칠해, (차에)타, (차에)태워, 튀겨, 틀어, (코를)풀어, (꽃이)피어, 해, 혼나 가벼워, 간지러워, 같아/똑같아, 괜찮아, 귀여워, 길어, (색이)까매, 깜깜해, (색이)노래, 높아, 달라, 더러워, 더워, 동그래, 뜨거워, 많아, 맛없어, 맛있어, 매워, 멀어, 멋있어, 목말라, 무거워, 무서워, 배고파, (색이)빨개, 빨라, 싫어, 심심해, 아파, 어두워, 없어, 예뻐, 있어, 작아, 재미있어, 조용해, 졸려, 좋아, 착해, 추워, 커, (색이)파래, (색이)하얘, 힘들어
## 2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양치, 응가/똥, 화이팅, 하지마 가, 간지럽혀, 걸어, 공부해, 기다려, (불)꺼, 나가, (차에서)내려, 넘어져, (통에)넣어, 노래 불러, 놀아, (무엇을)눌러, 다쳐, 닦아, 달려, 당겨, 던져, 도와, 들어가, 때려, 떼(어), 뛰어, 마셔, 만들어, 말해, (주사를)맞아, (음식을)먹어, 멈춰, 미워해, 밀어, (약)발라, 박수쳐, 버려, 벗어, 봐, 빗어, 빠져, 빨아, 빼, 뽀뽀해, (물건을)사, 사랑해, 생각해, 수영해, 숨어, 신어, 싸워, (모자)써, 씻어, 안아, 앉아, 열어, 올라가, 와, 요리해, 운전해, 울어, 웃어, 일어나/일어서, 읽어, 입어, (잠)자, 좋아해, 줘, (공을)차, 찾아, 춤춰, (차에)타, 해, 혼나 가벼워, 간지러워, 같아/똑같아, 괜찮아, 귀여워, 길어, 깜깜해, 높아, 더러워, 더워, 뜨거워, 많아, 맛없어, 맛있어, 매워, 멋있어, 목말라, 무거워, 무서워, 배고파, 시끄러워, 심심해, 아파, 없어, 예뻐, 이상해, 있어, 작아, 재미있어, 졸려, 좋아, (맛이)짜, (촉감이)차, 착해, 추워, 커, 힘들어
##                                                                          pn_pos_value
## 1 고마워,놀아,괜찮아,귀여워,맛있어,사랑해,예뻐,웃어,재미있어,조용해,춤춰,도와,안아,커
## 2 고마워,놀아,괜찮아,귀여워,맛있어,사랑해,예뻐,웃어,재미있어,좋아해,춤춰,도와,안아,커
##                                                                                                                                pn_neg_value
## 1              더러워,때려,맛없어,무거워,무서워,숨어,싫어,심심해,아파,안돼,없어,울어,추워,혼나,힘들어,물어,간지러워,작아,간지럽혀,더워,버려
## 2 더러워,때려,맛없어,무거워,무서워,미워해,숨어,시끄러워,심심해,아파,안돼,없어,울어,추워,혼나,힘들어,간지러워,작아,간지럽혀,미워해,더워,버려
##   pn_pos_num pn_neg_num          pn_pos_value_score
## 1       0.93       0.84 2,1,1,2,2,2,2,1,2,1,1,1,1,1
## 2       0.93       0.88 2,1,1,2,2,2,2,1,2,2,1,1,1,1
  • for문으로df$pn_value과 일치하는 부정 단어의 pn_neg$SentiWord_Dict 값 가져오기(부정어)
# 부정
for (i in 1:length(df$subject)){
  vet <- gsub(',', ' ', df$pn_neg_value[i])
  vet <- gsub(' +', ' ', vet)
  list <- strsplit(vet, ' ')
  if (length(pn_neg$Words[which(as.vector(pn_neg$Words) %in% list[[1]])]) == 0) {
    df$pn_neg_value_score[i] <- 0
  } else {
    df$pn_neg_value_score[i] <- paste(pn_neg$SentiWord_Dict[which(pn_neg$Words %in% list[[1]])], collapse = ",") #일치하는 단어의 SentiWord_Dict의 점수 넣기
  }
}


#### !! 여기까지 df를 df_saved로 저장
# df_saved <- df

긍부정어 점수 계산

  • pn_pos_value/pn_neg_value -> pn 단어들과 일치하는 단어들 나열

  • pn_pos_value_score/pn_neg_value_score -> 긍부정 단어 각 점수 나열

  • pn_pos_cal/pn_neg_cal -> 점수 합

  • pn_pos_cal열에 pn_pos_value값의 합을 넣기(긍정)

# 분리해보기
## 긍정
mode(df$pn_pos_value_score) #데이터 타입 확인, character  
## [1] "character"
p <- df[,c(1,8)];View(p) #subject와 pn_pos_value_score
strsplit(p$pn_pos_value_score, ',') -> p1
# View(new_list)


#new_list <- apply(as.numeric(unlist(new_list)), 1, sum)

for (i in 1:length(p$subject)){
  p1[[i]] <- sum(as.numeric(p1[[i]]))/22}
# unlist
p_data <- data.frame(unlist(p1))
# cbind
df <- cbind(df, p_data)
#change column name
colnames(df)[10]<-'pn_pos_cal'
  • pn_neg_cal열에 pn_neg_value값의 합을 넣기(부정)
## 부정
mode(df$pn_neg_value_score) #데이터 타입 확인, character  
## [1] "character"
n <- df[,c(1,9)];View(n) #subject와 pn_neg_value_score
strsplit(n$pn_neg_value_score, ',') -> n1

for (i in 1:length(n$subject)){
  n1[[i]] <- sum(as.numeric(n1[[i]]))/-37}
# unlist
n_data <- data.frame(unlist(n1))
# cbind
df <- cbind(df, n_data)
#change column name
colnames(df)[11]<-'pn_neg_cal'

head(df, n=2)
##                subject  Birthdate
## 1 godtheeb@hanmail.net 2017-04-13
## 2 munhee1981@naver.com 2017-04-07
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            merged
## 1 고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양치, 응가/똥, 화이팅, 하지마 가, 가리켜, 가져, 간지럽혀, 건너, 걸어, 고쳐, 그려, 기다려, 깎아, (컵을)깨, (불)꺼, 꺼내, 꽂아, 끊어져, 끌어, 끼워, 나가, 나와, (물건을)날라, 날라가, (차에서)내려, 내려가, 넘어져, (통에)넣어, 노래 불러, 놀아, (물건을)놓아, 누워, (무엇을)눌러, (무엇에)눌려, 다녀, 다쳐, 닦아, 닫아, 달려, 당겨, 던져, 덮어, 도와, 돌려, 돌아, 두드려, (여기에)둬, (물건을)들어, (소리를)들어, 들어가, 때려, (물에)떠, 떨어뜨려, 떨어져, 떼(어), 뛰어, 마셔, 만들어, (빨래/싸움)말려, 말해, 맛봐, (주사를)맞아, (음식을)먹어, (음식을)먹여, 멈춰, 몰라, 물어, 밀어, (약)발라, 박수쳐, 버려, 벗어, 보여, 봐, 부딪쳐, 부숴, (물을)부어, 불러, (풍선을)불어, 붙여, 빗어, 빠져, 빨아, 빼, 빼앗아, 뽀뽀해, 뽑아, (물건을)사, 사랑해, (그 자리에)서, 수영해, 숨어, 시작해, 신어, (물건을)실어, 싸워, (모자)써, 쏟아, 씻어, 안아, 안해, 앉아, 알아, 열어, 올라가, 올려, 와, 요리해, 운전해, 울어, 웃어, (승부에)이겨, 일어나/일어서, 일해, 읽어, 입어, (잠)자, 잘라, 잡아, 죽어, 줘, 쫓아, 찍어, (공을)차, 찾아, 춤춰, 치워, 칠해, (차에)타, (차에)태워, 튀겨, 틀어, (코를)풀어, (꽃이)피어, 해, 혼나 가벼워, 간지러워, 같아/똑같아, 괜찮아, 귀여워, 길어, (색이)까매, 깜깜해, (색이)노래, 높아, 달라, 더러워, 더워, 동그래, 뜨거워, 많아, 맛없어, 맛있어, 매워, 멀어, 멋있어, 목말라, 무거워, 무서워, 배고파, (색이)빨개, 빨라, 싫어, 심심해, 아파, 어두워, 없어, 예뻐, 있어, 작아, 재미있어, 조용해, 졸려, 좋아, 착해, 추워, 커, (색이)파래, (색이)하얘, 힘들어
## 2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양치, 응가/똥, 화이팅, 하지마 가, 간지럽혀, 걸어, 공부해, 기다려, (불)꺼, 나가, (차에서)내려, 넘어져, (통에)넣어, 노래 불러, 놀아, (무엇을)눌러, 다쳐, 닦아, 달려, 당겨, 던져, 도와, 들어가, 때려, 떼(어), 뛰어, 마셔, 만들어, 말해, (주사를)맞아, (음식을)먹어, 멈춰, 미워해, 밀어, (약)발라, 박수쳐, 버려, 벗어, 봐, 빗어, 빠져, 빨아, 빼, 뽀뽀해, (물건을)사, 사랑해, 생각해, 수영해, 숨어, 신어, 싸워, (모자)써, 씻어, 안아, 앉아, 열어, 올라가, 와, 요리해, 운전해, 울어, 웃어, 일어나/일어서, 읽어, 입어, (잠)자, 좋아해, 줘, (공을)차, 찾아, 춤춰, (차에)타, 해, 혼나 가벼워, 간지러워, 같아/똑같아, 괜찮아, 귀여워, 길어, 깜깜해, 높아, 더러워, 더워, 뜨거워, 많아, 맛없어, 맛있어, 매워, 멋있어, 목말라, 무거워, 무서워, 배고파, 시끄러워, 심심해, 아파, 없어, 예뻐, 이상해, 있어, 작아, 재미있어, 졸려, 좋아, (맛이)짜, (촉감이)차, 착해, 추워, 커, 힘들어
##                                                                          pn_pos_value
## 1 고마워,놀아,괜찮아,귀여워,맛있어,사랑해,예뻐,웃어,재미있어,조용해,춤춰,도와,안아,커
## 2 고마워,놀아,괜찮아,귀여워,맛있어,사랑해,예뻐,웃어,재미있어,좋아해,춤춰,도와,안아,커
##                                                                                                                                pn_neg_value
## 1              더러워,때려,맛없어,무거워,무서워,숨어,싫어,심심해,아파,안돼,없어,울어,추워,혼나,힘들어,물어,간지러워,작아,간지럽혀,더워,버려
## 2 더러워,때려,맛없어,무거워,무서워,미워해,숨어,시끄러워,심심해,아파,안돼,없어,울어,추워,혼나,힘들어,간지러워,작아,간지럽혀,미워해,더워,버려
##   pn_pos_num pn_neg_num          pn_pos_value_score
## 1       0.93       0.84 2,1,1,2,2,2,2,1,2,1,1,1,1,1
## 2       0.93       0.88 2,1,1,2,2,2,2,1,2,2,1,1,1,1
##                                                  pn_neg_value_score pn_pos_cal
## 1    -2,-1,-1,-2,-2,-1,-2,-1,-2,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-1,-2  0.9090909
## 2 -2,-1,-1,-2,-2,-2,-1,-2,-1,-2,-1,-1,-1,-1,-2,-2,-1,-1,-1,-2,-1,-2  0.9545455
##   pn_neg_cal
## 1  0.7837838
## 2  0.8648649
# 소숫점 2번째까지
df$pn_pos_cal <- sprintf("%.2f", df$pn_pos_cal)
df$pn_neg_cal <- sprintf("%.2f", df$pn_neg_cal)

cdi점수를 구하기 위해서는 표현하는 단어의 개수를 세고, precentile계산

-> 문성민 박사님이 작성하신 R 스트립트 사용.

cdi_per <- read.csv("C:\\Users\\csjja\\Desktop\\pn_data\\cdi_merge_23_0221.csv",head=T)
as.character(cdi_per$Birthdate)-> cdi_per$Birthdate
as.character(cdi_par$Birthdate)-> cdi_par$Birthdate
mode(cdi_per$Birthdate)
## [1] "character"
mode(cdi_par$Birthdate)
## [1] "character"
# 중복 데이터 찾기
cdi_par_2<- distinct(cdi_par)
  • cdi score 내기 위해서 subject(cdi_par)과 raw data(cdi_raw)를 cbind
cdi_score <- left_join(cdi_par_2, cdi_per,key='subject')
## Joining, by = c("subject", "Birthdate")
# View(cdi_score)
  • 기존 df데이터와 cdi_score데이터 합쳐서 하나의 큰 df생성; final_df
# type 일치시키기
as.character(cdi_per$Birthdate)-> cdi_per$Birthdate
as.character(cdi_par$Birthdate)-> cdi_par$Birthdate
mode(cdi_per$Birthdate)
## [1] "character"
mode(cdi_par$Birthdate)
## [1] "character"
final_df <- left_join(df,cdi_score,key='subject')
## Joining, by = c("subject", "Birthdate")
str(final_df)
## 'data.frame':    121 obs. of  18 variables:
##  $ subject           : chr  "godtheeb@hanmail.net" "munhee1981@naver.com" "dbsdmsghk14@naver.com" "chasu7315@naver.com" ...
##  $ Birthdate         : chr  "2017-04-13" "2017-04-07" "2018-01-20" "2021-01-29" ...
##  $ merged            : chr  "고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양치, 응가/똥, 화이팅, 하지마 가, 가리켜, 가"| __truncated__ "고마워, 네/응, 돼, 만세, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양치, 응가/똥, 화이팅, 하지마 가, 간지럽혀, "| __truncated__ "빠이빠이, 쉬, 아니(야), 안녕, 안돼, 화이팅 (불)꺼, (차에서)내려, 사랑해, 안해, 일어나/일어서, (잠)자 미워, 아파, 좋아, 추워" "고마워, 네/응, 돼, 목욕, 빠이빠이, 쉬, 아니(야), 안녕, 안돼, 양치, 응가/똥, 화이팅, 하지마 가, 그려, 끼워, 나와"| __truncated__ ...
##  $ pn_pos_value      : chr  "고마워,놀아,괜찮아,귀여워,맛있어,사랑해,예뻐,웃어,재미있어,조용해,춤춰,도와,안아,커" "고마워,놀아,괜찮아,귀여워,맛있어,사랑해,예뻐,웃어,재미있어,좋아해,춤춰,도와,안아,커" "사랑해" "고마워,귀여워,맛있어,사랑해,안아" ...
##  $ pn_neg_value      : chr  "더러워,때려,맛없어,무거워,무서워,숨어,싫어,심심해,아파,안돼,없어,울어,추워,혼나,힘들어,물어,간지러워,작아,간지럽혀,더워,버려" "더러워,때려,맛없어,무거워,무서워,미워해,숨어,시끄러워,심심해,아파,안돼,없어,울어,추워,혼나,힘들어,간지러워,작아"| __truncated__ "아파,안돼,추워" "나빠,더러워,무서워,싫어,아파,안돼,추워,더워" ...
##  $ pn_pos_num        : chr  "0.93" "0.93" "0.07" "0.33" ...
##  $ pn_neg_num        : num  0.84 0.88 0.12 0.32 0.6 1 0.16 0.12 0 0.16 ...
##  $ pn_pos_value_score: chr  "2,1,1,2,2,2,2,1,2,1,1,1,1,1" "2,1,1,2,2,2,2,1,2,2,1,1,1,1" "2" "2,2,2,2,1" ...
##  $ pn_neg_value_score: chr  "-2,-1,-1,-2,-2,-1,-2,-1,-2,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-1,-2" "-2,-1,-1,-2,-2,-2,-1,-2,-1,-2,-1,-1,-1,-1,-2,-2,-1,-1,-1,-2,-1,-2" "-2,-1,-1" "-2,-2,-2,-2,-2,-1,-1,-1" ...
##  $ pn_pos_cal        : chr  "0.91" "0.95" "0.09" "0.41" ...
##  $ pn_neg_cal        : chr  "0.78" "0.86" "0.11" "0.35" ...
##  $ X                 : int  1 2 3 NA 5 6 7 8 9 10 ...
##  $ Index             : int  1 2 3 NA 5 6 7 8 9 10 ...
##  $ TestingDate       : chr  "2020-04-16" "2020-04-16" "2020-04-16" NA ...
##  $ TotalVsize        : int  541 446 79 NA 312 623 126 152 17 229 ...
##  $ AgeAtCDI          : int  36 36 26 NA 24 34 33 33 26 26 ...
##  $ Gender            : chr  "M" "F" "M" NA ...
##  $ eachPercentile    : int  44 16 16 NA 72 94 6 8 5 47 ...
# View(final_df)

#열 이름 변경
names(final_df)#열이름 확인
##  [1] "subject"            "Birthdate"          "merged"            
##  [4] "pn_pos_value"       "pn_neg_value"       "pn_pos_num"        
##  [7] "pn_neg_num"         "pn_pos_value_score" "pn_neg_value_score"
## [10] "pn_pos_cal"         "pn_neg_cal"         "X"                 
## [13] "Index"              "TestingDate"        "TotalVsize"        
## [16] "AgeAtCDI"           "Gender"             "eachPercentile"
# names(final_df) <- gsub("[0-9]", "", names(final_df))
# names(final_df) <- gsub("[[:punct:]]","",names(final_df))
# names(final_df) <- gsub(" ", "",names(final_df));names(final_df) 

class(final_df$merged) #character
## [1] "character"

<번외: 해결과정 log>

  • solution: 엑셀로 내보내서 작업 후 다시 파일 import
    • 엑셀로 추출해서 실제 시트의 2, 3, 4번째 시트에 정리된 표현단어 개수와 백분위 입력
    • 정리하던 중, 중복된 응답은 삭제
# # file export
# write.xlsx(final_df, sheetName="cdi_coding", file="cdi_coding.xlsx")
# 
# # file import
# # cdi 점수 입력 완료
# final_cdi <- read_excel("C:\\Users\\csjja\\Desktop\\complete_cdi_coding.xlsx",
#                        sheet = "cdi_coding",
#                        range = "A1:G114",
#                        col_names = TRUE, # TRUE to use the first row as column names
#                        na = "NA");head(final_cdi) # Character vector of strings to use for missing values
# final_cdi <- final_cdi[,c(1,6,7)] #pn점수를 새로한 것으로 하기 위해 cdi결과만 추출
# 
# # 덮어쓰기
# final_df <- left_join(df,final_cdi,key='subject')
# head(final_df, n=2)
  • 백분위는 구간으로 총 6개 나옴 -> factor로 변경
# final_df$'표현낱말 백분위수' <- as.factor(final_df$'표현낱말 백분위수')  #백분위를 facotor로 변경
# levels(final_df$`표현낱말 백분위수`) #level 확인;6개 구간
  • 각 변수의 mode 확인
# final_df[, c(5,6,9,10)] = sapply(final_df[, c(5,6,9,10)], FUN = "as.numeric")

Statistical model

RE 분석

가설 1: 긍정어 개수에 따른 백분위 변화수

  • dependent var.: 표현낱말 백분위
  • fixed effect: pn개수 값(긍정어)
summary(lm(final_df$eachPercentile ~ final_df$pn_pos_num, data=final_df))
## 
## Call:
## lm(formula = final_df$eachPercentile ~ final_df$pn_pos_num, data = final_df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -47.778 -14.533  -0.927  13.031  45.667 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               19.333      5.140   3.762 0.000282 ***
## final_df$pn_pos_num0.07   11.833      7.710   1.535 0.127904    
## final_df$pn_pos_num0.13    9.292      8.715   1.066 0.288850    
## final_df$pn_pos_num0.20   30.267      8.127   3.724 0.000321 ***
## final_df$pn_pos_num0.27   10.867     10.279   1.057 0.292947    
## final_df$pn_pos_num0.33   24.542      8.715   2.816 0.005836 ** 
## final_df$pn_pos_num0.40   25.452      7.397   3.441 0.000842 ***
## final_df$pn_pos_num0.47   32.667     20.559   1.589 0.115168    
## final_df$pn_pos_num0.53   39.167     14.985   2.614 0.010309 *  
## final_df$pn_pos_num0.60   21.917     11.202   1.957 0.053134 .  
## final_df$pn_pos_num0.67   37.167     14.985   2.480 0.014763 *  
## final_df$pn_pos_num0.73   41.333     12.590   3.283 0.001407 ** 
## final_df$pn_pos_num0.80   55.333     12.590   4.395 2.72e-05 ***
## final_df$pn_pos_num0.87   48.167      9.615   5.009 2.30e-06 ***
## final_df$pn_pos_num0.93   44.444      8.393   5.295 6.86e-07 ***
## final_df$pn_pos_num1.00   64.354      7.154   8.995 1.36e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 19.91 on 102 degrees of freedom
##   (결측으로 인하여 3개의 관측치가 삭제되었습니다.)
## Multiple R-squared:  0.5464, Adjusted R-squared:  0.4797 
## F-statistic: 8.192 on 15 and 102 DF,  p-value: 7.16e-12

가설 2: 부정어 개수에 따른 백분위 변화

  • dependent var.: 표현낱말 백분위
  • fixed effect: pn개수 값(부정어)
summary(lm(final_df$eachPercentile ~ final_df$pn_neg_num, data=final_df))
## 
## Call:
## lm(formula = final_df$eachPercentile ~ final_df$pn_neg_num, data = final_df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -60.110 -16.094   0.941  13.769  50.812 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           26.094      2.752   9.483 3.87e-16 ***
## final_df$pn_neg_num   56.836      5.322  10.679  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 19.68 on 116 degrees of freedom
##   (결측으로 인하여 3개의 관측치가 삭제되었습니다.)
## Multiple R-squared:  0.4958, Adjusted R-squared:  0.4914 
## F-statistic:   114 on 1 and 116 DF,  p-value: < 2.2e-16

가설 3: 긍정어 점수에 따른 백분위 변화

  • dependent var.: 표현낱말 백분위
  • fixed effect: pn점수 값(긍정어)
summary(lm(final_df$eachPercentile ~ final_df$pn_pos_cal, data=final_df))
## 
## Call:
## lm(formula = final_df$eachPercentile ~ final_df$pn_pos_cal, data = final_df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -53.000 -11.136  -0.844  11.062  45.667 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              19.3333     4.8965   3.948 0.000149 ***
## final_df$pn_pos_cal0.05  13.2121     7.5279   1.755 0.082402 .  
## final_df$pn_pos_cal0.09   5.6667    14.2756   0.397 0.692278    
## final_df$pn_pos_cal0.14  11.0667     9.7930   1.130 0.261237    
## final_df$pn_pos_cal0.18   6.6667    11.9939   0.556 0.579601    
## final_df$pn_pos_cal0.23  29.5000     9.1605   3.220 0.001743 ** 
## final_df$pn_pos_cal0.27  29.0000     9.1605   3.166 0.002067 ** 
## final_df$pn_pos_cal0.32  20.9524     8.6805   2.414 0.017667 *  
## final_df$pn_pos_cal0.36   0.6667    19.5859   0.034 0.972917    
## final_df$pn_pos_cal0.41  14.2667     7.7420   1.843 0.068419 .  
## final_df$pn_pos_cal0.45  42.6667     9.1605   4.658 1.02e-05 ***
## final_df$pn_pos_cal0.50  31.1667    14.2756   2.183 0.031432 *  
## final_df$pn_pos_cal0.59  45.6667    19.5859   2.332 0.021791 *  
## final_df$pn_pos_cal0.64  30.9167    10.6716   2.897 0.004656 ** 
## final_df$pn_pos_cal0.73  19.1667    14.2756   1.343 0.182529    
## final_df$pn_pos_cal0.77  41.3333    11.9939   3.446 0.000842 ***
## final_df$pn_pos_cal0.82  55.3333    11.9939   4.613 1.21e-05 ***
## final_df$pn_pos_cal0.86  66.0000    11.9939   5.503 3.04e-07 ***
## final_df$pn_pos_cal0.91  28.6667     9.7930   2.927 0.004260 ** 
## final_df$pn_pos_cal0.95  49.6667     8.6805   5.722 1.17e-07 ***
## final_df$pn_pos_cal1.00  64.3542     6.8156   9.442 2.15e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.96 on 97 degrees of freedom
##   (결측으로 인하여 3개의 관측치가 삭제되었습니다.)
## Multiple R-squared:  0.6085, Adjusted R-squared:  0.5278 
## F-statistic: 7.539 on 20 and 97 DF,  p-value: 2.232e-12

가설 4: 부정어 점수에 따른 백분위 변화

  • dependent var.: 표현낱말 백분위
  • fixed effect: pn점수 값(부정어)
summary(lm(final_df$eachPercentile ~ final_df$pn_neg_cal, data=final_df))
## 
## Call:
## lm(formula = final_df$eachPercentile ~ final_df$pn_neg_cal, data = final_df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -39.000  -7.857   0.000   7.792  41.000 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              27.3571     4.9192   5.561 3.35e-07 ***
## final_df$pn_neg_cal0.03  -3.5238     8.9812  -0.392 0.695827    
## final_df$pn_neg_cal0.05  -5.9286     8.5203  -0.696 0.488535    
## final_df$pn_neg_cal0.08   4.8929    10.4352   0.469 0.640415    
## final_df$pn_neg_cal0.11  -2.8571     8.9812  -0.318 0.751209    
## final_df$pn_neg_cal0.14  20.6429    10.4352   1.978 0.051306 .  
## final_df$pn_neg_cal0.16  17.6429     7.8639   2.244 0.027593 *  
## final_df$pn_neg_cal0.19  45.6429    13.9136   3.280 0.001530 ** 
## final_df$pn_neg_cal0.22  14.9762    11.7100   1.279 0.204577    
## final_df$pn_neg_cal0.24  -5.3571    19.0520  -0.281 0.779285    
## final_df$pn_neg_cal0.27  42.6429    13.9136   3.065 0.002958 ** 
## final_df$pn_neg_cal0.30  38.6429    19.0520   2.028 0.045818 *  
## final_df$pn_neg_cal0.32  -0.4821     8.1576  -0.059 0.953015    
## final_df$pn_neg_cal0.35  22.6429    19.0520   1.188 0.238118    
## final_df$pn_neg_cal0.38  49.6429    19.0520   2.606 0.010910 *  
## final_df$pn_neg_cal0.41  18.1429    13.9136   1.304 0.195939    
## final_df$pn_neg_cal0.43  36.6429    19.0520   1.923 0.057955 .  
## final_df$pn_neg_cal0.46  14.3095    11.7100   1.222 0.225256    
## final_df$pn_neg_cal0.49  27.1429    13.9136   1.951 0.054537 .  
## final_df$pn_neg_cal0.51  29.3095    11.7100   2.503 0.014327 *  
## final_df$pn_neg_cal0.54 -13.3571    19.0520  -0.701 0.485256    
## final_df$pn_neg_cal0.57  27.1429    13.9136   1.951 0.054537 .  
## final_df$pn_neg_cal0.59  24.6429    19.0520   1.293 0.199531    
## final_df$pn_neg_cal0.62  40.6429    10.4352   3.895 0.000201 ***
## final_df$pn_neg_cal0.65  19.6429    19.0520   1.031 0.305603    
## final_df$pn_neg_cal0.68  40.1429    13.9136   2.885 0.005012 ** 
## final_df$pn_neg_cal0.70  55.6429    19.0520   2.921 0.004524 ** 
## final_df$pn_neg_cal0.73  26.6429    13.9136   1.915 0.059038 .  
## final_df$pn_neg_cal0.78  16.6429    19.0520   0.874 0.384946    
## final_df$pn_neg_cal0.81  30.6429    19.0520   1.608 0.111643    
## final_df$pn_neg_cal0.84  57.6429    19.0520   3.026 0.003325 ** 
## final_df$pn_neg_cal0.86  22.1429    13.9136   1.591 0.115403    
## final_df$pn_neg_cal0.89  61.3095    11.7100   5.236 1.27e-06 ***
## final_df$pn_neg_cal0.92  44.6429    13.9136   3.209 0.001912 ** 
## final_df$pn_neg_cal0.95  51.9762    11.7100   4.439 2.83e-05 ***
## final_df$pn_neg_cal0.97  70.6429    19.0520   3.708 0.000381 ***
## final_df$pn_neg_cal1.00  61.2429     7.6208   8.036 6.37e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.41 on 81 degrees of freedom
##   (결측으로 인하여 3개의 관측치가 삭제되었습니다.)
## Multiple R-squared:  0.6921, Adjusted R-squared:  0.5552 
## F-statistic: 5.056 on 36 and 81 DF,  p-value: 7.45e-10

graph 1: 긍정어 개수 변화에 따른 백분위수 변화

boxplot(final_df$eachPercentile ~ final_df$pn_pos_num,
        col=c("green","blue","red", "purple", "orange","yellow"),
        final_df)

# lineplot.CI(final_df$'표현낱말 백분위수', final_df$pn_pos_num)

graph 2:부정어 개수 변화에 따른 백분위수 변화

boxplot(final_df$eachPercentile ~ final_df$pn_neg_num, 
        col=c("green","blue","red", "purple", "orange","yellow"),
        final_df)

# lineplot.CI(final_df$`표현낱말 백분위수`, final_df$pn_neg_num)

graph 3: 긍정어 점수 변화에 따른 백분위수 변화

boxplot(final_df$eachPercentile ~ final_df$pn_pos_cal, 
        col=c("green","blue","red", "purple", "orange","yellow"),
        final_df)

# lineplot.CI(final_df$`표현낱말 백분위수`, final_df$pn_pos_cal)

graph 4: 부정어 점수 변화에 따른 백분위수 변화화

boxplot(final_df$eachPercentile ~ final_df$pn_neg_cal, 
        col=c("green","blue","red", "purple", "orange","yellow"),
        final_df)

# lineplot.CI(final_df$`표현낱말 백분위수`, final_df$pn_neg_cal)