개인-전체 상관관계(person-total correlation)는 문항-전체 상관관계(item-total correlation)에서 확장된 기법으로 문항들에 대한 개인의 반응과 표본 내 다른 응답자들의 평균 반응 간의 상관계수를 계산하는 것이다. 문항-전체 상관관계가 한 항목이 다른 모든 항목들을 얼마나 잘 예측하는지를 나타내는 것과 달리, 개인-전체 상관관계는 한 개인의 응답이 다른 모든 응답자들에 의해 생성된 예측 패턴과 얼마나 일관되게 나타나는지를 측정한다.
이 기법은 대부분의 응답자가 신중하게 응답한다는 가정에 기반하며 낮은 개인-전체 상관관계를 불성실 응답이라고 여기며 Curran(2016)¹은 그 값이 음수일 경우를 불성실 응답으로 간주할 것을 권장한다. 하지만 샘플 내 대다수의 응답자가 불성실한 응답자일 경우 이 기법이 정상적인 응답자도 제거할 수 있는 것과 같이, 샘플 내 불성실한 응답자의 비율에 따라 이 기법의 효과가 달라질 수 있다.
개인-전체 상관관계는 각 응답자들의 응답과 그를 제외한 나머지 응답자들의 평균 사이의 상관관계 통해 계산될 수 있다. 이를 계산할 패키지가 따로 존재하지 않기에**,** Bevans 등(2020)²의 연구에서 사용된 함수를 활용하여 분석해야 한다. 사용자 정의 함수 function()
을 통해 계산 과정을 정의하며, data
와 columns
를 매개변수로 가진다. colums
를 통해 계산에 포함될 열을 지정할 수 있고 기본값인 null
은 전체 열을 대상으로 계산함을 의미한다. 사용되는 데이터는 수치형 데이터로 구성되어야한다. 코드는 아래와 같다.
personTotalCor <- function(df, columns = NULL) {
#계산에 포함될 특정 열을 지정했을 때 지정된 열만으로 새로운 데이터 정의.
if(!is.null(columns)) df <- df[, columns]
out <- c()
#1부터 응답자 수(nrow)까지 연산 반복.
for(i in 1:nrow(df)) {
responseSet <- as.numeric(df[i,])
meanResponseSet <- sapply(df[-i,], mean, na.rm = TRUE) #각 열마다 i번째 응답자를 제외한 응답들의 평균을 meanResponseSet에 저장.
out[i] <- cor(responseSet, meanResponseSet, use = "pairwise.complete.obs") #i번째 응답자와 나머지 응답들 평균의 상관계수를 계산.
}
return(out)
}
결측치에 대해 위 코드는 use = "pairwise.complete.obs"
명령어를 사용했지만 데이터 전처리 과정에서 결측치를 미리 처리한다면 사용하지 않아도 되는 코드이다. 하지만 결측치가 데이터에 포함되었을 때 처리 명령어를 사용하지 않는다면 오류가 발생하여 cor()
함수가 제대로 적용되지 않을 것이다.
실제 데이터로 분석 시의 과정과 결과를 예시를 통해 설명하고자 한다. 1번 데이터의 성격을 측정하는 50문항에 대한 응답을 역코딩하여 사용하였다. 실제로 적용해본 코드와 그에 따른 결과는 다음과 같다.
big5_PTC <- personTotalCor(big5_reverse50)
id | PTC |
---|---|
1184 | -0.77269 |
1880 | -0.42692 |
2029 | -0.4157 |
2372 | -0.41052 |
1456 | -0.3866 |
1452 | -0.37596 |
142 | -0.37587 |
918 | -0.35603 |
968 | -0.35322 |
… | |
576 | -0.00074 |
1884 | -0.00046 |
1131 | 0.001202 |
962 | 0.00176 |
… | |
569 | 0.769232 |
1077 | 0.772134 |
1 | N/A |
2 | N/A |
위에 설명된 사용자 지정 함수를 미리 입력했다면 한 줄의 코드 만으로 개인-전체 상관관계를 알 수 있다. 분석 결과 개인-전체 상관관계의 불성실 응답 탐지 기준인 0 이하의 값을 보인 응답자는 240명으로 전체 응답의 약 9.5%에 해당했다.