Pokémon AI 대전 CSV 분석 보고서

작성일: 2026-10-20 · 작성: Codex · 저장·집계: Cloudflare D1 (`game` DB / `game` 표)

요약

Kaggle 경기 목록 CSV **1,724행 전체**를 Cloudflare D1에 적재하고, 원격 행 수와 모든 셀을 원본과 대조했다.
분석 범위는 manifest.csv이며, 약 21.47GB의 경기 JSON 원문 전체를 D1에 적재한 것이 아니다.
이 CSV에는 에이전트 이름·승패·선공·카드 목록이 없어 승률·카드 성능 분석은 할 수 없다.
따라서 실제 존재하는 열로 답할 수 있는 질문 3개를 정했다.

1. 데이터 출처와 처리

출처: https://www.kaggle.com/datasets/kaggle/the-pokemon-company-ptcg-ai-battle-challenge-playground-episodes-2026-10-18

데이터 버전 1, 경기 날짜 2026-10-18. 공식 메타데이터상 라이선스는 CC0: Public Domain.
이 표시는 Pokémon 상표·캐릭터에 대한 별도 권리를 부여한다는 뜻이 아니다.
자료는 평균 에이전트 레이팅 기준으로 선택하고 하루 20 GiB로 제한한 리플레이 목록이다.
전 세계 모든 경기나 대회 전체를 대표하는 무작위 표본이 아니다.

UTF-8을 엄격히 해석했고, episode_id 중복 없음·숫자 타입·날짜를 검증했다.
created_date는 원본 타임스탬프의 날짜 부분만 보존했다. 시간·소수 초는 D1 표에서 제외하며 원본 CSV에는 남아 있다.
원본 시간에 시간대 표기가 없어 한국 시간으로 임의 변환하지 않았다.
최종 날짜는 모든 행에서 `2026-10-18`, 참가자 수는 모든 행에서 2다.

원래 열D1 열타입
episode_idepisode_idINTEGER · 기본키
create_timecreated_dateTEXT · YYYY-MM-DD
avg_scoreavg_ratingREAL
min_scoremin_ratingREAL
sum_scoretotal_ratingREAL
agent_countagent_countINTEGER
size_bytessize_bytesINTEGER

2. 질문 1 — 선택된 경기들은 어느 레이팅 구간에 집중되어 있는가?

방법: D1에서 avg_rating의 최소·평균·중앙값·최대와 100점 구간별 경기 수를 집계했다.
레이팅은 에이전트 강도 지표이며 경기 득점이나 승패 보상이 아니다.

- 평균 레이팅: 1131.24
- 중앙값: 1118.12
- 범위: 1060.23–1348.36

평균 레이팅 구간경기 수비중평균 파일 크기(MB)
1100-119997856.73%13.19
1200-1299613.54%12.16
1300+754.35%9.08
below110061035.38%11.71

해석: 1,100–1,199 구간이 978경기(56.73%)로 가장 많다.
1,200 이상은 136경기(7.89%)다. 고레이팅 경기만 균등하게 모인 자료가 아니라 특정 구간에 집중된 선택 표본이다.
평균만 보고 전체 분포를 대표한다고 해석해서는 안 된다. 구간 경계는 설명용 100점 간격이며 실력 등급의 공식 경계가 아니다.

3. 질문 2 — 두 참가자의 레이팅 차이가 작은 경기가 얼마나 많은가?

방법: 참가자가 모든 경기에서 2명임을 먼저 확인했다.
두 레이팅 합이 S, 최솟값이 L이면 최댓값은 S-L, 따라서 차이는 S-2L이다.
D1에서 `total_rating - 2*min_rating`으로 계산했다.
합과 평균×2의 최대 차이는 0.000001000로 원본 소수점 반올림 수준이다.

지표결과
평균 레이팅 차이46.39
최대 레이팅 차이493.05
차이 50 미만1,096경기 · 63.57%
차이 100 이상136경기 · 7.89%

해석: 약 63.6%는 레이팅 차이가 50 미만이다.
다만 차이가 100 이상인 경기도 136개 있어 모든 대진이 비슷한 강도의 상대끼리 이루어진 것은 아니다.
50·100은 설명을 위한 기준이며, '공정한 매칭'의 공식 기준이 아니다.
레이팅 차이가 크다는 사실만으로 실제 승자나 일방적인 경기였는지는 알 수 없다.

4. 질문 3 — 평균 레이팅이 높을수록 리플레이 파일도 큰가?

방법: D1에서 중심화한 공분산과 두 분산을 계산하고 Pearson 상관계수로 변환했다.
원격 SQL 집계값에 대한 제곱근 계산만 Python으로 수행했다.
크기는 1MB=1,000,000bytes 기준이다.

- 원본 JSON 크기 합: 21.468GB
- 평균 파일 크기: 12.45MB
- 최소/최대: 1.81MB / 278.20MB
- 전체 1,724경기 상관계수 r: -0.0026
- 큰 파일 상위 18개(약 1%) 제외한 민감도 분석: n=1,706, r=-0.0748

해석: 관측된 선형 상관은 음의 방향이며 크기는 약하다.
단순히 레이팅이 높을수록 더 큰 리플레이가 나온다고 주장할 근거는 부족하다.
파일 크기는 직렬화된 상태·로그 등의 양에 좌우되므로 턴 수, 경기 시간, 전략의 복잡성과 동일하지 않다.
상위 18개 제외 결과는 이상치 민감도 확인용이며 전체 표본 결과를 대체하지 않는다.
유의확률 검정이나 인과 추정은 수행하지 않았다.

5. 결론

1. 선택된 경기의 평균 레이팅은 주로 1,100대에 몰려 있다.
2. 레이팅 차이가 작은 대진이 많지만 차이가 큰 대진도 존재한다.
3. 평균 레이팅과 파일 크기를 같은 의미의 지표로 사용할 수 없다.

이 CSV만으로 승률·최강 에이전트·선공 효과·강한 카드를 말하는 것은 데이터 범위를 넘어선다.
그런 질문에는 별도로 전체 JSON에서 승패·에이전트·행동·덱을 추출해야 한다.
단 하루의 선택 표본이며 동일 에이전트의 반복 출전 여부를 CSV에서 확인할 수 없으므로 일반화에 주의한다.

6. 검증과 재현

- Wrangler OAuth 로그인 후 Cloudflare D1 원격으로 업로드했다. 수동 API 토큰을 생성하지 않았다.
- 원본 CSV 1,724행, D1 원격 1,724행, 고유 episode_id 1,724개.
- D1의 모든 셀을 원본 숫자·날짜 변환 결과와 대조해 일치함을 확인했다.
- `d1/import.sql`: 재실행해도 episode_id 중복을 만들지 않는 업로드 SQL.
- `d1/analysis.sql`: 세 질문을 분석한 원격 SQL.
- `reports/d1_results.json`: D1의 실제 응답과 실행 메타데이터.
- `reports/d1_verification.json`: 전체 셀 대조 결과.
- `python report_d1.py`: Wrangler를 통해 D1에서 다시 집계해 이 보고서를 생성한다.

기존 로컬 SQLite 적재는 D1 전환 요청에 따라 중단했으며, 남아 있는 부분 DB를 전체 데이터로 사용하지 않았다.
Cloudflare에 배포돼 있던 게임 사이트는 이 작업에서 변경하지 않았다.