【R Advent Calendar】Dominion Dataで遊んでみる【19日目】

この記事は、R Advent Calendar 19日目の記事です。

巷では最近行われたM-1の審査結果で分析するのが流行っていますが、こちらは趣向を変えて宇宙本勉強用にDominionのCPU戦の対戦データを集めてみましたので、分析結果の一部をお披露目しようと思います。今回は効率という観点からデータセットを俯瞰していきます。ルールを知らない方はこちらをご参照下さい。

RユーザのためのRStudio[実践]入門−tidyverseによるモダンな分析フローの世界−

RユーザのためのRStudio[実践]入門−tidyverseによるモダンな分析フローの世界−

Summary

データセットの説明です。

  • 期間:2018年7月29日から9月22日まで
  • プレイヤー数:3人(私とAI2名)
  • データ数:72戦×3人、計216人分のデータ
  • 拡張パッケージ使用:なし(Dominion Onlineの無課金で遊べる基本セットのみ)*1
  • 変数:
    • 初期のサプライのカード(s_英語カード名)(有=1, 無=0の名義尺度)
    • ゲーム終了時手札に有るカード(r_英語カード名)(単位:枚)*2
    • ターン数(ゲーム終了までに使ったターン)
    • 得点(point):ゲーム終了時に獲得していた勝利点合計
    • カード枚数(card):ゲーム終了時の手持ちカード枚数
    • 順位(rank)(1st,2nd,3rdのカテゴリ)

貨幣の量で考える

まず、貨幣の量で考えます。貨幣を見る必要が有るので

ibrary(tidyverse)
→ここでread_csvでデータセットを読み込ませる作業が入ってきます。
money <- read_csv(hogehoge.csv, stringsAsFactors = FALSE)

銅貨は基本的に破棄されたりする運命なので、属州を獲得する上で必須となるのが、上級貨幣の銀貨と銀貨の量と順位を見ていきます。

silver_quan <- ggplot(data = money, mapping = aes(x = rank,y = r_silver))
silver_quan <- silver_quan + geom_violin(scale = "count")+ geom_point(data = money, mapping = aes(x = rank,y = r_silver))
print(silver_quan)

f:id:rakugou:20181215221745p:plain
順位ごとの銀貨獲得数(バイオリンプロット)

gold_quan <- ggplot(data = money, mapping = aes(x = rank,y = r_gold))
gold_quan <- gold_quan + geom_violin(scale = "count")+ geom_point(data = money, mapping = aes(x = rank,y = r_gold))
print(gold_quan)

f:id:rakugou:20181215221832p:plain
順位ごとの金貨獲得数(バイオリンプロット)

図では違いがわかりにくいですが、金貨保有ボリュームゾーンはだいたい3枚くらいがトップを取っているゾーン、3位のドンケツは金貨が3枚くらいしかないことが多い傾向にありそうなので、3〜5枚ほど稼いでおいたほうがよさそうです。

貨幣の質で考える

次に貨幣の質で見ていきます。 今回は合成変数として、山札の枚数あたりの貨幣量で見ていきます。

money_quality <- money %>% mutate(money_qual = (r_copper1 + r_silver2 + r_gold*3)/card)
mq <- ggplot(data = money_quality, aes(x = rank, y = money_qual))
mq <- mq + geom_boxplot()
print(mq)

f:id:rakugou:20181215221858p:plain
順位ごとの貨幣の質(箱ひげ図)

念の為、分散分析して、この差が意味が有るのか見ていきます。

anova(aov(money_qual ~ rank, data = money_quality))

Analysis of Variance Table

Response: money_qual
Df Sum Sq Mean Sq F value Pr(>F)
rank 2 0.0835 0.041768 1.2575 0.2865
Residuals 213 7.0750 0.033216

有意ではないっぽいですね。貨幣の質は順位によってあまり変わっていないらしいので、山札の効率化が勝利に導かれるかは時と場合による。ということでしょうか。ただ、箱ひげ図を見る限り、3位だけは0.5を突き抜けて下に伸びているので、手持ちの貨幣の総額が山札の枚数*0.7〜0.6を下回ると運用上きつくなりそうです*3

山札の枚数と勝敗

山札の枚数は勝敗に影響してくるんでしょうか、ドミニオンの基本的な戦略として、山札を圧縮して必要なカードをできるだけ多く回していくという戦法があります。圧縮する戦法か、カードを増やしていく戦法か、どちらがいいんでしょうか?

deck <- ggplot(data = money, mapping = aes(x = rank,y = card))
deck <- deck + geom_violin(scale = "count")+ geom_point(data = money, mapping = aes(x = rank,y = card))
print(deck)

f:id:rakugou:20181215221936p:plain
順位ごとの最終デッキ枚数(バイオリンプロット)

最瀕値もほぼ横並びで、だいたい似たような値に収まってきます。こちらも時と場合によることがあるのでしょう。1位のところだけ山札の枚数が多くなっているところがあるので、そのデータについて見てみましょう。

money %>%
filter(rank == 1st, card >= 45)
irr <- money %>%
+ select(r_copper,r_gardens,rank,turn,card)

r_copper r_gardens rank  turn   card
13     12     1st   26   51
10    11     1st   28   51
7     2     1st   29   47
13    12     1st   26   51

銅貨と庭園が著しく多いですね。庭園の数が2つになっているところは長期戦の末、庭園も確保せざるを得ない状況に陥っているように見受けられますが、それ以外は庭園をサプライのほぼ上限(12枚)を取りきるような形で獲得しています。山札10枚に付き1勝利点を得る庭園を集めて勝利する、特殊な戦略で勝ちきっているパターン*4です。

獲得勝利点で考える

獲得勝利点でも考えていきましょう。

win <- ggplot(data = money, mapping = aes(x = rank, y = point)) + geom_violin(scale = "count") + geom_point()
print(win)

f:id:rakugou:20181215222016p:plain
順位ごとの獲得勝利点(バイオリンプロット)

by(money$point,money$rank,summary)
→順位ごとの獲得得点の要約統計量を算出しています。 dom$rank: 1st
Min. 1st Qu. Median Mean 3rd Qu. Max.
24.00 31.00 33.00 36.04 38.00 72.00
dom$rank: 2nd
Min. 1st Qu. Median Mean 3rd Qu. Max.
20.00 26.00 28.50 30.26 32.00 60.00
dom$rank: 3rd
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 20.00 25.00 24.51 27.00 51.00

思った以上に僅差ですね。1位の勝利点平均が属州6枚分であることは体感的に分かりますが、2位でも属州5枚分、3位でも属州4枚分の平均です。公領の獲得が2枚くらいで属州の獲得枚数が1枚減ると考えると、これくらいの数字がでそうですね。1位を狙うなら、少なくとも属州を5枚は取っていくペース配分で進めるのがよさそうです。

もっと細かいのないの?

細かいものはデータを持っているので、おいおいどこかでアップ*5できればと思っています。分析手法がおかしいものがあれば随時ご連絡下さい。

*1:拡張を使ってしまうとトークンやらランドマークやら避難所場などのイレギュラーな開始手札やらで集計がものすごくややこしくなりそうなので、基本で良かったと思っています。

*2:今回は開始と終了時のカードしか扱っていないが、5手目Rakugou、祝祭使用、銀貨×1、銅貨×2で金貨×1を購入みたいなことをするとデータ収集コストが無限に跳ね上がっていくのでできませんでした。そんなデータを取り扱えるようになってみたい。

*3:ただし、村、研究所などのアクション増加やドロー強化で山札の回転を極端に早めて、毎ターン山札を全て引ききる「引き切り」デッキの場合は、貨幣は8程度で属州をほぼ購入できるので、貨幣の質に縛られないプレイをすることが可能です。

*4:今回はAI戦で行っており、AIは庭園をかき集めて勝利する展開を取りたがらないので、この戦略が生きています。勘のいい人なら解ると思いますが、庭園を複数人で取り合う形になると、庭園不足で勝利点を十分に稼ぐことができず、属州を普通に集めていく戦略を取るほうが有利になります。

*5:このブログになるかgithubになるかは未定