2016-08-24

3tabでリプライランキングを出す

3tabにはリプライのスコア一覧を表示する機能や、ましてやそのランキングを出す機能はありません。tabbycatにはありますが、動作環境、運用の習熟度、その他の問題で手軽に使えるとはまだ言えない状況のように思われます。

ということで、3tabからそれでもリプライのランキングを作る方法を以下に示します。なおこの方法は無保証です。本来そんな機能はないものですし、以下の手順に問題がない保証はないので、あくまで参考値を出すものと考えてください。

以下、pgAdmin3とExcelなどの表計算ソフト、また正規表現による置換を行えるテキストエディタを使います。ExcelのVLOOKUPやAVERAGEIF、また相対参照と絶対参照などについての知識は既知とします。

1. speaker_score_sheetsから2列目から6列目までを切り出す

2. セミコロンをタブに置換、またspeaking_integerが4のエントリ以外を削除する(正規表現で言えば^.*[1-3]\nを削除)

3. debate_team_xref_id integerのidを使ってdebates_teams_xrefsテーブルのエントリと対応付け、さらにdebate_teams_xrefsのdebate_id integerからdebatesテーブルのエントリともう一段階対応付けをして、debatesテーブルのround_id integerを取り出し(excelでvlookup使えば簡単)、各リプライスコアがどのラウンドのものなのかをわかるようにする。

4. ここまでで手元にはspeaker_score_sheetsのadjudicator_allocation_id integer, debates_teams_xrefs integer, debater_id integer, score double precision, そして追加したround数の表があるはず。

あと一歩のように思えるがそうでもなく、3人ジャッジのラウンドのマイノリティマジョリティの処理をしないといけない。

5. team_score_sheetsテーブルからadjudicator_allocation_id integer, debates_teams_xrefs integer, score integerを取り出す。ここを見てやれば同じラウンドに三人入っていることと、そのときどのように票が割れたかがわかる。

6. adjudicator_allocation_id integerとdebates_teams_xrefs integer, score integerを使って、手順4までに作った表と手順5の表を対応させ(要ソート)、あるリプライのスコアと、そのときのvote先をひとつの表にまとめる。

7. マジョリティ判定を行う。B列にdebates_teams_xrefs integer, F列にvoteが入っているとして、G列にmajorityかどうかtrue or falseを表示したい。そのときたとえばG2セルに入る数式は=IF(IF(COUNTIF(B:B,B2)=1,1,0)+IF(COUNTIFS(B:B,B2,F:F,F2)>=2,1,0),"T","F")となる。

8. そしてminorityの点数は無視されるので、簡単のためexcel上でフィルタして削除してしまう。空行を残しておくと何かとめんどくさいのでつめておく。

9. これで元データとなるテーブルは完成したので、ここからスピーカーごとにデータを抽出するテーブルを別途作る。この手順は比較的簡単。説明を読むよりも成果物を見たほうが早いだろう。同じラウンドの同じスピーカーに対して最大三件スコアのエントリーがあるので、averageifsを使ってスピーカーとラウンドの二つを絞込みの条件として平均点を取り出す(たとえばこんな感じ:=IFERROR(AVERAGEIFS($D:$D,$C:$C,$O6,$E:$E,"Round1"),"")ここでD列はスコア、C列はdebater id、O6にはそのディベーターのidがあり、E列にはラウンド数が入っている)。さらにその4ラウンドでの平均も取る。また、かならずしも同一のスピーカーが4回リプライを行うわけではないので、count関数も別の列に入れておく。さらに、名前がIDのままではまずいのでdebatersテーブルから拾い出してやる。さらにチーム名も表示したら親切だろう。そして点数で降順にソートしたら完成。

(作業時間:やり方を模索しながらやって一時間。わかっていればたぶん15分くらいで作れる)

No comments:

Post a Comment