library(dplyr)
##
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(readr)
## Warning: 패키지 'readr'는 R 버전 4.4.3에서 작성되었습니다
library(irr)
## Warning: 패키지 'irr'는 R 버전 4.4.2에서 작성되었습니다
## 필요한 패키지를 로딩중입니다: lpSolve
## Warning: 패키지 'lpSolve'는 R 버전 4.4.2에서 작성되었습니다
# 데이터 불러오기
raw <- read.csv("HPP5_duration.csv",fileEncoding = "UTF-16")
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## 입력 커넥션 'HPP5_duration.csv'에서 유효하지 않은 입력을 찾았습니다
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## 'HPP5_duration.csv'에서 readTableHeader에 의하여 발견된 완성되지 않은 마지막
## 라인입니다
raw <- read.csv("HPP5_duration.csv", fileEncoding = "euc-kr")
# 코더 정리read.csv()# 코더 정리
names(raw)
## [1] "filename" "label" "begin" "end" "duration"
raw$Coder <- case_when(
grepl("윤현정", raw$filename) ~ "윤현정",
grepl("김지원", raw$filename) ~ "김지원",
grepl("박여은", raw$filename) ~ "박여은",
grepl("한영은", raw$filename) ~ "한영은",
TRUE ~ NA_character_
)
raw <- raw %>% filter(Coder %in% c("김지원", "박여은", "윤현정","한영은"))
# 라벨 공백 제거
raw$Label <- trimws(raw$label)
# 시간 반올림
raw$Begin <- round(as.numeric(raw$begin), 1)
raw$End <- round(as.numeric(raw$end), 1)
# 0.5초 단위 타임라인 생성
timeline <- sort(unique(unlist(mapply(function(start, end) {
if (end - 0.01 > start) seq(start, end - 0.01, by = 0.5) else NULL
}, raw$Begin, raw$End))))
# 각 시간에 대해 각 코더가 부여한 라벨 정리
get_label <- function(coder, time) {
row <- raw %>% filter(Coder == coder, Begin <= time, End > time)
if (nrow(row) > 0) row$Label[1] else NA
}
# wide-format 테이블 생성
label_df <- data.frame(
time = timeline,
김지원 = sapply(timeline, function(t) get_label("김지원", t)),
박여은 = sapply(timeline, function(t) get_label("박여은", t)),
윤현정 = sapply(timeline, function(t) get_label("윤현정", t)),
한영은 = sapply(timeline, function(t) get_label("한영은", t))
)
# NA 제거: 4명 모두 라벨링한 시점만 유지
label_df_complete <- label_df %>% filter(complete.cases(.))
# 시간 정보 제거 후 Kappa 계산
kappa_data <- label_df_complete[, -1]
kappa_result <- kappam.fleiss(kappa_data)
print(kappa_result)
## Fleiss' Kappa for m Raters
##
## Subjects = 1457
## Raters = 4
## Kappa = 0.808
##
## z = 127
## p-value = 0
library(tidyr)
## Warning: 패키지 'tidyr'는 R 버전 4.4.2에서 작성되었습니다
library(ggplot2)
label_long <- pivot_longer(label_df_complete, cols = -time, names_to = "Coder", values_to = "Label")
ggplot(label_long, aes(x = Label, fill = Coder)) +
geom_bar(position = "dodge") +
theme_minimal() +
labs(title = "라벨별 분포 (네 코더)", x = "Label", y = "Count")
본 분석에서는 세 명의 코더(김지원, 박여은, 윤현정)가 동일한 시간대에 라벨링한 데이터(1457개 시점)에 대해 Fleiss’ Kappa를 계산한 결과, 0.808의 Kappa 값을 보여 일관된 코딩 기준을 확인할 수 있었다.