📌 학습주제
1. Indian Restaurant Dataset으로 실습하기
2. Global AI, ML, Data Science Salary Dataset 으로 실습하기
3. NBA Players Dataset으로 실습하기
NBA Players Dataset으로 실습하기
NBA에서 제공하는 API를 활용해서 정리한 데이터셋 (199~2021년 시즌까지의 데이터)
🔗 실습 링크 : https://www.kaggle.com/datasets/justinas/nba-players-data/data
1단계. 데이터 살펴보기
컬럼명 | 의미 |
player_name | 선수 이름 |
team_abbreviation | 소속 팀 |
age | 나이 |
player_height | 선수 신장 |
player_weight | 선수 몸무게 |
college | 대학 |
country | (국적과 별개) 선수가 태어난 나라 |
draft_year | 드래프트 선수가 된 연도 |
draft_round | 드래프트에서 몇 라운드로 뽑혔는지 |
draft_number | 라운드 내에서 몇 번째로 뽑혔는지 |
gp | 시즌 내 몇 경기를 뛰었는지 |
pts | |
reb | |
ast | |
net_rating | 해당 선수가 코트에 있는 동안 팀이 100번의 공을 소유했을 때 점수가 어떻게 차이가 났는지(양수 = 득점, 음수 = 실점) |
oreb_pct | (높을수록 좋음) |
dreb_pct | (높을수록 좋음) |
usg_pct | 선수가 팀 플레이를 얼마나 잘 활용했는지 |
ts_pct | 선수의 슈팅 효율 |
ast_pct | 어시스트 횟수/전체 슛 시도 횟수 |
season |
2단계. 다양한 기준에 따라 SQL로 데이터 분석해보기
시즌별 데이터 비중을 살펴보자.
-- 시즌별 데이터 비중
SELECT season, count(1) as cnt
FROM nba
GROUP BY 1
ORDER BY 1
→ 연도별로 편차가 크지 않으며 전체적으로 고르게 분포해 있다.
데이터에 중복이 없는지 확인해보자.
-- 중복 체크
WITH dups as(
SELECT player_name, season, count(1) as cnt
FROM nba
GROUP BY 1, 2
HAVING cnt > 1
),
tot as(
SELECT *
FROM nba
)
SELECT tot.*
FROM tot INNER JOIN dups ON tot.player_name = dups.player_name and tot.season = dups.season
(06:41)
→ 중복인 데이터가 있는데 원인은 동명이인의 선수들이었다.
SELECT count(1) as cnt,
count(distinct player_name, season, team_abbreviation) as d_cnt,
count(distinct player_name, season, college) as d_cnt_2
FROM nba
cnt | d_cnt | d_cnt_2 |
12844 | 12844 | 12844 |
→ 4개의 중복 데이터 모두 동명이인인 케이스이기 때문에 대학, 팀 이름 등을 distinct 집계의 대상에 넣으면 중복이 발생하지 않게 된다.
즉, 행 하나를 골라낼 수 있는 unique한 key는 3개 컬럼의 조합이 된다.
선수 이름으로 분석을 진행할 때는 이러한 중복에 유의하면 된다.
선수들의 키, 몸무게, 나이, 경기횟수 등의 특성이 시즌별로 어떻게 변화했는지 분석해보자.
SELECT season,
AVG(player_height) as height,
AVG(player_weight) as weight,
AVG(gp) as gp,
AVG(pts) as pts,
AVG(reb) as reb,
AVG(ast) as ast
FROM nba
GROUP BY 1
ORDER BY 1
(09:37)
→ 시즌이 지남에 따라 선수들의 키와 몸무게가 점점 감소한다.
→ 시즌이 지남에 따라 평균 경기횟수는 유지되거나 점점 줄어드는 추세를 보인다.
→ 시즌이 지남에 따라 평균 득점이 점점 증가하는 추세를 보인다.
→ 리바운드와 어시스트는 단위가 크지 않기 때문에 정확한 파악이 어려우므로 차트를 그려 확인해보는 것이 좋다.
구글 스프레드 시트로 export
(11:25)
리바운드는 왼쪽축, 어시스트는 오른쪽 축
→ 리바운드는 시즌이 지남에 따라 유지되는 추세이고, 어시스트는 증가하는 추세를 보인다.
[정리]
- 데이터가 중복되는 케이스는 선수 이름이 동명이인인 경우였다.
- 시즌이 지남에 따라 선수들의 평균 신장, 몸무게는 감소하는 추세를 보였다.
- 시즌 내에 소화하는 경기 횟수는 증가하는 추세를 보였다.
- 시즌이 지남에 따라 평균 득점과 어시스트는 증가하는 추세를 보였으며, 리바운드는 유지되는 추세를 보였다.
[해석]
- 득점이 증가하면 어시스트도 증가하는데, 혼자서 한 득점도 있겠지만 농구는 팀 플레이이기 때문에 누군가에게 패스를 받아서 슛을 쏠 가능성이 있다.
- 신장과 몸무게도 서로 상관관계가 있을 것이다. 보통은 키가 큰 사람이 무게가 많이 나가는 경향이 있기 때문이다.
- 선수들의 평균 득점은 늘어나고 덩치는 줄어드는 추세를 보았을 때, 예전보다는 작고 가벼운 선수들이 더 많이 득점하는 구조로 변화하는 것 같다. 농구에는 3점슛도 있기 때문에 상대적으로 덩치가 작은 선수들이 3점슛과 외곽슛을 더 많이 넣는 스타일로 경기운영 방식이 변화하고 있다고 가설을 세울 수 있을 것이다.
위에서 세운 가설을 확인해보기 위해, 연도별로 드래프트에서 빨리 뽑힌 선수들의 키와 몸무게, 나이를 살펴보도록 하자.
-- 드래프트 1라운드, 순위 10위 이내에 뽑힌 선수들의 평균 신장과 몸무게, 나이 파악하기
SELECT draft_year, AVG(player_height), AVG(player_weight), AVG(age)
FROM nba
WHERE draft_round = 1
AND draft_number <= 10
GROUP BY 1
(13:42)
→ 상위 드래프트에 뽑힌 선수들에 대해 시즌이 지남에 따라 선수들의 키와 나이는 감소하는 추세를 보인다.
→ 예전 시즌 선수들일 수록 신체 조건이 좋은 선수들을 먼저 뽑았다면, 요즘 시즌 선수들일수록 득점률이 좋다면 상대적으로 덩치가 작은 선수들도 앞쪽 순서로 뽑힌다고 해석할 수 있다.
→ 나이가 어려지는 현상은 농구 선수를 키워내는 시스템들이 점점 발전함에 따라 어린 나이부터 두각을 나타내는 선수들이 많아졌다고 해석할 수 있다.
시즌별 평균 득점이 가장 많았던 선수들은 어떤 선수인지 살펴보도록 하자.
-- 각 시즌별 1위 선수들의 나이, 키, 몸무게, 평균득점 파악하기
WITH max_pts as(
SELECT season, MAX(pts) as max_pt
FROM nba
GROUP By 1
)
SELECT m.season, player_name, age, player_height, player_weight, max_pt, gp
FROM max_pts m INNER JOIN nba n ON m.season = n.season AND m.max_pt = n.max_pt
ORDER BY 1
(16:08)
→ 한번 득점왕을 했던 선수들은 연이어서 득점왕을 차지하는 경우가 많았다.
1위 선수의 득점에 상승 추세가 있었는지 파악하기 위해 그래프를 그려 추세를 확인해보자.
(18:07)
→ 득점의 경우 상승추세가 약간은 있었다. 시즌별 경기수도 전체 추세와 비슷하게 유지되는 추세였다.
그러나 1위 선수만 보았을때는 추세가 정확하게 파악되지 않으므로 시즌별 10위 선수까지 데이터를 추출한 후에 10위 이내 선수들의 득점 평균을 살펴보도록 하자.
-- 각 시즌별 10위 이내 선수들의 평균득점 파악하기
WITH base as(
SELECT season, player_name, rank() over (PARTITION BY season ORDER BY pts DESC) as rank, pts
FROM nba
)
SELECT season, AVG(pts) as pts
FROM base
WHERE rank <= 10
GROUP BY 1
ORDER BY 1
(19:41)
→ 10위 이내 선수들의 평균 득점은 1위 선수보다 낮다.
농구는 5명이 하는 경기이기 때문에 한명이 그만큼 점수를 많이 낼 수 있다는 뜻이다.
→ 시즌이 지남에 따라 평균 득점이 점점 늘어나고 있다.
→ 시즌이 지남에 따라 평균 시함 수는 유지되거나 약간 감소하는 추세를 보인다.
3단계. 분석 결론 내리기
느낀점