1. 데이터 불러오기 및 전처리

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))))

2. Wide Format 데이터프레임 생성

# 각 시간에 대해 각 코더가 부여한 라벨 정리
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(.))

3. Fleiss’ Kappa 계산

# 시간 정보 제거 후 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

4. 라벨 분포 시각화

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")

5. 논문용 해석 문장

본 분석에서는 세 명의 코더(김지원, 박여은, 윤현정)가 동일한 시간대에 라벨링한 데이터(1457개 시점)에 대해 Fleiss’ Kappa를 계산한 결과, 0.808의 Kappa 값을 보여 일관된 코딩 기준을 확인할 수 있었다.