이번에는 포켓몬 데이터를 가지고 이것저것 분석을 해볼 예정이다.
https://www.kaggle.com/datasets/rounakbanik/pokemon
The Complete Pokemon Dataset
Data on more than 800 Pokemon from all 7 Generations.
www.kaggle.com
데이터는 Kaggle의 포켓몬 데이터셋을 활용했고, 총 801개의 행이 존재했다.
Excel로 확인해보면, 데이터가 조금 이상하게 나오는데, DBeaver에서 불러오면,
SELECT *
FROM pokemon
LIMIT 20;

문제 없이 잘 나오는 것을 확인할 수 있다. (인코딩 문제이지 않았을까 싶다)
이번에는 간단하게 MySQL을 이용하여 상관관계를 계산해보고자한다.
사용할 변수는 'base_total'(총개체값)과 'capture_rate'(포획률)
base_total을 직관적으로 보기 위해 total_stat으로 변수명을 수정해주었다.
ALTER TABLE pokemon
CHANGE COLUMN base_total total_stat INT;
Step1) 산점도 시각화

SQL문을 통해 추출한 데이터를 엑셀에서 나타낸 산점도이다.
그래프를 보면, R^2 = 0.5067로 약 약 50%의 설명력을 가진다고 볼 수 있다.
(즉, 총개체값(x)가 포획률(Y)의 변동을 약 51% 정도 설명한다)
Step2) 상관계수 도출
1) 피어슨 상관계수(Pearson's Correlation)
SELECT
(AVG(total_stat * capture_rate) - AVG(total_stat) * AVG(capture_rate)) /
(STDDEV(total_stat) * STDDEV(capture_rate)) AS pearson_corr
FROM
pokemon;

2) 스피어만 상관계수(Spearman's Correlation)
포획률 데이터의 경우 특정 구간(3, 45, 255 등)에 밀집된 경향을 보여서, 순위 기반 스피어만 상관계수도 함께 도출해주었다.
WITH ranked AS (
-- 연속형 변수 -> 서열 데이터로 변환
SELECT
total_stat, capture_rate,
RANK() OVER (ORDER BY total_stat) AS rank_x,
RANK() OVER (ORDER BY capture_rate) AS rank_y
FROM pokemon
)
SELECT
(AVG(rank_x * rank_y) - AVG(rank_x) * AVG(rank_y)) /
(STDDEV(rank_x) * STDDEV(rank_y))
AS spearman_corr
FROM ranked;

두 상관계수 둘다 일관되게 높은 값을 가지는 것을 알 수 있다.
Step3) 결론
포획률과 총개체값은 강한 음의 상관관계를 가진다 (포획률이 낮을수록 총개체값은 높다)
이후에는, 어떤 타입이 강한지, 스탯은 어떠한지, 특성과는 어떠한 연관이 있을지 등에 대해 분석해볼 예정이다.
(시간이 된다면, 데이터들을 더 추가해볼 예정이다)
'프로젝트' 카테고리의 다른 글
| [포켓몬 Kaggle] 2. 성별 및 키.몸무게 전처리 (MySQL) (0) | 2026.04.23 |
|---|---|
| 만우절에 검색량이 늘어나는 키워드는? (네이버 데이터랩 분석) (3) | 2026.04.03 |