Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
deep dish peat moss

I've been learning Data Analysis and Data Visualization and I need practice projects. Post statistics you have always wanted to know or wondered about and I will see if I can find the data, and perform the analysis if I can find it.

If you want to look at what datasets are available to analyze this is a good place to start: https://www.kaggle.com/datasets but you don't have to look it up first.

It can be serious or silly but there's more serious data available than silly data.

Adbot
ADBOT LOVES YOU

your friend sk

(ヤイケス!)


if you want a big project...i've been playing with pokemon data on and off for a while as a hobby because i'm a huge rec math nerd and a fellow dataviz/analyst. here's a question i might try to solve at the same time:

suppose you're running a round robin tournament with all 151 of the gen 1 pokemon. that is, every pokemon fights every other pokemon once. for simplicity, you might make some assumptions, such as:
  • every pokemon is level 100
  • pokemon attack at the same time each turn
  • pokemon choose a random move from all those available to them
  • an attack deals [move POW * move ACC(%)] + [your ATK - opp DEF] (physical or special ATK/DEF depending on move type)
  • attack damage is modified as usual due to pokemon/move type
  • a win is 1 point, a loss is 0 points, a draw is 0.5 points

my question: which pokemon win the most points under these conditions? which win the fewest?


Join the BYOB Army


thank you again Saoshyant!!

deep dish peat moss

Dang, that's more than I know how to feasibly do yet, I'm barely at the "look I'm learning R" part of this. But I may come back to it when I know more

Dumb Sex-Parrot

 
Absurd Pox Term
Rad Buxom Strep
     
Retard Ox Bumps
Borax Dumpster
     
Dares Box Trump

your friend sk posted:

if you want a big project...i've been playing with pokemon data on and off for a while as a hobby because i'm a huge rec math nerd and a fellow dataviz/analyst. here's a question i might try to solve at the same time:

suppose you're running a round robin tournament with all 151 of the gen 1 pokemon. that is, every pokemon fights every other pokemon once. for simplicity, you might make some assumptions, such as:
  • every pokemon is level 100
  • pokemon attack at the same time each turn
  • pokemon choose a random move from all those available to them
  • an attack deals [move POW * move ACC(%)] + [your ATK - opp DEF] (physical or special ATK/DEF depending on move type)
  • attack damage is modified as usual due to pokemon/move type
  • a win is 1 point, a loss is 0 points, a draw is 0.5 points

my question: which pokemon win the most points under these conditions? which win the fewest?

This sounds very doable, but I've hit a bit of a snag. You see I have never played a pokemon game before and the dataset I've found only lists 2 attacks for each pokemon, normal and special, and it does not say anything about level or move power and what move acc is.






thank you Saoshyantx4, Plant MONSTER. and deep dish peat moss for the excellent signature

your friend sk

(ヤイケス!)


Dumb Sex-Parrot posted:

This sounds very doable, but I've hit a bit of a snag. You see I have never played a pokemon game before and the dataset I've found only lists 2 attacks for each pokemon, normal and special, and it does not say anything about level or move power and what move acc is.

i think you're looking at movesets for Pokemon Go. this is a set i found on kaggle that i think has all the info: https://www.dropbox.com/scl/fi/54wfwhfp687gwnbhaso5y/pokedex.csv?rlkey=fbio8hzktb9ojygws5qkf30o3&dl=0


Join the BYOB Army


thank you again Saoshyant!!

deep dish peat moss

I think I am at the point RStudio-wise where I could do that but I don't understand math well enough to know how to conceptualize a formula to calculate everything taking pokemon types into account, all those years of sleeping through math classes are biting me in the rear end :blush:

Without types it would be as easy as just taking an average attack power from their available moves and comparing the stats but I don't know the math syntax for doing that while checking like a dozen conditionals to see if an additional multiplier needs to be included. I guess just really heavy use of if() statements and writing a separate calculation for each individual attack?

actually I guess it would just be an if(attacktype=x and targettype=y) then basedamage*1.5 kind of deal for each type... and then calculating for each attack individually and taking an average of that? lmao I never went beyond basic geometry in school but I will figure this out conceptually eventually and then bruteforce the math.

deep dish peat moss fucked around with this message at 21:08 on Aug 25, 2023

Dumb Sex-Parrot

 
Absurd Pox Term
Rad Buxom Strep
     
Retard Ox Bumps
Borax Dumpster
     
Dares Box Trump
Looking at the pokemon data I shudder at the thought of trying to sort through the moves using string searches.

Look at this thing:

quote:

"{'Tackle': {'Type': 'Normal', 'Level': '—', 'Power': '40', 'Accuracy': '100', 'PP': '35', 'Effect %': '--', 'Description': 'A physical attack in which the user charges and slams into the target with its whole body.'}, 'Growl': {'Type': 'Normal', 'Level': '3', 'Power': '--', 'Accuracy': '100', 'PP': '40', 'Effect %': '--', 'Description': 'The user growls in an endearing way, making opposing Pokémon less wary. This lowers their Attack stat.'}, 'Vine Whip': {'Type': 'Grass', 'Level': '9', 'Power': '45', 'Accuracy': '100', 'PP': '25', 'Effect %': '--', 'Description': 'The target is struck with slender, whiplike vines to inflict damage.'}, 'Poison Powder': {'Type': 'Poison', 'Level': '13', 'Power': '--', 'Accuracy': '75', 'PP': '35', 'Effect %': '--', 'Description': 'The user scatters a cloud of poisonous dust that poisons the target.'}, 'Sleep Powder': {'Type': 'Grass', 'Level': '13', 'Power': '--', 'Accuracy': '75', 'PP': '15', 'Effect %': '--', 'Description': 'The user scatters a big cloud of sleep-inducing dust around the target.'}, 'Take Down': {'Type': 'Normal', 'Level': '15', 'Power': '90', 'Accuracy': '85', 'PP': '20', 'Effect %': '--', 'Description': 'A reckless, full-body charge attack for slamming into the target. This also damages the user a little.'}, 'Razor Leaf': {'Type': 'Grass', 'Level': '19', 'Power': '55', 'Accuracy': '95', 'PP': '25', 'Effect %': '--', 'Description': 'Sharp-edged leaves are launched to slash at the opposing Pokémon. Critical hits land more easily.'}, 'Sweet Scent': {'Type': 'Normal', 'Level': '21', 'Power': '--', 'Accuracy': '100', 'PP': '20', 'Effect %': '--', 'Description': \"A sweet scent that harshly lowers opposing Pokémon's evasiveness.\"}, 'Growth': {'Type': 'Normal', 'Level': '25', 'Power': '--', 'Accuracy': '--', 'PP': '20', 'Effect %': '--', 'Description': \"The user's body grows all at once, raising the Attack and Sp. Atk stats.\"}, 'Double-Edge': {'Type': 'Normal', 'Level': '27', 'Power': '120', 'Accuracy': '100', 'PP': '15', 'Effect %': '--', 'Description': 'A reckless, life-risking tackle. This also damages the user quite a lot.'}, 'Worry Seed': {'Type': 'Grass', 'Level': '31', 'Power': '--', 'Accuracy': '100', 'PP': '10', 'Effect %': '--', 'Description': \"A seed that causes worry is planted on the target. It prevents sleep by making the target's Ability Insomnia.\"}, 'Synthesis': {'Type': 'Grass', 'Level': '33', 'Power': '--', 'Accuracy': '--', 'PP': '5', 'Effect %': '--', 'Description': 'The user restores its own HP. The amount of HP regained varies with the weather.'}, 'Seed Bomb': {'Type': 'Grass', 'Level': '37', 'Power': '80', 'Accuracy': '100', 'PP': '15', 'Effect %': '--', 'Description': 'The user slams a barrage of hard-shelled seeds down on the target from above.'}}"

And I think you're definitely on to something with the if/then statements.






thank you Saoshyantx4, Plant MONSTER. and deep dish peat moss for the excellent signature

your friend sk

(ヤイケス!)


Dumb Sex-Parrot posted:

Looking at the pokemon data I shudder at the thought of trying to sort through the moves using string searches.

Look at this thing:

yeah it's awful, that's why I haven't done anything with it yet lol. it looks like it could be parsed as JSON maybe? I'd prefer a separate table of moves to cross reference though


Join the BYOB Army


thank you again Saoshyant!!

deep dish peat moss

I made a clean data set of Gen 1 pokemon moves. This does NOT include which pokemon have which moves, this is just the moves assigned a moveID and their stats listed out in a clean fashion.

Notes:
  • Data is all from https://pokemondb.net/move/generation/1

  • numberOfHits column uses an averaged number of hits (e.g. a move that hits 2-5 times has a numberOfHits of 3.5).

  • additionalDamageTurns is the number of turns that a skill does damage over time. There are only 4 skills that deal damage over time and they all have the same value of 4.5. Skills that do not do damage over time have a 0 in this column.

  • Moves with 10000 movePOW are instant kills if they land

  • moveACC is represented in decimal value, the move Swift has a value of 100 - this is not a typo, it ignores accuracy/evasion so I figured 10000% is the best way to handle that. So consider that in any final calculations of you're doing pow*acc. I guess maybe it should just be switched to a 1

  • this includes the move Struggle (moveID 135) which is not ordinarily usable (only when you're out of other moves)

  • This does not (currently) account for any secondary effects of skills other than those listed above (e.g. buffs/debuffs, Absorb healing for 50% of the damage it deals, or Gust doing extra damage against pokemon using Fly/Bounce/Sky Drop, or Psywave doing extra damage based on the user's level, or status effects)

  • This does not yet include whether a move is physical/special/status but I'll add that next.
https://docs.google.com/spreadsheets/d/17xLdC-krJDdGDcbAPUqlUcA4LnnATXyWjNJ7X4I3-IY/edit?usp=sharing

I may go back later and add additional boolean columns for each status effect on each move but :effort:

Also I haven't set up proper attributes or labels or anything yet it's just raw data

deep dish peat moss fucked around with this message at 22:50 on Aug 25, 2023

Areola Grande

it's a free country u pervs

deep dish peat moss posted:

I made a clean data set of Gen 1 pokemon moves. This does NOT include which pokemon have which moves, this is just the moves assigned a moveID and their stats listed out in a clean fashion.

Notes:
  • Data is all from https://pokemondb.net/move/generation/1

  • numberOfHits column uses an averaged number of hits (e.g. a move that hits 2-5 times has a numberOfHits of 3.5).

  • additionalDamageTurns is the number of turns that a skill does damage over time. There are only 4 skills that deal damage over time and they all have the same value of 4.5. Skills that do not do damage over time have a 0 in this column.

  • Moves with 10000 movePOW are instant kills if they land

  • moveACC is represented in decimal value, the move Swift has a value of 100 - this is not a typo, it ignores accuracy/evasion so I figured 10000% is the best way to handle that. So consider that in any final calculations of you're doing pow*acc. I guess maybe it should just be switched to a 1

  • this includes the move Struggle (moveID 135) which is not ordinarily usable (only when you're out of other moves)

  • This does not (currently) account for any secondary effects of skills other than those listed above (e.g. buffs/debuffs, Absorb healing for 50% of the damage it deals, or Gust doing extra damage against pokemon using Fly/Bounce/Sky Drop, or Psywave doing extra damage based on the user's level, or status effects)

  • This does not yet include whether a move is physical/special/status but I'll add that next.
https://docs.google.com/spreadsheets/d/17xLdC-krJDdGDcbAPUqlUcA4LnnATXyWjNJ7X4I3-IY/edit?usp=sharing

I may go back later and add additional boolean columns for each status effect on each move but :effort:

Also I haven't set up proper attributes or labels or anything yet it's just raw data

:farf:





spring sigs by nesamdoom and Ravenous Scoot

Saoshyant

:hmmorks: :orks:


Goon project! Goon project!



awesome spring sig by RavenousScoot

baka of lathspell

soon byob will truly be the best there ever was


join dork order
sig by ??? (<3 u)

Dumb Sex-Parrot

 
Absurd Pox Term
Rad Buxom Strep
     
Retard Ox Bumps
Borax Dumpster
     
Dares Box Trump

deep dish peat moss posted:

I made a clean data set of Gen 1 pokemon moves. This does NOT include which pokemon have which moves, this is just the moves assigned a moveID and their stats listed out in a clean fashion.

Notes:
  • Data is all from https://pokemondb.net/move/generation/1

  • numberOfHits column uses an averaged number of hits (e.g. a move that hits 2-5 times has a numberOfHits of 3.5).

  • additionalDamageTurns is the number of turns that a skill does damage over time. There are only 4 skills that deal damage over time and they all have the same value of 4.5. Skills that do not do damage over time have a 0 in this column.

  • Moves with 10000 movePOW are instant kills if they land

  • moveACC is represented in decimal value, the move Swift has a value of 100 - this is not a typo, it ignores accuracy/evasion so I figured 10000% is the best way to handle that. So consider that in any final calculations of you're doing pow*acc. I guess maybe it should just be switched to a 1

  • this includes the move Struggle (moveID 135) which is not ordinarily usable (only when you're out of other moves)

  • This does not (currently) account for any secondary effects of skills other than those listed above (e.g. buffs/debuffs, Absorb healing for 50% of the damage it deals, or Gust doing extra damage against pokemon using Fly/Bounce/Sky Drop, or Psywave doing extra damage based on the user's level, or status effects)

  • This does not yet include whether a move is physical/special/status but I'll add that next.
https://docs.google.com/spreadsheets/d/17xLdC-krJDdGDcbAPUqlUcA4LnnATXyWjNJ7X4I3-IY/edit?usp=sharing

I may go back later and add additional boolean columns for each status effect on each move but :effort:

Also I haven't set up proper attributes or labels or anything yet it's just raw data

This is really great, and seems way better than my approach of doing string searches using regular expressions. That said I'm going to keep hammering away with the regex stuff as I feel I'm learning things.






thank you Saoshyantx4, Plant MONSTER. and deep dish peat moss for the excellent signature

deep dish peat moss

From here I think this formula should mostly work?

((movePOW * moveACC) + (attackerATK - targetDEF)) * (numberOfHits + additionalDamageTurns) = baseDamage
-> if (moveType = [x]) and (defenderType = [a]) then (baseDamage * [modifier])
-> if (moveType = [y]) and (defenderType = [b]) then (baseDamage * [modifier]) etc...

But I still need to figure out how I would calculate this on a matchup-by-matchup basis

deep dish peat moss fucked around with this message at 00:15 on Aug 26, 2023

your friend sk

(ヤイケス!)


deep dish peat moss posted:

From here I think this formula should mostly work?

((movePOW * moveACC) + (attackerATK - targetDEF)) * (numberOfHits + additionalDamageTurns) = baseDamage
-> if (moveType = [x]) and (defenderType = [a]) then (baseDamage * [modifier])
-> if (moveType = [y]) and (defenderType = [b]) then (baseDamage * [modifier]) etc...

But I still need to figure out how I would calculate this on a matchup-by-matchup basis

if there's no random chance involved, you should be able to see which one does the larger proportion of its opponent's hp in damage. if pikachu hits for 20% of squirtle's health, and squirtle hits for 10% of pikachu's health, pikachu will win the fight

there's an edge case around draws that may need to be checked as well, i'm too high to put it together right now


Join the BYOB Army


thank you again Saoshyant!!

Adbot
ADBOT LOVES YOU

deep dish peat moss

today I'm learning how to use ggplot2 so here's a ribbon graph of move power compared to move accuracy which looks a lil bit like a floppy dong

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply