I can describe myself as someone who “just joined the hype” of the recent Pokémon GO mobile game. It was a fun summer, but when school kicked in and winter started taking over, I felt less inclined to go out and fill-up my Pokédex. I still remember the days when our neighborhood is just filled with Pidgeys and Rattatas, and very few Abras that were almost “un-catchable.” This inspired me to look into how other Pokémon fare with respect to their spawn frequency and the ease on how they can be caught.

So here’s a magic quadrant exploring these features. Good thing that data for Pokémon GO is already available online. However, please be mindful that several assumptions were made in the methods of data collection, so subtle biases, intended or not, may be present. You can check them below. Moreover, if you’re planning to use my dataset, you can first refer to my exploratory data analysis here.

You can play with this chart by hovering on different points so you can see the Pokémon it represents. Which Pokémon is the most common and easiest to catch? Which one’s the hardest? In which quadrant does more powerful Pokémon lie? You can also click the legends on the right to hide some types so you can focus or compare between different types. Enjoy!


  • The data for catch and flee rates was pulled by Reddit user /u/The_Desert_Rain. In my visualization, I am using the base rates, this means that catching these Pokémon gets harder as your level goes up. What /u/The_Desert_Rain and other Redditors are doing is that they are trying to reverse engineer the formulas and game mechanics in PokemonGO. Because the actual data is hidden, they look for patterns and compute for expected outcomes. It’s so geeky and exciting! You can read more of their analyses here and here.
  • The spawn rate was taken from the Pokémon GO Hub’s website. Their methodology involves scraping the data from Poké Radar and computed the percentages on a one-week period across approximately 100 million historical data points. This then normalizes the spawn rate irrespective of your geographical location (like Mr. Mime showing only in France or Water-type Pokémon spawning near bodies of water).
  • The CP was taken as a basis of “strength.” The data for this came from Kaggle.
  • In my case, I engineered two features for my x and y axes. First, I took the log (base 10) of the swarm rate and plotted it along the x-axis. For the y-axis, I simply plotted the ratio between the catch rate and the flee rate. Thus, we have x_arg = np.log10(swarm_rate) for the x-axis and y_arg = catch_rate/flee_rate for the y-axis. If y_arg is high, then the denominator is low so that catch rate is higher than the flee rate and so on.
  • To make the “magic quadrant” more pleasing to look at, I applied zero-mean centering in my data. This means that I took the mean of the two features, and subtracted it to all my samples. You can access the GitHub repo for the source code.
  • As you can see, I am only plotting the Primary types of each Pokémon. I still haven’t figured an elegant way of showing those that are double-typed. That’s why you’ll see Pidgey and Spearow classified as Normal-types, and Seel and Dewgong as Water-types. If you have nice ideas, just comment below!