๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ
< ์ด์ ๊ธ >
https://silvercoding.tistory.com/53
[python ์๊ฐํ] 2. ์์ธ์ ๋ํผ์ ํํฉ ์ง๋ ๋ง๋ค๊ธฐ , ์ง๋ ์๊ฐํ ( folium ๋ผ์ด๋ธ๋ฌ๋ฆฌ )
๋ฌ๋์คํผ์ฆ ์์ ์ ๋ฆฌ < ์ด์ ๊ธ > https://silvercoding.tistory.com/52 [python ์๊ฐํ] 1. seaborn ๋ผ์ด๋ธ๋ฌ๋ฆฌ (distplot, relplot, jointplot, pairplot, boxplot, swarmplot, heatmap) ๋ฌ๋์คํผ ์์ ์ ๋ฆฌ..
silvercoding.tistory.com
์ฌ์ ์ง์
- ํ์จ : ํ๊ฒฉ์ ์ฑ๊ณตํด ์ด์๋๊ฐ๋ ์ ๋
= ํ๊ฒฉ ์ฑ๊ณต ํ์ / ํ๊ฒฉ ๊ธฐํ ์
= ์ํ ์ / ํ์
- ์ถ๋ฃจ์จ : ์ด์์ ๋๊ฐ๋ ์ ๋
= ์ง๋ฃจ ์ฑ๊ณต ํ์ / ์ง๋ฃจ ๊ธฐํ ์
= (์ํ+๋ณผ๋ท+๋ชธ์ ๋ง๋ ๋ณผ) / (ํ์+๋ณผ๋ท+๋ชธ์ ๋ง๋ ๋ณผ+ํฌ์ ํ๋ผ์ด)
- ์ฅํ์จ : ํ๊ฒฉ์ ์ฑ๊ณตํด ๋ฉ๋ฆฌ ์ด์๋๊ฐ๋ ์ ๋
= ์ง๋ฃจํ ๋ฒ ์ด์ค ์ / ํ๊ฒฉ ๊ธฐํ ์
= ๋ฃจํ ์ / ํ์
(ํ์จ์ ๊ฑฐ๋ฆฌ ๊ฐ๋ ์ถ๊ฐ : 2๋ฃจํ = 1๋ฃจํ x 2)
- OPS : ์ด์์ ๋ฉ๋ฆฌ ๋๊ฐ๋ ์ ๋
= ์ถ๋ฃจ์จ + ์ฅํ์จ
*** ๋ณธ ๊ธฐ์ด ์๊ฐํ ํ๋ก์ ํธ์์๋ ์ถ๋ฃจ์จ - ์ฅํ์จ - ops - ํ์จ ์ ๊ธฐ์ค์ผ๋ก best player ๋ฅผ ๋ถ์ํ๋ค. ***
๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ & ์ดํด๋ณด๊ธฐ
import pandas as pd
file = './data/KBO_2019_player_gamestats.csv'
raw = pd.read_csv(file, encoding = 'cp949')
๋ฐ์ดํฐ : KBO 2019 ์์ฆ ํ์ ๊ธฐ๋ก์ง ๋ฐ์ดํฐ (๋ฌ๋์คํผ์ฆ ์ ๊ณต)
raw.head()
ํ์ & ๊ฒ์ ๋ณ๋ก ๊ธฐ๋ก๋์ด ์๋ค.
raw.info()
raw.columns
์ฌ์ฉํ ์ปฌ๋ผ์ ๋ฝ๊ธฐ ์ํด ์ ์ฒด ์ปฌ๋ผ์ ์ดํด ๋ณธ๋ค.
columns_select = ['ํ', '์ด๋ฆ', '์์ผ','์ผ์', '์๋','ํ์','์ํ','ํ๋ฐ', '๋ฃจํ', 'ํ์ ','๋ณผ๋ท', '์ฌ๊ตฌ', 'ํฌ๋น']
data = raw[columns_select]
data.head()
์ํ๋ ์ปฌ๋ผ๋ง ๋ฝ์์ DataFrame์ ์์ฑํ๊ณ , data์ ๋ฃ์ด์ฃผ์๋ค.
KBO best player ๋ถ์ํ๊ธฐ
- ์ ์๋ณ ๊ธฐ๋ก ์ง๊ณ
data_player = data.pivot_table(index = ['ํ','์ด๋ฆ','์์ผ'],
values = ['ํ์','์ํ','ํ๋ฐ','๋ฃจํ','ํ์ ','๋ณผ๋ท','์ฌ๊ตฌ','ํฌ๋น'],
aggfunc = 'sum')
data_player
pivot_table ์ ์ฌ์ฉํ์ฌ ํ, ์ด๋ฆ , ์์ผ์ ๊ธฐ์ค์ผ๋ก ํ์, ์ํ, ํ๋ฐ, ๋ฃจํ, ํ์ , ๋ณผ๋ท, ์ฌ๊ตฌ, ํฌ๋น์ ์ด ํฉ๊ณ๋ฅผ ์ง๊ณํ๋ค.
data_player['ํ์'].hist()
ํ๋ค์ค์์ ๊ธฐ๋ณธ์ผ๋ก ๋ด์ฅ๋์ด ์๋ ์๋ฆฌ์ฆ.hist()๋ฅผ ์ฌ์ฉํ์ฌ ํ์์ ๋ถํฌ ์ดํด๋ณด๊ธฐ . ( ํ์๊ฐ ์ ์ ์ ์๋ฅผ ์ ์ธํ๊ธฐ ์ํด ์ด๋ ์ ๋๊ฐ ์ ์์ง ํ๋จํ๋ ๋ฐ ์ฌ์ฉ ) ๋ถํฌ๋ฅผ ์ดํด๋ณด๋, ํ์๊ฐ 50 ์ดํ์ธ ์ ์๋ฅผ ์ ์ธํ๋ฉด ์ ์ ํ ๊ฒ ๊ฐ๋ค.
cond = data_player['ํ์'] > 50
data_player = data_player[cond].reset_index() # ๋ค์ค ์ธ๋ฑ์ค --> ์ปฌ๋ผ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ
data_player
ํ์๊ฐ 50 ์ด๊ณผ์ธ ์ ์๋ค๋ง ์ถ๋ฆฌ๊ณ , ์์ํ ์ปจํธ๋กค์ ์ํด reset_index()๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค ์ธ๋ฑ์ค๋ฅผ ์ปฌ๋ผ์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค.
def cal_hit(df):
'''
- ํ์จ : ํ๊ฒฉ์ ์ฑ๊ณตํด์ ์ง๋ฃจํ๋ ๋น์จ --> ์ํ / ํ์
- ์ถ๋ฃจ์จ: ์ด์์ ์ง๋ฃจํ๋ ๋น์จ --> (์ํ+๋ณผ๋ท+๋ชธ์๋ง๋๋ณผ)/(ํ์+๋ณผ๋ท+๋ชธ์๋ง๋๋ณผ+ํฌ์ํ๋ผ์ด)
- ์ฅํ์จ : ํ์จ์ ์ง๋ฃจํ ๋ฒ ์ด์ค ๊ฐ์ค์น ์ถ๊ฐ --> ๋ฃจํ / ํ์
- OPS : ์ถ๋ฃจ์จ + ์ฅํ์จ
'''
df['ํ์จ'] = df['์ํ'] / df['ํ์']
df['์ถ๋ฃจ์จ'] = (df['์ํ'] + df['๋ณผ๋ท'] + df['์ฌ๊ตฌ']) / (df['ํ์'] + df['๋ณผ๋ท'] + df['์ฌ๊ตฌ'] + df['ํฌ๋น'])
df['์ฅํ์จ'] = df['๋ฃจํ'] / df['ํ์']
df['OPS'] = df['์ถ๋ฃจ์จ'] + df['์ฅํ์จ']
return df
๋ฐ์ดํฐํ๋ ์์ ๋ฃ์ด ์ฃผ๋ฉด best player ๋ฅผ ์ ์ ํ๋ ๊ธฐ์ค์ธ ํ์จ, ์ถ๋ฃจ์จ, ์ฅํ์จ, OPS ์ปฌ๋ผ์ ๊ณ์ฐํ์ฌ ์์ฑํ๋ ํจ์์ด๋ค.
player_stat = cal_hit(data_player)
player_stat
- ์ถ๋ฃจ์จ -> ์ฅํ์จ -> OPS -> ํ์จ ์์๋๋ก ์ ๋ ฌํ์ฌ best 10 player ๋ฝ์๋ณด๊ธฐ
player_stat = player_stat.sort_values(by = ['์ถ๋ฃจ์จ','์ฅํ์จ','OPS', 'ํ์จ'], ascending = False)
player_stat = player_stat.reset_index(drop = True)
player_stat.head(10)
์ธ๋ฑ์ค๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ์ผ๋ก ์ ๋ ฌ๋๋ฏ๋ก, reset_index()๋ฅผ ์ด์ฉํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์ ๋ ฌํด ์ค๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ถ๋ฃจ์จ์ ๊ธฐ์ค์ผ๋ก ํ KBO 2019 ์์ฆ best player๋ ๋ค์๊ณผ ๊ฐ๋ค.
player_stat['์ด๋ฆ'][:10]
ํ๋ณ ์ ์๋ค์ ์ถ๋ฃจ์จ ๋ถํฌ ์ดํด๋ณด๊ธฐ
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
์ฐ์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ธ์ ๋ ํ๊ธ์ด ๊นจ์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํฐํธ์ค์ ์ ํ๊ณ , ๋ง์ด๋์ค ๊ธฐํธ ํ์ ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ค.
- ํ ๋ณ ์ถ๋ฃจ์จ ๋ถํฌ ( boxplot & swarmplot )
sns.boxplot(data = player_stat, x = 'ํ', y = '์ถ๋ฃจ์จ')
๊ฐ์๋ ์ง๊ด์ ์ผ๋ก ๋ณด๊ธฐ ์ํด swarmplot์ ์ถ๊ฐ ํ๋ค.
sns.swarmplot(data = player_stat, x = 'ํ', y = '์ถ๋ฃจ์จ')
sns.boxplot(data = player_stat, x = 'ํ', y = '์ถ๋ฃจ์จ')
์๊น์ด ๊ฒน์น๊ธฐ ๋๋ฌธ์ boxplot์ ์ฌ๋ฌ ์ต์ ์ ์ฃผ์ด ๋ณด๊ธฐ ํธํ๊ฒ ๋ง๋ค์ด ์ค๋ค.
sns.swarmplot(data = player_stat, x = 'ํ', y = '์ถ๋ฃจ์จ')
sns.boxplot(data = player_stat, x = 'ํ', y = '์ถ๋ฃจ์จ',
showcaps=False, # ๋ฐ์ค ์๋จ ๊ฐ๋ก๋ผ์ธ ๋ณด์ด์ง ์๊ธฐ
whiskerprops={'linewidth':0}, # ๋ฐ์ค ์๋จ ์ธ๋ก ๋ผ์ธ ๋ณด์ด์ง ์๊ธฐ
showfliers=False, # ๋ฐ์ค ๋ฒ์ ๋ฒ์ด๋ ์์๋ผ์ด์ด ํ์ํ์ง ์๊ธฐ
boxprops={'facecolor':'None'}, # ๋ฐ์ค ์์ ์ง์ฐ๊ธฐ
)
์ด๋ ๊ฒ ํ๋ณ ์ ์๋ค์ ์ถ๋ฃจ์จ ๋ถํฌ๋ฅผ ํ์ธํด๋ณผ ์ ์๋ค. NC ํ์ด ๊ฐ์ฅ ๋์ ์ถ๋ฃจ์จ์ ๊ฐ์ง ์ ์๋ฅผ ๋ณด์ ํ๊ณ ์๊ณ , ์ถ๋ฃจ์จ์ด ๊ฐ์ฅ ๋ง์ด ๋ชฐ๋ ค ์๋ ํ์ LGํ์ธ ๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ฉฐ, ์ถ๋ฃจ์จ์ ์ค์์๊ฐ ๊ฐ์ฅ ๋์ ํ์ ๋์ฐ์ธ ๊ฒ ๋ฑ์ ํ ๋์ ์ ์ ์๋ค.
๋ง๋ฌด๋ฆฌ : csv ํ์ผ๋ก ์ ์ฅํ๊ธฐ
file = './data/player_stat.csv'
player_stat.to_csv(file, encoding = 'cp949', index = False)
๋ณธ ํฌ์คํ ์์ ๋ถ์์ ์ฌ์ฉํ player_stat์ csv ํ์ผ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค.