This commit is contained in:
2026-07-17 20:07:01 +09:00
commit 814273d4d7
52 changed files with 8765 additions and 0 deletions
+197
View File
@@ -0,0 +1,197 @@
> 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`