Type-wing Politics!: Discussing the Great Pokémon Debate

10 minute read

Hello everyone,

Its time for Round 2 of the greatest debate in Pokémon history, “Which of the Three Starters is the best”?

Do you remember our contenders?

We have:

  • Charmander. The little lizard with the heat on it’s tail
  • Squirtle. Who is cool but crude(Give him a break)
  • Bulbasaur. The sentient cesear salad.

I our last post we examined the stats of the starters and figured out that bulbasuar has the highest stats in majority of the categories. We then looked at how these stats changed over the Pokémon’s evolutionary line and we saw that Charizard lead the charge with a huge gain in stat points.

In ranking I would give Bulbasaur first place. He starts off winning the highest amount of stats in most of the categories and ends only tied with Charizard Charmander would get second place, really winning because his final evolution Charizard gets a massive boost in stats. And in last place, would be Squirtle. He just never really leads in any way when it comes to stats. You could argue that hes the most balanced of the three starters and while that is true, being balanced rarely equates to be the best(or even being great…)

However, stats arent the only metrics we can use to examine what makes a good starter. Let’s look at Type Advantages and see how our starters compare.

Going Back to the Source

As I discussed in the first post, I got the idea to do a more in-depth analysis from two sources

  1. A communal debate at my go to bar.
  2. An article from Scientific American claiming to have scientifically determemined the best Kanto starter.

Here is the link to the article: https://blogs.scientificamerican.com/but-not-simpler/squirtle-i-should-choose-you-settling-a-great-pokemon-debate-with-science/

One of the issues with this article(and the point I discussed in my first post on this topic) was that it mostly ignores Pokémon stats.

The next issue I had was how it compares type advantage/disadvantage in order to reach it’s conclusion on which starter is best.

To summarize the paper’s approach and logic

  1. First comparing the type advantage/disadvantage of the starters and their evolutions against th Pokémon of gym leaders and elite four(videogame bosses).
  2. It creates a heatmap indicating weak,neutral, or strong,
  3. It concludes that squirtle has the most neutral matchups, therefore it is the better choice.

While this isn’t a terrible way to analysis this, I feel like it is misleading for a nmuber of reasons. First, it shortchanges the entire “Type Match-up interaction”. Second, while the author tends to focus on the first generation(Even admitting to have lost touch with the franchise at Pokemon X/Y) it ignores a whole plefora of data brought in by newer generations. And third, it just isnt nearly as comprensive as it should be to really contain decision making value.

What is the Type Match-up Interaction?

I want to apologize to anyone aware of how the Type Match-up Interaction works. I hope this post reaches people from all walks of life. In order for this analysis to be effective, I have to explain how some factors work as if it is your first time gaining this information. For some of your readers, this will be your first time seeing these factors and I want to make sure you are with us until the very end. For those of you more experienced in these factors I hope you can corroborate the information.

So if we were to boil any given Pokémon to its essentials, it would come down to a few objects:

  • The Pokémon’s stat values(Attack, Special Attack, Defense, Special Defense, Speed, and HP)
  • The Pokémon’s Type
  • The Pokémon’s Move pool(The specific combat moves it can learn or aquire)
  • The Pokémon’s Abilities(Something we will discuss way down the line)

Pokémon moves also contain a type.

There are 18 types in the current Pokémon format. Those types being:

Normal, Fire, Water, Electric, Grass, Ice, Fighting, Poison, Ground, Flying, Psychic, Bug, Rock, Ghost, Dragon, Dark, Steel, Fairy.

In combat, a Pokémon’s type and the move used agaisnt it maintain a Defense/ Attack relationship. Having the Pokémon’s type defend against the move’s types

This relationship has three basic outcomes:

  1. The defending Pokémon’s type is Weak to the move’s type resulting in additional damage dealt.
  2. The defending Pokémon’s type is Neutral to the move’s type resulting in standard damage dealt.
  3. The defending Pokémon’s type is Strong to the move’s type resulting in reduced damage dealt.

Some type relationships sometimes follow logic e.g, Fire moves are strong against Grass type pokemon, as in real life fire can burn plants Other relationships are based on existing mythologies, like fairy pokemon being weak to steel, as fairy creatures in many myths have an adverse interaction with iron and metal

Here is a chart summing up the relationships between how the types interact with one another:

Relationship between defending and attacking pokemon types

OKAY, with all that said and done lets get to the data!!!

Remember: I used this dataset from Kaggle: https://www.kaggle.com/rounakbanik/pokemon

I made a subset of the data using the original Kanto starters.

My overall goal is to examine aspects of the starters in order to answer the question “Which starter is the best starter?”

# Load Packages
library(tidyverse)# This is R's #1 tool for data manipulation
library(RColorBrewer) # Used to have more control over the color palettes
library(ggthemes)

Our starters exhibit the following types:

  • Bulbasaur has the dual typing of Grass and Poison, rather unique
  • Squirtle has the typing of Water
  • Charmander has the typing of Fire

I created a dataset which contained the type relationship between each starter and created this heatmap

p<- ggplot(data = TypeMatchupStarters, aes(y = Starter, x = Type,fill = Damage_Coefficient))+
  geom_tile(color = "Black")+
  coord_equal()+
  labs(title = "Starters Defending Type Matchup",
       x = "Attacking Types",
       y = "Pokemon Starters")+
  theme_fivethirtyeight()

p
p + scale_fill_gradientn(colours = hm.palette(100))+ 

Heatmap

Here we can already see some interesting things. Lets look at them individually:

Bulbasaur

Bulbasaur

  • Weak to 4 types
  • Strong to 5 types
  • Neutral to 9 types

Squirtle

Squirtle

  • Weak to 2 types
  • Strong to 4 types
  • Neutral to 12 types

Charmander

Charmander

  • Weak to 3 types
  • Strong to 6 types
  • Neutral to 9 types

This is a nice chunk of information but we can take our analysis a bit further

Pokémon Moves Dataset

Remember earlier how I said the relationship between type advantages/disadvantages was:

“Pokémon’s type defending against the attacking move type”. This means we need to start looking at Pokémon moves.

To get the data for the Pokémon’s moves I went to this website: https://pokemondb.net/move/all

I then used the package rvest to webscrape the data. While I wanted to include this process into the blog post, I decided it would be better not to overbloat this post and leave it out. If you guys are curious please send me an email and I will gladly supply you with this method.

After I scraped and cleaned the data, I had a dataset I could work with. If any of you are courious about the dataset it is on my Kaggle page: https://www.kaggle.com/supervegate/pokemon-moveset

# Load the dataset
# Check the dataset
head(All_Moves)

Which will give me a printout like:

# A tibble: 6 x 9
  Name                        Type     Category Effect                                         Power Acc   PP    TM    `Prob.(%)`
  <chr>                       <chr>    <chr>    <chr>                                          <chr> <chr> <chr> <chr> <chr>     
1 10,000,000 Volt Thunderbolt Electric Special  Pikachu-exclusive Z-Move.                      195   -     1     <NA>  <NA>      
2 Absorb                      Grass    Special  User recovers half the HP inflicted on oppone~ 20    100   25    <NA>  -         
3 Accelerock                  Rock     Physical User attacks first.                            40    100   20    <NA>  <NA>      
4 Acid                        Poison   Special  May lower opponent's Special Defense.          40    100   30    <NA>  10        
5 Acid Armor                  Poison   Status   Sharply raises user's Defense.                 -     -     20    <NA>  -         
6 Acid Downpour               Poison   Z-Move   Poison type Z-Move.                            -     -     1     <NA>  <NA>      

Because I have a more defined idea of how I am going to be using this dataset I am going to set into some light EDA. I will be asking myself two questions Q1. How many moves are in each type? Q2. How many moves are in each category?

Q1 How many moves are in each type?

move_types <- All_Moves %>%
  count(Type)
move_types

Graphically expressed as Move Count by Type

We can see here that majority of the moves available are of “normal” type, which is neutral to most Pokémon

Q2. How many moves are in each category? To explain breifly, Pokémon moves follow their own category, which interact with individual stats of the attacking and defending Pokémon.

  • Moves of the physical category interact with the Attack and Defense stat scores
  • Moves of the special category interact with the Special Attack and Special Defense stat scores
  • Moves of the Status category usually don’t impose damage directly and have a wide range of effects
  • Last, Z-moves which were introduced more recently, are type specific damaging moves.
# Q2. How are moves distributed by category?
move_cate <- All_Moves %>%
  count(Category) %>%
  mutate(Percentage =  n / sum(n) * 100) %>%
  mutate(Percentage_sig = sprintf("%0.2f", Percentage)) # Changes the significant figure up to two places
move_cate
# Lets make a basic plot to give us visual
ggplot(data = move_cate, aes(x = Category, y = Percentage, fill = Category)) +
  geom_bar(stat = "identity")+
  labs(x = "Move Category",
       y = "Percentage of Occurance",
       title = "Total Pokémon Moveset by Category")+
  theme_hc()

Move Category Total

You can see here, that I started calculating the counts by percentages instead of raw numbers.

Here we can see that by Category:

  • Physical moves make up 38% of the movepool.
  • Status makes up 35% of the movepool
  • Special moves represent 25% of the movepool
  • Z-moves represent 2% move pool

The Big Picture

Combinding our two objectives will get me to the final point I am trying to make.

Since Pokémon only take initial damage from Physical/Special/Z-moves lets removes Status and then lets do a count

Moves_NoStatus <- All_Moves %>%
  filter(!Category == "Status") %>%
  count(Type) %>%
  mutate(Percentage =  n / sum(n) * 100) %>%
  mutate(Percentage_sig = sprintf("%0.2f", Percentage)) # Changes the significant figure up to two places
Moves_NoStatus

# A tibble: 18 x 4
   Type         n Percentage Percentage_sig
   <chr>    <int>      <dbl> <chr>         
 1 Bug         20       4.22 4.22          
 2 Dark        24       5.06 5.06          
 3 Dragon      17       3.59 3.59          
 4 Electric    28       5.91 5.91          
 5 Fairy       13       2.74 2.74          
 6 Fighting    38       8.02 8.02          
 7 Fire        32       6.75 6.75          
 8 Flying      22       4.64 4.64          
 9 Ghost       19       4.01 4.01          
10 Grass       26       5.49 5.49          
11 Ground      21       4.43 4.43          
12 Ice         21       4.43 4.43          
13 Normal      89      18.8  18.78         
14 Poison      16       3.38 3.38          
15 Psychic     24       5.06 5.06          
16 Rock        15       3.16 3.16          
17 Steel       19       4.01 4.01          
18 Water       30       6.33 6.33   

Now we have the following items.

  1. The defending types of the starters
  2. How types interact with one another
  3. The percentage of move types.

Combinding theses items I was able to create this

# Next create a bar chart
ggplot(data = MatchupMovesStarters, aes(x = Type_Relationship, y = Percentage, fill = Type_Relationship))+
  geom_bar(stat = "identity")+
  facet_grid(. ~ Pokemon)+
  labs(title = "Pokémon Starters Type Matchup",
       subtitle = "The Typing Relationship Between the Original Pokémon starters and the Movepool",
       x = "Typing Relationship",
       y = "Move Total Percentage(%)")+
  theme_economist_white()+
  scale_fill_wsj("colors6")

Move Category Total

Conclusion

Here we can see an interesting fact about the move types and their interaction with the Pokémon Starters In terms of the total amount of moves which can damage a Pokémon:

Bulbasaur

  • Has the highest number of weak matchups
  • Has beat Charmander(slightly) in neutral matchups

Charmander

  • Has the highest number of strong matchups

Squirtle

  • Has the highest number of neutral matchups
  • Has the smallest number of Strong and Weak matchups

Since Bulbasaur has duel-typing it interacts with the type matchup in a more dynamic way. The duel-typing allows it to cast a wider influence on the match up which seems to have increased both its Strong and Weak match ups. As a result I think it loses in a general sense. In addition to losing the general fight, It seems like the moves Bulbasaur is weak to happen to be more popularily represented in the moveset as a whole.

Sorry my little green homie, but I think you lose this fight.

As for the winner, Squirtle gets the win in most general, or better put least hindering match ups. Charmander wins in most favorable match ups.

The true winner is up to you, but I would give this win to Squirtle.

Lets say each of our starters is getting relentlessly blasted by the metronome(Which has a random chance of being anymove in the entire moveset). Squirtle is going to be able to get hit by a majority of the moves without suffering from any type disadvantage.

I thought this was all together more conprehensive than the previous article. Thanks for reading, and thanks for being patient with me! Bye fellow Pokémon Masters!!