프로젝트

[포켓몬 Kaggle] 1. 포획률과 총개체값의 상관관계 (MySQL)

wjyee 2026. 4. 13. 19:47

이번에는 포켓몬 데이터를 가지고 이것저것 분석을 해볼 예정이다.

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;

결과값은 -0.71..

 

 

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;

 

결과값은 -0.67...

두 상관계수 둘다 일관되게 높은 값을 가지는 것을 알 수 있다.

Step3) 결론

포획률과 총개체값은 강한 음의 상관관계를 가진다 (포획률이 낮을수록 총개체값은 높다)

 

이후에는, 어떤 타입이 강한지, 스탯은 어떠한지, 특성과는 어떠한 연관이 있을지 등에 대해 분석해볼 예정이다.

(시간이 된다면, 데이터들을 더 추가해볼 예정이다)