見出し画像

ポケカを本気で統計してみる(準備編、完)

今日は在宅勤務です。在宅勤務だと普段通勤に使っている時間をこういうこと考える時間に充てられるのがいいですね。

ということで今日で準備編は最後です。

マッチングに対して勝敗データをつける

前回は作成したマッチングに対して勝率を結合するところまで行いました。

今回はそれに対して勝ち負けをシミュレーションし、最終的な結果のデータを作るところまで行います。

前回作ったデータ

対戦結果をシミュレーションする方法としては、まず、0~1の間で一様な乱数を生成します。それとそれぞれの対戦パターンに応じた勝率(上図の"winerate")を比較して、winrateの方が大きかったら勝ち、小さかったら負けという単純なものです。

ということでまずは一様な乱数(全ての乱数が等確率で発生する乱数)を生成します。コードはこんな感じ。

ransu <- runif(5)

生成された乱数はこんな感じ。

> ransu
[1] 0.122884072 0.502603634 0.007353249 0.355368550 0.399860776

今回はまだ本番ではないので5個の乱数しか作っていませんが本番ではマッチ数に合わせた大量の乱数を作ります。
これを単純に列方向に結合させます。

match_TCG4 <- cbind(match_TCG3, ransu)

こんなデータができました。

1行目ですとwinrateが乱数より大きいので3の勝ち、2行目だとwinrateが乱数より小さいので7の負け、という感じですね。

次はこれに対して勝敗を判定する計算式を追加します。
調べたらこんな感じでやればできそうでした。

match_TCG5 <- mutate(match_TCG4, result = if_else(winrate>ransu,1,0)

Excelのif関数と同じような発想なのでわかりやすかったです。
結果はこうなりました。

対戦結果の集計をするには片方(この表だと"you")だけでなく、相手側の結果(この表だと"opponent")の結果も必要になります。
なので、対戦相手から見た結果も追加します、方法は先ほどのif_else文の条件を反対にするだけなので簡単です。

match_TCG6 <- mutate(match_TCG5,oppresult=if_else(winrate<=ransu,0,1))

するとこうなります。

ちゃんと結果が逆になっているのでうまくいってそうです。

最終結果を取り出す

あとはここからデータを取り出せば完成です。

まずは"you"の方の結果を取り出します。

result <- data.frame(you=match_TCG6$you.x,opponent=match_TCG6$oppnent,
result=match_TCG6$result)

こんなデータができます。

次に対戦相手(opponent)から見た結果のデータを取り出します。その際に項目の名前も入替えます。

opponent_result <- data.frame(you=match_TCG6$opponent,opponent=match_TCG6$you.x,
result=match_TCG6$oppresult)

取りだしたデータを行方向に結合します。

last_result<-rbind(result,opponent_result)

するとこんなデータができました。

ちゃんと対称になったデータができました、これでいけそうです。

本番データの作成

練習で上手くいきそうだったので本番のデータを作成します。
どういうデータを作成しようか考えたのですが、とりあえず次のようなことを想定しました。

  • 1万人のプレイヤーが

  • ランダムに9戦を行う

という合計9万戦分のデータを作ることにします。

ここで、1点練習でやっていた時と違うことが発生します。
それぞれのプレイヤーに対し、そのプレイヤーがどのタイプのデッキを使っているか割り当てる必要があります。またその使用率は実際の使用率と一致させる必要があります。

そのためこのように、デッキタイプごとにIDをつけ、それぞれの使用率を組み合わせたデータを作ります。
使用率はいつも通りこちらのデータを使わせていただきました。
(マジでこのデータ神、みんなメンバーシップ始まったら入りましょう)

このようなデータです。

データを作る際に10,000人のユニークなIDを振ったデータと、その個々のIDがどのタイプのデッキを組み合わせたデータを作る必要があります。
やり方は単純で、1~10,000のIDのデータと、この発生確率に応じて1~15の数字をサンプリングしたデータを組み合わせます。

その使用率に応じてサンプリングする方法は次のようなコードでできました。

type <-sample(1:15,size=10000,replace=TRUE,prob= probabilities)

最後のprobabilitiesというのが発生確率のパラメーターで、その確率に応じた割合でサンプリングされます。

それらを組み合わせて、10,000人×9戦のランダムマッチングを作りました。

一番目だとID6258の人がドラパルトを使って、ID2139の人が使うタケルライコと対戦したという感じです。これが45,000行続きます。

ここから先は練習でやったことと同じなので省略しますが、最終的にこのようなデータができ上がりました。

こんなデータが9万行続いています

やってみて

手探りで使ったRでしたが、まあまあ順調にいきました。
ネットで検索しながら進めていましたが、すごい役立ったのがChatGPTです。
プログラミングするにはすごい便利と聞いていたのですが、実際に使ってみるとやりたいことを日本語で入力するとコードの内容まで返してくれました。

これ使いこなすとプログラミングへのハードルが下がりそうに思いました。

あとはこれを分析するのですが、ここからが本番で楽しみです。

この記事が気に入ったらサポートをしてみませんか?