Files
2026-07-17 20:07:01 +09:00

10 KiB
Raw Permalink Blame History

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. 단어를 1개씩 순차 제시 (제시 시간 2초 또는 3초, 각 단어 뒤 1초 공백)
  2. 배열 종료 시 빨간색 Finish 표시
  3. 참가자가 기억나는 단어를 순서와 무관하게 종이 설문지에 작성 (설문지 형식 초안.docx)
  4. 위치별 회상 성공 여부를 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
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.jsoneToThree 배열에 "칼"중복으로 들어있습니다.
  • 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