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;
つまり、AさんとBさんを統合したものの名前がCL3で、CさんとDさんを統合したものの名前がCL2で、CL3とCL2を統合したものがCL1で、CL0は最後に優勝者の部分の線を盛り上げるために設定しています。
これをproc treeに流し込むと
proc tree data=Q1;
title '優勝';
run;
結果は
って感じです。
で、実はこれはもっと発展させることができます。
例えば、ランダムな要素を入れつつ、
部員同士の過去の対戦成績から、その部員の棋力をレーティング得点という評価値で表現し、
それに従って、できる限り力の近いものとあたる、或いは強い人が固まらないようなトーナメントを
自動生成させようと考えていました。樹形図は別に左右対称である必要はないので、極端に成績のよい人や前回優勝者をシード選手にすることも表現できます。
そういった一大マクロを作ってやろうと思ったのですが、そもそもクラブの出席率が非常に悪く、
これはトーナメント作っても消化できんなと思ったので断念しました。
会社に活気あるクラブがあって、トーナメント表作られている方は、ぜひSASで、メンバーと過去成績から、適切なトーナメント表を自動生成するマクロを作って、ぜひ公開してください。
0 件のコメント:
コメントを投稿