Is Genshin Powercreep Real?

Author

Adi Ve

from u/MatMatSlime on Reddit

Introduction

“Powercreep” is a term used broadly in gacha games to describe the gradual increase in strength of released playable units. Gacha games have a primary incentive of profiting off of their players, which means they must in some way incentivize players to spend money on the gambling component of their game. Gacha companies often do this by making the currently available characters stronger than previously released characters in order to motivate players to spend on new characters. The primary issue with this tactic, however, is that old characters are often eclipsed in the presence of newer, more powerful units. This is often seen as unfair and unethical by playerbases, and companies often receive backlash for blatant examples of powercreeping. This is especially true for competitive games such as “Onmyoji”, in which players duel each other.

A familiar example for the uninitiated is Apple’s iPhone series. Apple customers may often find themselves reluctantly buying new models over the years due to the (allegedly intentional) deficiencies of previous models.

In saurusness’ video “Do we need to worry about powercreep in Genshin?”, various types of Powercreep are discussed. The main types of powercreep are “Direct” and “Ambient” powercreep. Direct powercreep occurs when a new character fulfills the role of an old character completely, and simply better. Ambient powercreep occurs when the strength of units generally, slowly, increase over time, rendering old characters unplayable for endgame content regardless of if their niche has been stolen by a new character. A proxy measure for strength in Genshin Impact is “Motion Value”, more easily understood as the raw damage a character can output on their own. Suppose two characters fulfill the same niche, then one character could be said to be “stronger” than another character if they have higher motion values. Of course, motion values cannot hope to describe a characters strength in their entirety. Because of the existence of team synergies, elemental reactions, and utility skills, a character’s motion value is only one of many components that can make a character “strong”. However, in this project I will use motion values as a proxy for character strength in a pure damage sense, which will help to visualize whether these motion values have been increasing throughout the continued story of Genshin Impact.

Sophia Healy on Kaggle published a Genshin Impact character dataset 15 days before the completion of this project. I utilize this data mostly for the characters’ release dates and elements. I then add motion value data via computations using the raw scaling attributes of these characters which can be found on Keqing Mains’ website. Ultimately, the relevant variables are:

  • rarity: a measure of the chance to obtain a character (categorical, 4 or 5). in this project we only consider 5 star characters, and use this variable to filter.

  • release_date: the day on which the character was released (date). we use this for constructing time series.

  • vision: the character’s element, which partially determines their niche (categorical: anemo, cryo, dendro, electro, geo, hydro, pyro)

  • mv: the computed motion value per second of the character in weighted artifact rolls per second

Read and Load Libraries

library(tidyverse)
library(plotly)
library(lubridate)
library(openintro)
genshin_init <- read_csv("csvs/genshin.csv")

Filter for Only 5*s

As previously discussed, the characters which we will consider for this investigation are limited (meaning they are not always available) 5 star damage-dealers. Using filter, we remove the characters which do not meet these criteria, and using select we remove all variables which we will not need.

genshin <- genshin_init |>
  filter(rarity==5)

# remove the traveler

genshin <- genshin |>
  filter(birthday!="Player's Choice")

# filter for limited 5*s only

genshin <- genshin |>
  filter(limited==TRUE)

# get rid of variables we don't need

genshin <- genshin |>
  select(character_name, region, vision, weapon_type, release_date, hp_90_90,
         atk_90_90, def_90_90)

# select only the damage-dealing characters and reread the dates

genshin <- genshin |>
  mutate(release_date = mdy(release_date)) |>
  filter(character_name != "Venti",
         character_name != "Zhongli",
         character_name != "Kaedehara Kazuha",
         character_name != "Nilou",
         character_name != "Baizhu")

# Remove characters from 4.0 and later, as they are not fully understood

genshin <- genshin |>
  filter(character_name != "Lyney",
         character_name != "Neuvillette",
         character_name != "Wriothesley")

head(genshin)
# A tibble: 6 × 8
  character_name region    vision  weapon_type release_date hp_90_90 atk_90_90
  <chr>          <chr>     <chr>   <chr>       <date>          <dbl>     <dbl>
1 Albedo         Mondstadt Geo     Sword       2020-12-23      13226       251
2 Alhaitham      Sumeru    Dendro  Sword       2023-01-18      13348       313
3 Arataki Itto   Inazuma   Geo     Claymore    2021-12-14      12858       227
4 Cyno           Sumeru    Electro Polearm     2022-09-28      12490       318
5 Eula           Mondstadt Cryo    Claymore    2021-05-18      13226       342
6 Ganyu          Liyue     Cryo    Bow         2021-01-12       9797       335
# ℹ 1 more variable: def_90_90 <dbl>

Calculate Character Motion Values

We run through the characters alphabetically.

Using the values of artifact substats on Honey Hunter, we add weights to separate stats to standardize our calculation of motion value. We will deem attack scaling multipliers as having a weight of “1”, and then all other multipliers will be calculated as their ratio to wt_atk.

To further standardize the units of motion value, we can divide multipliers by the % values of a substat roll. The units of “motion value” will then be weighted-rolls per second.

wt_HP <- mean(c(209.13, 239.0, 268.88, 298.75))
wt_atk <- mean(c(13.62, 15.56, 17.51, 19.45))
wt_def <- mean(c(16.2, 18.52, 20.83, 23.15))
wt_EM <- mean(c(16.32, 18.65, 20.98, 23.31))
roll_HP <- mean(c(4.08, 4.66, 5.25, 5.83))
roll_atk <- mean(c(4.08, 4.66, 5.25, 5.83))
roll_def <- mean(c(5.1, 5.83, 6.56, 7.29))
roll_EM <- wt_EM
motion_value <- function(scaling, instances, time_interval, type){
  if(type=="HP"){
    return(scaling/roll_HP*wt_HP/wt_atk*instances/time_interval)
  }
  else if(type=="atk"){
    return(scaling/roll_atk*wt_atk/wt_atk*instances/time_interval)
  }
  else if(type=="def"){
    return(scaling/roll_def*wt_def/wt_atk*instances/time_interval)
  }
  else if(type=="EM"){
    return(scaling/roll_EM*wt_EM/wt_atk*instances/time_interval) 
    # EM is special as it has no %-rolls
  }
  else{
    print("type invalid")
  }
}

All calculations will be performed with level 9 talents and at C0.

Albedo

Albedo’s rotations include his skill and burst, and he usually is played off-field. His skill has a theoretical 100% uptime, and thus should deal damage roughly every 2.5 seconds (factoring in hitlag). His skill and burst also have partial attack scalings, but these are negligible due to his low investment in atk stats. The talent multiplier for his skill at lvl 9 is 227.12% DEF.

mv_albedo <- motion_value(227.12, 1, 2.5, "def")

Al-Haitham

Al-Haitham is an extremely complicated character to consider for scalings. He gets value out of his normal, charged, skill, bust, and special skill attacks, which make calculations a nightmare, especially because his rotations are not consistent the way Albedo’s are. Another issue is that Al-Haitham benefits greatly from EM for extra additive damage. One major deficiency of these motion value calculations is the fact that additive damage from reactions such as Spread and Aggravate, and buffs from characters like Shenhe or Yunjin are completely unconsidered. This will hurt various Electro and Dendro characters in their calculated motion values, because they get so much value out of these reactions. Al-Haitham’s typical rotation is 20 seconds long.

We reference SevyPlays’ guide on Al-Haitham for the total rotation combo:
- Q (0-mirror)
- 3x N5
- 1x N1C
- 1x E
- 4x 3-mirror skill proc
- 1x 2-mirror skill proc

mv_alhaitham <-
  # Q (0-mirror)
  motion_value(206.72, 4, 20, "atk") + motion_value(165.38, 4, 20, "EM") +
  # 3x N5
  motion_value(90.99+93.24+62.79*2+122.67+154.05, 3, 20, "atk") +
  # 1x N1C
  motion_value(90.99+101.51*2, 1, 20, "atk") + 
  # 1x E
  motion_value(329.12, 1, 20, "atk") + motion_value(263.3, 1, 20, "EM") +
  # 4x 3-mirror skill proc
  4*motion_value(114.24, 3, 20, "atk") + 4*motion_value(228.48, 3, 20, "EM") +
  # 1x 2-mirror skill proc
  motion_value(114.24, 2, 20, "atk") + motion_value(228.48, 2, 20, "EM")

Arataki Itto

Itto, like Al-Haitham is a hypercarry, so we expect similarly high damage values. He faces similar issues in computations as Al-Haitham as well. We refer the KQM TCL again. Itto’s attack scalings, unlike Albedo’s, are not negligible, because Itto gains roughly 100% of his defense as atk while in his burst state. This helps simplify some calculations.

As per KQM’s guide on Itto, a full 20s rotation contains:
- 1x N1
- 1x N2
- 1x N3
- 1x N4
- 2x E
- 7x C
- 3x F

Note that Arataki Itto’s Kesagiri (C) slashes gain an extra 35% defense scaling from his ascension passive.

mv_itto <-
  # 1x N1
  motion_value(145.57, 1, 20, "atk") +
  # 1x N2
  motion_value(145.57 + 140.3, 1, 20, "atk") +
  # 1x N3
  motion_value(145.57 + 140.3 + 168.36, 1, 20, "atk") +
  # 1x N4
  motion_value(145.57 + 140.3 + 168.36 + 215.37, 1, 20, "atk") +
  # 2x E
  motion_value(522.24, 2, 20, "atk") +
  # 7x C
  motion_value(167.48, 7, 20, "atk") + motion_value(35, 7, 20, "def") +
  # 3x F
  motion_value(350.76, 3, 20, "atk")

Cyno

Cyno is also a sort-of “hypercarry”. Time to go again. We will assume that the player uses 4-piece thundering fury on Cyno.

As per KQM’s guide on Cyno, a full 20s rotation contains:
- 1x E (non-mortuary)
- 6x E (mortuary)
- 3x duskstalker procs
- 4x N4
- 1x N2
- 1x N5

Note the following, by ascension passives:
- NAs gain 150% EM scaling
- Duskstalker bolts seem to do 100% atk total, with an additional 250% EM total

mv_cyno <-
  # 1x E (non-mortuary)
  motion_value(221.68, 1, 20, "atk") +
  # 6x E (mortuary)
  motion_value(266.56, 6, 20, "atk") +
  # 3x duskstalker procs
  motion_value(100, 3, 20, "atk") + motion_value(250, 3, 20, "EM") +
  # 4x N4
  motion_value(143.82 + 151.51 + 178.85 + 94.97*2, 4, 20, "atk") +
  # 1x N2
  motion_value(143.82 + 151.51, 1, 20, "atk") +
  # 1x N5
  motion_value(143.82 + 151.51 + 178.85 + 94.97*2 + 240.39, 1, 20, "atk") +
  # 23x passive NA EM scaling
  motion_value(150, 23, 20, "EM")

Eula

Eula’s cryo damage from her skill and burst are negligible, thus only her normal attack combo damage and burst explosion damage need to be considered. However, her held skill creates a mini-lightfall sword which deals half the damage of the burst. The standard c0 rotation gains 14 lightfall stacks.

As per KQM’s extended guide on Eula, a standard 20 second rotation contains:
- 2x N4
- 1x E lightfall
- 1x Q explosion

mv_eula <-
  # 2x N4
  motion_value(164.86 + 171.87 + 104.35*2 + 206.95, 2, 20, "atk") +
  # 1x E lightfall
  motion_value(0.5*674.34, 1, 20, "atk") +
  # 1x Q explosion
  motion_value(674.34, 1, 20, "atk") + motion_value(137.78, 14, 20, "atk")

Ganyu

Ganyu’s classic team archetype is freeze, or “Morgana”. This has a very consistent burst hit rate in AoE, but has a high variability in general. A generous assumption is that in AoE content (3+ targets), 25 out of the 50 cryo shards hit.

As per KQM’s extended guide on Ganyu, a standard 20 second rotation contains:
- 3x C
- 1x E (deals damage twice)
- 1x Q

mv_ganyu <-
  # 3x C
  motion_value(217.6+369.92, 3, 20, "atk") +
  # 1x E
  motion_value(224.4*2, 1, 20, "atk") +
  # 1x Q
  motion_value(119.46, 25, 20, "atk")

Hu Tao

Hu Tao is another hypercarry, who bursts every other rotation (unlike the other hypercarries we have computed so far).

As per KQM’s extended guide on Hu Tao, a standard 20 second rotation contains:
- 9x N1C
- 3x Blood Blossom
- 0.5x Q (burst every other rotation)

mv_hutao <-
  # 9x N1C
  motion_value(307.51, 9, 20, "atk") +
  # 3x Blood Blossom
  motion_value(108.8, 3, 20, "atk") +
  # 0.5x Q
  motion_value(587.93, 0.5, 20, "atk")

Kamisato Ayaka

LOML AYAKA!!! She is… the best (idcidc)

As per KQM’s extended guide on Ayaka, a standard 20 second rotation contains:
- 2x N2C
- 1x N1
- 1x E
- 1x Q (20 ticks)

mv_ayaka <-
  # 2x N2C + 1x N1
  motion_value(84.01+89.44+303.84, 2, 20, "atk") + 
  motion_value(84.01, 1, 20, "atk") +
  # 1x E
  motion_value(406.64, 1, 20, "atk") +
  # 1x Q
  motion_value(190.91, 19, 20, "atk") + motion_value(286.36, 1, 20, "atk")

Kamisato Ayato

As per KQM’s extended guide on Ayato, a standard 20 second rotation contains:
- 1x E Explosion
- 5x N3 (in skill) + 15 namisen stacks
- 10x Q hits

mv_ayato <-
  # 1x E explosion
  motion_value(186.44, 1, 20, "atk") +
  # 4x N3 (in skill) + 12 namisen stacks
  motion_value(97.17+108.23+119.29, 5, 20, "atk") + 
  motion_value(1.03, 15, 20, "HP") +
  # 10x Q hits
  motion_value(112.98, 10, 20, "atk")

Klee

KQM’s resources on Klee’s rotations were limited, so I referenced an extended Klee video guide for a 20s rotation:
- 1x N1
- 4x N1C
- 2x E
- 1x Q

mv_klee <-
  # 1x N1 + 4x N1C
  motion_value(122.67, 1, 20, "atk") + motion_value(122.67 + 267.51, 4, 20, "atk") +
  # 2x E (2 bounces hit each on average, 4 mines each hit on average)
  motion_value(161.84*2+55.76*4, 2, 20, "atk") +
  # 1x Q
  motion_value(72.49, 22, 20, "atk")

Nahida

We assume that Nahida is used on-field. As I am familiar with her rotations and scalings, no reference is needed:
- 4x N4
- 9x TKP procs per 20s rotation
- 1x E hold hit

mv_nahida <-
  # 4x N4
  motion_value(68.52+62.86+77.99+99.29, 4, 20, "atk") +
  # 9x TKP procs
  motion_value(175.44, 9, 20, "atk") + motion_value(350.88, 9, 20, "EM") +
  # 1x E hold hit
  motion_value(221.68, 1, 20, "atk")

Raiden Shogun

Raiden can act as a hypercarry, and she has some complicated combos when factoring her normal, skill, and burst damage. I am familiar with her combos, again, so no reference is needed. We assume 60/60 resolve stacks and a 20s rotation:
- 1x Q initial hit
- 1x E initial hit
- 18x E hits
- 3x N3C
- 1x N2C

mv_raiden <-
  # 1x Q initial hit + resolve
  motion_value(681.36+60*6.61, 1, 20, "atk") +
  # 1x E initial hit + 18x E hits
  motion_value(199.24, 1, 20, "atk") + motion_value(71.4, 18, 20, "atk") +
  # 3x N3C + 1x N2C + resolve
  motion_value(75.24+73.93+90.52+103.6+125.06, 3, 20, "atk") +
  motion_value(75.24+73.93+103.6+125.06, 1, 20, "atk") +
  motion_value(1.23*60, 19, 20, "atk")

Sangonomiya Kokomi

Kokomi is not a traditional DPS, or some may not consider her a damage dealer at all, but her base multipliers are respectable, and in teams such as Sukokomon, she contributes a respectable portion of the damage herself. I am familiar with her Sukokomon rotation but not her scalings. A 20s rotation contains:
- 1x E initial hit
- 10x E hits + 5x HP bonus
- 1x Q initial hit
- 3x N2, 1x C + HP bonus

mv_kokomi <-
  # 1x E initial hit + 10x E hits + 5x HP skill bonus
  motion_value(185.62, 11, 20, "atk") + motion_value(12.06, 5, 20, "HP") +
  # 1x Q initial hit
  motion_value(17.71, 1, 20, "HP") +
  # 3x N2 + 1x C + HP bonus
  motion_value(116.24+104.62, 3, 20, "atk") + 
  motion_value(252.14, 1, 20, "atk") +
  motion_value(8.23, 6, 20, "HP") +
  motion_value(11.52, 1, 20, "HP")

Shenhe

Shenhe is also not typically considered a damage dealer, but theorycrafters tend to consider the icy quill damage that she provides to be a direct contribution instead of a buff because of its additive calculation. A standard 20s rotation with Shenhe contains the following:
- 1x Q initial hit + 12x Q hits
- 2x E press hits
- 10x icy quills

mv_shenhe <-
  # 1x Q initial hit + 12x Q hits
  motion_value(171.36, 1, 20, "atk") + motion_value(56.3, 12, 20, "atk") +
  # 2x E press hits
  motion_value(236.64, 2, 20, "atk") +
  # 10x icy quills
  motion_value(77.62, 10, 20, "atk")

Tartaglia

Tartaglia is not a typical hypercarry, as he tends to enable his team to deal damage with his fast hydro application. Nonetheless he contributes respectable damage. We reference KQM’s guide for a 20s rotation:
- 6x N2C
- 5x Riptide Flash
- 5x Riptide Slash
- 1x Ranged Q
- 2x E initial hit

mv_childe <-
  # 6x N2C
  motion_value(390.74, 6, 22, "atk") +
  # 5x Riptide Flash
  motion_value(17.63*3, 5, 22, "atk") +
  # 5x Riptide Slash
  motion_value(86.5, 5, 22, "atk") +
  # 1x Ranged Q
  motion_value(643.28, 1, 22, "atk") +
  # 1x E initial hit
  motion_value(122.4, 2, 22, "atk")

Wanderer

We reference KQM’s extended guide on Wanderer for a 20 second rotation:
- 5x N2C
- 1x N2
- 1x E
- 0.5x Q

mv_scara <-
  # 5x N2C + 1x N2
  motion_value(126.24+119.45+237.74, 5, 20, "atk") +
  motion_value(126.24+119.45, 1, 20, "atk") +
  # 1x E
  motion_value(161.84, 1, 20, "atk") +
  # 0.5x Q
  motion_value(250.24*5, 0.5, 20, "atk")

Xiao

Referring to Xiao’s guide on KQM, his highest use case has the following components in a 20 second rotation:
- 2x E
- 11x HP
- 2x LP

mv_xiao <-
  # 2x E
  motion_value(429.76, 2, 20, "atk") +
  # 11x HP
  motion_value(375.5, 11, 20, "atk") +
  # 2x LP
  motion_value(300.63, 2, 20, "atk")

Yae Miko

Yae is an off-field damage dealer, and her rotation is exceedingly simple. I am familiar with her rotation and scalings, so no reference is needed. typical 20s rotation contains:
- 15x lvl. 3 turret strikes
- 0.5x Q initial hit
- 1.5x Q hits

mv_yae <-
  # 15x lvl. 3 turret strikes
  motion_value(161.16, 15, 20, "atk") +
  # 0.5x Q initial hit
  motion_value(442, 0.5, 20, "atk") +
  # 1.5x Q hits
  motion_value(567.49, 1.5, 20, "atk")

Yelan

Referencing KQM’s Yelan guide, a standard 20 second rotation will contain:
- 1x Q initial hit
- 15x Q waves
- 1x E

mv_yelan <-
  # 1x Q initial hit
  motion_value(12.42, 1, 20, "HP") +
  # 15x Q waves
  motion_value(8.28*3, 15, 20, "HP") +
  # 1x E
  motion_value(38.44, 1, 20, "HP")

Yoimiya

Yoimiya’s attack strings are quite simple, and she is very similar in playstyle to Hu Tao. Her combos are very simple, and as I am familiar with her rotations and scalings, no reference is needed. in a standard 20s rotation:
- 3x N5
- 1x Q initial hit
- 4x Q hits

mv_yoimiya <-
  # 3x N5
  motion_value(119.88+115+149.49+156.14+178.04, 3, 20, "atk") +
  # 1x Q initial hit
  motion_value(216.24, 1, 20, "atk") +
  # 4x Q hits
  motion_value(207.4, 4, 20, "atk")

Merge the New Motion Value Data with the Cleaned Dataframe

# make all the motion value numbers into a vector ordered by the character's
# index in the original dataframe
mv <- c(mv_albedo, mv_alhaitham, mv_itto, mv_cyno, mv_eula, mv_ganyu, mv_hutao, 
        mv_ayaka, mv_ayato, mv_klee, mv_nahida, mv_raiden, mv_kokomi, mv_shenhe,
        mv_childe, mv_scara, mv_xiao, mv_yae, mv_yelan, mv_yoimiya)

# join genshin and the mv vector to make a new dataframe
genshin_mv <- data.frame(genshin, mv)

Create a Linear Model and Assess

powercreep_lm <- lm(genshin_mv$mv ~ genshin_mv$release_date)

summary(powercreep_lm)

Call:
lm(formula = genshin_mv$mv ~ genshin_mv$release_date)

Residuals:
    Min      1Q  Median      3Q     Max 
-24.643 -11.234   3.438  10.910  23.469 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)
(Intercept)             -222.03765  238.23341  -0.932    0.364
genshin_mv$release_date    0.01410    0.01259   1.120    0.277

Residual standard error: 14.51 on 18 degrees of freedom
Multiple R-squared:  0.06515,   Adjusted R-squared:  0.01322 
F-statistic: 1.254 on 1 and 18 DF,  p-value: 0.2774
plot(powercreep_lm)

plot(genshin_mv$mv ~ genshin_mv$release_date)
abline(powercreep_lm)

Initial Discussion

Ok well what does all this even say? Perhaps the first and most important thing to recognize is that the least-squares linear model created using this data has a p-value of 0.2774, which is absolutely insufficient to reject the null hypothesis that there is no relationship between a characters release date and their rotational motion values. Thus, none of the four diagnostic plots even matter, and neither does the plot of the linear model. Yes, visually there appears to be some sort of upward trend to motion values over time, but this is ultimately meaningless, because this model explains only 1% of the variability in motion values through release date. This maybe begs the question whether any of the other variables have any weight in explaining the differences in motion values.

motion value vs. vision

powercreep2 <- lm(genshin_mv$mv ~ genshin_mv$vision)
summary(powercreep2)

Call:
lm(formula = genshin_mv$mv ~ genshin_mv$vision)

Residuals:
    Min      1Q  Median      3Q     Max 
-21.979 -10.507   2.155  10.507  19.352 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)   
(Intercept)               45.6184    11.1264   4.100  0.00125 **
genshin_mv$visionCryo     -2.4842    13.6270  -0.182  0.85816   
genshin_mv$visionDendro    4.9682    15.7351   0.316  0.75721   
genshin_mv$visionElectro   9.7906    14.3641   0.682  0.50745   
genshin_mv$visionGeo     -11.3761    15.7351  -0.723  0.48250   
genshin_mv$visionHydro     0.6543    13.6270   0.048  0.96244   
genshin_mv$visionPyro     -8.7497    14.3641  -0.609  0.55293   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 15.74 on 13 degrees of freedom
Multiple R-squared:  0.2064,    Adjusted R-squared:  -0.1598 
F-statistic: 0.5637 on 6 and 13 DF,  p-value: 0.7521
plot(powercreep2)

And it seems that the character’s element is inconclusive as an explanatory variable too! We as a community know, however, that the motion values of characters ARE dependent on their element due to the nature of their reactions. A character like Hu Tao, for example, MUST have low motion values in order to balance the fact that she recieves a roughly 2x multiplicative damage bonus from the vaporize reaction. This highlights a weakness in using motion values to assess powercreep, because ultimately the raw numbers of a character in isolation from their team means little as to how much damage and utility they are capable of providing. In a more simplistic game where characters fight solo, motion values can mean nearly everything, but part of the beauty of Genshin Impact is the ability to play unique and innovative teams which elevate your favorite characters to heights that they could never reach on their own.

Expository Plots

HOW ABOUT SOME SIDE BY SIDE BOX PLOTS!!!

vision_pal <- c("#b8dbb0", "#78c6e9", "#2ecc71", "#f47fff", "#f1c40f",
                "#3498db", "#ee7600")
boxplots <- ggplot(genshin_mv, aes(x = vision, y = mv, fill = vision)) +
  geom_boxplot() +
  scale_fill_manual(values = vision_pal) +
  labs(title = "Motion Value Boxplots by Element")

boxplots

I’m honestly quite shocked by these plots. I expected the motion values of geo and anemo to be much higher on average due to their lack of access to multiplicative reactions.

stacks <- ggplot(genshin_mv, aes(x = vision, y = mv, fill = region)) +
  geom_col() +
  scale_fill_brewer(palette = "Pastel1") +
  theme_classic() +
  labs(title = "Motion Values by Element and Region")

stacks

This plot honestly doesn’t say much either other than that all the limited dendro 5* damage dealers that are currently out are from Sumeru. Perhaps you could also say that there are a lack of regional diversities in the anemo, dendro, electro, and geo elements for limited 5* damage dealers.

I definitely want to move forward with a time series plot. So that’s what I’ll do.

Final Viz and Discussion

For the initial ggplot, I add the release date as the x aesthetic, and the motion value as the y aesthetic. I add the classic theme first so as to not mess with the palette used for the points later. I then add a scatterplot using the point geom, and add the vision as the point color aesthetic within this. Adding the color aesthetic here is very important, because when I put it in the first aesthetics declaration at the top, the loess smooth did not work. I then add the smooth geom with a loess smoother, and change the line color to black, making the error band have a low opacity (I wanted to include it just to emphasize how horrible the model is). Then I add the title, x and y axis labels, and caption. I finally center the title using hjust, and call the plot.

insignificant <- ggplot(genshin_mv, aes(x=release_date, y=mv)) +
  theme_classic() +
  geom_point(aes(color=vision, name=character_name)) +
  scale_color_manual(values = vision_pal) +
  geom_smooth(method='loess', color = "black", alpha=0.1) +
  labs(title = "Powercreep in Genshin Impact", x = "Release Date (yyyy-mm)",
       y = "Motion Value (rolls/s)", 
       caption = "character data from Sophia Healy,
       motion values computed using KQM data") +
   theme(plot.title = element_text(hjust = 0.5))
Warning in geom_point(aes(color = vision, name = character_name)): Ignoring
unknown aesthetics: name
insignificant
`geom_smooth()` using formula = 'y ~ x'

Then to add interactivity, I use plotly, which unfortunately cuts off the caption:

ggplotly(insignificant)
`geom_smooth()` using formula = 'y ~ x'

.

The scatterplot and loess smooth indicate a general upwards trend in motion value over time, with a dip in early 2022. One could make an argument that this dip should not be there at all, as Shenhe is not necessarily a “damage dealer”, and perhaps if she is included on these plots, the motion value calculations should change to reflect her on-fielding potential similar to characters such as Nahida. The distribution of visions (elements) across the y-axis corroborates the boxplots displayed in the earlier sections of this project, but showing no clear grouping of motion values by vision.

So what do these mean? Well, in short, nothing predictive. The data provides no evidence of a significant relationship between the motion value and release date variables. However, it is important to consider that this data is a complete population of characters before version 4.0. In that sense, yes, on average the motion value of limited 5 star damage dealers released in the first quarter of the game’s main storyline is lower than the average motion value of limited 5 star damage dealers released in the second quarter of the game’s main storyline. Does this mean that powercreep is occurring in Genshin Impact? No, this data ultimately says nothing conclusive about powercreep in Genshin Impact, and is in fact subject to change if new characters enable different rotations and roles for the characters whose motion values are calculated and displayed in this graph.

As for my thoughts, I believe that in a more practical sense, the 4-member team-based nature of Genshin Impact helps to mitigate the effect of ambient powercreep. In order to substitute a new character into a team, there will always be sacrifices, so long as HoyoVerse makes future characters’ kits sufficiently different than their predecessors. saurusness, in their video, describes how they felt that Ayato was powercrept by Neuvillette (a character we did not cover in this exploration due to recency). I can agree that they share similar niches and can understand why they felt this way, but it is important to recognize that Ayato retains characteristics which Neuvillette does not, namely, a normal-attack focused playstyle, and off-field hydro application with his burst, which is a form of future-proofing, which allows Ayato to be rebalanced as characters and abyss cycles which synergize with this playstyle return.

I was disappointed to see that the painstaking labor of manual data entry and computation resulted in no conclusive inferences or predictions, and this reminds me that it is so important to motivate, incentivize, and reward inconclusive research in science, because I cannot imagine the magnitude of dejectedness I would feel were this an actual research topic I had poured years into. This also makes me interested in learning more about statistical methods, because I have no clue how to draw statistical conclusions from these types of insignificant results. Thanks for reading if you made it here!

from u/Yosoress on Reddit

Works Cited: