๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/54
[์๊ฐํ ๋ถ์ ํ๋ก์ ํธ] 1. best baseball player ๋ถ์
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/53 https://silvercoding.tistory.com/52 [python ์๊ฐํ] 1. seaborn ๋ผ์ด๋ธ๋ฌ๋ฆฌ (distplot, relplot, jointplot, pairplot, boxplot, swarm..
silvercoding.tistory.com
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
import pandas as pd
file = './data/KBO_2019_player_gamestats.csv'
raw = pd.read_csv(file, encoding = 'cp949')
raw.head()
์ด์ ํฌ์คํ ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๋ถ๋ฌ์จ๋ค.
์ผ๊ตฌ์ ์๊ฐ ๊ฐํด์ง๋ ๊ณ์ ์ด ์์๊น ?
idea : '์ผ์' ์ปฌ๋ผ์์ ์ ์ ๋ณด๋ง ์ถ์ถํด ๋ด์ด ์ ๋ณ ์ถ๋ฃจ์จ์ ์๊ฐํ ํด๋ณธ๋ค.
1. ์ ๋ณ ๊ธฐ๋ก ์ ๋ฆฌํ๊ธฐ
- '์ผ์' ์ปฌ๋ผ์์ ์ ์ถ์ถํ๊ธฐ
month_list = []
for monthdate in raw['์ผ์']:
month, date = monthdate.split('-')
month_list.append(month)
raw['์'] = month_list
raw.head()
- ๋ถ์์ ํ์ํ ์ปฌ๋ผ ์ ํ
columns_select = ['ํ', '์ด๋ฆ', '์์ผ','์ผ์', '์๋','ํ์','์ํ','ํ๋ฐ', '๋ฃจํ', 'ํ์ ','๋ณผ๋ท', '์ฌ๊ตฌ', 'ํฌ๋น', '์']
data = raw[columns_select]
data.head()
- ์๋ณ ์ค์ ์ง๊ณ
data_player_month = data.pivot_table(index = ['ํ','์ด๋ฆ','์์ผ', '์'],
values = ['ํ์','์ํ','ํ๋ฐ','๋ฃจํ','ํ์ ','๋ณผ๋ท','์ฌ๊ตฌ','ํฌ๋น'],
aggfunc = 'sum', fill_value = 0
)
data_player_month
ํ, ์ด๋ฆ, ์์ผ๋ก ์ ์๋ฅผ ๊ตฌ๋ถํ๊ณ , ์๋ณ ์ค์ ์ ์ง๊ณํ๋ pivot table์ ์์ฑํ๋ค. ๋น์ด์๋ ๊ณณ์ 0์ผ๋ก ๊ฐ์ ์ฑ์ ์ค๋ค.
data_player_month = data_player_month.reset_index()
data_player_month
reset_index๋ก ๋ฉํฐ์ธ๋ฑ์ค๋ฅผ ์ปฌ๋ผ์ผ๋ก ๋ณ๊ฒฝํด ์ค๋ค.
- ํ์จ, ์ถ๋ฃจ์จ, ์ฅํ์จ, OPS ( ์ฃผ์ ์ค์ ๊ณ์ฐ ) ์ปฌ๋ผ ์ถ๊ฐ
def cal_hit(df):
'''
- ํ์จ : ๊ณต์ ์ณ์ ๋๊ฐ๋ ๋น์จ --> ์ํ / ํ์
- ์ถ๋ฃจ์จ: ์ง๋ฃจํด์ ๋๊ฐ๋ ๋น์จ --> (์ํ+๋ณผ๋ท+๋ชธ์๋ง๋๋ณผ)/(ํ์+๋ณผ๋ท+๋ชธ์๋ง๋๋ณผ+ํฌ์ํ๋ผ์ด)
- ์ฅํ์จ : ํ์จ์ ์ง๋ฃจํ ๋ฒ ์ด์ค ๊ฐ์ค์น ์ถ๊ฐ --> ๋ฃจํ / ํ์
'''
df['ํ์จ'] = df['์ํ'] / df['ํ์']
df['์ถ๋ฃจ์จ'] = (df['์ํ'] + df['๋ณผ๋ท'] + df['์ฌ๊ตฌ']) / (df['ํ์'] + df['๋ณผ๋ท'] + df['์ฌ๊ตฌ'] + df['ํฌ๋น'])
df['์ฅํ์จ'] = df['๋ฃจํ'] / df['ํ์']
df['OPS'] = df['์ถ๋ฃจ์จ'] + df['์ฅํ์จ']
return df
player_month_stat = cal_hit(data_player_month)
player_month_stat.head()
player_month_stat.info()
๊ฒฐ์ธก๊ฐ์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
player_month_stat = player_month_stat.dropna()
player_month_stat.head()
dropna()๋ฅผ ์ด์ฉํ์ฌ ๊ฒฐ์ธก๊ฐ์ด ์๋ row๋ฅผ ์ ๊ฑฐํด ์ค๋ค.
player_month_stat.info()
๊ฒฐ์ธก๊ฐ์ด ๋ชจ๋ ์ฑ์์ก๋ค!
- ์๋ณ ์ถ๋ฃจ์จ
month_pivot = player_month_stat.pivot_table(index = ['ํ','์ด๋ฆ','์์ผ'],
columns = '์',
values = '์ถ๋ฃจ์จ')
month_pivot = month_pivot.reset_index()
month_pivot
์์ ๊ฐ์ด ์ ์๋ค์ ์ ๋ณ ์ถ๋ฃจ์จ ํผ๋ฒํ ์ด๋ธ์ ์์ฑํ์๋ค.
2. ๊ฒฐ๊ณผ : KBO ์ถ๋ฃจ์จ ์ต๊ณ ํ์๋ค์ ์ ๋ณ ์ถ๋ฃจ์จ ํ์ธํด ๋ณด๊ธฐ
- KBO ์ถ๋ฃจ์จ ์ต๊ณ ํ์ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
file = './data/player_stat.csv'
player_stat = pd.read_csv(file, encoding = 'cp949')
player_stat.head(20)
์ ๋ฒ ๊ธ์ ์ฃผ์ ์๋ ์ถ๋ฃจ์จ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด ๋์ ๋ฐ์ดํฐ์ด๋ค. ์ด ๋ฐ์ดํฐ์ ์์์ ๋ง๋ค์ด ๋์ ์ ๋ณ ์ถ๋ฃจ์จ ๋ฐ์ดํฐ๋ฅผ ํฉ๋ณํ์ฌ ์ถ๋ฃจ์จ ์์ 50๋ช ์ ์ ์๋ค์ ์ ๋ณ ์ถ๋ฃจ์จ ๊ธฐ๋ก์ ํ์ธํด ๋ณด์.
- ๋ฐ์ดํฐ ํฉ๋ณ
df = pd.merge(player_stat, month_pivot, how = 'left', on = ['ํ','์ด๋ฆ','์์ผ'])
# left_on = ['ํ','์ด๋ฆ','์์ผ'], right_on = ['ํ','์ด๋ฆ','์์ผ']
df.head(10)
df_sort = df.sort_values(by = '์ถ๋ฃจ์จ', ascending = False).head(50)
df_sort
๋ค์ํ๋ฒ ์ถ๋ฃจ์จ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ํ๊ณ , 50๊ฐ์ ๋ฐ์ดํฐ๋ฅผ df_sort ์ ๋ฃ์ด ์ค๋ค.
df_selected = df_sort[['ํ', '์ด๋ฆ', '์ถ๋ฃจ์จ', '03', '04', '05', '06', '07', '08', '09', '10']]
df_selected
๊ทธ๋ฆฌ๊ณ df_sort์์ ์ถ๋ฃจ์จ๊ณผ ๊ด๋ จ๋ ์ปฌ๋ผ๋ง ๋ฝ์์ df_selectied ๋ณ์๋ฅผ ์ ์ธํ๋ค.
์ซ์๋ก ๋์์์ผ๋ 50๋ช ์ ์ ์๋ค์ ์ ๋ณ ๊ธฐ๋ก์ด ์ด๋ค์ง ๊ฐ๋ ์ด ์ ๊ฐ๋ค. ๋ฐ๋ผ์ ์๊ฐํ๋ฅผ ํตํ์ฌ ํ์ธํ๋๋ก ํ๋ค.
- ์๊ฐํ๋ก ํ๋์ ๋ณด๊ธฐ
df_selected = df_selected.set_index(['ํ','์ด๋ฆ'])
df_selected
ํํธ๋งต์ ์ฌ์ฉํ์ฌ ์๊ฐํ๋ฅผ ํ ๊ฒ์ด๋ค. ์ด ๋ ๋ฐ์ดํฐํ๋ ์์ values ๋ถ๋ถ์ ๋ชจ๋ ์ซ์ํ ๋ฐ์ดํฐ๋ก๋ง ๋์ด ์์ด์ผ ํ๋ค. ๋ฐ๋ผ์ ํ, ์ด๋ฆ ์ปฌ๋ผ์ index๋ก ๋ณ๊ฒฝํด ์ค๋ค.
import matplotlib
from matplotlib import font_manager, rc
import platform
import matplotlib.pyplot as plt
import seaborn as sns
# ์ด๋ฏธ์ง ํ๊ธ ํ์ ์ค์
if platform.system() == 'Windows': # ์๋์ฐ์ธ ๊ฒฝ์ฐ ๋ง์๊ณ ๋
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
else: # Mac ์ธ ๊ฒฝ์ฐ ์ ํ๊ณ ๋
rc('font', family='AppleGothic')
#๊ทธ๋ํ์์ ๋ง์ด๋์ค ๊ธฐํธ๊ฐ ํ์๋๋๋ก ํ๋ ์ค์ ์
๋๋ค.
matplotlib.rcParams['axes.unicode_minus'] = False
sns.heatmap(df_selected)
์กฐ๊ธ ๋ ์ค์ ์ ์ฃผ์ด ๋ณด๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ๋ณด์.
fig, ax = plt.subplots( figsize=(15,15) )
sns.heatmap(data = df_selected,
annot = True, fmt = '.3f',
cmap = 'Reds'
)
์งํ ๋นจ๊ฐ์์ผ ์๋ก ๋ณด๋ค ๋์ ์ถ๋ฃจ์จ์ ๊ฐ์ง๋ค. ์์ง์ ์ ๋ณ๋ก ๋ ์ํ ๊ฑด์ง ๋ชปํ ๊ฑด์ง ํ ๋์ ๋ณด๊ธฐ๋ ์ด๋ ต๋ค. ๋ฐ๋ผ์ ์์ฆ ์ ์ฒด ์ถ๋ฃจ์จ๊ณผ์ ์ฐจ์ด๋ฅผ ๊ตฌํ์ฌ ํ์ธํด ๋ณด์.
for col in df_selected.columns[1:]:
df_selected[col] = df_selected[col] - df_selected['์ถ๋ฃจ์จ']
df_selected['์ถ๋ฃจ์จ'] = 0.0
์์ฆ ์ถ๋ฃจ์จ๊ณผ ์๋ณ ์ถ๋ฃจ์จ์ ์ฐจ์ด๋ฅผ ๋ชจ๋ ๊ตฌํ ํ, ์์ฆ ์ถ๋ฃจ์จ์ ์ํฅ์ ๋ฐ์ง ์๊ฒ ํ๊ธฐ ์ํด ๋ชจ๋ 0์ผ๋ก ๋ฐ๊พธ์ด ์ค๋ค.
fig, ax = plt.subplots( figsize=(10,10) )
sns.heatmap(data = df_selected.head(50),
annot = True, fmt = '.3f',
cmap = 'RdBu_r'
)
๋นจ๊ฐ์์ด ์ง์ผ๋ฉด ์์ฆ ์ถ๋ฃจ์จ ๋ณด๋ค ๋์ ์ถ๋ฃจ์จ์ ๊ฐ๊ณ ์์ผ๋ฉฐ, ํ๋์์ด ์ง๋ค๋ฉด , ์์ฆ ์ถ๋ฃจ์จ ๋ณด๋ค ๋ ๋ฎ์ ์ถ๋ฃจ์จ์ ๊ฐ๊ณ ์์์ ์๋ฏธ ํ๋ค. ์๋ฅผ ๋ค์ด ํํ ์ต์ฌํ ์ ์๋ 3์ ์ถ๋ฃจ์จ์ด ์ฐ์ธํ๊ณ , KIA ์ ๋ฏผ์ ์ ์๋ 6์์ ๋นํด 7์์ ์์ฒญ๋ ์ถ๋ฃจ์จ ์์น์ ๋ณด์ธ๋ค. ๊ณ์ ์ ๋ฐ๋ฅธ ์ํฅ์ด ์๋์ง ๊ถ๊ธํ๋๋ฐ , (๋์ด ์ฌ๋ฆ์ฒ ์๋ ๊ธฐ๋ก์ด ์ค์ด๋๋ ๋ฑ ) ์ ์ ๋ง๋ค ๋ชจ๋ ๋ค๋ฅด๊ณ , ํ์คํ ํน์ ๋ฌ์ ์ถ๋ฃจ์จ์ด ๋์์ง๋ ์ ์๋ค์ด ์๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.