Sqix

OWL Statistics : 세이버매트릭스에서 공격 기여에 대한 공부 - EqA 본문

OWLMetrics - 오버워치 세이버메트릭스

OWL Statistics : 세이버매트릭스에서 공격 기여에 대한 공부 - EqA

Sqix_ow 2020. 4. 24. 21:28

inning.co.kr에 작성된 niceguys 님의 글(http://www.inning.co.kr/board/bbs/board.php?bo_table=inning_midnight&wr_id=39397&page=46)을 통해 EqA를 공부하였습니다.

 

EqA는 "어느 정도 타자들을 데려와야 투수가 평균적인 상황에서 5할 승률의 게임을 할 수 있는가"를 나타냅니다.

 

EqA는 가장 정밀한 타자의 공격요소에 대한 지표 중 하나라고 볼 수 있습니다. 상당히 합리적인 지표로, 구장에 대한 보정, 리그 수준에 대한 보정, 리그의 성향에 대한 보정, 주루플레이에 대한 보정이 모두 들어가고 세이버에서 중요시 여기는 출루율과 장타율에 대한 스탯을 기반으로 스탯이 짜여집니다.

 

기본적으로 EqA는 리그 평균 득점이 4.65점일 때를 가정하여 짜여집니다.

 

MLB에서는 타율 출루율 장타율 .260, .340, .420을 기준으로 하네요.

KBO는 이보다 조금 낮은 타율 .255 정도를 잡네요. 비교적 스몰볼이라 그런가 봐요.

 

1. RawEqA

 

EqA를 구하기 위해서는 많은 과정을 거칩니다. 가장 첫 단계인 RawEqA(OPS 수정본)부터 알아봅시다.

 

RawEqA는 3가지 요소를 합한 스탯입니다.

 

출루 부분 : (안타 + 볼넷 + 사구) / (타석 + 볼넷 + 사구 + 희생번트 + 희생플라이)

진루 부분 : (루타 + 0.5 * (볼넷 + 사구) + 희생번트 + 희생플라이 - 고의사구/2) / (타석 + 볼넷 + 사구 + 희생번트 + 희생플라이)

주루 부분 : (1.5 * 도루성공) / (도루실패 + 도루성공)

 

이를 조합해서 나타낸 RawEqA는 다음과 같습니다.

 

안타 + 루타 + 1.5*(볼넷 + 사구 + 도루) + 희생번트 + 희생플라이 - 고의사구 / 2) / (타석 + 볼넷 + 사구 + 희생번트 + 희생플라이)

 

RawEqA는 간단하게 OPS에 주루 요소를 추가한 것이라고 볼 수 있습니다.

 

2. UEQR

 

다음 단계에서는 UEQR(득점 생산력에 대한 정교한 지표)를 계산합니다.

 

가장 먼저, xmul을 계산하기 되는데, 이는 파크 팩터(PF)와 1경기 27아웃, 각 5득점, 총 40타석을 기준으로 리그가 보여주는 성향을 나타내는 계수입니다. 2를 기준으로 잡고, 총 40타석이므로 타석당 0.125점 이상을 가져간다면 xmul은 2보다 작게 됩니다. 

 

xmul을 구하는 공식은 다음과 같습니다.

 

2 * (0.125 ÷ Park Factor ÷ Log(득점 ÷ 타석))

 

이후 타자의 타석당 득점력을 의미하는 EQAADJ를 구해야 합니다. 해당 수치는 구장의 효과, 선수의 조정 OPS, 리그의 수준을 반영하여 선수가 제공하는 득점력을 정교하게 나타내줍니다. 공식은 다음과 같습니다.

 

xmul * (RawEqA ÷ Log(RawEqA)) * ((1+1÷(리그 수준 조정계수)) ÷ 2) + (1 - xmul)

 

선수의 득점력을 먼저 구장 조정계수를 통해 조정하고, 이를 다시 리그수준에 따른 조정계수(메이저리그는 보통 1로 고정)를 통해 조정합니다. 

 

구해진 EQAADJ에 타석 수와 Log(득점 / 타석 수)를 구하면 이 값이 바로 UEQR, 득점생산지표가 나옵니다.

 

3. WINPCT

 

이제 이 값들을 바탕으로 기대승률을 구해 봅시다. 기대승률의 값은 9명의 리그 평균 수준의 타자들이 타선을 이룰 떄의 득점력인 AVGTM과, 8명의 리그 평균 수준의 타자들과 특정 수준의 타자로 타선을 이룰 때의 득점력인 TMPLUS라는 수치를 이용합니다.

 

AVGTM은 리그 전체적인 수치를 이용하게 됩니다. 9이닝당 득점과, 경기 출장수, 구장 효과를 이용합니다. 공식은

 

Log(득점 ÷ 타석 수) * Log(타석 수 ÷ 9(이닝)) * 파크 팩터(PF) * 경기 출장수

 

입니다.

 

TMPLUS는 여기서 1명의 타자를 특정 타자로 대체하고, 평균수준의 타자를 1명 빼 줍니다. 공식은

 

AVGTM + UEQR - Log(R / PA) * 타석 * 구장 효과

 

입니다.

 

이제 위 값들을 이용한 피타고리안 기대승률에서의 멱지수(W^n / (W^n + L^n)에서의 n)를 계산하는 공식입니다.

 

pyexp = ((TMPLUS + AVGTM) ÷ 경기 출장수) ^ 0.285

 

위 pyexp를 통해 특정 선수가 리그 평균 타자 8명과 리그 평균 투수진을 가지고 게임을 했을 때의 기대승률을 나타낼 수 있습니다. 여기서, 우리 팀 투수진이 리그 평균 수준이기 때문에 우리 팀의 실점은 리그 평균 득점과 동일해 집니다.

 

기존 W^pyexp ÷ (W^pyexp + L^pyexp)를 리그 평균 득점으로 나누어주게 된다면 다음과 같은 공식이 나옵니다.

 

WINPCT = ((TMPLUS ÷ AVGTM)^pyexp) ÷ (1 + (TMPLUS ÷ AVGTM)^pyexp)

 

4. EqR, EqA

 

 

먼저 득점 효율을 표현해 주기 위해서 NEWTM이라는 지표가 등장합니다. 공식은

 

(WINPCT ÷ (1- WINPCT))^0.5

 

입니다. 이는 승률이 5할인 팀에서 해당 선수의 공격지표가 반영된다면, 해당 팀의 득점효율이 얼마나 증가하는가를 나타냅니다. 예를 들어 5할 승률팀이면 WINPCT는 0.5이고, NEWTM은 (0.5 / 0.5)^0.5 = 1이 나올 것입니다. 

 

EqR은 Equivalent Runs로, 등가화한 득점이라고 해석되며 이는 리그의 성향(타고투저, 투고타저)에 관계없이 이를 투타 균형을 이룬 시즌의 득점 상태로 등가화시키는 공식입니다. 승률이 5할인 팀을 기준으로 잡으면 이들은 평균 득점 및 실점 역시 시즌 평균득점인 4.65점이 되겠죠. 그럼 아웃카운트당 득점과 실점은 4.65 / 27 = 0.17235가 될 겁니다.

 

EqR은 0.17235 * ((NEWTM - 1) * 27 * Games + 아웃 이라는 공식으로 표현합니다.

 

리그 수준, 구장, 리그 성향, 선수 스탯 전부 보정된 기대승률인 WINPCT가 사용되며, 이는 해당 선수가 리그 평균인 아웃카운트당 0.17235점보다 얼마나 많은 점수를 내는지를 나타냅니다. 계속 언급드리지만 bias가 보정되었기 때문에 영향을 받는 요소로부터 등가화가 된 수치입니다.

 

EqA는 (EqR ÷ 5 ÷ 아웃)^0.4로 표현합니다. 이는 득점과 타율의 관계라고 합니다.(이 부분은.. 이해가 잘 안되네요, EqR이 득점 효율이고, Run/Out 기반 스탯이기 때문에 Out 관련 보정값을 넣어 타율로 치환한게 아닐까 하는 생각이 듭니다.)

 

 

- 배울 점

 

 

이 스탯에서는 보정 계수가 가장 중요한 요소가 될 것 같습니다. 

 

 

□ RawEqA

 

=> 야구에서의 출루 요소, 진루 요소, 주루 요소는 오버워치에서 "팀에게 기회를 주는 것"과, "주어진 기회에서 활약을 하는 것", 그리고 "팀의 기회요소를 날리지 않는 것" 정도로 변환이 가능할 것 같다.

=> "팀에게 기회를 주는 요소"는 팀을 유리한 상황으로 이끄는  솔로 킬, 궁극기를 사용한 킬, 스킬 효율성(ex : 수면총, 퍼플, 디바와 시그마의 궁극기 차단 등) 정도

=> "주어진 기회에서의 활약"은 주어진 딜각에서, 힐각에서, 혹은 상대의 딜각에서 자기 역할을 얼마나 잘 수행하는지이므로, 이는 에임(명중률, 치명률, 직격률 등), 데미지량, 힐량, 막은 방벽량 등으로 나타낼 수 있을 것이다.

=> "팀의 기회를 지켜주는 것"은, 오버워치에서 생존을 의미한다고 생각한다.

=> 특히 스킬 관련 요소는 나머지 2개 요소보다 값이 작으니 적절한 보정값을 주어야 하겠다.

 

□ Xmul

 

=> 오버워치는 구장 개념이 아닌, 맵 혹은 전장 타입(Hybrid, Escort, Assault, Control 등)에 대한 보정값을 준다.

=> 또한, 영웅별 스킬 효율성과 궁극기 효율성, 막은 피해량, 가한 데미지량 등에서 전체적인 보정을 해야 할 것이다.

=> 윗줄은 오버워치 리그의 전체 영웅에 대한 10분당 스탯을 종합해서 특정 기준을 정하고, 이를 통한 보정을 한다.

 

□ diffic

 

=> 리그의 수준인데, 오버워치 리그와 컨텐더즈를 리그 간 격차로 나타낼 수 있는 요소가 무엇일까?

 

□ pyexc

 

=> 리그에서 전체적으로 나타나는 데미지량, 힐량, 킬 등을 기준으로 해서 모든 스탯의 기준치를 보정해야 할 것.

=> 경기에서 이벤트가 발생한다는 것은 주로 "확정 킬"이 나오는 것을 의미한다. 피타고리안 승률을 적용할 수 있는 지표가 야구에선 득점이었다면, 오버워치 리그에선 "Final Blows"임을 가정하고 한 번 계산을 해 보자.

=> 그렇다면 힐러, 탱커들의 각 지표들이 Final Blows와 어떠한 Correlation을 가지는지를 계산해 보아야 할 것이다.

=> OWL의 데이터들은 대부분(검증해보지 못한 요소들은..배제) 정규분포를 따르기 때문에, 피어슨 계수와 P-value를 이용해서 Final Blows와의 상관관계를 따져 보고 이를 통한 지표 설정을 하면 되지 않을까?

 

EqA, EqR

 

=> 리그 평균 50%의 승률을 내려면 필요한 Key Statistics는?

=> 오버워치 리그는 선수들이 팀당 6명, 그러나 DPS와 Tank, Heal이 나눠졌기 때문에 6으로 분할하는건 좋지 않다.

=> 탱커, 힐러, DPS의 FB를 잡고 이를 분배할 필요가 있겠다.

=> 이 지표는 Run/Out인데, 그렇다면 Final Blows와 deaths를 기반으로 하여 나타내야겠다.

=> First Blood와 First Death를 클러치 요소로 잡고 가중치를 주어야 할 것 같다. (Teamfight랑 Match데이터 공개좀...)

=> Kill과 Death, 그리고 승률의 관계를 나타내는 수식 역시 필요하다.

Comments