본문 바로가기
Study/통계 공부 + R

R기초: 데이타 클리닝(양질의 데이타란?, 데이타 일부 삭제하기)

by PhD_Ming 2020. 12. 5.
300x250

사회과학의 경우 많은 경우 설문조사나 질문지를 통해 데이타를 수집하게 된다. 이 때 우리는 어떻게 양질의 데이타를 구분할 수 있을까? 이를 다루는 많은 문헌들이 존재하지만, 오늘은 가장 기본적인 부분을 다루도록 하겠다. 한 연구자가 여러 사람들에게 설문을 돌려 데이타를 수집하였다. 설문조사를 참여한 사람들 중 당연히 대충대충 설렁설렁 참여한 사람이 존재할 것이고, 심한 경우 문항을 읽지도 않고 모두 '예' 혹은 '아니오' 등을 일렬로 체크한 사람들도 있을 것이다. 이래서 어떤 설문의 경우 읽었는지 확인할 수 있는 문항("당신의 의사와는 무관하게 예를 선택하시오")을 포함시키기도 한다. 

데이타를 최대한 보존하는 것이 좋지만, 일부의 경우 특정 참여자의 데이타를 삭제해야할 경우가 있다. 

 

1. 내가 연구하고자 하는 집단에 속하지 않은 경우

한 연구자가 아시안이 겪는 인종차별에 대해 연구한다고 하자. 이 연구자는 아시안을 대상으로 연구 참여자를 구하고 있다. 설문 문항에 "당신은 아시안입니까?" 라는 질문을 포함시켰는데 이 때 "아니오"라고 답한 참여자는 연구자가 연구하고자 하는 대상에서 벗어나므로 이 데이타는 삭제해야할 것이다. 하지만 중요한 것은 항상 컴퓨터에 저장되어 있는 raw data (날 것 그대로의 데이타, 내가 수집한 그대로의 데이타)는 보존한 채 r 프로그램 내에서 데이타를 삭제하도록 하자. (Raw 데이타는 건드리는 것이 아님.) 아무튼 이때 사용할 수 있는 명령문, r 코드를 알아보자. 

datanew <- subset(data, data$variable=="answer")

Asi_racist 라는 이름의 데이타에서 아시안입니까 질문(변인명: asian)에 네(yes)라고 답한 사람만 Dat.Asi_racist라는 이름의 하위 데이타 셋으로 설정한다고 해보자. 그럼 다음과 같이 사용할 수 있다. 

Dat.Asi_racist <- subset(Asi_racist, Asi_racist$asian=="yes")

새로 만든 데이타셋의 줄(row)이 줄었는지 확인하여 제대로 코드가 실행되었는지 간단히 확인할 수 있다. 또한 asian변인에 대해서 yes라고 대답한 사람의 수와 row의 수가 일치하여야 한다. 

각괄호를 사용해 삭제할 수도 있음! Dat.Asi_racist <- Asi_racist[Asi_racist$asian=="yes"]

2. "나쁜(bad)" 데이타인 경우

최근엔 여러 설문조사 프로그램을 사용하여 설문조사를 실시한다. 이런 프로그램들은 설문을 완료하는 데 사용된 시간을 같이 기록해준다. 이 시간을 참고하면 나쁜 데이타를 구분할 수 있다. 너무 짧은 시간도 좋지 않고 (대충 보고 참여하였을 가능성 때문) 너무 긴 시간도 좋지 않다(딴짓하면서 참여하였을 가능성 때문). 적정한 시간은 어느정도일까? 연구자가 직접 해보거나 주변 사람들에게 해보라고 부탁한 후 적정한 시간을 적당히 선택할 수도 있고, 또 히스토그램을 사용해서 적정한 컷오프 점수를 결정할 수 있다. 히스토 그램은 다음 코드를 사용하여 볼 수 있음. 언제나 그랬듯 data에는 데이타셋이름을 넣고, variable에 시간 변인 이름을 넣으면 되는 것. 

hist(data$variable)

자 이제 히스토그램을 통해 적정한 시간을 정했다고 하자. 예를 들어 2분 이하, 10분 이상은 저품질의 데이타라고 결정되었다. 그 다음에 우리는 표기 변인(flag variable)을 만들어야 한다. 변인명은 timeflag라고 설정해보자. 그리고 원래 가지고 있던 설문 완료에 사용된 시간 변인의 이름은 time_second라고 하고 초단위로 기록되었다고 해보자. 

data$timeflag <- ifelse(data$time_second < 120 | data$time_second > 600, 1, 0)

여기서 |는 "or(또한)"을 뜻한다,

ifelse 기능은 일반적으로 ifelse(A, B, C)로 사용되는데 만약 A라면 B로 기록하고, A가 아니라면 C로 기록하라는 명령문이다. 위 예시에서는 설문완료에 사용된 시간이 120초 미만이거나 600초이상인 경우가 맞다면 1로 아니라면 0으로 기록하라는 명령문이고, 이를 데이타셋 내에 timeflag라는 변인으로 표시해라라는 뜻이다. 

그 이후엔 위에 사용했던 datanew <- subset(data, data$variable=="answer")를 그대로 사용하면 된다. 우리는 120초 미만이거나 600초이상인 경우가 아닌 경우를 가져와야하므로 datanew <- subset(data, data$timeflag=="0")을 사용하면 된다.

3. 내적 합치도 측정치를 통한 나쁜 데이타 확인하기

위의 두 방법 외에도 내적 합치도를 사용해 부주의하거나 의심스러운 데이타를 확인할 수도 있다. 이를 위한 한 방법으로는 반분검사(split-half)가 있다. 예를 들면, 10문항으로 이루어진 자존감 척도를 사용해서 데이타를 수집했다고 해보자. 이 때 10문항은 모두 자존감을 측정하기 때문에 문항간 상관이 높아야할 것이다. 예를 들면 홀수문항을 묶고 짝수문항을 묶어 홀수문항과 짝수문항간의 상관을 구해볼 수 있다. 이 방법은 각각의 참여자에 대해, 설문에 속한 모든 척도(자존감, 친구관계 등)에 대해 상관을 구해볼 수도, 너무 많다면 높은 내적 합치도를 가지는 척도나 20문항 이상인 척도 한두개를 선택하여 상관을 구해볼 수 있다. (상관 구하는 방법은 다음번에 포스팅할 예정!)

이때 아주 낮은 상관을 보인다면 불규칙한 반응 패턴을, 너무 높은 상관을 보인다면 단조로운 반응패턴을 예상해볼 수 있다. 

 

⭐️데이타 클리닝 투명성⭐️ 다음을 꼭 기억하자!

  • 값을 제거할 지 결정하는 것은 보수적으로 결정한다. 보수적이란 것은 최대한 바꾸지 않는 쪽으로 선택하는 것임. 무작정 많은 데이타를 삭제해서는 안됨을 강조하는 것이다. 
  • 절대 값을 변경하지 않는다. (연령에 대한 답으로 300을 입력했다고 하자. 이에 대해 임의로 30살이겠지 하고 30으로 변경해서는 안된다.)
  • 데이타를 삭제했을 경우 이에 대해 왜 삭제했는지까지 잘 기록해둔다.
  • 발표 및 논문 출판시에 이 데이타에 대한 의사결정을 투명하게 공개한다. 
반응형

댓글