일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 백준 #파이썬 #알고리즘 #코딩테스트
- DFS
- java #자바 #동빈나
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- 재귀
- BFS
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- 파이썬
- 알고리즘
- 프로그래머스
- 백준
- PYTHON
- java #자바 #나동빈
- 백준 #알고리즘 #파이썬 #코딩테스트
- 투포인터
- css #웹 #생활코딩
- java #자바 #생활코딩
- react #리액트 #동빈나
- 파이썬 #백준 #알고리즘 #코딩테스트
- css #생활코딩 #웹
- java #자바
- 자바 #java
- 다익스트라
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 코딩테스트
- 다이나믹프로그래밍
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- dp
- Dijkstra
- 백트랙킹
Archives
- Today
- Total
커리까지
데이콘 - KBO 외국인 투수 스카우팅 최적화 경진대회 [연습]_02 본문
728x90
SMALL
만들었던 csv 불러오기
외국인역대성적 = pd.read_csv('kbo_yearly_foreigners_2011_2018_추가분.csv',encoding='utf-8-sig',engine='python',sep=',')
외국인역대성적.head()
- 지난번에 승_패를 저장했던 파일을 다시 불러온다.
- 그러면 이렇게 정상적으로 불러와진다. 현재 승,패가 같이 붙어있으니 따로 나눠서 승,패로 새로운 컬럼으로 넣어주자.
외국인역대성적['승'] = 외국인역대성적['2011년_승_패'].apply(lambda x:str(x).split(' ')[0])
외국인역대성적['패'] = 외국인역대성적['2011년_승_패'].apply(lambda x:str(x).split(' ')[1])
외국인역대성적.drop('2011년_승_패',axis=1,inplace=True)
공백으로 나눠서 0번째는 승, 1번째가 패이다. 그 다음에 원래있던 2011_승_패 컬럼을 제거했다.
그러면 승률과 경기수를 추가하자.
def winratio(x):
return round(int(x['승']) / (int(x['승'])+int(x['패'])),3)
외국인역대성적['승률'] = 외국인역대성적.apply(lambda x:winratio(x),axis=1)
외국인역대성적['경기수'] = 외국인역대성적.apply(lambda x:int(x['승']) + int(x['패']),axis=1)
- 이렇게 하면 승률과 관련된 정보들이 모였다.
승률과 경기수로 상위 10명, 하위 10명 알아보기
def headtail10(df,text):
display(df.sort_values(text,ascending=False).head(10))
print('*'*20,'head','*'*20)
display(df.sort_values(text,ascending=False).tail(10))
headtail10(외국인역대성적,['경기수','승률'])
- 경기수가 많다는건 팀에서 핵심 투수라는 건데 경기수가 낮은 투수들이 있었다. 경기수도 많으면서 승률이 높은 투수들의 특징이 무엇인지 분석하면 될 것 같다.
headtail10(외국인역대성적,['승률','경기수'])
- 상위권은 위랑 비슷하지만 하위권이 다르다. 경기수는 많지만 승률이 낮은 투수들이 있었다. 이것도 비교하면 좋겠다.
headtail10(외국인역대성적,['경기수'])
- 경기수가 적은 선수들이 과연 왜그럴까 생각해봤더니 방출가능성이 있었다. 그레서 방출된 선수들의 명단을 찾아서 정보를 날리기로 하였다. 방출된 선수들의 정보도 따로 보려고 한다.
방출 선수 찾기
- 외국인선수목록
- 여기서 그냥 찾아서 엑셀에 기록하였다.
방출선수들 세부기록 보기
throw_df = pd.read_csv('plus_win_lose_2.csv')
throw_df.head()
- 위에서 입력한 파일을 열었다.
throw_df_01 = throw_df[throw_df['방출연도'].isnull() == False].reset_index(drop=True)
throw_df_01['방출연도'] = throw_df_01['방출연도'].astype(int)
- 방출연도라는 새로운 컬럼을 위에서 만들었고 그 값이 null이 아닌 것들만 추려서 인덱스와 타입을 바꾸었다.
throw_df_01.describe()
패한 경기수가 더 많다.
era도 6.x대라 낮다고 볼 수 없다. 그러면 게임수로 나눠보자.
기록 용어 설명
용어이름 | 영문 풀이 | 한국용어 | 설명 |
---|---|---|---|
ERA | Earned Run Average | 평균자책점(방어율) | (9 × 자책점) ÷ 투구이닝 |
숫자가 낮을수록 좋으며 상대팀에게 얼마나 점수를 덜 주었는지 나타내는 지표 | |||
TBF | Total Batters Faced | 타자수 | 투수가 경기 중에 상대한 모든 타자의 수 |
H | Hits | 피안타 | 2루타, 3루타, 홈런을 포함 (각각 1개로 계산) |
HR | Home Runs | 홈런 | |
BB | Bases on Balls, Walks | 볼넷 | |
HBP | Hit By Pitch | 사구 | 몸에 맞는 볼 |
SO | Strike Outs | 삼진 |
throw_df_01[throw_df_01['경기수'] >= 10].describe()
- 10경기 이상 뛴 선수로 나눈 것은 어느정도 괜찮은 성적을 내고있다고 생각해서 그만큼 경기를 뛰었다고 생각했기때문이다.
- 기대만큼 다들 못해줘서 방출이라는 결과가 나온것 같다. 세부기록들은 다른 방출 안 된 선수들과 비교해보자.
throw_df_01[throw_df_01['경기수'] < 10].describe()
- 승률도 낮고 평균자책점도 높다.
throw_df[throw_df['pitcher_name'] == '마야']
- 이렇게 2년간 뛰다가 방출된 선수들도 있어서 비고해보기로 하였다. 확실히 2015년에 기록이 안좋아졌다.
playername = list(throw_df[throw_df['방출연도'].isnull() == False]['pitcher_name'])
- 그동안의 방출된 선수들의 명단을 리스트로 만들었다.
throw_df[throw_df['pitcher_name'].isin(playername) == True].sort_values(['pitcher_name','year'])
- 해가 지날 수록 기록이 어떻게 나빠졌는지 보기위해서 뽑아보았다.
2시즌 이상 뛰면서 나중에 방출된 선수들을 보면 승률이 떨어졌고 ERA도 높아졌다.
그러면 방출 안 된 선수들의 기록과 비교해보자.
throw_df[throw_df['방출연도'].isnull() == True].reset_index(drop=True).describe()
- 확실히 모든 면에서 달랐다. 세이브나 승률 , 승리를 위한 조건들이 방출 안 된 선수들의 기록이 더 좋았다. 세이브는 2배가량 차이가 났다.
- 방출 선수들의 외국기록들과 비교하여 어떤 이유로 스카웃했는데 어떤 기록이 나빠졌는지 꾸준히 뛴 선수들은 어떤 기록이 유지되었는지 보기로 하였다.
외국인메이저성적[외국인메이저성적['pitcher_name'].isin(playername) == True].sort_values(['pitcher_name','year'])
기록 용어 설명 2
위에 없는 것들만 추가하였다.
용어이름 | 영문 풀이 | 한국용어 | 설명 |
---|---|---|---|
WAR | Wins Above Replacement | 대체 선수 대비 승리 기여도 | 선수가 팀 승리에 얼마나 기여했는가를 표현하는 종합적인 성격의 스탯 |
가상의 대체선수와 비교하여 WAR 선수가 득점과 실점 억제에 얼마나 기여했는지를 구하고, 이를 승수로 바꿔 표현 | |||
WHIP | Walks Plus Hits Divided by Innings Pitched | 이닝당 안타 볼넷 허용률 | 피안타 수와 볼넷 수의 합을 투구 이닝으로 나눈 수치 |
BABIP | Batting Average on Balls In Play | 인플레이로 이어진 타구에 대한 타율을 계산하는 용어 | |
(총 안타수-홈런)/(타수-삼진-홈런+희생플라이) | |||
FIP | Fielding-Independent Pitching | 수비와 상관 없는 독립된 피칭 | |
수비와 관련된 모든 요소를 제외한 순수 기록 | |||
LD% | 라인 드라이브 | ||
GB% | 땅볼 | ||
FB% | 플라이볼 | ||
IFFB% | In Field Fly Ball | 내야팝업 | IFFB/FB |
SwStr% | 헛스윙률 | 전체 투구 대비 헛스윙 비율 | |
스윙 대비 헛스윙 비율과 혼동되서는 안 됨 | |||
Swing% | 전체 피칭에 대한 타자의 스윙 비율 | ||
공을 던졌을 때 스윙비율(헛스윙 비율x) |
- 이렇게 외국메이저 성적을 보고 어떤 점이 돋보이고 한국이랑 비교해서 어떤 스탯이 감소하였는지 보자.
- 잘던지는 선수가 당연히 모든 팀에 필요하다. 구속과 제구력을 갖추었으면 금상첨화다.
니퍼트 비교해보기
- 메이저성적
외국인메이저성적[(외국인메이저성적['pitcher_name'].isin(playername) ==False)\
& (외국인메이저성적['pitcher_name'] == '니퍼트')].sort_values(['pitcher_name','year'])
- 한국성적
throw_df[throw_df['pitcher_name'] == '니퍼트']
kbo에 와서 ERA나 SO가 좋아졌다.
메이저 경기수가 없어서 우선 외국인스탯캐스터를 이용해서 경기수를 채워려고 한다. 단순 수치비교보다는 경기수까지 포함해서 보는게 좋을 것 같다. 또한 우승 여부도 넣으면 좋을것 같다.
구속이 마일라서 km로 변경하였다.
외국인스탯캐스터['km변환'] = 외국인스탯캐스터['release_speed'].apply(lambda x:round(x*1.609344,0))
- 구속이 가장 빠른 투수를 찾아보았다.
외국인스탯캐스터.groupby('pitcher_name',as_index=False).agg({'km변환':'mean'}).sort_values('km변환',ascending=False)
얼추 들어온 선수들의 이름이 있다.
이쯤에서 궁금해졌다. 과연 감독들은 어떤 투수를 원할까?
- 6이닝 이상은 던져워서 불펜들을 쉴 수 있게 하는 투수
- 팀과 융화되는 선수
-
구속이 빠르다고 좋은게 아니다. 구위, 구종까지 갖추어야 살아남는다.
장타보다는 단타
높은 릴리즈 포인트
본인의 장점을 적절히 섞고 안 되는건 고치고 다음해에 다른 무기를 장착해온 선수
위닝샷이라고 불리는 결정구를 가진 선수
커맨드를 겸비한 투수
커맨드란 좋은 스트라이크(good strike) 또는 경우에 따라 존 바깥의 원하는 곳으로 원하는 구질의 공을 던지는 능력
출처: https://baseball-in-play.com/52 [Baseball-in-Play]
728x90
LIST
'프로젝트 > KBO 외국인 투수 스카우팅 최적화 경진대회' 카테고리의 다른 글
데이콘 - KBO 외국인 투수 스카우팅 최적화 경진대회 [연습]_04 (0) | 2021.04.02 |
---|---|
[SVM] 서포트 백터 머신이란? (0) | 2021.03.19 |
데이콘 - KBO 외국인 투수 스카우팅 최적화 경진대회 [연습]_03 (0) | 2021.02.17 |
파이썬 문자열을 변수로 호출하기 (0) | 2021.01.10 |
데이콘 - KBO 외국인 투수 스카우팅 최적화 경진대회 [연습] (0) | 2021.01.04 |
Comments