Files
serial-position-effect/README.md
T
2026-07-17 20:07:01 +09:00

198 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
> 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세대, 권장)
```bash
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에서 4~6음절 단어를 섞어야 하는데 `np.random.shuffle(sw_arr)`**짧은 단어 배열을 다시 섞고 있습니다** (`lw_arr` 이어야 함). 그 결과 `bce_list`~`bdf_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` 로부터 위 결과표를 다시 계산하려면:
```python
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`