다음의 조건을 확인하고 통계선택
두 그룹 모두 정규성 충족 + 등분산성 충족 | ANOVA |
정규성 비충족 (일부 또는 전체) + 등분산성 충족 | 비모수 검정 (Kruskal-Wallis Test) |
정규성 충족 + 등분산성 비충족 | Welch's ANOVA |
정규성 비충족 + 등분산성 비충족 | Kruskal-Wallis Test 또는 PERMANOVA |
변수별로 다른 통계를 적용할 필요 확인후 통계에서 정규성과 등분산성 확인후 선택
✅ 정규성 및 만족하는 변수 (cadence, cofsi, terminalstancegc) → ANOVA + Tukey HSD
✅ 정규성을 만족하지 않는 변수 (그 외 모든 변수) → Kruskal-Wallis + Dunn’s Test
✅ 결과를 CSV 및 Excel 파일로 저장
# ✅ 필요한 패키지 설치 (최초 1회 실행)
if (!require("tidyverse")) install.packages("tidyverse", dependencies = TRUE)
if (!require("rstatix")) install.packages("rstatix", dependencies = TRUE)
if (!require("car")) install.packages("car", dependencies = TRUE)
if (!require("dplyr")) install.packages("dplyr", dependencies = TRUE)
if (!require("purrr")) install.packages("purrr", dependencies = TRUE)
if (!require("tibble")) install.packages("tibble", dependencies = TRUE)
if (!require("FSA")) install.packages("FSA", dependencies = TRUE) # Dunn's Test
if (!require("openxlsx")) install.packages("openxlsx", dependencies = TRUE) # Excel 저장
# ✅ 패키지 로드
library(tidyverse)
library(rstatix)
library(car)
library(dplyr)
library(purrr)
library(tibble)
library(FSA)
library(openxlsx)
# 📁 데이터 불러오기
Data <- read_csv("20250224(인지제외).csv")
# 📊 보행조건 변환 (필수)
Data$condition <- factor(Data$condition, levels = c(1, 2, 3), labels = c("평지보행", "물컵들고 보행", "숫자세기 보행"))
# ✅ 분석할 변수 목록
gait_vars <- c("loadingresponsetime", "loadingresponsegc",
"midstancetime", "midstancegc", "terminalstancetime",
"preswingtime", "preswinggc",
"firstdsp", "firstdspsi", "seconddsp", "seconddspsi",
"cadence", "cadencero", "cadencesi",
"stancetimesi", "swingtimesi", "stridetimesi", "cofsi", "terminalstancegc")
# ✅ 정규성 및 등분산성 검정 함수
check_normality <- function(df, variable) {
if (length(unique(df[[variable]])) < 3) return(NA) # 데이터가 3개 미만이면 검사 불가
shapiro_test <- shapiro.test(df[[variable]])
return(shapiro_test$p.value)
}
check_homogeneity <- function(df, variable) {
levene_test <- leveneTest(as.formula(paste(variable, "~ condition")), data = df)
return(levene_test$`Pr(>F)`[1])
}
# ✅ 정규성 및 등분산성 검정 수행
normality_results <- tibble(
Variable = gait_vars,
Normality = map_dbl(gait_vars, ~ check_normality(Data, .x)),
Homogeneity = map_dbl(gait_vars, ~ check_homogeneity(Data, .x))
)
# ✅ ANOVA & Kruskal-Wallis 적용 변수 분류
anova_vars_all <- normality_results %>% filter(Normality > 0.05 & Homogeneity > 0.05) %>% pull(Variable)
kruskal_vars_all <- setdiff(gait_vars, anova_vars_all)
# ✅ 워크북 생성
anova_workbook <- createWorkbook()
kruskal_workbook <- createWorkbook()
# ✅ ANOVA 수행
perform_anova <- function(df, variable, workbook) {
anova_result <- aov(as.formula(paste(variable, "~ condition")), data = na.omit(df))
anova_summary <- summary(anova_result)
anova_df <- as.data.frame(anova_summary[[1]])
# ✅ CSV 저장
write_csv(anova_df, paste0("ANOVA_", variable, "_results.csv"))
# ✅ 엑셀 저장
addWorksheet(workbook, sheetName = paste0(variable, "_ANOVA"))
writeData(workbook, sheet = paste0(variable, "_ANOVA"), anova_df)
# ✅ Tukey HSD 사후검정 수행
if (anova_df["condition", "Pr(>F)"] < 0.05) {
tukey_result <- TukeyHSD(anova_result)
tukey_df <- as.data.frame(tukey_result$condition) %>%
rownames_to_column(var = "Comparison")
write_csv(tukey_df, paste0("TukeyHSD_", variable, "_results.csv"))
addWorksheet(workbook, sheetName = paste0(variable, "_Tukey"))
writeData(workbook, sheet = paste0(variable, "_Tukey"), tukey_df)
}
}
# ✅ Kruskal-Wallis 수행
perform_kruskal <- function(df, variable, workbook) {
kruskal_result <- kruskal.test(as.formula(paste(variable, "~ condition")), data = df)
kruskal_df <- data.frame(Variable = variable, Statistic = kruskal_result$statistic, p_value = kruskal_result$p.value)
# ✅ CSV 저장
write_csv(kruskal_df, paste0("Kruskal_", variable, "_results.csv"))
# ✅ 엑셀 저장
addWorksheet(workbook, sheetName = paste0(variable, "_Kruskal"))
writeData(workbook, sheet = paste0(variable, "_Kruskal"), kruskal_df)
# ✅ Dunn’s Test 수행
if (kruskal_df$p_value < 0.05) {
dunn_result <- dunnTest(as.formula(paste(variable, "~ condition")), data = df, method = "bonferroni")
dunn_df <- dunn_result$res
write_csv(dunn_df, paste0("Dunn_", variable, "_results.csv"))
addWorksheet(workbook, sheetName = paste0(variable, "_Dunn"))
writeData(workbook, sheet = paste0(variable, "_Dunn"), dunn_df)
}
}
# ✅ 전체 데이터에 대해 분석 실행
for (var in anova_vars_all) {
perform_anova(Data, var, anova_workbook)
}
for (var in kruskal_vars_all) {
perform_kruskal(Data, var, kruskal_workbook)
}
# ✅ 엑셀 파일 저장
saveWorkbook(anova_workbook, file = "ANOVA_Results.xlsx", overwrite = TRUE)
saveWorkbook(kruskal_workbook, file = "Kruskal_Results.xlsx", overwrite = TRUE)