見出し画像

戦闘回数を重ねても戦績が上がらなかった事例 (データで見るバトオペ2 バウンド・ドック戦績 #2 2023-02-18 ~ 2023-06-18)

概要

バウンド・ドックに乗り続けて戦績を記録していったら、数カ月後には成長が見えるのだろうか? 素朴な疑問に答えるべく、2023年2月〜3月までバウンド・ドックの個人戦績を記録した後、5月頭まで引退し、同月中旬以降に再開した戦績を追加して比較しました。以下の条件のもと、記録しています。

  • PS5版バトオペ コスト650帯レート戦における戦績 全283戦の記録を取得

  • レートはA+後半からS-前半を行ったり来たり 2023-06-18現在およそ2,770

  • カスパ: 初期は格闘プログラム全振りの火力重視、5月以降は強制冷却システム5・2・1および耐ビーム・耐格闘の機動性・防御重視

  • MAPは機体特性・配信頻度から、廃墟都市・北極基地・補給基地・軍事基地が多い。次いで塹壕、コロニー落下地域、墜落跡地、無人都市、熱帯砂漠など。その他のMAPはほとんど含まれない

  • 味方の厳選はしない。個人的には当然のプレイマナーとは思うが、一旦編成されたら味方編成を問わず出撃し、切断・放置もしない

結果

月単位でのスコアの変遷を追う目的で、日単位で戦績を平均化し、月別に毎日の平均値をplotしてみました。その結果が下図です。

2023年2月から6月の4ヶ月の戦績の遷移。小さく薄いグレーのドットは毎日の戦績の平均値を示し、大きく濃いグレーの丸と直線は月単位の戦績の平均値と95%信頼区間(1.96SE)を示す。統計手法の妥当性はあまり真剣に考えていない

議論

  • この4ヶ月の戦績は(復帰したての5月が全体的に低いことを除けば)ほとんど一定を維持している。強いて言えば6月のDeath=被撃破数は他より低い傾向を示しており、今後さらに低下するか注目したい。以前より低い被撃破数で同じ成績を維持しているとも言えるかもしれないが、逆に言えば被撃破数以外何も成長していない。

  • 戦績の内容は与ダメージや撃破数がS-としては低く、一方で被撃破数は高め(平均3を下回ることが上手い人の特徴の一つとされる)であるから、攻撃のチャンスを逃したり、無駄死にをしている頻度が高いと想像でき、工夫の余地がある。

  • A+帯メインの戦闘になるかS-帯メインの戦闘になるかによって戦績は変動することから、その影響を推し量るため、レートポイント自体の遷移も記録・図示することが望ましい。

  • 2023-03-02にはフライト系の天敵、ゼク・ツヴァイが同650コスト帯に追加された。2023-06-10にはピックアップも実施され、ピック率もそこそこあることから、2月までと3月以降では環境が異なっている。(ただし、環境は移ろうものであり、ゲームシステムやスキル面の変化を除けば、考慮する意味は薄いと思う)

  • バッジチャレンジを使って戦績を記録する関係上、どうしても(大して強くなくても)バッジがついてしまう。このことで、戦績が悪い際にファンメールや故意FF等の攻撃対象になりやすくなっている気もした。

  • 自分的には上位スコアを出していた戦場でも、味方にいたカンスト系配信者が自分に対してブチ切れながら配信していたりする (バトオペのライブ配信者はだいたい常に他人のプレーに文句を言っている) ので、そういう面からも、まだまだムーブ面には工夫の余地があるのだと考えられる。

結論

漫然と戦っているつもりが無くても、勝利に貢献する気持ちで動いていたはずでも、実際には4ヶ月プレイしてレートも戦績も上がっていなかった。経時的に上達しているはずという思い込みをきちんと否定するために、バッジチャレンジを用いたデータ取得は効果的。

用いたRスクリプト

setwd("path-to-dir")

library("stringr")
library("dplyr")
library("tidyverse")
library("patchwork")
library("scales")
library("ggplot2")
library("ggbeeswarm")

data <- read_tsv("input.tsv", col_names = c("msname", "mslevel", "rule", "winlose", "rival", "zscore", "personalscore", "assistscore", "damage", "mskill", "msdeath", "date"))

winlose <- filter(data, msname == "バウンド・ドック") |> 
  mutate(yyyymm = gsub("-\\d\\d$", "", date)) |> 
  group_by(date) |> 
  summarize(yyyymm, date, wins = sum(winlose == "win"), loses = sum(winlose == "lose")) |>
  mutate(winlose = wins/(wins + loses)*100) |> distinct()
winlose2 <- ungroup(winlose) |> 
  group_by(yyyymm) |>
  summarise(mean = mean(winlose), sd = sd(winlose), se = sd/sqrt(n()), ci=1.96*se)

winlosefig <- ggplot(NULL) + 
  geom_quasirandom(data = winlose, aes(x = factor(yyyymm), y = winlose), width = 0.3, size = 2, alpha = 0.3) +
  geom_pointrange(data = winlose2, aes(x = factor(yyyymm), y = mean, ymin = mean-ci, ymax = mean+ci), color = "grey30", size=1, alpha = 0.8) +
  # coord_cartesian(xlim=c(0,250), ylim=c(0,100)) + 
  labs(x = "YYYYMM") + 
  labs(y = "Game win (%)") + 
  # scale_y_continuous(
  #   breaks = c(200, 300, 500),
  #   labels = c("200", "300", ">500"),
  #   limits = c(200, 500),
  #   oob = squish
  # ) +
  # scale_y_continuous(
  #   breaks = c(0, 50, 100),
  #   labels = c("0", "50", "100"),
  #   limits = c(0, 100),
  #   oob = squish
# ) +
theme( 
  plot.margin= unit(c(1, 1, 1, 1), "lines"),
  text = element_text(size = 14, family = "Helvetica", color = "black"),
  plot.title = element_text(size = 14, family = "Helvetica", color = "black", hjust = 0.5),
  axis.text = element_text(size = 14, family = "Helvetica", color = "black"),
  axis.text.x = element_text(angle = 45, hjust = 1),
  axis.ticks = element_line(size = 0.8),
  axis.ticks.length = unit(-1.5, "mm"),
  panel.grid = element_blank(),
  panel.border = element_rect(linetype = "solid", color = "black", fill = NA, size = 1.5),
  panel.background = element_rect(fill = "white")
)
plot(winlosefig)

rival <- filter(data, msname == "バウンド・ドック") |> 
  mutate(yyyymm = gsub("-\\d\\d$", "", date)) |> 
  group_by(date) |> 
  summarize(yyyymm, date, wins = sum(rival == "win"), loses = sum(rival == "lose")) |>
  mutate(winlose = wins/(wins + loses)*100) |> distinct()
rival2 <- ungroup(winlose) |> 
  group_by(yyyymm) |>
  summarise(mean = mean(winlose), sd = sd(winlose), se = sd/sqrt(n()), ci=1.96*se)

rivalfig <- ggplot(NULL) + 
  geom_quasirandom(data = rival, aes(x = factor(yyyymm), y = winlose), width = 0.3, size = 2, alpha = 0.3) +
  geom_pointrange(data = rival2, aes(x = factor(yyyymm), y = mean, ymin = mean-ci, ymax = mean+ci), color = "grey30", size=1, alpha = 0.8) +
  # coord_cartesian(ylim=c(0,100)) +
  labs(x = "YYYYMM") + 
  labs(y = "Rival win (%)") + 
  # scale_y_continuous(
  #   breaks = c(200, 300, 500),
  #   labels = c("200", "300", ">500"),
  #   limits = c(200, 500),
  #   oob = squish
  # ) +
  scale_y_continuous(
    breaks = c(0, 50, 100),
    labels = c("      0", "50", "100"),
    limits = c(0, 100),
    oob = squish
  ) +
  theme( 
    plot.margin= unit(c(1, 1, 1, 1), "lines"),
    text = element_text(size = 14, family = "Helvetica", color = "black"),
    plot.title = element_text(size = 14, family = "Helvetica", color = "black", hjust = 0.5),
    axis.text = element_text(size = 14, family = "Helvetica", color = "black"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.ticks = element_line(size = 0.8),
    axis.ticks.length = unit(-1.5, "mm"),
    panel.grid = element_blank(),
    panel.border = element_rect(linetype = "solid", color = "black", fill = NA, size = 1.5),
    panel.background = element_rect(fill = "white")
  )
plot(rivalfig)

zscoredata <- filter(data, msname == "バウンド・ドック") |> 
  mutate(yyyymm = gsub("-\\d\\d$", "", date)) |> 
  group_by(date) |> 
  summarize(yyyymm, date, zscore = mean(zscore)) |>
  distinct()
zscoredata2 <- ungroup(zscoredata) |> 
  group_by(yyyymm) |>
  summarise(mean = mean(zscore), sd = sd(zscore), se = sd/sqrt(n()), ci=1.96*se)

zscore <- ggplot(NULL) + 
  geom_quasirandom(data = zscoredata, aes(x = factor(yyyymm), y = zscore), width = 0.3, size = 2, alpha = 0.3) +
  geom_pointrange(data = zscoredata2, aes(x = factor(yyyymm), y = mean, ymin = mean-ci, ymax = mean+ci), color = "grey30", size=1, alpha = 0.8) +
  # coord_cartesian(xlim=c(0,250), ylim=c(0,100)) + 
  labs(x = "YYYYMM") + 
  labs(y = "Z-score") + 
  scale_y_continuous(
    breaks = c(200, 300, 400, 500),
    labels = c("200", "300",  "400", ">500"),
    limits = c(200, 500),
    oob = squish
  ) +
  # scale_y_continuous(
  #   breaks = c(0, 50, 100),
  #   labels = c("0", "50", "100"),
  #   limits = c(0, 100),
  #   oob = squish
  # ) +
  theme( 
    plot.margin= unit(c(1, 1, 1, 1), "lines"),
    text = element_text(size = 14, family = "Helvetica", color = "black"),
    plot.title = element_text(size = 14, family = "Helvetica", color = "black", hjust = 0.5),
    axis.text = element_text(size = 14, family = "Helvetica", color = "black"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.ticks = element_line(size = 0.8),
    axis.ticks.length = unit(-1.5, "mm"),
    panel.grid = element_blank(),
    panel.border = element_rect(linetype = "solid", color = "black", fill = NA, size = 1.5),
    panel.background = element_rect(fill = "white")
  )
plot(zscore)

personalscoredata <- filter(data, msname == "バウンド・ドック") |> 
  mutate(yyyymm = gsub("-\\d\\d$", "", date)) |> 
  group_by(date) |> 
  summarize(yyyymm, date, personalscore = mean(personalscore)) |>
  distinct()
personalscoredata2 <- ungroup(personalscoredata) |> 
  group_by(yyyymm) |>
  summarise(mean = mean(personalscore), sd = sd(personalscore), se = sd/sqrt(n()), ci=1.96*se)

personalscore <- ggplot(NULL) + 
  geom_quasirandom(data = personalscoredata, aes(x = factor(yyyymm), y = personalscore), width = 0.3, size = 2, alpha = 0.3) +
  geom_pointrange(data = personalscoredata2, aes(x = factor(yyyymm), y = mean, ymin = mean-ci, ymax = mean+ci), color = "grey30", size=1, alpha = 0.8) +
  # coord_cartesian(xlim=c(0,250), ylim=c(0,100)) + 
  labs(x = "YYYYMM") + 
  labs(y = "Personal score") + 
  scale_y_continuous(
    breaks = c(0, 2000, 4000, 6000, 8000),
    labels = c("0", "2,000", "4,000", "6,000", ">8,000"),
    limits = c(0, 8000),
    oob = squish
  ) +
  # scale_y_continuous(
  #   breaks = c(0, 50, 100),
  #   labels = c("0", "50", "100"),
  #   limits = c(0, 100),
  #   oob = squish
  # ) +
  theme( 
    plot.margin= unit(c(1, 1, 1, 1), "lines"),
    text = element_text(size = 14, family = "Helvetica", color = "black"),
    plot.title = element_text(size = 14, family = "Helvetica", color = "black", hjust = 0.5),
    axis.text = element_text(size = 14, family = "Helvetica", color = "black"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.ticks = element_line(size = 0.8),
    axis.ticks.length = unit(-1.5, "mm"),
    panel.grid = element_blank(),
    panel.border = element_rect(linetype = "solid", color = "black", fill = NA, size = 1.5),
    panel.background = element_rect(fill = "white")
  )
plot(personalscore)

assistscoredata <- filter(data, msname == "バウンド・ドック") |> 
  mutate(yyyymm = gsub("-\\d\\d$", "", date)) |> 
  group_by(date) |> 
  summarize(yyyymm, date, assistscore = mean(assistscore)) |>
  distinct()
assistscoredata2 <- ungroup(assistscoredata) |> 
  group_by(yyyymm) |>
  summarise(mean = mean(assistscore), sd = sd(assistscore), se = sd/sqrt(n()), ci=1.96*se)

assistscore <- ggplot(NULL) + 
  geom_quasirandom(data = assistscoredata, aes(x = factor(yyyymm), y = assistscore), width = 0.3, size = 2, alpha = 0.3) +
  geom_pointrange(data = assistscoredata2, aes(x = factor(yyyymm), y = mean, ymin = mean-ci, ymax = mean+ci), color = "grey30", size=1, alpha = 0.8) +
  # coord_cartesian(xlim=c(0,250), ylim=c(0,100)) + 
  labs(x = "YYYYMM") + 
  labs(y = "Assist score") + 
  scale_y_continuous(
    breaks = c(0, 500, 1000, 1500),
    labels = c("0", "500", "1,000", ">1,500"),
    limits = c(0, 1500),
    oob = squish
  ) +
  # scale_y_continuous(
  #   breaks = c(0, 50, 100),
  #   labels = c("0", "50", "100"),
  #   limits = c(0, 100),
  #   oob = squish
  # ) +
  theme( 
    plot.margin= unit(c(1, 1, 1, 1), "lines"),
    text = element_text(size = 14, family = "Helvetica", color = "black"),
    plot.title = element_text(size = 14, family = "Helvetica", color = "black", hjust = 0.5),
    axis.text = element_text(size = 14, family = "Helvetica", color = "black"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.ticks = element_line(size = 0.8),
    axis.ticks.length = unit(-1.5, "mm"),
    panel.grid = element_blank(),
    panel.border = element_rect(linetype = "solid", color = "black", fill = NA, size = 1.5),
    panel.background = element_rect(fill = "white")
  )
plot(assistscore)

damagedata <- filter(data, msname == "バウンド・ドック") |> 
  mutate(yyyymm = gsub("-\\d\\d$", "", date)) |> 
  group_by(date) |> 
  summarize(yyyymm, date, damage = mean(damage)) |>
  distinct()
damagedata2 <- ungroup(damagedata) |> 
  group_by(yyyymm) |>
  summarise(mean = mean(damage), sd = sd(damage), se = sd/sqrt(n()), ci=1.96*se)

damage <- ggplot(NULL) + 
  geom_quasirandom(data = damagedata, aes(x = factor(yyyymm), y = damage), width = 0.3, size = 2, alpha = 0.3) +
  geom_pointrange(data = damagedata2, aes(x = factor(yyyymm), y = mean, ymin = mean-ci, ymax = mean+ci), color = "grey30", size=1, alpha = 0.8) +
  # coord_cartesian(xlim=c(0,250), ylim=c(0,100)) + 
  labs(x = "YYYYMM") + 
  labs(y = "Damage") + 
  scale_y_continuous(
    breaks = c(0, 50000, 100000, 150000),
    labels = c("0", "50,000", "100,000", ">150,000"),
    limits = c(0, 150000),
    oob = squish
  ) +
  # scale_y_continuous(
  #   breaks = c(0, 50, 100),
  #   labels = c("0", "50", "100"),
  #   limits = c(0, 100),
  #   oob = squish
  # ) +
  theme( 
    plot.margin= unit(c(1, 1, 1, 1), "lines"),
    text = element_text(size = 14, family = "Helvetica", color = "black"),
    plot.title = element_text(size = 14, family = "Helvetica", color = "black", hjust = 0.5),
    axis.text = element_text(size = 14, family = "Helvetica", color = "black"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.ticks = element_line(size = 0.8),
    axis.ticks.length = unit(-1.5, "mm"),
    panel.grid = element_blank(),
    panel.border = element_rect(linetype = "solid", color = "black", fill = NA, size = 1.5),
    panel.background = element_rect(fill = "white")
  )
plot(damage)

mskilldata <- filter(data, msname == "バウンド・ドック") |> 
  mutate(yyyymm = gsub("-\\d\\d$", "", date)) |> 
  group_by(date) |> 
  summarize(yyyymm, date, mskill = mean(mskill)) |>
  distinct()
mskilldata2 <- ungroup(mskilldata) |> 
  group_by(yyyymm) |>
  summarise(mean = mean(mskill), sd = sd(mskill), se = sd/sqrt(n()), ci=1.96*se)

mskill <- ggplot(NULL) + 
  geom_quasirandom(data = mskilldata, aes(x = factor(yyyymm), y = mskill), width = 0.3, size = 2, alpha = 0.3) +
  geom_pointrange(data = mskilldata2, aes(x = factor(yyyymm), y = mean, ymin = mean-ci, ymax = mean+ci), color = "grey30", size=1, alpha = 0.8) +
  # coord_cartesian(xlim=c(0,250), ylim=c(0,100)) + 
  labs(x = "YYYYMM") + 
  labs(y = "Kill") + 
  scale_y_continuous(
    breaks = c(0, 2, 4, 6),
    labels = c("0", "2", "4", "6"),
    limits = c(0, 6),
    oob = squish
  ) +
  # scale_y_continuous(
  #   breaks = c(0, 50, 100),
  #   labels = c("0", "50", "100"),
  #   limits = c(0, 100),
  #   oob = squish
  # ) +
  theme( 
    plot.margin= unit(c(1, 1, 1, 1), "lines"),
    text = element_text(size = 14, family = "Helvetica", color = "black"),
    plot.title = element_text(size = 14, family = "Helvetica", color = "black", hjust = 0.5),
    axis.text = element_text(size = 14, family = "Helvetica", color = "black"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.ticks = element_line(size = 0.8),
    axis.ticks.length = unit(-1.5, "mm"),
    panel.grid = element_blank(),
    panel.border = element_rect(linetype = "solid", color = "black", fill = NA, size = 1.5),
    panel.background = element_rect(fill = "white")
  )
plot(mskill)

msdeathdata <- filter(data, msname == "バウンド・ドック") |> 
  mutate(yyyymm = gsub("-\\d\\d$", "", date)) |> 
  group_by(date) |> 
  summarize(yyyymm, date, msdeath = mean(msdeath)) |>
  distinct()
msdeathdata2 <- ungroup(msdeathdata) |> 
  group_by(yyyymm) |>
  summarise(mean = mean(msdeath), sd = sd(msdeath), se = sd/sqrt(n()), ci=1.96*se)

msdeath <- ggplot(NULL) + 
  geom_quasirandom(data = msdeathdata, aes(x = factor(yyyymm), y = msdeath), width = 0.3, size = 2, alpha = 0.3) +
  geom_pointrange(data = msdeathdata2, aes(x = factor(yyyymm), y = mean, ymin = mean-ci, ymax = mean+ci), color = "grey30", size=1, alpha = 0.8) +
  # coord_cartesian(xlim=c(0,250), ylim=c(0,100)) + 
  labs(x = "YYYYMM") + 
  labs(y = "Death") + 
  scale_y_continuous(
    breaks = c(0, 2, 4, 6),
    labels = c("0", "2", "4", "6"),
    limits = c(0, 6),
    oob = squish
  ) +
  # scale_y_continuous(
  #   breaks = c(0, 50, 100),
  #   labels = c("0", "50", "100"),
  #   limits = c(0, 100),
  #   oob = squish
  # ) +
  theme( 
    plot.margin= unit(c(1, 1, 1, 1), "lines"),
    text = element_text(size = 14, family = "Helvetica", color = "black"),
    plot.title = element_text(size = 14, family = "Helvetica", color = "black", hjust = 0.5),
    axis.text = element_text(size = 14, family = "Helvetica", color = "black"),
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.ticks = element_line(size = 0.8),
    axis.ticks.length = unit(-1.5, "mm"),
    panel.grid = element_blank(),
    panel.border = element_rect(linetype = "solid", color = "black", fill = NA, size = 1.5),
    panel.background = element_rect(fill = "white")
  )
plot(msdeath)

layout <- "
AABB
CCDD
EEFF
GGHH
"
all <- winlosefig + rivalfig + zscore + damage + personalscore + assistscore + mskill + msdeath + plot_layout(design = layout)
ggsave(file = "output.pdf", plot = all, dpi = 300, width = 12, height = 12)

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