Stats Ratings

Status
Not open for further replies.

X-Act

np: Biffy Clyro - Shock Shock
is a Site Content Manager Alumnusis a Programmer Alumnusis a Smogon Discord Contributor Alumnusis a Top Researcher Alumnusis a Top CAP Contributor Alumnusis a Top Tiering Contributor Alumnusis a Top Contributor Alumnusis a Smogon Media Contributor Alumnusis an Administrator Alumnus
Today I've had a very busy day, so I hadn't had the time to sit down on my laptop and type everything I did yesterday, until now.

The formulae that will be written here would be better suited in a kind of little program that would produce the numbers for us, by the way. They become rather hairy quite quickly, so be warned.

So hereunder are a collection of ratings of a Pokemon, in particular:
  • Physical Tankiness (PT) and Special Tankiness (ST) of a Pokemon, which provide the physical and special defensive prowess of a Pokemon
  • Physical Sweepiness (PS) and Special Sweepiness (SS) of a Pokemon, which provide the physical and special offensive capabilities of a Pokemon
  • Offense/Defense Balance (ODB) of a Pokemon, providing whether or not a Pokemon's stats are geared towards offense (Atk/SpA/Spe), defense (HP/Def/SpD), or neither.
  • Physical/Special Balance (PSB) of a Pokemon, providing whether or not a Pokemon's stats are geared towards physical stats (Atk/Def), special stats (SpA/SpD), or neither.
  • Overall Rating of a Pokemon, providing a rating from each of the Pokemon's stats.
Before I continue, I wish to note that a Pokemon having high attacking stats but low defense and speed stats is NOT deemed to be offensive, as it can't do enough damage before it is KOed. An example of such a Pokemon is Camerupt.

Physical Tankiness, Special Tankiness, Physical Sweepiness, Special Sweepiness

Code:
Physical Tankiness (PT) = HP × Def ÷ 35
 
Special Tankiness (ST) = HP × SpD ÷ 35
 
Physical Sweepiness (PS) = Atk × (Atk × SF + 315) ÷ (Atk × (1-SF) + 315)
 
Special Sweepiness (SS) = SpA × (SpA × SF + 315) ÷ (SpA × (1-SF) + 315)
 
where HP is the normalized Base HP
      Atk is the normalized Base Attack
      Def is the normalized Base Defense
      SpA is the normalized Base Special Attack
      SpD is the normalized Base Special Defense
      SF is the Speed Factor of the Base Speed
PT and ST are divided by 35 to normalize their values.

A tankiness (physical or special) of 100 means that the Pokemon has average (physical or special) defense. A tankiness of more than 100 means it's pretty defensive (the more the better), while a tankiness of less than 100 means that it can't take hits well.

A sweepiness (physical or special) of 100 means that the Pokemon has average (physical or special) offense. A sweepiness of more than 100 means it's pretty offensive (the more the better), while a sweepiness of less than 100 means it cannot attack well.

Offense/Defense Balance

Code:
ODB = 55 × ln(max(PS,SS) ÷ max(PT,ST)), rounded to one decimal place.
 
where max([I]a[/I],[I]b[/I]) returns the larger of [I]a[/I] and [I]b[/I]
      ln([I]x[/I]) is the natural logarithm of [I]x[/I]
If the ODB is negative, then the Pokemon's stats are geared towards defense. If the ODB is positive, then the Pokemon's stats are geared towards offense. If it is near zero, then the stats are balanced, having roughly the same amount of tankiness as it has sweepiness.

A small chart can give us the degree of offense/defense:

Code:
ODB is               Pokemon's Stats are geared      Pokemon with this ODB
---------------------------------------------------------------------------------
More than 40         Absolutely towards offense      Shedinja, Deoxys-A, Deoxys, Sharpedo, Alakazam, Gengar, Ninjask, Azelf, Absol, Syclant
Between 30 and 40    Strongly towards offense        Manectric, Darkrai, Floatzel, Chatot, Zangoose, Dodrio, Mewtwo, Dugtrio, Espeon, Weavile, Swellow, Staraptor, Honchkrow, Porygon-Z, Rampardos, Lucario, Ambipom, Primeape, Salamence, Infernape
Between 20 and 30    Towards offense                 Scyther, Beautifly, Mothim, Aerodactyl, Delibird, Breloom, Rotom, Fearow, Electivire, Banette, Deoxys-S, Starmie, Rayquaza, Blaziken, Rapidash, Sceptile, Jolteon, Xatu, Toxicroak, Houndoom, Cacturne, Purugly, Raticate, Zapdos, Roserade, Jynx, Hitmonlee, Latios, Stantler, Regigigas, Charizard, Typhlosion, Raichu, Girafarig, Seviper, Pinsir, Palkia, Shiftry
Between 10 and 20    Moderately towards offense      Unown, Yanmega, Kricketune, Victreebel, Qwilfish, Magmortar, Plusle, Garchomp, Arcanine, Flygon, Moltres, Mismagius, Froslass, Electrode, Heracross, Luxray, Persian, Kingler, Venomoth, Raikou, Slaking, Tauros, Bibarel, Crobat, Mamoswine, Kabutops, Mr. Mime, Crawdaunt, Entei, Dialga, Ursaring, Mightyena, Linoone, Dragonite, Scizor, Arbok, Hitmonchan, Cherrim, Golduck, Gallade, Gardevoir, Nidoking
Between 5 and 10     Slightly towards offense        Gyarados, Skuntank, Furret, Glaceon, Flareon, Chimecho, Heatran, Pidgeot, Minun, Farfetch'd, Machamp, Solrock, Lunatone, Volbeat, Illumise, Exploud, Carnivine, Leafeon
Between -5 and 5     Equally in offense and defense  Butterfree, Beedrill, Groudon, Kyogre, Kingdra, Gorebyss, Ditto, Latias, Kangaskhan, Seaking, Exeggutor, Octillery, Granbull, Camerupt, Lopunny, Hitmontop, Drifblim, Togekiss, Magnezone, Mew, Celebi, Jirachi, Manaphy, Shaymin, Sableye, Arceus, Feraligatr, Mawile, Mesprit, Venusaur, Castform, Delcatty, Huntail, Drapion, Glalie, Phione, Ariados, Metagross, Ninetales, Hariyama, Ampharos, Lumineon, Luvdisc, Tyranitar, Medicham, Wailord, Armaldo, Parasect, Masquerain, Empoleon, Pelipper, Gliscor, Swampert
Between -10 and -5   Slightly towards defense        Vileplume, Nidoqueen, Abomasnow, Sandslash, Ludicolo, Meganium, Sunflora, Grumpig, Blastoise, Omastar
Between -20 and -10  Moderately towards defense      Ho-oh, Revenankh, Torterra, Miltank, Politoed, Jumpluff, Poliwrath, Walrein, Tentacruel, Spiritomb, Milotic, Wigglytuff, Vaporeon, Dusknoir, Whiscash, Articuno, Bellossom, Clefable, Weezing, Suicune, Donphan, Corsola, Altaria, Lanturn, Muk, Claydol, Dunsparce, Uxie, Wormadam-G, Wormadam, Marowak, Wormadam-S, Pachirisu
Between -30 and -20  Towards defense                 Gastrodon, Dewgong, Noctowl, Swalot, Ledian, Kecleon, Smeargle, Quagsire, Cloyster, Vespiquen, Dustox, Golem, Sudowoodo, Tropius, Skarmory, Mantine, Deoxys-D, Hippowdon, Bronzong, Magcargo, Giratina, Lugia, Tangrowth, Hypno, Lickilicky, Rhyperior, Cradily, Lapras, Slowbro, Slowking
Between -40 and -30  Strongly towards defense        Aggron, Relicanth, Forretress, Azumarill, Cresselia, Probopass, Torkoal
Less than -40        Absolutely towards defense      Umbreon, Registeel, Snorlax, Regirock, Regice, Steelix, Bastiodon, Wobbuffet, Blissey, Shuckle
Physical/Special Balance

Code:
PSB = 55 × ln((PT × PS) ÷ (ST × SS)), rounded to one decimal place
 
where ln([I]x[/I]) is the natural logarithm of [I]x[/I]
If the PSB is negative, then the Pokemon's stats are geared towards the special stats. If the PSB is positive, the Pokemon's stats are geared towards the physical stats.

A small chart can give us the degree of physical/special disparity:

Code:
PSB is               Pokemon's Stats are geared       Pokemon with this PSB
---------------------------------------------------------------------------------
More than 40         Absolutely towards physical      Kingler, Aggron, Rhyperior, Steelix, Cloyster, Sudowoodo, Sandslash, Leafeon, Skarmory, Regirock, Gliscor, Tauros, Staraptor, Relicanth, Donphan, Golem, Pinsir, Forretress, Shedinja, Miltank, Slaking, Rampardos, Scizor, Breloom, Kabutops, Heracross, Groudon, Mamoswine, Hariyama, Hippowdon, Weavile, Kangaskhan
Between 30 and 40    Strongly towards physical        Regigigas, Qwilfish, Dodrio, Drapion, Scyther, Granbull, Tangrowth, Solrock, Mawile, Hitmontop, Swellow, Metagross, Hitmonchan, Zangoose, Armaldo, Garchomp, Marowak, Torkoal, Crawdaunt, Furret
Between 20 and 30    Towards physical                 Ambipom, Weezing, Absol, Machamp, Ninjask, Hitmonlee, Torterra, Gyarados, Mightyena, Aerodactyl, Ursaring, Fearow, Feraligatr, Primeape, Ariados, Quagsire, Tyranitar, Wormadam-G
Between 10 and 20    Moderately towards physical      Bibarel, Huntail, Entei, Kricketune, Skuntank, Raticate, Dusknoir, Purugly, Banette, Parasect, Linoone, Floatzel, Delcatty, Crobat, Bastiodon, Sharpedo, Dragonite, Revenankh, Flygon, Salamence, Sableye, Swampert, Luxray, Poliwrath, Lopunny, Toxicroak
Between 5 and 10     Slightly towards physical        Dugtrio, Pidgeot, Honchkrow, Arbok, Volbeat, Seaking, Rapidash, Muk, Gallade, Dunsparce, Victreebel, Arcanine, Nidoqueen, Shiftry, Nidoking
Between -5 and 5     Equally in physical and special  Syclant, Blaziken, Slowbro, Bronzong, Carnivine, Electivire, Stantler, Lickilicky, Magcargo, Whiscash, Gorebyss, Persian, Deoxys-A, Deoxys, Azelf, Infernape, Mothim, Deoxys-S, Rayquaza, Cacturne, Seviper, Unown, Froslass, Exploud, Kingdra, Ditto, Octillery, Mew, Celebi, Jirachi, Manaphy, Shaymin, Arceus, Spinda, Mesprit, Castform, Glalie, Phione, Medicham, Wailord, Spiritomb, Uxie, Wormadam-S, Swalot, Vespiquen, Deoxys-D, Giratina, Azumarill, Registeel, Wobbuffet, Shuckle, Exeggutor, Farfetch'd, Meganium, Omastar, Lucario, Beedrill, Blastoise, Yanmega, Dialga, Tropius, Cradily, Umbreon, Camerupt
Between -10 and -5   Slightly towards special         Snorlax, Lumineon, Abomasnow, Girafarig, Corsola, Claydol, Pelipper, Wigglytuff, Altaria, Cresselia, Delibird, Walrein, Dewgong, Lapras, Lugia, Golduck, Jumpluff, Suicune, Kecleon, Smeargle, Moltres
Between -20 and -10  Moderately towards special       Beautifly, Pachirisu, Dustox, Vileplume, Gastrodon, Bellossom, Xatu, Flareon, Probopass, Drifblim, Chatot, Magnezone, Starmie, Raichu, Articuno, Ho-oh, Ninetales, Empoleon, Clefable, Charizard, Typhlosion, Venusaur, Manectric, Luvdisc, Heatran
Between -30 and -20  Towards special                  Wormadam-G, Mewtwo, Zapdos, Politoed, Palkia, Cherrim, Hypno, Lanturn, Sceptile, Masquerain, Darkrai, Slowking, Venomoth, Ampharos, Ludicolo, Glaceon
Between -40 and -30  Strongly towards special         Magmortar, Electrode, Raikou, Sunflora, Houndoom, Porygon-Z, Rotom, Illumise, Chimecho, Tentacruel, Latias, Latios, Lunatone
Less than -40        Absolutely towards special       Kyogre, Vaporeon, Butterfree, Milotic, Noctowl, Gengar, Jolteon, Togekiss, Plusle, Minun, Ledian, Mismagius, Grumpig, Gardevoir, Roserade, Espeon, Regice, Mantine, Mr. Mime, Alakazam, Jynx, Blissey
Overall Rating

Part 1: The Rating Modifier

The Rating Modifier (M) is used in the Overall Rating of a Pokemon, to reward Pokemon having outstanding PT, PS, ST, and/or SS. Each modifier increases slowly from 1 for a rating (tankiness or sweepiness) of 100, to 1.375 for a rating of 180 (about 2 standard deviations from the mean), to 2.5 for a rating of 260 (about 4 standard deviations from the mean).

Code:
Modifier for PT (MPT) = (3 × PT^2 - 600 × PT + 81200) ÷ 51200, if PT > 100
                      = 1, otherwise
 
Modifier for PS (MPS) = (3 × PS^2 - 600 × PS + 81200) ÷ 51200, if PS > 100
                      = 1, otherwise
 
Modifier for ST (MST) = (3 × ST^2 - 600 × ST + 81200) ÷ 51200, if ST > 100
                      = 1, otherwise
 
Modifier for SS (MSS) = (3 × SS^2 - 600 × SS + 81200) ÷ 51200, if SS > 100
                      = 1, otherwise
 
M = MPT × MPS × MST × MSS
Part 2: The Overall Rating Formula

Code:
Overall Rating = PT × ST × (PS + SS) × M ÷ (56 × (PT + ST)), rounded to the nearest whole number.
The rating can be used as follows:

Code:
Rating is       Pokemon's Stats are  Pokemon with this rating
---------------------------------------------------------------------------------
More than 1400  Exaggerated          Arceus, Deoxys-A, Giratina, Mewtwo, Rayquaza, Slaking, Regigigas, Palkia, Dialga, Ho-oh, Lugia, Deoxys, Groudon, Kyogre
900 to 1399     Too Good             None
580 to 899      Fantastic            Cresselia, Azelf, Salamence, Garchomp, Darkrai, Latios, Mew, Celebi, Jirachi, Manaphy, Shaymin, Latias, Syclant, Heatran, Zapdos
420 to 579      Excellent            Dragonite, Entei, Blissey, Tyranitar, Raikou, Regirock, Regice, Registeel, Moltres, Suicune, Metagross, Articuno, Snorlax, Uxie, Mesprit, Arcanine, Espeon
300 to 419      Very Good            Infernape, Electivire, Porygon-Z, Gyarados, Deoxys-D, Togekiss, Milotic, Gengar, Umbreon, Magmortar, Lapras, Alakazam, Lucario, Charizard, Typhlosion, Deoxys-S, Weavile, Rhyperior, Mamoswine, Sceptile, Blaziken, Vaporeon, Hippowdon, Walrein, Yanmega, Steelix, Leafeon, Kingdra, Jolteon, Feraligatr, Swampert, Revenankh, Flygon
250 to 299      Quite Good           Lickilicky, Torterra, Aggron, Heracross, Scyther, Tangrowth, Gallade, Gardevoir, Blastoise, Aerodactyl, Starmie, Roserade, Magnezone, Crobat, Floatzel, Honchkrow, Pinsir, Venusaur, Probopass, Glaceon, Houndoom, Luxray, Meganium, Empoleon, Staraptor, Gliscor, Rapidash, Tentacruel, Relicanth, Flareon, Magmar, Mismagius, Porygon2, Rampardos, Tauros, Muk 
210 to 249      Good                 Exeggutor, Kangaskhan, Scizor, Bastiodon, Poliwrath, Manectric, Electabuzz, Machamp, Politoed, Donphan, Ninetales, Golduck, Toxicroak, Drapion, Cradily, Nidoqueen, Ambipom, Kabutops, Miltank, Sharpedo, Nidoking, Ampharos, Ursaring, Slowbro, Slowking, Hypno, Rhydon, Dodrio, Bronzong, Omastar, Cloyster, Claydol, Drifblim, Zangoose, Absol, Abomasnow, Altaria, Golem, Dusknoir, Raichu, Kingler, Skuntank, Shiftry
175 to 209      Average              Froslass, Dewgong, Victreebel, Exploud, Ludicolo, Xatu, Armaldo, Hitmonlee, Glalie, Phione, Weezing, Clefable, Wailord, Primeape, Swalot, Tropius, Gastrodon, Breloom, Pidgeot, Grumpig, Hariyama, Whiscash, Stantler, Bellossom, Lanturn, Torkoal, Lopunny, Jynx, Forretress, Vileplume, Gorebyss, Magneton, Huntail, Vespiquen, Skarmory, Mantine, Cacturne, Lumineon, Octillery, Girafarig, Hitmonchan, Golbat, Venomoth, Banette, Seaking, Seviper
143 to 174      Below Average        Purugly, Spiritomb, Cherrim, Crawdaunt, Fearow, Sandslash, Electrode, Rotom, Mr. Mime, Piloswine, Noctowl, Chansey, Carnivine, Granbull, Hitmontop, Solrock, Lunatone, Vigoroth, Camerupt, Kadabra, Sneasel, Arbok, Jumpluff, Qwilfish, Haunter, Quagsire, Misdreavus, Seadra, Persian, Kecleon, Dusclops, Chimecho, Mothim, Pelipper, Mightyena, Castform, Munchlax
127 to 142      Poor                 Gligar, Swellow, Wormadam-G, Dragonair, Wormadam-S, Chatot, Wormadam, Ninjask, Bibarel, Dunsparce, Azumarill, Wobbuffet, Gabite, Marowak, Wigglytuff, Linoone, Furret, Pupitar, Tangela, Raticate, Metang, Sealeo, Masquerain, Lairon, Sunflora, Murkrow, Ponyta, Grotle, Monferno, Sudowoodo, Shelgon, Croconaw, Medicham, Marshtomp, Machoke, Wartortle, Bayleef, Prinplup, Charmeleon, Quilava, Ivysaur
100 to 126      Bad                  Combusken, Grovyle, Parasect, Plusle, Magcargo, Volbeat, Illumise, Togetic, Lickitung, Porygon, Minun, Gloom, Roselia, Ariados, Wailmer, Pachirisu, Shuckle, Yanma, Kricketune, Dugtrio, Delcatty, Weepinbell, Beautifly, Poliwhirl, Dustox, Butterfree, Corsola, Beedrill, Sableye, Mawile, Nidorina, Graveler, Flaaffy, Nidorino, Lileep
99 or less      Horrible             Everything else
An Example

I think you deserve one. :)

Let's say we are considering creating a hypothetical Pokemon having the following Base Stats:

52/117/93/80/67/101

First we find the normalized stats and the Speed Factor:

HP: 52/4 + 18 = 31
Atk: 117 + 18 = 135
Def: 93 + 18 = 111
SpA: 80 + 18 = 98
SpD: 67 + 18 = 85
SF: 0.92

Now we find PT, ST, PS, SS:

Physical Tankiness = 31 x 111 / 35 = 98.31 (average defense)
Special Tankiness = 31 x 85 / 35 = 75.29 (below average special defense)
Physical Sweepiness = 135 x (135 x 0.92 + 315) / (135 x 0.08 + 315) = 135 x 439.2 / 325.8 = 181.99 (very high physical offense)
Special Sweepiness = 98 x (98 x 0.92 + 315) / (98 x 0.08 + 315) = 98 x 405.16 / 322.84 = 122.99 (above average special offense)

Offense/Defense Balance:

The higher from PT and ST is 98.31; that from PS and SS is 181.99.

ODB = 55 x ln(181.99 / 98.31) = 55 x ln(1.851) = 55 x 0.616 = 33.9

Looking at the chart, this translates to a Pokemon that is geared strongly towards offense.

Physical/Special Balance:

PSB = 55 x ln((98.31 x 181.99) / (75.29 x 122.99)) = 55 x ln(17891.44 / 9259.92) = 55 x ln(1.932) = 55 x 0.659 = 36.2

Looking at the chart, this means that the Pokemon is geared strongly towards the physical stats.

Now, for the overall rating, we first need to find the rating modifier M, which is made up of four mini modifiers, one each for PT, PS, ST and SS.

PT and ST are both not greater than 100, so MPT and MST are both 1.

For PS, MPS = (3 x 181.99^2 - 600x181.99 + 81200) / 51200 = (3 x 33120.36 - 109194 + 81200) / 51200 = (99361.08 - 109194 + 81200) / 51200 = 71367.08 / 51200 = 1.394

For SS, MSS = (3 x 122.99^2 - 600x122.99 + 81200) / 51200 = (3 x 15126.54 - 73794 + 81200) / 51200 = (45379.62 - 73794 + 81200) / 51200 = 52785.62 / 51200 = 1.031

Hence M = 1 x 1 x 1.394 x 1.031 = 1.437

Finally, the overall rating! Note that ODB and PSB are not needed for the evaluation of the overall rating.

Overall Rating = 98.31 x 75.29 x (181.99 + 122.99) x 1.437 / (56 x (98.31 + 75.29)) = 98.31 x 75.29 x 304.98 x 1.437 / (56 x 173.6) = 3243867.61 / 9721.6 = 334

From the chart, a rating of 334 means that the stats are very good.
 

tennisace

not quite too old for this, apparently
is a Site Content Manager Alumnusis a Top Social Media Contributor Alumnusis a Community Contributor Alumnusis a Researcher Alumnusis a Top CAP Contributor Alumnusis a Tiering Contributor Alumnusis a Contributor Alumnusis a Smogon Media Contributor Alumnusis an Administrator Alumnus
looks great! the problem is that i haven't gotten to natural logs in my algebra class, so i have no clue how to calculate this myself. is there any chance of a program to calculate this automatically?
 

Aldaron

geriatric
is a Tournament Director Alumnusis a Battle Simulator Admin Alumnusis a Smogon Discord Contributor Alumnusis a Top Tiering Contributor Alumnusis a Top Contributor Alumnusis an Administrator Alumnus
Great job, X-Act.

I just holistically checked out the overall ratings, and I really can't see any problems.

I'll give it a more detailed look later, but great job again :D
 
I haven't analyzed this thoroughly, but, from a first impression, it seems that you just hit the nail, X-Act. Congratulations, this is a really, really great feat. As proved countless times before (and often against your previous proposals), measuring the base stats of a pokémon so that a number accurately represents the power of the stats is not easy at all, and I can't really find anything wrong about this (well, just a really tiny thing, but I'll have to read this more carefully before saying anything).

Great, amazing. No complaints. Awesome.

looks great! the problem is that i haven't gotten to natural logs in my algebra class, so i have no clue how to calculate this myself. is there any chance of a program to calculate this automatically?
You can't really calculate logarithms manually. Use a scientific calculator to calculate them.
 
looks great! the problem is that i haven't gotten to natural logs in my algebra class, so i have no clue how to calculate this myself. is there any chance of a program to calculate this automatically?
ln approximates to log base 2.7.

Though, I would love an app myself.
 
You can't really calculate logarithms manually. Use a scientific calculator to calculate them.
Well, you can, but it's so unrealistically complicated and long that it isn't worth it. I agree, just get a TI-83 or something, you'll end up needing one eventually anyway.
 

X-Act

np: Biffy Clyro - Shock Shock
is a Site Content Manager Alumnusis a Programmer Alumnusis a Smogon Discord Contributor Alumnusis a Top Researcher Alumnusis a Top CAP Contributor Alumnusis a Top Tiering Contributor Alumnusis a Top Contributor Alumnusis a Smogon Media Contributor Alumnusis an Administrator Alumnus
Hehe, the first Pokemon in CAP has Fantastic stats. :)

But that's not a surprise, as everyone knew this.

As I said in the original post, I think a small app would be better, so as not to calculate this by hand. Or else even a small Excel sheet would do.
 
The one dodgy rating would be Snorlax absolutely towards defence seeing how he has 110 base attack and a pretty poor defence.
 

X-Act

np: Biffy Clyro - Shock Shock
is a Site Content Manager Alumnusis a Programmer Alumnusis a Smogon Discord Contributor Alumnusis a Top Researcher Alumnusis a Top CAP Contributor Alumnusis a Top Tiering Contributor Alumnusis a Top Contributor Alumnusis a Smogon Media Contributor Alumnusis an Administrator Alumnus
It needs to be mentioned that PT, PS, ST, and SS can also be rated separately via a similar logarithmic scale used in ODB and PSB.

Code:
Rank for PT = 11 x ln(PT/100), with its fractional part removed.
and the same for PS, ST and SS.

This rank translates to the following:

Code:
Rank less than -5: Abysimal (the less the worse)
Rank -5: Extremely Bad
Rank -4: Very Bad
Rank -3: Bad
Rank -2: Moderately Bad
Rank -1: Below Average
Rank 0: Average
Rank 1: Above Average
Rank 2: Moderately Good
Rank 3: Good
Rank 4: Very Good
Rank 5: Extremely Good
Rank more than 5: Amazing (the more the better)
For example, let's take a Pokemon as an example: Hitmonchan with 50/105/79/35/110/76 base stats.

NormHP: 50/4 + 18 = 30.5
NormAtk: 105 + 18 = 123
NormDef: 79 + 18 = 97
NormSpA: 35 + 18 = 53
NormSpD: 110 + 18 = 128
Speed Factor: 0.65

PT = 30.5 x 97 / 35 = 84.53
ST = 30.5 x 128 / 35 = 111.54
PS = 123 x (123 x 0.65 + 315) / (123 x 0.35 + 315) = 135.68
SS = 53 x (53 x 0.65 + 315) / (53 x 0.35 + 315) = 55.53

Rank for PT: 11 x ln(84.53 / 100) = 11 x -0.168 = -1.85 = -1 (Below Average)
Rank for ST: 11 x ln(111.54 / 100) = 11 x 0.109 = 1.20 = 1 (Above Average)
Rank for PS: 11 x ln(135.68 / 100) = 11 x 0.305 = 3.36 = 3 (Good)
Rank for SS: 11 x ln(55.53 / 100) = 11 x -0.588 = -6.47 = -6 (Abysimal)

We can also write the PT, PS, ST and SS as kind of 'stats' (Sweeptank stats, maybe? lol) in their own right. I suggest to write them in this order: Physical Sweepiness, Physical Tankiness, Special Sweepiness, Special Tankiness and to round them to the nearest whole number when writing them in this way.

For example, Hitmonchan has 'Sweeptank' stats 136 / 85 / 56 / 112.

(136 is good, 85 is below average, 56 is abysimal and 112 is above average.)

EDIT: SkarmBlissCounter, when it says 'defense', it could mean either defenses. In the case of Snorlax, 160 HP coupled with 110 SpD makes him extremely defensive. Also, because of Snorlax's bad speed, it can't be called offensive, unless it somehow increases its speed or its defense. I wouldn't underestimate Snorlax's physical defense too, actually: its physical tankiness is 138, which is 'Good' on the scale. 160 base HP makes a hell of a lot of difference.
 

chaos

is a Site Content Manageris a Battle Simulator Administratoris a Programmeris a Smogon Discord Contributoris a Contributor to Smogonis an Administratoris a Tournament Director Alumnusis a Researcher Alumnus
Owner
ok i dont have time to finish this right now but here are the relevant functions coded in python

Code:
import math
 
def normalize_hp(hp):
 return hp / 4 + 18
 
def normalize_stat(stat):
 return stat + 18
 
def calc_sf(spe):
 chart = [(151,1),
  (131, 0.99),
  (121, 0.98),
  (116, 0.97),
  (111, 0.95),
  (106, 0.94),
  (101, 0.92),
  (96, 0.87),
  (91, 0.82),
  (86, 0.77),
  (81, 0.71),
  (76, 0.65),
  (71, 0.62),
  (66, 0.55),
  (61, 0.49),
  (56, 0.42),
  (51, 0.37),
  (46, 0.29),
  (41, 0.23),
  (36, 0.17),
  (31, 0.12),
  (26, 0.06),
  (21, 0.04),
  (16, 0.02),
  (11, 0.01)]
 
 for stat, r in chart:
  if spe >= stat:
   return r
 
 return 0
 
def calc_pt(HP, Def):
 return HP * Def / 35
 
def calc_st(HP, SpD):
 return HP * SpD / 35
 
def calc_ps(Atk, SF):
 return Atk * (Atk * SF + 315) / (Atk * (1-SF) + 315)
 
def calc_ss(SpA, SF):
 return SpA * (SpA * SF + 315) / (SpA * (1-SF) + 315)
 
def calc_odb(PS, SS, PT, ST):
 return 55 * round(math.ln(max(PS, SS) / max(PT, ST)), 1)
 
def calc_psb(PS, SS, PT, ST):
 return 55 * round(math.ln((PT * PS) / (ST * SS)), 1)
 
def calc_modifier(V):
 return (3 * V**2 - 600 * V + 81200) / 51200 if V > 100 else 1
 
def calc_m(MPS, MSS, MPT, MST):
 return MPS * MSS * MPT * MST
 
def calc_rating(PS, SS, PT, ST, M):
 return round(PT * ST * (PS + SS) * M / (56 * (PT + ST)))
 

dekzeh

B is for BRUTUS
is a Tournament Director Alumnusis a Forum Moderator Alumnusis a Past WCoP Champion
Just something I wonder, if you apply the SDef Sandstorm boost to Tyranitar stats, does it change its tier?
Same for Soul Dew Latias, Thick Club Marowak, and everything that can modify the stats based on items..
Could you give those pokemons two ranks, one with their normal stats, and one with the stats boosted from items and Sandstorm? (Sandstorm only for TTar, not other rock types :P)
 
How exactly did you derive these functions? Where do all those constants come from? I'm curious and it's pretty difficult to infer from the final result...

Also, from toying around with parameters, I find that:
tanh(speed/30 - 2)/2 + 0.5
is a reasonable approximation of SF. Not really simpler, I know, but it's nice to know ;)
 
Now that I've looked at it more carefully, I still find it amazing, but I have one question: Why choosing 35 as the normalization factor for Tankiness? The ratio between Tankiness and Sweepiness of a 50/50/50/50/50/50 is about 33, and the ratio in the case of a 100/100/100/100/100/100 pokémon is only 23. The ratios doesn't have to be exactly the same, because speed is not spread uniformly, but a 50% difference might underestimate the defenses of high BST pokémon. Have you tried with an intermediate number?

In any case, the results match nearly flawlessly with the reality, so this isn't an important issue at all.


Also, I've noticed that this is really flexible. Not only you can rate PT, PS, ST, and SS individually, as X-Act mentioned in his last post, but you can also do the Physical/Special balance comparing only PT with PS, or even PT with SS, etc. thanks to the way the balance is calculated. I'm going to propose this as the new method of deciding style and build, in fact.
 
I'm going to propose this as the new method of deciding style and build, in fact.
It's a good idea, but we should probably get some sort of applet or program to calculate it out. Remember, people were confused as hell by something as simple as "20% more". They're heads will freaking explode from this.

BTW, I love it and if I get time I might just program it into my TI-83.
 
We can just show a chart of how the current pokémon are rated with this method, for people to have a reference. The ones X-Act has posted, plus a few more for other comparisons should be sufficient. That way, if we say a pokémon is balanced if its ODB is between 10 an -10, people can see what pokémon currently fall into that category, and vote accordingly.
 

X-Act

np: Biffy Clyro - Shock Shock
is a Site Content Manager Alumnusis a Programmer Alumnusis a Smogon Discord Contributor Alumnusis a Top Researcher Alumnusis a Top CAP Contributor Alumnusis a Top Tiering Contributor Alumnusis a Top Contributor Alumnusis a Smogon Media Contributor Alumnusis an Administrator Alumnus
Code:
def calc_odb(PS, SS, PT, ST):
 return 55 * round(math.ln(max(PS, SS) / max(PT, ST)), 1)
 
def calc_psb(PS, SS, PT, ST):
 return 55 * round(math.ln((PT * PS) / (ST * SS)), 1)
return round(55 * math.ln(...),1) would produce a much more accurate number for each of those.

The other functions are spot-on.

To people who asked me questions about the constants:

For HP, the division by 35 is done because 35 is the normalized HP stat for 68 base HP, and 68 base HP happens to be the average base HP (hello Gallade and Gardevoir).

For the logarithmic things, the logarithmic scale is excellent for deciding how much fluctuation you have from the middle, so I used that. The '55' and the '11' are just things I used so that the rating is a number that makes sense and is not too small or too large. I just toyed with various numbers until I found those that made sense. Excel does this really quickly and you can see at a glance the ratings of each Pokemon sorted whichever way you like.

For the modifiers, I wanted a modifier that barely did anything to Pokemon with just above average stats, but boosted those that are very far from the average. However, I also wanted the function to be relatively simple. When I calculated the standard deviations for PT, PS, ST and SS, they all were near 40 and their average all were near 100. So I decided that, of course, a rating of 100 gets a multiplier of 1 (to stay the same), a rating of 180 gets 1.375, and 260 gets 2.5. I then assumed that the function is quadratic ax^2 + bx + c so that it's relatively simple. Plugging in those three points in the quadratic yields a simultaneous equation in three unknowns a,b,c, from which a = 3/51200, b = -3/256 and c = 203/128 followed. When I applied it to the formula, it seemed to work. I tried other numbers just to be sure, but none worked better than this, so I stuck with it.

Finally, the Overall Rating formula is just the one I posted in the other thread but multiplied also by M, so there's not much to be said about it.

I assume that chaos is working on implementing this with Python (otherwise he wouldn't have posted his code). I'm also separately implementing this in Java (which sucks when compared to Python, I know) but at least we could use my applet for comparison purposes. It should be up in a couple of hours.
 

X-Act

np: Biffy Clyro - Shock Shock
is a Site Content Manager Alumnusis a Programmer Alumnusis a Smogon Discord Contributor Alumnusis a Top Researcher Alumnusis a Top CAP Contributor Alumnusis a Top Tiering Contributor Alumnusis a Top Contributor Alumnusis a Smogon Media Contributor Alumnusis an Administrator Alumnus
I made a temporary Base Stats Ratings applet in sucky Java. Here's a screenshot where I was checking out Rampardos' ratings:



Please tell me of any bugs you encounter.

EDIT: I request the "A Much Better Rating Of A Pokemon Than BST" thread to be locked. Thanks.
 

chaos

is a Site Content Manageris a Battle Simulator Administratoris a Programmeris a Smogon Discord Contributoris a Contributor to Smogonis an Administratoris a Tournament Director Alumnusis a Researcher Alumnus
Owner
locked the thread. Yeah, I was going to make a quick python program for testing but I guess it's not necessary since you beat me to the punch with the java applet. I whipped up the functions in a few minutes when I saw the thread but had to step out (and ended up stepping out for 3 days... so yeah).

I haven't had time to really analyze this yet but from my skimming the results of the algorithm seem to make sense. Thanks for putting in the effort to fix it up (and for hopefully not taking my criticism of the previous algorithm too hard!)

Assuming everyone in time agrees this is the best method, maybe we could integrate it with the site?
 

X-Act

np: Biffy Clyro - Shock Shock
is a Site Content Manager Alumnusis a Programmer Alumnusis a Smogon Discord Contributor Alumnusis a Top Researcher Alumnusis a Top CAP Contributor Alumnusis a Top Tiering Contributor Alumnusis a Top Contributor Alumnusis a Smogon Media Contributor Alumnusis an Administrator Alumnus
That would be a good idea, but I'd prefer your Python implementation to be in the site, for the reasons you give me about Java applets not being compatible with all browsers/computers.

Oh, and there are no hard feelings. I can take constructive criticism. :) If anything, I learned from it.
 
Status
Not open for further replies.

Users Who Are Viewing This Thread (Users: 1, Guests: 0)

Top