たくさん寝太郎の寝床

料理とITと皿回しが好きなオタクのブログ

Splatoon2の話(ガチエリアの勝率編)

こんにちは、たくさん寝太郎です。

今日は楽して稼ぐ方法を考えていたら夕方になっていました。


さて、昨日「毎日寝床を更新する」と言ったは良いものの何を書けば良いか思い付かなかったので最近よく遊んでるSplatoon2の話をしようと思います。


Splatoon2任天堂が2017年7月21日に発売したNintendo Switch専用アクションシューティングゲームです。


私はガチマッチというモードを頻繁に遊んでいるので、今回はガチマッチについて話します。

データで見るガチマッチ

splatoon2には公式でイカリング2という記録とかバトル履歴が見られる機能があるのですが、有志が開発したikaWidget2というアプリの方が色々解析しやすいです。

ikaWidget 2

ikaWidget 2

  • Yu Kiuchi
  • ユーティリティ
  • 無料
apps.apple.com

↓こんな感じで勝敗などのデータを視覚化してくれる
f:id:kaworu_mk6:20200509171438p:plain

このアプリはcsv形式でファイル出力してくれる機能があるので、それを用いてデータ解析することができます。


今回はガチエリアの勝率をグラフで分かりやすく視覚化してみました。

やりたいこと

  1. N戦毎の勝率をプロットして視覚化する
  2. グラフから何か読み取ってみる
データの準備

ikaWidgetからcsvファイルを保存し実行するプログラムと同じディレクトリ下に置きます。

プログラムの実行

以下のプログラムを実行します。
pandas.read_csvにて先ほど保存したファイルを指定して実行するとparsererrorというのが発生しました。(カラムサイズが一定でないことが原因らしい)
実際にcsvを見てみると稀にデータがずれてる行がありました。原因は分かりません。

色々試してみましたが、「一度excel, keynoteでファイルを開く→再びcsvとして書き出す」という方法で何とかなりました。

import pandas as pd
import matplotlib.pyplot as plt

df = pandas.read_csv('保存したcsvファイルのpath')
gachi_df = df.query("gameModeKey==' gachi'")

area_df = gachi_df.query("gameRuleKey==' splat_zones'")

tl = 20
N = int(len(area_df)/tl)
area_rate = []

step = [tl*i for i in range(N)][::-1]

for i in step:
    area_rate.append(area_df["win"][i:i+tl].mean())

plt.plot(range(N), area_rate, label="area")

plt.hlines([0.5], 0, N, "red", linestyle='dashed')

plt.ylim(0,1)
plt.legend()
plt.show()
出力結果

こんな感じで20戦毎の勝率の変遷が可視化されます。

f:id:kaworu_mk6:20200509184000p:plain


乱高下を繰り返しているように見えますね。
ちなみに50戦毎だとこうなります。

f:id:kaworu_mk6:20200509184508p:plain


「勝率が上下しているのはウデマエが上がった時の環境に適応できていないため」と仮説立て、上記のプログラムを改良しグラフにウデマエを表示してみました。

f:id:kaworu_mk6:20200509190228p:plain


これだとウデマエの上下が原因で連敗しているという仮説は微妙に思えます。
10戦毎だと次のようになりました。


f:id:kaworu_mk6:20200509190452p:plain


何でこんなに勝率が上下するんでしょうかね
今度の記事でブキ編成などにも着目して考えてみようと思います。