|
출처: 고슴도치 탁구클럽 원문보기 글쓴이: 혜화동 둥이아빠
여기서 rate, rating 을 우리말로 표현하면 문맥이나 상황에 따라 순위, 랭킹, 등급, 점수 등으로 해석될 소지가 있으나,
여기서는 한 선수가 다른 경쟁선수들에 비해 우월하거나 열등함을 정량적인 수치를 통해 비교하기 때문에 '레이팅 점수'로
표현하고자 합니다.
Glicko 시스템은 단순히 순위를 말하기 보다 신뢰구간 형태로 한 선수의 성적을 요약하는 데 매우 효과적이라 합니다.
이렇게 하는 한 가지 방법으로 95% 신뢰구간을 들수가 있습니다.
이 신뢰구간에서 가장 낮은 값(하한치)은 레이팅 점수에서 2 x RD(편차) 를 뺀 값이 되고, 가장 큰 값(상한치)은
레이팅 점수에서에 2 x RD 를 더한 값이 됩니다.
예를 들면, 한 선수의 레이팅 점수가 1850 이고, 레이팅 점수 편차(RD) 가 50 일 때, 95% 신뢰구간은 1750 ~ 1950 사이가
됩니다. 이럴때 우리는 이 선수의 실제 경기 성적을 1750 부터 1950 사이가 될 것이라고 95% 확신할 수 있게 됩니다.
그리고, 한 선수가 낮은 RD(편차) 값을 갖는다면, 이는 매우 좁은 형태의 변동 구간을 갖는다고 95% 확신하게 됩니다.
그래서 Glicko-2 시스템에서 중요한 것은 바로 이 RD(편차) 값이며, 리그전을 하면 할 수록 이 RD 값은 점점 작아지게
됩니다. 즉, 그 선수의 레이팅 점수 등락폭이 어느 정도 일정하게 좁혀진다라고 말할 수 있습니다.
만약, 어떤 선수가 리그전 참여를 잘 안하게 되면 이 RD(편차) 값은 오히려 증가할 수도 있습니다.
레이팅 변동률(rating volatility, sigma) 수치는 한 선수의 레이팅 점수가 오르 내리는 등락의 정도를 나타낸다.
예를 들어 한 선수가 슬럼프에 빠졌다가 그 후에 어느 누구도 예상치 못할 정도의 우수한 성적을 냈다고 했을 때
즉, 불규칙한 경기 성적을 보였다면, 그 선수의 레이팅 변동률 수치는 매우 높고, 반대로 일관되게 좋은 성적이든
나쁜 성적이든 꾸준한 성적을 보인다면 레이팅 변동률 수치는 상대적으로 작게 됩니다.
공식
레이팅 알고리즘을 적용하기 위해서는 레이팅 기간(보통 리그전)에 진행된 모든 게임의 결과가 필요합니다.
모든 선수들은 레이팅 기간 시작시에 직전 리그전 결과로 산출된 또는 초기값의 레이팅 점수, RD(편차),
volatility(레이팅 변동률) 값을 갖게 되고, 모든 게임 결과는 집계되어 종료시 최종적으로 이 값들을 갱신하게 됩니다.
Glicko-2 시스템은 레이팅 기간의 게임이 점점 많아질수록(보통 한 레이팅 기간 동안 한 선수당 적어도 10~15 게임
정도가 바람직) 가장 효과적으로 동작한다고 합니다. 보통 동호회 리그전은 무핸디 풀리그로 인한 시간 제약이 있기
때문에 레이팅 기간의 전체 게임수, 세트수 등은 경기 운영자나 관리자의 재량에 따라 진행하면 됩니다.
이 Glicko-2 시스템은 세트 득실수가 공식에 사용되지 않고, 오직 승/패/무승부(사실상 탁구에서는 무의미)만
반영되기 때문에 풀리그를 시간 제약상 3세트 2선승제로 해도 상관은 없습니다. 이 시스템에서 중요한 것은
어떤 레이팅 점수를 갖고 있는 누구와 경기해서 승/패를 했는지가 중요합니다. 물론, 레이팅만을 위하는 게 아니라
상대전적 등을 추가로 관리하려면 당연히 세트 득실수까지 필요하겠죠?
Glicko-2 레이팅 scale(규모)는 초기 Glick 시스템의 것과는 좀 다르지만, 공식을 통해 이 두가지 scale 사이에서
왔다갔다 할 수 있습니다.
다음의 각 단계는 초기 Glicko 기반의 scale 로 시작하여 공식을 통해 Glicko-2 scale 로 변환하고, 최종적으로 다시
초기 Glicko scale로 변환하여 레이팅 점수를 산출하는 알고리즘입니다.
1단계
레이팅 기간(리그전)이 시작될 때, 각 선수들의 초기 레이팅 점수, RD(편차)를 설정 또는 확인합니다.
Glicko 시스템의 상수값(타우,tau)을 설정합니다. 이 상수값은 volatility(레이팅 변동률) 변화 정도를 결정합니다.
이 상수값은 예측 정확도를 높이기 위해 테스트를 통해 얻어져야 하지만, 보통 0.3 ~ 1.2 사이가 됩니다.
이 값이 작으면 volatility(레이팅 변동률) 수치가 크게(심하게) 변하는 것을 막아줍니다.
즉, 결코 일어날 거 같지 않은 게임 결과가 나왔다면, 이 상수값은 가능한 작은 값으로 설정하면 됩니다.(최소값은 0.2)
(a) 만약 어떤 선수가 아직 레이팅이 정해지지 않은 신규 선수라면, 초기 레이팅 점수는 1500 으로 설정하고, RD(편차)는
350 으로 설정합니다. 그리고, volatility 는 경우에 따라 다르지만, 보통 0.06 으로 설정합니다.
(b) 만약 기존 선수라면, 그 선수의 가장 최근의 rate, RD, volatility 를 사용합니다.
2단계
각 선수들에 대해 레이팅 점수 r 과 RD(편차) 값을 Glicko-2 scale 로 변환합니다. volatility(레이팅 변동률, sigma)와
상수값(tau)는 변하지 않습니다.
신규 선수라면 Glick scale 기준의 레이팅 점수 r 은 1500 이므로, Glicko-2 scale 로 변환된 레이팅 점수 뮤(mu) 값은
0 이 되고, RD(편차) 값은 Glico-2 scale 로 변환된 파이(phi)는 RD(편차) 초기값이 350 이므로 2.014762 가 됩니다.
|
Glicko |
Glicko-2 |
r → mu |
1500 |
0 |
RD → phi |
350 |
2.014762 |
sigma = 0.06
tau = 0.75
한 선수는 총 m 명의 선수(각각이 변환된 레이팅 점수 mu 1,mu 2,...,mu m과, 변환된 편차 phi 1,phi 2,...,phi m을 가짐)와
경기를 합니다.
각 경쟁선수와의 경기결과 점수는 s 1,s 2,...,s m 이라고 한다.(승리는 1, 무승부는 0.5, 패는 0)
탁구에서 무승부는 있을 수 없으므로 사실상 승리는 1점, 패하면 0점 입니다. 위에서도 언급했지만, 이 Glicko-2 시스템은
세트 득실수가 사용되지 않고 단순히 경쟁선수(레이팅 점수, 레이팅 편차)에게 승리를 하였는지, 패했는지가 레이팅 점수에
사용됩니다. 경쟁선수의 volatility(레이팅 변동률, sigma) 는 이 계산에 관여하지 않습니다.
3단계
이제, 경기 결과만으로 선수의 잠정적인 변동값(estimated variance) v 를 계산합니다.
자신을 제외한 경쟁선수들은 j=1 .. m 으로 표기한 것이며, 자신의 Glicko-2 scale 레이팅 점수는 mu 로 표기합니다.
아래 수식을 보면 자신의 변환된 레이팅 점수와 경쟁선수의 레이팅 점수가 동일하다면 전체 변동값 v 에는 영향을
주지 않게 됩니다.
4단계
4단계에서는 이전 리그전 레이팅 점수 대비 이번 경기 결과의 레이팅을 짐작해 볼 수 있는 잠정적인 레이팅 개선치
(estimated improvement) delta(델타) 값을 구합니다. 아래 식에서 s 값은 각 게임의 승/패 점수를 의미합니다.
5단계
이제 좀 복잡한 과정을 거쳐 새로운 volatility(레이팅 변동률,sigma) 를 계산해야 합니다. 이 계산은 재귀호출로 계산됩니다.
사실 이 부분의 재귀호출 부분에서 버그가 발견되어 2012년 2월 22일에 보완되었고 지금 현재는 안정적이라고 합니다.
Glickman 교수가 처음 고안할 때 사용한 알고리즘은 "Newton-Raphson 알고리즘"이었는데, 어떤 경우에는 값을 제대로
계산하지 못하더라는 걸 알고, 보다 안정적으로 이 값을 구하기 위해 이른바 "Illinois 알고리즘"을 적용하였다고 합니다.
6단계
새로운 rating deviation(phi, 파이)을 업데이트 합니다.
7단계
이제 위에서 계산한 값들을 이용하여 새로운 rating 과 RD 값을 업데이트 합니다.
8단계
7단계에서 나온 Glicko-2 scale rating 과 RD 값을 다시 원래 Glicko scale 로 변환하면 최종적으로 완료됩니다.
만약, 선수가 레이팅 기간(리그전) 부상이나 사정으로 인해 경기에 참여하지 못하게 되면, 6단계만 적용하게 됩니다.
이 경우에는 그 선수의 레이팅과 volatility 는 변하지 않으며, 다만 RD 값이 아래 공식에 따라 증가하게 됩니다.
이제까지 Glicko-2 레이팅 시스템의 핵심 알고리즘에 대해 알아보았습니다.
어떻게 보면 어렵고 복잡하기도 하고, 어떻게 보면 조금 쉽기도 합니다.
그럼, 여기까지 잘 따라와 주신 분들을 위해 예제를 통해 이 레이팅 시스템으로 본 한 선수의 레이팅 점수를
알아보도록 하겠습니다.
예제
홍길동이라는 생활체육 탁구선수가 있습니다. 아직 리그전에 참여하지 않아서 이 선수의 레이팅 점수는 기본 1500 점입니다.
그런데, 주말에 동네 탁구장에 가서 3명의 아마추어 동호인과 리그전을 했다고 합니다.
A 선수는 레이팅 점수가 1400, B 선수는 1550, C 선수가 1700 점이라고 합니다.
3게임을 한 결과, A 선수에게는 운좋게도 하수였는지 이겼고, 나머지 선수들에게는 모두 졌다고 합니다.
그리고, 자신의 RD(편차, rating deviation) 는 200, 나머지 선수는 각각 30,100,300 이라고 합니다.
홍길동 선수의 volatility(레이팅 변동률,sigma) 는 0.06 이고, 시스템 상수인 타우(tau)는 0.5 라고 할 때,
첫 리그전을 치른 홍길동 선수의 새로운 레이팅 점수는 얼마일까요?
풀이
먼저 주어진 값들을 확인합니다.
홍길동 선수의 Glicko 값들은 다음과 같습니다.
r = 1500
RD = 200
sigma = 0.06
tau = 0.5
s 1 = 1
s 2 = 0
s 3 = 0
우리에게 익숙한 스코어 보드로 표현하면 다음과 같습니다.(세트 득실은 제외)
색깔로 칠해진 부분은 경기를 안했다고 가정하였습니다.
이 Glicko scale 의 값들을 이제 Glicko-2 scale 의 값들로 변환을 합니다.
mu = 0
phi = 1.1513
그리고 각 경쟁선수들에 대해 다음과 같은 값들로 표시합니다.
j |
mu j |
phi j |
g(phi j) |
E(mu, mu j, phi j) |
s j |
1 |
-0.5756 |
0.1727 |
0.9955 |
0.639 |
1 |
2 |
0.2878 |
0.5756 |
0.9531 |
0.432 |
0 |
3 |
1.1513 |
1.7269 |
0.7242 |
0.303 |
0 |
이 값들을 이용하여 v 값과 delta 값을 구합니다.
v = ( [ (0.9955)^2(0.639)(1-0.639) + (0.9531)^2(0.432)(1-0.432) + (0.7242)^2(0.303)(1-0.303) ] ) ^ -1 = 1.7785
delta = 1.7785(0.9955(1-0.639) + 0.9531(0-0.432) + 0.7242(0-0.303)) = -0.4834
5단계의 재귀호출 과정을 거쳐 새로운 sigma 값은 0.05999 가 됩니다.
이제 6단계의 새로운 rating deviation(phi, 파이)을 계산하면 1.152862 가 나옵니다.
다음으로 7단계의 Glicko-2 scale 의 새로운 mu 값과 phi 값을 구합니다.
new phi = 0.8722
new mu = -0.2069
마지막으로 위 값을 Glicko scale 로 다시 변환하면 끝나게 됩니다.
new rating = -0.2069(173.7178) + 1500 = 1464.06
new RD = 0.8722(173.7178) = 151.52
초기에 홍길동 선수의 레이팅 점수는 1500 점이었고, RD 값은 200 이었습니다.
첫 리그전을 치르고 나니 홍길동 선수는 첫 경기는 이겼지만, 나머지 두경기를 모두 지는 바람에 기본 점수 1500점에서
내려간 1464.06 으로 점수가 정해지게 됩니다. 물론, 리그전을 시작했기 때문에 RD 값도 역시 당연히 처음 200 보다 작아지게
되었습니다.
나머지 선수들에 대해서도 이와 같은 방법으로 레이팅 점수를 계산할 수 있습니다.
PHP 프로그래밍을 통한 시뮬레이션
자, 그렇다면 이 Glicko-2 레이팅 알고리즘을 알았으니 이게 정상적으로 동작하는지, 또 보다 용이하게 적용하기 위해
서버 프로그래밍 언어인 PHP를 통해 구현해 보았습니다.
인터넷 상에서 공개된 알고리즘 중에 다행히 제가 아는 PHP 언어의 라이브러리가 있어서 이 라이브러리를 다운 받을수
있었습니다.
그렇지만, 이게 완전한 소스코드가 아니기에 시뮬레이션이나 웹으로 구현하기 위해서는 이 라이브러리에 몇가지 기능들을
구현해 주어야 합니다.
예를 들면, 탁구선수 A를 생성하는 부분과 초기 값을 할당해주는 부분, 그리고 각 경쟁선수와의 게임결과(승/패)를
등록할 때 입력자의 실수를 방지하기 위한 예외처리 기능(특히, A가 B에게 이겨서 score 를 1로 할당해줘야 하는데,
B가 A에게도 이겼다고 실수로 1로 할당하는 경우가 종종 발생하게 되며, 이를 시스템적으로 먼저 등록한 것을 정상이라고
간주할지, 아니면 나중에 등록한 것을 정상이라고 간주할지, 아니면 입력자에게 어느 것이 맞는지 확인할 때 까지 입력을
보류하는 기능), 각 선수들의 리그전 시작전의 상태값 출력, 리그전 후의 변화된 상태값 출력하는 기능 등을 추가로 구현해
주어야 그나마 아주 기본적으로 이 Glicko-2 레이팅 시스템을 시뮬레이션 해볼수 있게 됩니다.
다음은 위 예제를 프로그램으로 개발하여 시뮬레이션 한 결과입니다. 물론, 위 예제의 풀이에서 보는 것과 동일한 결과를
가져왔으니 프로그램이 정상적으로 동작한다고 봐야겠죠?
편의상 홍길동은 Alice 로 하였습니다.
[root@ home]# /usr/bin/php glicko2_v4.php
Player = Alice
==================================
rating = 1500.00000
rate deviation = 200.00000
mu = 0.00000
phi = 1.15129
sigma = 0.06000
tau(constant) = 0.50000
Player = Bob
==================================
rating = 1400.00000
rate deviation = 30.00000
mu = -0.57565
phi = 0.17269
sigma = 0.06000
tau(constant) = 0.50000
Player = Charlie
==================================
rating = 1550.00000
rate deviation = 100.00000
mu = 0.28782
phi = 0.57565
sigma = 0.06000
tau(constant) = 0.50000
Player = David
==================================
rating = 1700.00000
rate deviation = 300.00000
mu = 1.15129
phi = 1.72694
sigma = 0.06000
tau(constant) = 0.50000
Player = Alice
==================================
[1] Alice : Bob, result = 1.0
[2] Alice : Charlie, result = 0.0
[3] Alice : David, result = 0.0
==================================
Wins = 1 Loss = 2 Draw = 0 ==> Score = 4
==================================
Player = Alice
==================================
rating = 1464.05067 <=== 기본 1500 에서 시작함
rate deviation = 151.51652 <=== 기본 RD 값이 200 에서 시작함
mu = -0.20694
phi = 0.87220
sigma = 0.06000
tau(constant) = 0.50000
Player = Bob
==================================
[1] Bob : Alice, result = 0.0
==================================
Wins = 0 Loss = 1 Draw = 0 ==> Score = 1
==================================
Player = Bob
==================================
rating = 1398.14356 <=== 리그 시작전 1400
rate deviation = 31.67022 <=== 리그 시작전 30
mu = -0.58633
phi = 0.18231
sigma = 0.06000
tau(constant) = 0.50000
Player = Charlie
==================================
[1] Charlie : Alice, result = 1.0
==================================
Wins = 1 Loss = 0 Draw = 0 ==> Score = 2
==================================
Player = Charlie
==================================
rating = 1570.39474 <=== 리그 시작전 1550
rate deviation = 97.70917 <=== 리그 시작전 100
mu = 0.40522
phi = 0.56246
sigma = 0.06000
tau(constant) = 0.50000
Player = David
==================================
[1] David : Alice, result = 1.0
==================================
Wins = 1 Loss = 0 Draw = 0 ==> Score = 2
==================================
Player = David
==================================
rating = 1784.42179 <=== 리그 시작전 1700
rate deviation = 251.56556 <=== 리그 시작전 300
mu = 1.63726
phi = 1.44813
sigma = 0.06000
tau(constant) = 0.50000
현장에서 전국 단위로 적용되기 위해 고려되어야 할 사항
지금 현재는 이 알고리즘을 프로그램 레벨에서 정상적으로 동작하는지만 확인하였으며, 현장에서 전국 단위로 실행되기
위해서는 많은 허들을 풀어야 할 것으로 생각됩니다.
[ 레이팅 점수가 의미하는 실력 수준의 대표성 측면 ]
만약 어떤 선수가 쉬운 상대가 많은 그룹에서만 리그전을 하고 이를 통해 나온 레이팅 점수는 그렇지 않은 그룹에서
활동하는 선수의 레이팅 점수와 서로 객관적으로 비교할 수 없게 됩니다.
- 이 레이팅 시스템이 일부 동호회 내에서만 적용되게 될 경우, 이 점수는 그 동호회 내에서 각 선수들의 랭킹이나 등급을
부여하는 데에 소기의 목적은 달성할 수 있으나, 그 동호회를 벗어난 다른 그룹의 레이팅 점수를 동등한 수준에서 선수간
실력을 대변하지는 못한다고 볼 수 있습니다. 이는 Glicko-2 레이팅 시스템 뿐만 아니라 다른 레이팅 시스템도 마찬가지의
문제라 생각됩니다.
- 따라서, 레이팅 시스템은 어느 한 동호회나 일부 지역에서만 적용하는 것은 매우 제한적인 등급 관리에 불과하며, 레이팅이
도입된 그룹 및 단체간 리그전이 반드시 활발히 이루어져야 레이팅과 그에 비례한 실력이나 성적이 의미가 있다고 봅니다.
- 만약, 상, 하위부로 나눠 리그전을 레이팅으로 한다 하더라도, 그룹내 레이팅 기간(리그전)이 너무 길면 그 또한 레이팅 점수
대비 실력을 객관적으로 말하기 어려워진다고 봅니다. 적어도 상, 하위부 섞어서 하는 리그전을 격주 라도 진행해야 한다고
생각합니다.
[ 운영 관리 측면 ]
운영 관리 또한 공신력 있는 전국 규모의 기관에서 가능한 거의 모든 경기를 관리 할 수 있어야 현실화 될 수 있다고 생각됩니다.
- 이런 수고를 일사분란하고 정교하게 하기 위해서는 이를 총괄하는 기관이 반드시 있어야 하고, 각 시도군구별로 위임하에
해당 지역에서 발생하는 리그전이나 오픈 대회 등을 모두 기록 관리할 수 있도록 해야 합니다.
- 그렇지 않다면 이 레이팅 제도는 결코 현실화되기 어려운 이슈라고 봅니다.
올해는 시간이 더 이상 나지 않을 거 같고, 내년에는 이번에 이 알고리즘을 적용하여 프로토타입 형태로 개발해본 프로그램을
더 확장하여 보다 체계적이고 안정적인 모습의 레이팅 시스템을 구현해 보고자 합니다.
재미없은 긴글을 여기까지 봐주셔서 감사합니다 ^^
References
1. http://en.wikipedia.org/wiki/Glicko_rating_system
2. Mark E. Glickman, Boston University, Example of the Glicko-2 system, November 30, 2013
첫댓글 시간이 허락될 때 천천히 음미해 보시면 좋을 것 같습니다.~^^