λ¬λμ€νΌμ¦ μμ μ 리
< μ΄μ κΈ >
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 νμΌλ‘ μ μ₯νλ λ°©λ²μ΄λ€.