10 KiB
This README is written by claude as I couldn't remember the project.
비선형회귀법으로 분석한 서열 위치 효과
Pre-URP 연구 프로젝트 · 2024년 1월 · Serial Position Effect
Murdock(1962)의 자유회상 서열위치효과 실험을 한국어 단어로 재현하되, 원 논문이 사용한 선형 회귀 대신 2차(비선형) 회귀로 U자 곡선을 직접 적합한 연구입니다. 자체 제작한 웹앱으로 실험을 실행하고, 참가자 약 18명 × 8조건의 자유회상 데이터를 수집해 조건별 2차 계수를 비교했습니다.
최종 산출물은 발표자료 SerialPositionEffect.pptx (24장)입니다.
1. 실험 설계
2×2×2 = 8조건 요인 설계. 각 조건은 세 글자 코드로 표기하며, 파일명·엑셀 시트명·그래프 번호가 모두 이 체계를 따릅니다.
| 요인 | 수준 1 | 수준 2 |
|---|---|---|
| 단어 길이 | A = 1~3음절 (짧은 단어) | B = 4~6음절 (긴 단어) |
| 단어 제시 시간 | C = 2초 | D = 3초 |
| 배열의 총 단어 수 | E = 10개 | F = 20개 |
조건 코드 순서: ACE → ACF → ADE → ADF → BCE → BCF → BDE → BDF
(Result graphs/1.png ~ 8.png이 이 순서에 대응합니다.)
절차
- 단어를 1개씩 순차 제시 (제시 시간 2초 또는 3초, 각 단어 뒤 1초 공백)
- 배열 종료 시 빨간색
Finish표시 - 참가자가 기억나는 단어를 순서와 무관하게 종이 설문지에 작성 (
설문지 형식 초안.docx) - 위치별 회상 성공 여부를 0/1로 코딩해 엑셀에 입력
자극
표준국어대사전의 명사 (한자어·외래어·혼종어 포함). 원본 단어 목록은 단어 목록.xlsx(1to3 / 4to6 각 145행)와 pre_urp/korean_words.xlsx(음절 수별 컬럼)에 있습니다.
참가자
조건당 17~18명 (BCE만 17명, 나머지 7개 조건은 18명).
2. 파일 구조
실험 실행 도구 — 3세대에 걸쳐 진화
| 세대 | 위치 | 설명 |
|---|---|---|
| 1세대 | pre_urp_contents/*.pptm |
파워포인트 매크로판. ACE.pptm~BDF.pptm 8개 파일. VBA GetRandom() 매크로가 단어 순서를 셔플해 슬라이드로 제시. Random100Direct.pptm은 이 셔플 알고리즘을 100회 돌려 검증한 파일 |
| 2세대 | Word View/ |
수동 웹앱. Mix 버튼·제시 시간·단어 개수를 매번 직접 설정해 한 조건씩 실행 |
| 3세대 | Word View Auto/ |
자동 웹앱. Express 서버 위에서 ACE ACF ADE ADF BCE BCF BDE BDF를 한 번에 입력하면 8조건 자동 연속 실행. 페이지 로드 시 자동 셔플 |
데이터 · 분석
| 파일 | 설명 |
|---|---|
exp_results1.xlsx |
실제 수집 데이터 (최종본). 8개 조건 시트 + Dummy 시트. 행 = 참가자, 열 = 서열 위치, 값 = 회상 성공 0/1 |
pre_urp/exp_results.xlsx |
데이터 수집 전 빈 템플릿 (헤더만 존재) |
pre_urp/korean_words.xlsx |
음절 수별 단어 원본 |
pre_urp.ipynb |
분석 노트북 (sklearn 회귀 연습 → 단어 리스트 셔플/분할 → Dummy 적합) |
pre_urp/comp_libraries.txt |
필요 패키지: matplotlib, scikit-learn, pandas, openpyxl |
산출물 · 문서
| 파일 | 설명 |
|---|---|
SerialPositionEffect.pptx |
최종 발표자료 (24장, 32MB) |
Result graphs/1~8.png |
조건별(ACE→BDF) 산점도 + 2차 적합 곡선 |
wordlength.png / wordshown.png / wordnumber.png |
요인별 비교 그래프 (단어 길이 / 제시 시간 / 단어 개수) |
pre_urp_contents/배경지식.pptx |
이론 정리 (감각기억, 단기기억, Sperling 1960, Miller의 매직넘버 7±2, 작업기억 음운루프) |
pre_urp_contents/Experiment_Instruction.pptx |
실험 진행 안내 (2024-01-08) |
pre_urp_contents/exp_procedure.docx |
실험 절차 초안 |
기존연구.pdf, pre_urp_contents/murdock_serial_position_effect.pdf |
선행연구 논문 (서로 다른 파일) |
3. 실행 방법
Word View Auto (3세대, 권장)
cd "Word View Auto"
npm install # node_modules는 이미 포함되어 있음
node server.js # → http://127.0.0.1:4000
Test Type List에 조건 코드를 공백으로 구분해 입력 (기본값 ACE ACF ADE ADF BCE BCF BDE BDF) → Start → 스페이스바로 각 테스트 시작.
Word View (2세대)
서버 불필요. Word View/index.html을 브라우저로 직접 열면 됩니다.
R 키로 설정 화면 복귀.
4. 결과
각 조건의 위치별 평균 회상률에 y = ax² + bx + c 를 최소제곱 적합한 결과입니다.
| 조건 | 설명 | N | 평균 회상률 | a (x²) | b (x) | c | R² |
|---|---|---|---|---|---|---|---|
| ACE | 짧은 / 2초 / 10개 | 18 | 0.578 | 0.0105 | −0.1009 | 0.7278 | 0.398 |
| ACF | 짧은 / 2초 / 20개 | 18 | 0.408 | 0.0033 | −0.0682 | 0.6444 | 0.447 |
| ADE | 짧은 / 3초 / 10개 | 18 | 0.622 | 0.0141 | −0.1840 | 1.0917 | 0.566 |
| ADF | 짧은 / 3초 / 20개 | 18 | 0.536 | 0.0040 | −0.0975 | 0.9822 | 0.771 |
| BCE | 긴 / 2초 / 10개 | 17 | 0.535 | 0.0189 | −0.2201 | 1.0167 | 0.587 |
| BCF | 긴 / 2초 / 20개 | 18 | 0.333 | 0.0038 | −0.0851 | 0.6881 | 0.599 |
| BDE | 긴 / 3초 / 10개 | 18 | 0.467 | 0.0078 | −0.0782 | 0.5972 | 0.267 |
| BDF | 긴 / 3초 / 20개 | 18 | 0.361 | 0.0040 | −0.0790 | 0.6152 | 0.428 |
핵심 발견
8조건 모두 a > 0 — 아래로 볼록한 U자 곡선이 전 조건에서 재현되었습니다. 서열 위치 효과 자체는 성공적으로 확인되었습니다.
주효과 (조건 평균 회상률)
| 요인 | 수준 1 | 수준 2 | 차이 |
|---|---|---|---|
| 단어 개수 | E (10개) 0.550 | F (20개) 0.410 | 0.140 — 가장 큰 영향 |
| 단어 길이 | A (짧은) 0.536 | B (긴) 0.424 | 0.112 — 두 번째 |
| 제시 시간 | C (2초) 0.464 | D (3초) 0.497 | 0.033 — 거의 영향 없음 |
초두 효과 vs 최신 효과 — 발표자료 13쪽의 논점이지만, 데이터상 일관된 우열이 나오지 않았습니다. 첫 3개 위치 평균과 마지막 3개 위치 평균을 비교하면 8조건 중 4개는 최신 효과가, 4개는 초두 효과가 우세합니다.
| 조건 | 초두(첫 3개) | 중간 | 최신(마지막 3개) | 우세 |
|---|---|---|---|---|
| ACE | 0.611 | 0.514 | 0.630 | 최신 |
| ACF | 0.519 | 0.349 | 0.574 | 최신 |
| ADE | 0.815 | 0.514 | 0.574 | 초두 |
| ADF | 0.778 | 0.472 | 0.593 | 초두 |
| BCE | 0.647 | 0.441 | 0.549 | 초두 |
| BCF | 0.537 | 0.262 | 0.463 | 초두 |
| BDE | 0.426 | 0.472 | 0.500 | 최신 |
| BDF | 0.500 | 0.282 | 0.593 | 최신 |
위치별 평균 회상률 (원자료)
ACE (n=18, 10개): 0.61 0.61 0.61 0.28 0.50 0.61 0.67 0.44 0.61 0.83
ADE (n=18, 10개): 0.83 0.78 0.83 0.50 0.67 0.44 0.44 0.50 0.39 0.83
BCE (n=17, 10개): 0.76 0.65 0.53 0.59 0.41 0.24 0.53 0.41 0.35 0.88
BDE (n=18, 10개): 0.67 0.33 0.28 0.44 0.56 0.39 0.50 0.39 0.50 0.61
ACF (n=18, 20개): 0.67 0.39 0.50 0.39 0.22 0.28 0.50 0.44 0.44 0.39
0.39 0.22 0.17 0.33 0.28 0.39 0.44 0.39 0.50 0.83
ADF (n=18, 20개): 0.83 0.83 0.67 0.83 0.50 0.50 0.50 0.61 0.33 0.44
0.44 0.33 0.39 0.33 0.50 0.39 0.50 0.56 0.50 0.72
BCF (n=18, 20개): 0.72 0.39 0.50 0.28 0.44 0.28 0.28 0.33 0.28 0.22
0.06 0.22 0.39 0.28 0.28 0.17 0.17 0.39 0.39 0.61
BDF (n=18, 20개): 0.61 0.39 0.50 0.22 0.22 0.11 0.50 0.22 0.56 0.22
0.11 0.33 0.28 0.33 0.22 0.33 0.28 0.28 0.67 0.83
5. 알려진 문제
프로젝트를 다시 열 때 알아둬야 할 사항들입니다.
노트북의 셔플 버그
pre_urp.ipynb 셀 11에서 46음절 단어를 섞어야 하는데 np.random.shuffle(sw_arr) 로 짧은 단어 배열을 다시 섞고 있습니다 (lw_arr 이어야 함). 그 결과 bce_listbdf_list 는 엑셀 원본 순서 그대로입니다.
다만 실제 제시 순서는 PPT의 VBA 매크로가 한 번 더 셔플했으므로(
ACE.pptm의 단어 순서가 노트북ace_list와 다름을 확인) 실험 자체의 무작위성은 훼손되지 않았습니다.
최종 분석 코드 유실
pre_urp.ipynb 셀 17이 정의된 적 없는 temp 변수를 참조합니다. 위 결과표의 8조건 회귀와 Result graphs/ 의 그래프를 생성한 코드는 노트북에 남아있지 않습니다. 현재 노트북에는 sklearn 회귀 연습 → 단어 분할 → Dummy 시트 적합까지만 있습니다.
위 결과표는
exp_results1.xlsx로부터 독립적으로 재계산해 검증한 값입니다. 8개 조건 중 6개가 발표자료 14쪽 숫자와 소수점까지 일치합니다.
발표자료 14쪽 오타 2건
- ADE의 b: 발표자료에
-0.2840으로 기재되어 있으나 실제 값은-0.1840입니다. (−0.2840을 쓰면 10번째 위치의 예측 회상률이 −0.34라는 불가능한 값이 나옵니다.) - ACF의 c: 발표자료에
0.6881로 기재되어 있으나 실제 값은0.6444입니다. 기재된 값이 BCF의 c와 동일해 복사·붙여넣기 실수로 보입니다.
중복 파일
pre_urp.ipynb, pre_urp (1).ipynb, pre_urp/pre_urp.ipynb 세 파일은 md5 해시가 모두 동일합니다. 하나만 남겨도 됩니다.
사소한 것들
Word View/main.js의 단어 오타 2개(고구마입벌레,고리대급업자)는 Auto 버전에서고구마잎벌레,고리대금업자로 수정되었습니다.Word View/main.js의oneToThree배열에"칼"이 중복으로 들어있습니다.wordnumber.png의 제목이"Word bumber difference"오타입니다.Word View/history.json({"Hello":"Me too"}) 과 Auto 서버의/your-endpoint는 미완성된 결과 자동저장 기능의 흔적입니다. 최종적으로 응답은 종이 설문지로 수집했습니다.
6. 재현 방법
exp_results1.xlsx 로부터 위 결과표를 다시 계산하려면:
import pandas as pd, numpy as np
from sklearn import linear_model
for cond in ['ACE','ACF','ADE','ADF','BCE','BCF','BDE','BDF']:
df = pd.read_excel('exp_results1.xlsx', sheet_name=cond)
means = df.mean().to_numpy() # 위치별 평균 회상률
x = np.arange(1, len(means) + 1).reshape(-1, 1)
X = np.concatenate((x**2, x), axis=1) # [x^2, x]
regr = linear_model.LinearRegression(fit_intercept=True).fit(X, means)
a, b = regr.coef_
print(f'{cond}: a={a:.4f} b={b:.4f} c={regr.intercept_:.4f}')
필요 패키지: matplotlib, scikit-learn, pandas, openpyxl