안녕하세요!
오늘은 다층 함수형 데이터 분석(Multilevel Functional Data Analysis, MFDA)에 대해 살펴보겠습니다.
이름만 들어도 머리가 지끈거리시나요? 걱정 마세요. “학교 현장의 데이터”를 예시로 들어, 아주 직관적인 설명부터 대학원 수준의 수리적 엄밀함까지 갖춘 형태로 완벽하게 재구성해 드리겠습니다.
분석 도구와 관련하여 한 가지 중요한 점을 말씀드립니다. jamovi는 훌륭한 통계 도구이지만, 오늘 다룰 ‘함수형 데이터(Functional Data)’와 같은 고차원적 분석은 아직 기본 메뉴로 지원하지 않습니다(일반적인 다층모형까지만 지원). 따라서 본 강의에서는 R을 사용하여 모의 데이터 생성부터 분석, 시각화까지 구현해 드리겠습니다. 대신, 코드는 복사해서 바로 쓸 수 있도록 아주 친절하게 주석을 달아 제공합니다.
그럼, 시작해 볼까요?
1. 서론: 점(Point)이 아니라 선(Line)을 보자!
1.1 직관적 이해 (초등학생도 이해하는 MFDA)
여러분이 담임 선생님이라고 상상해 보세요. 우리 반 학생 철수의 수학 실력을 알고 싶습니다. 보통 우리는 “기말고사 점수 80점”이라는 하나의 숫자(Scalar)로 철수를 평가합니다. 이것이 전통적인 통계입니다.
그런데, 80점이라는 점수가 철수의 모든 것을 설명할까요?
어떤 학생은 수업 초반 20분은 엄청 집중하다가 후반에 자는 학생이 있고, 어떤 학생은 처음엔 멍하다가 나중에 발동이 걸리는 학생이 있습니다.
- 스칼라(Scalar) 데이터: 철수의 점수 = 80점 (사진 한 장 📷)
- 함수형(Functional) 데이터: 철수의 45분간 집중력 변화 그래프 (동영상 🎥)
다층 함수형 데이터 분석(MFDA)은 바로 이 “동영상(변화 곡선)”을 분석하는 방법입니다. 그런데 왜 ‘다층(Multilevel)’일까요?
학생마다 수업을 듣는 집중력 곡선이 다르고(1수준), 이 학생들이 속한 반(Class)마다 분위기가 다르기(2수준) 때문입니다.
핵심 요약:
- FDA: 시간에 따라 변하는 “곡선” 자체를 하나의 데이터로 분석함.
- Multilevel: 그 곡선들이 여러 집단(학생, 학교 등)에 층층이 겹쳐 있는 구조를 반영함.
2. 시나리오: “어떤 수업 방식이 끝까지 집중하게 할까?”
우리는 다음과 같은 교육 실험을 진행한다고 가정해 보겠습니다.
- 연구 대상: 초등학교 6학년 학생 100명 (2개 반)
- 독립 변수(집단):
- A반 (50명): 전통적 강의식 수업
- B반 (50명): 게임 기반(Gamification) 수업
- 종속 변수(함수): 45분 수업 동안의 분당 뇌파 집중도(Attention Score, 0~100)
- 학생 1명당 45개의 측정값(0분~44분)이 연결된 하나의 곡선이 생성됩니다.
3. R을 이용한 모의 데이터 생성 및 분석
자, 이제 이 시나리오를 실제 데이터로 만들어 분석해 보겠습니다. R 스튜디오를 켜고 아래 코드를 순서대로 실행해 보세요.
3.1 데이터 생성 (Data Simulation)
실제 학교 현장과 유사하게 데이터를 생성합니다.
- A반(강의식): 초반엔 집중력이 높지만 시간이 갈수록 급격히 떨어지는 패턴.
- B반(게임형): 초반엔 산만하지만, 시간이 갈수록 몰입도가 유지되거나 상승하는 패턴.
R
# 필수 패키지 설치 및 로드
if(!require(ggplot2)) install.packages("ggplot2")
if(!require(refund)) install.packages("refund") # 함수형 데이터 분석용 핵심 패키지
if(!require(dplyr)) install.packages("dplyr")
if(!require(tidyr)) install.packages("tidyr")
library(ggplot2)
library(refund)
library(dplyr)
library(tidyr)
set.seed(1234) # 재현성을 위해 시드 고정
# 1. 기본 설정
n_students <- 100 # 총 학생 수
n_points <- 45 # 측정 지점 (0분~44분, 총 45분 수업)
time_points <- seq(0, 1, length.out = n_points) # 0에서 1로 정규화된 시간
# 2. 그룹 할당 (A반: 0=강의식, B반: 1=게임형)
group <- c(rep(0, n_students/2), rep(1, n_students/2))
group_factor <- factor(group, labels = c("Lecture", "Gamification"))
# 3. 기저 함수 생성 (집중력의 기본 패턴)
# 강의식(A): 초반 높음 -> 후반 낮음 (감소형)
mu_A <- function(t) { 80 - 40 * t }
# 게임형(B): 초반 중간 -> 후반 유지/상승 (유지형)
mu_B <- function(t) { 60 + 10 * sin(2 * pi * t) + 10 * t }
# 4. 개인차(Random Effect) 추가
# 학생마다 고유한 집중력 기복이 있음 (브라운 운동 + 임의 오차)
Y_matrix <- matrix(NA, nrow = n_students, ncol = n_points)
for(i in 1:n_students){
# 기본 곡선 선택
base_curve <- if(group[i] == 0) mu_A(time_points) else mu_B(time_points)
# 학생별 임의 효과 (Random Intercept + Random Slope 유사 효과)
student_deviation <- rnorm(1, 0, 5) + rnorm(1, 0, 2) * time_points * 10
# 측정 오차 (Measurement Error)
noise <- rnorm(n_points, 0, 2)
Y_matrix[i, ] <- base_curve + student_deviation + noise
}
# 데이터 프레임 형태로 정리 (시각화용)
df_long <- data.frame(
ID = rep(1:n_students, each = n_points),
Time = rep(1:n_points, n_students),
Group = rep(group_factor, each = n_points),
Attention = as.vector(t(Y_matrix))
)
head(df_long)
# CSV로 저장 (jamovi에서 불러오기 위함)
write.csv(df_long, "chap13.csv", row.names = FALSE)
3.2 데이터 시각화 (Spaghetti Plot)
분석의 첫 걸음은 데이터를 눈으로 확인하는 것입니다. 개별 학생들의 집중력 곡선을 모두 그려보겠습니다. 이를 ‘스파게티 플롯(Spaghetti Plot)’이라고 합니다.
R
# 스파게티 플롯 + 평균 곡선
ggplot(df_long, aes(x = Time, y = Attention, group = ID, color = Group)) +
geom_line(alpha = 0.3) + # 개별 학생 곡선 (흐리게)
geom_smooth(aes(group = Group), method = "gam", se = TRUE, size = 2) + # 그룹별 평균 곡선 (진하게)
labs(title = "수업 방식에 따른 학생 집중력 변화 곡선",
subtitle = "개별 곡선(흐림)과 그룹 평균 곡선(진함)",
x = "수업 시간 (분)", y = "집중도 (점수)") +
theme_minimal() +
scale_color_manual(values = c("Lecture" = "blue", "Gamification" = "red"))

해석: > 파란색(강의식) 곡선들은 시간이 갈수록 우하향하는 경향이 뚜렷합니다. 반면 빨간색(게임형)은 출렁거림이 있지만 전반적으로 수준이 유지됩니다. 이것이 바로 함수형 데이터 분석의 매력입니다. 평균 점수만 비교했다면 놓쳤을 ‘시간에 따른 패턴’을 볼 수 있죠.
4. 이론적 배경: 함수형 혼합 모형 (Functional Mixed Model)
이 데이터를 통계적으로 검증하려면 어떤 모형을 써야 할까요? 함수형 혼합 모형(FMM) 수식은 다음과 같습니다.
초등학생 눈높이로 번역해 보겠습니다.
- : 관찰된 학생의 집중력 곡선 (우리가 본 스파게티 면발)
- : 고정 효과 (Fixed Effects) = 수업 방식에 따른 공통적인 패턴.
- “강의식 수업은 대체로 이렇게 흘러간다”는 평균 곡선.
- : 임의 효과 (Random Effects) = 학생 개인의 특성.
- “철수는 원래 초반에 약해”, “영희는 후반에 강해” 같은 개인별 편차 곡선.
- : 오차 (Error) = 측정 당시의 잡음.
우리의 목표는 (수업 방식의 효과 곡선)가 통계적으로 유의미하게 다른지 확인하는 것입니다.
5. 핵심 분석: Function-on-Scalar Regression
이제 refund 패키지를 사용하여 “수업 방식(Scalar)이 집중력 곡선(Function)에 미치는 영향”을 분석해 보겠습니다.
5.1 분석 코드 실행
R
# 1. 데이터 프레임 만들기
# 핵심: I() 함수를 사용하여 Y_matrix를 데이터 프레임의 한 '열'로 안전하게 포장합니다.
covariates_df <- data.frame(group_factor = group_factor)
covariates_df$Y_matrix <- I(Y_matrix)
# 2. 모델 적합
# 이제 Y_matrix와 group_factor 모두 covariates_df 안에 들어있습니다.
f_model <- fosr(Y_matrix ~ group_factor, data = covariates_df, method = "OLS")
# 3. 결과 확인
summary(f_model)
# 4. 시각화 (베타 계수 곡선)
plot(f_model, split = 1)

5.2 결과 해석 및 재구성 (교육적 설명)
분석을 실행하면 베타 계수 곡선()이 그려집니다.
- 절편 곡선 (Intercept):
Reference Group인 강의식 수업(Lecture)의 평균 집중력 곡선을 보여줍니다. (우하향하는 그래프가 나옵니다.) - 기울기 곡선 (Slope for Gamification): 여기가 핵심입니다! 이 곡선은 “강의식 대비 게임형 수업의 집중력 차이”를 시간대별로 보여줍니다.
- 0~10분: 차이가 거의 0에 가깝거나 음수일 수 있습니다 (초반엔 게임 룰 익히느라 산만함).
- 20분 이후: 곡선이 양수(+)로 치솟습니다. 즉, 수업 중반 이후부터 게임형 수업의 집중력이 강의식보다 유의미하게 높다는 뜻입니다.
6. 심화 분석: FPCA (함수형 주성분 분석)
첨부 파일에서 강조하는 또 하나의 중요한 기법은 FPCA입니다.
학생 100명의 곡선은 제각각이지만, 그 안에는 몇 가지 “대표적인 유형(Mode of Variation)”이 숨어 있습니다.
R
# FPCA 수행
fpca_res <- fpca.sc(Y_matrix)
# 주성분(Eigenfunctions) 시각화
par(mfrow = c(1, 2))
plot(fpca_res$efunctions[,1], type='l', main = "제1주성분 (전체적 높낮이)", ylab="Value", xlab="Time")
plot(fpca_res$efunctions[,2], type='l', main = "제2주성분 (초반 vs 후반)", ylab="Value", xlab="Time")

- 제1주성분: “집중력이 전체적으로 높은 학생 vs 낮은 학생”을 구분하는 패턴.
- 제2주성분: “초반에 높고 후반에 지치는 유형(토끼형)” vs “초반엔 낮지만 후반에 강한 유형(거북이형)”을 구분하는 패턴.
교수자는 이 점수(FPC Score)를 활용해 학생들을 유형별로 분류하고 상담할 수 있습니다.
7. 결론 및 제언
오늘 우리는 다층 함수형 데이터 분석(MFDA)을 통해, 단순히 “평균 80점”이 아닌 “시간의 흐름에 따른 학습 패턴”을 분석했습니다.
- 교육적 시사점: 단순한 점수 비교를 넘어, “언제(When)” 개입해야 하는지 알려줍니다.
- 분석 결과, 강의식 수업은 20분 지점에서 집중력이 급락하므로, 이때 환기 활동(Brain Break)이 필요하다는 데이터 기반 의사결정이 가능합니다.
- 방법론적 의의:
- jamovi로 구현되지 않는 고차원 분석을 R의
refund패키지로 구현함으로써, 연구의 깊이를 더했습니다. - 다층 모형의 개념을 함수(곡선)로 확장하여, 개인차(Between-subject)와 시간차(Within-subject)를 동시에 고려했습니다.
- jamovi로 구현되지 않는 고차원 분석을 R의
이 분석 기법을 활용하여, 여러분의 교실과 연구실에서 숨겨진 데이터의 맥박을 느껴보시길 바랍니다.
참고문헌 (References)
- Crainiceanu, C. M., Caffo, B. S., & Morris, J. S. (2013). Multilevel functional data analysis. In The SAGE Handbook of Multilevel Modeling (pp. 223-238). SAGE Publications Ltd.
- Morris, J. S., & Carroll, R. J. (2006). Wavelet-based functional mixed models. Journal of the Royal Statistical Society: Series B (Statistical Methodology), 68(2), 179-199.
- Ramsay, J. O., & Silverman, B. W. (2005). Functional Data Analysis (2nd ed.). Springer.
- Crainiceanu, C. M., et al. (2009). Generalized multilevel functional regression. Journal of the American Statistical Association, 104(488), 1550-1561.
