proc treeでトーナメント表とか作ってみる

最近、割と役に立つ真面目なことばかり書いていた気がしたので、たまには無益なものを紹介します。

proc treeはproc clusterなんかの結果をデータセットにして読み込ませることで、クラスター分析の結果をデンドログラム(樹上図)で表現するのに使ったりするですが、当然、このブログではそんな真面目なことには使いません。

会社で将棋部の部長をやっていた時があって、その時に、トーナメント表をSASで作れないかな~
とか考えてて、treeプロシジャに目を付けました。

例えばAさん Bさん Cさん Dさんがいて、1回戦を A vs  B、C vs Dとして、その勝者同士で決勝戦を行うトーナメント表を作る場合は、以下のようにします。

data Q1;
length _NAME_  _PARENT_ $5.;
_NAME_='Aさん';_PARENT_='CL3';_HEIGHT_=0;output;
_NAME_='Bさん';_PARENT_='CL3';_HEIGHT_=0;output;
_NAME_='Cさん';_PARENT_='CL2';_HEIGHT_=0;output;
_NAME_='Dさん';_PARENT_='CL2';_HEIGHT_=0;output;
_NAME_='CL3';_PARENT_='CL1';_HEIGHT_=1;output;
_NAME_='CL2';_PARENT_='CL1';_HEIGHT_=1;output;
_NAME_='CL1';_PARENT_='CL0';_HEIGHT_=2;output;
_NAME_='CL0';_PARENT_='';_HEIGHT_=2.5;output;
run;

_NAME_はクラスター名、_PARENT_はそのクラスターの親(統合後)となるクラスターの名前で、HEIGHTは高さだと思ってください。HEIGHT=0は一番下層のクラスターです。
つまり、AさんとBさんを統合したものの名前がCL3で、CさんとDさんを統合したものの名前がCL2で、CL3とCL2を統合したものがCL1で、CL0は最後に優勝者の部分の線を盛り上げるために設定しています。

これをproc treeに流し込むと

proc tree data=Q1; 
 title '優勝'; 
run;

結果は























って感じです。


で、実はこれはもっと発展させることができます。

例えば、ランダムな要素を入れつつ、
部員同士の過去の対戦成績から、その部員の棋力をレーティング得点という評価値で表現し、
それに従って、できる限り力の近いものとあたる、或いは強い人が固まらないようなトーナメントを
自動生成させようと考えていました。樹形図は別に左右対称である必要はないので、極端に成績のよい人や前回優勝者をシード選手にすることも表現できます。

そういった一大マクロを作ってやろうと思ったのですが、そもそもクラブの出席率が非常に悪く、
これはトーナメント作っても消化できんなと思ったので断念しました。

会社に活気あるクラブがあって、トーナメント表作られている方は、ぜひSASで、メンバーと過去成績から、適切なトーナメント表を自動生成するマクロを作って、ぜひ公開してください。






0 件のコメント:

コメントを投稿