import pandas as pd
from IPython.core.display import display, HTML  
display(HTML("<style>.container { width:100% !important; }</style>"))

Loading the Data Frame

I used the pandas library to import my csv file to a Dataframe

df = pd.read_csv("owl.csv")
df
playerId teamId role name team eliminations_avg_per_10m deaths_avg_per_10m hero_damage_avg_per_10m healing_avg_per_10m ultimates_earned_avg_per_10m final_blows_avg_per_10m time_played_total count
0 8675 7693 offense Adora HZS 16.002129 3.876235 5390.964430 5678.864360 4.410253 4.134037 65166.328327 1
1 3985 4523 offense aKm DAL 17.296143 5.178533 9600.623636 158.646056 4.575825 6.050875 75658.485169 1
2 8812 7692 tank ameng CDH 16.470544 6.202665 7051.640852 0.724798 4.511644 5.046006 88703.810417 1
3 4841 4403 support Anamo NYE 14.165021 2.745207 3948.127250 6563.244540 3.567532 1.898150 97041.863429 1
4 5715 4404 offense Architect SFS 18.181756 4.555888 7825.862117 3806.894747 4.639483 8.087747 28710.098079 1
5 4652 7697 support ArK WAS 7.870130 2.641469 2482.555936 6825.268613 3.518943 1.320735 66326.727702 1
6 5878 4402 tank Axxiom BOS 13.589015 6.323052 7227.732159 0.000000 3.771645 3.383387 10817.561445 1
7 4491 7698 offense babybay ATL 18.285137 4.898535 9724.894013 153.512705 4.520151 6.320031 58670.601443 1
8 8896 7692 offense Baconjack CDH 15.605830 6.119487 7305.171594 123.938222 4.231318 6.506221 26374.758866 1
9 4624 4525 support Bani HOU 11.303448 5.257418 4791.691330 6825.377770 3.680192 2.102967 2282.489336 1
10 8676 7693 offense Bazzi HZS 15.814585 5.846427 5369.937012 7506.352638 4.589445 3.800178 20525.356901 1
11 4655 4410 support Bdosin LDN 15.048464 4.107217 6983.868463 8836.736647 4.746420 3.882816 88234.919687 1
12 8731 7693 support BEBE HZS 14.154976 3.952661 7197.340358 9429.701829 4.803399 3.533836 91685.070527 1
13 8708 7694 tank BenBest PAR 13.411352 6.584489 6648.912608 0.000000 4.201147 4.026099 44559.264875 1
14 4643 4406 support BigG00se GLA 12.350082 4.683845 3870.859580 6429.321595 3.655210 2.206065 92744.320062 1
15 4639 7699 tank Bischu GZC 16.794393 5.927433 7229.213813 1836.443127 2.963716 8.891149 1214.691094 1
16 8184 4525 offense blase HOU 14.115152 5.688758 5288.563477 5127.842249 3.993433 4.545983 95556.889781 1
17 4625 4525 support Boink HOU 8.675604 5.084554 2736.000684 5754.139120 3.133041 1.772292 90391.403033 1
18 4079 4524 support Boombox PHI 14.716397 4.686374 6282.962865 9251.731158 4.765247 3.542715 91285.929199 1
19 8704 4407 offense bqb FLA 16.439333 4.809016 8641.233568 319.525665 4.536164 4.972728 87959.775570 1
20 8771 7696 tank BUMPER VAN 16.630474 5.906248 7969.093625 6.324790 4.654208 5.399093 113574.634219 1
21 10031 4407 support byrem FLA 11.418219 5.360666 5266.262933 7719.478526 3.752466 4.127713 11192.639166 1
22 4620 4524 offense carpe PHI 17.983018 4.844880 8782.867900 137.704463 4.146629 7.031507 97959.083057 1
23 8721 7699 support Chara GZC 10.361039 3.866669 3932.990917 5914.067038 3.253993 1.912912 88137.878443 1
24 5831 4404 tank Choihyobin SFS 19.391551 3.472553 6035.142896 302.338209 2.882165 5.957548 111790.956037 1
25 4663 4523 support Closer DAL 10.935586 3.527819 3511.197807 6354.660012 3.377837 1.936714 92011.533219 1
26 5306 4402 offense ColourHex BOS 14.899417 5.548090 8649.812908 168.870374 3.966816 5.752565 88030.291299 1
27 8892 4408 support CoMa SHD 7.909984 3.700223 2070.655671 6161.834635 3.184618 1.389100 98912.968913 1
28 4138 4525 tank coolmatt HOU 15.208515 4.527089 6774.211482 183.137562 4.214156 4.777435 28760.204940 1
29 8784 7697 offense Corey WAS 15.025158 5.201795 9003.292089 127.436107 4.608075 7.036929 88930.845029 1
... ... ... ... ... ... ... ... ... ... ... ... ... ...
123 9155 7693 offense SASIN HZS 15.217982 4.972212 6304.243753 450.467436 2.862789 6.026923 3982.131229 1
124 5442 4407 offense sayaplayer FLA 13.396877 5.487655 6048.630900 4204.440753 4.051289 6.067726 65164.442533 1
125 8728 7696 offense SeoMinSoo VAN 21.092578 3.588644 10933.062491 198.216055 5.075465 7.048881 88780.044028 1
126 10041 4405 offense Shax VAL 16.920446 5.694832 6499.728449 332.208914 4.148087 6.515075 25602.161674 1
127 4644 4406 support Shaz GLA 14.269397 4.063945 6467.514174 10113.314711 4.988753 3.243341 92127.225783 1
128 8725 7699 support shu GZC 14.059122 3.826302 6458.460594 8793.613298 4.767641 3.609592 88597.283044 1
129 4139 4404 offense sinatraa SFS 20.914314 3.497822 11849.397959 111.562321 5.252785 7.019851 99147.405428 1
130 8749 7696 support SLIME VAN 14.527621 3.703972 4165.190298 5882.757861 3.192704 2.724949 110314.003005 1
131 7831 4404 tank Smurf SFS 17.720797 4.922444 6587.333835 0.000000 3.999486 4.983974 19502.508479 1
132 4493 4524 offense snillo PHI 13.115663 7.286479 4268.438247 6369.452283 2.914592 2.914592 411.721471 1
133 3987 7694 offense SoOn PAR 17.156117 6.122379 8755.638934 181.999070 4.459629 6.852836 62426.713501 1
134 4637 4406 tank SPACE GLA 16.937870 3.754919 6297.654849 349.497358 4.028947 5.421303 81013.727587 1
135 4094 4525 tank SPREE HOU 16.057987 4.951975 7074.346063 442.661626 3.723781 5.265556 45921.072883 1
136 8747 7696 offense Stitch VAN 17.654422 5.264495 7419.042221 628.318125 4.211596 6.807114 24503.776509 1
137 8783 7697 offense Stratus WAS 15.851749 5.322345 6520.332819 1105.055288 3.785206 5.648987 31226.837463 1
138 4610 4404 offense STRIKER SFS 16.207208 6.053294 7380.909425 140.294067 4.491154 8.201238 6145.413898 1
139 4490 4404 tank super SFS 17.351664 5.256228 8277.983328 5.826254 4.657262 6.197460 98169.257876 1
140 4144 4406 offense Surefour GLA 16.264683 4.850343 7702.970198 2334.307256 4.409403 6.784467 59872.055648 1
141 3380 4523 offense Taimou DAL 13.643140 5.311080 6980.864470 353.580132 4.141668 6.724119 12313.880814 1
142 4104 4409 support tobi SEO 12.527639 3.561285 3821.983777 6536.903535 3.460255 2.083730 47510.945922 1
143 10021 4523 tank Trill DAL 11.016714 6.549455 5723.625044 0.000000 3.482947 3.369373 15848.646641 1
144 8729 7696 support Twilight VAN 16.044986 4.139107 7122.262343 9320.446421 5.048997 4.156948 100891.334471 1
145 3983 4523 support uNKOE DAL 12.889446 4.796602 5795.335146 9419.885852 4.592007 3.175002 79181.059063 1
146 8688 4404 support Viol2t SFS 17.185764 4.195764 7637.591409 10409.200261 5.300486 4.440653 110254.045210 1
147 5809 4406 tank Void GLA 19.343389 3.178936 6457.220391 250.965632 2.048810 5.555847 82291.682828 1
148 8710 7692 offense YangXiaoLong CDH 15.342481 5.957453 7572.263394 299.683611 4.115422 6.295547 51464.949743 1
149 8894 4408 offense YOUNGJIN SHD 17.674387 5.835630 6183.788216 5143.003544 4.046751 6.204125 89553.317851 1
150 8813 7692 support Yveltal CDH 7.512112 4.692623 2209.111332 7691.353637 3.602681 1.520697 91931.532277 1
151 8642 4523 offense ZachaREEE DAL 15.167823 5.666740 5698.414532 6211.639093 4.642945 3.866947 92010.565901 1
152 4098 4409 tank ZUNBA SEO 18.577579 2.959663 6789.544551 0.000000 2.549864 5.737194 13177.174514 1

153 rows × 13 columns

Relations Between Stats

We are going to make a correlation table with the .corr() Function

df_correleations = df[["eliminations_avg_per_10m","deaths_avg_per_10m","hero_damage_avg_per_10m","healing_avg_per_10m","ultimates_earned_avg_per_10m","final_blows_avg_per_10m","time_played_total"]]
df_corr_table = df_correleations.corr()
df_corr_table
eliminations_avg_per_10m deaths_avg_per_10m hero_damage_avg_per_10m healing_avg_per_10m ultimates_earned_avg_per_10m final_blows_avg_per_10m time_played_total
eliminations_avg_per_10m 1.000000 -0.053546 0.702982 -0.520182 0.108123 0.768385 0.184809
deaths_avg_per_10m -0.053546 1.000000 0.157248 -0.242843 0.131407 0.183793 -0.312624
hero_damage_avg_per_10m 0.702982 0.157248 1.000000 -0.468124 0.467872 0.756272 0.130058
healing_avg_per_10m -0.520182 -0.242843 -0.468124 1.000000 0.345956 -0.662879 0.021491
ultimates_earned_avg_per_10m 0.108123 0.131407 0.467872 0.345956 1.000000 0.100654 0.123582
final_blows_avg_per_10m 0.768385 0.183793 0.756272 -0.662879 0.100654 1.000000 0.007640
time_played_total 0.184809 -0.312624 0.130058 0.021491 0.123582 0.007640 1.000000

This is great, but let's filter out correlations below .5 because they aren't strong

df_corr_table[(df_corr_table> .5) | (df_corr_table <-.5) & (df_corr_table < 1.0)]
eliminations_avg_per_10m deaths_avg_per_10m hero_damage_avg_per_10m healing_avg_per_10m ultimates_earned_avg_per_10m final_blows_avg_per_10m time_played_total
eliminations_avg_per_10m 1.000000 NaN 0.702982 -0.520182 NaN 0.768385 NaN
deaths_avg_per_10m NaN 1.0 NaN NaN NaN NaN NaN
hero_damage_avg_per_10m 0.702982 NaN 1.000000 NaN NaN 0.756272 NaN
healing_avg_per_10m -0.520182 NaN NaN 1.000000 NaN -0.662879 NaN
ultimates_earned_avg_per_10m NaN NaN NaN NaN 1.0 NaN NaN
final_blows_avg_per_10m 0.768385 NaN 0.756272 -0.662879 NaN 1.000000 NaN
time_played_total NaN NaN NaN NaN NaN NaN 1.0

this looks great, but we are going to make this cleaner with the .drop() function so that the table doesn't have so many NaNs

df_column_drop = df_corr_table.drop(["deaths_avg_per_10m", "ultimates_earned_avg_per_10m", "time_played_total"])
df_relevant_correlations = df_column_drop.drop(["deaths_avg_per_10m", "ultimates_earned_avg_per_10m", "time_played_total"],axis=1)
df_relevant_correlations
eliminations_avg_per_10m hero_damage_avg_per_10m healing_avg_per_10m final_blows_avg_per_10m
eliminations_avg_per_10m 1.000000 0.702982 -0.520182 0.768385
hero_damage_avg_per_10m 0.702982 1.000000 -0.468124 0.756272
healing_avg_per_10m -0.520182 -0.468124 1.000000 -0.662879
final_blows_avg_per_10m 0.768385 0.756272 -0.662879 1.000000

it appears that

Eliminations and Hero Damage have a strong positive correlation with each other

Eliminations and Final blows have a strong positive correlation with each other

Eliminations and Healing have a moderate negative correlation with each other

Final blows and Hero damage have a strong positive correlation with each other

Final blows and Healing have a moderate negative correlation with each other

Figuring Out Which Pro has The Best Stats

Let's take a look at which Pros have the most eliminations, damage dealt, final blows, ultimates earned, healing dealt, and least number of deaths

Most Eliminations

df_elims = df[["role", "name", "team", "eliminations_avg_per_10m"]]
df_elims.nlargest(10, "eliminations_avg_per_10m")
role name team eliminations_avg_per_10m
125 offense SeoMinSoo VAN 21.092578
129 offense sinatraa SFS 20.914314
75 tank JJANU VAN 20.056908
24 tank Choihyobin SFS 19.391551
98 offense Nenne NYE 19.365667
147 tank Void GLA 19.343389
59 offense Haksal VAN 19.341104
35 offense diem SHD 19.069305
93 tank Michelle SEO 18.928176
43 offense FITS SEO 18.882519

Most Damage Dealt

df_damage = df[["role", "name", "team", "hero_damage_avg_per_10m"]]
df_damage.nlargest(10, "hero_damage_avg_per_10m")
role name team hero_damage_avg_per_10m
129 offense sinatraa SFS 11849.397959
125 offense SeoMinSoo VAN 10933.062491
36 offense Diya SHD 10081.816984
69 offense ivy TOR 9899.923990
7 offense babybay ATL 9724.894013
56 offense GodsB HZS 9683.685510
1 offense aKm DAL 9600.623636
43 offense FITS SEO 9527.150428
98 offense Nenne NYE 9397.008782
116 support Ripa GLA 9261.831927

Most Final Blows Dealt

df_final_blows = df[["role", "name", "team", "final_blows_avg_per_10m"]]
df_final_blows.nlargest(10, "final_blows_avg_per_10m")
role name team final_blows_avg_per_10m
15 tank Bischu GZC 8.891149
87 offense Logix TOR 8.368265
138 offense STRIKER SFS 8.201238
4 offense Architect SFS 8.087747
35 offense diem SHD 7.917622
86 offense LiNkzr HOU 7.424964
45 tank fragi GZC 7.409291
36 offense Diya SHD 7.223194
99 offense nero GZC 7.065229
125 offense SeoMinSoo VAN 7.048881

Most Ultimates Earned

df_ultimates = df[["role", "name", "team", "ultimates_earned_avg_per_10m"]]
df_ultimates.nlargest(10, "ultimates_earned_avg_per_10m")
role name team ultimates_earned_avg_per_10m
116 support Ripa GLA 6.299542
110 support RAPEL VAN 5.533913
146 support Viol2t SFS 5.300486
129 offense sinatraa SFS 5.252785
78 support Krillin LDN 5.159678
111 offense Rascal SFS 5.150937
70 support IZaYaKI SHD 5.089731
125 offense SeoMinSoo VAN 5.075465
144 support Twilight VAN 5.048997
81 offense Krystal HZS 5.003493

Most Healing Dealt

df_heals = df[["role", "name", "team", "healing_avg_per_10m"]]
df_heals.nlargest(10, "healing_avg_per_10m")
role name team healing_avg_per_10m
116 support Ripa GLA 12489.082153
61 support HarryHook DAL 10731.194372
70 support IZaYaKI SHD 10720.448760
110 support RAPEL VAN 10575.563042
66 support HyP PAR 10568.360507
78 support Krillin LDN 10410.303999
146 support Viol2t SFS 10409.200261
127 support Shaz GLA 10113.314711
12 support BEBE HZS 9429.701829
145 support uNKOE DAL 9419.885852

Least Deaths Recieved

df_deaths = df[["role", "name", "team", "deaths_avg_per_10m"]]
df_deaths.nsmallest(10, "deaths_avg_per_10m")
role name team deaths_avg_per_10m
5 support ArK WAS 2.641469
3 support Anamo NYE 2.745207
152 tank ZUNBA SEO 2.959663
147 tank Void GLA 3.178936
93 tank Michelle SEO 3.239774
75 tank JJANU VAN 3.381134
24 tank Choihyobin SFS 3.472553
105 support Onlywish GZC 3.493403
129 offense sinatraa SFS 3.497822
25 support Closer DAL 3.527819

It wouldn't be fair to judge the stats for pro's who don't get a lot of play time.

let's see which pros got the most play time

Most Playtime Recived

df_time_largest = df[["role", "name", "team", "time_played_total"]]
df_time_largest.nlargest(10, "time_played_total")
role name team time_played_total
95 support moth SFS 116859.144868
20 tank BUMPER VAN 113574.634219
24 tank Choihyobin SFS 111790.956037
130 support SLIME VAN 110314.003005
146 support Viol2t SFS 110254.045210
59 offense Haksal VAN 109848.948995
75 tank JJANU VAN 107005.528668
111 offense Rascal SFS 102156.164167
144 support Twilight VAN 100891.334471
129 offense sinatraa SFS 99147.405428

Least Playtime Recived

df_time_smallest = df[["role", "name", "team", "time_played_total"]]
df_time_smallest.nsmallest(10, "time_played_total")
role name team time_played_total
132 offense snillo PHI 411.721471
77 tank Karayan FLA 496.426940
36 offense Diya SHD 498.394445
116 support Ripa GLA 666.715092
47 support FunnyAstro ATL 1020.976662
15 tank Bischu GZC 1214.691094
45 tank fragi GZC 1214.691094
53 tank Gator ATL 1735.402076
94 tank Mickie DAL 2149.076643
105 support Onlywish GZC 2232.780163

Explanation For What I have chosen

I have choosen Eliminations, Damage, and Deaths for this project because I wanted to apply the findings to my own games.

Although these statistics do not reflect the skill level of a player, I personally would like to use these to figure out how I personally compare in my own competitive games to the pros.

Grouping by role

Which roles has the best in the various categories

df_group_role = df.groupby("role")
df_group_role = df_group_role.agg("sum").reset_index()
df_group_role
role playerId teamId eliminations_avg_per_10m deaths_avg_per_10m hero_damage_avg_per_10m healing_avg_per_10m ultimates_earned_avg_per_10m final_blows_avg_per_10m time_played_total count
0 offense 386317 334557 946.176006 291.759163 425826.207321 130963.348462 246.230313 341.229728 3.354968e+06 57
1 support 352231 289111 599.786627 214.251135 238364.322933 386289.038203 202.228107 135.218342 3.153147e+06 49
2 tank 316162 270656 768.694654 242.023534 307152.496101 9071.285277 167.693455 242.304149 2.905581e+06 47
df_group_role.plot.bar(x = "role")
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a30cce470>

Counts For Each Role

df_group_role[["role","count"]]
role count
0 offense 57
1 support 49
2 tank 47
df_group_role.plot.bar(x = "role", y = "count" )
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a30398550>

across all the roles, the count seems to be pretty spread evenly

How Many Eliminations Do Each Role Get?

They say that DPS should be the ones who get the most eliminations. That is true, however, tanks are pretty close to DPS.

df_group_role["Overall Average Eliminations Per 10m"] = df_group_role["eliminations_avg_per_10m"]/df_group_role["count"]
df_group_role_elimminations = df_group_role[["role","Overall Average Eliminations Per 10m"]]
df_group_role_elimminations.nlargest(3, "Overall Average Eliminations Per 10m")
role Overall Average Eliminations Per 10m
0 offense 16.599579
2 tank 16.355205
1 support 12.240543
df_group_role.plot.bar(x = "role", y = "Overall Average Eliminations Per 10m" )
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a30360f60>

it appears that The tanks and DPS get almost about the same amount of damage. The Tanks might have more than the supports because they get more opportunities to do damage and finish off targets.

It is also possible that during the GOATs meta (3 tanks 3 supports) tanks were the primary damage dealers.

How Much Damage is Dealt by Each Role?

df_group_role["Overall Average Damage Dealt per 10m"] = df_group_role["hero_damage_avg_per_10m"]/df_group_role["count"]
df_group_role_Damage = df_group_role[["role","Overall Average Damage Dealt per 10m"]]
df_group_role_Damage.nlargest(3, "Overall Average Damage Dealt per 10m")
role Overall Average Damage Dealt per 10m
0 offense 7470.635216
2 tank 6535.159492
1 support 4864.578019
df_group_role.plot.bar(x = "role", y = "Overall Average Damage Dealt per 10m" )
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a302e6898>

In this category, the DPS did 1000 more damage per 10 min compared to the tanks.

It is possible that the dps can focus more on dealing damage thus they would have more than the tanks. If we compare this back to the eliminations, it would appear that the DPS do the majority of the damage, and the tanks would finish off low health oppponents

How Many Deaths Do Each Role Get?

df_group_role["Overall Average Deaths Per 10m"] = df_group_role["deaths_avg_per_10m"]/df_group_role["count"]
df_group_role_Deaths = df_group_role[["role","Overall Average Deaths Per 10m"]]
df_group_role_Deaths.nlargest(3,"Overall Average Deaths Per 10m")
role Overall Average Deaths Per 10m
2 tank 5.149437
0 offense 5.118582
1 support 4.372472
df_group_role.plot.bar(x = "role", y = "Overall Average Deaths Per 10m" )
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a302ae6d8>

In terms of deaths, it appears that the dps and tanks die more than the supports.

The values are reasonable as supports in this game have better abilities that help them self sustain(Lucio amp and wall riding, Brigitte having a shield and inspire, Ana having sleep and nade, Moria healing orb and fade out etc.

DPS and tanks constantly need to put themselves in risky positions to get value and their abilities for the most part don't heal or sustain themselves (with obvious exceptions like soldier health pad, doomfist shields, and tracer recall).

How do teams affect statistics

df_group_team = df.groupby("team")
df_group_team = df_group_team.agg("sum").reset_index()
df_group_team
team playerId teamId eliminations_avg_per_10m deaths_avg_per_10m hero_damage_avg_per_10m healing_avg_per_10m ultimates_earned_avg_per_10m final_blows_avg_per_10m time_played_total count
0 ATL 85503 76980 157.793977 50.490675 62229.534763 29717.316325 39.633521 46.196669 542129.691046 10
1 BOS 19387 13206 41.831810 18.307436 22339.040042 168.870374 11.459645 13.611692 191882.761582 3
2 CDH 88084 76920 140.685496 54.735281 65018.505578 26011.366858 40.810739 46.357993 559672.649090 10
3 DAL 52627 45230 134.600049 53.890802 57832.731141 35178.978760 38.816079 41.888466 552438.204392 10
4 FLA 57758 30849 101.959246 36.758415 39591.619961 19430.429026 24.740010 28.107798 354423.819966 7
5 GLA 40743 30842 108.744030 30.418445 49108.905545 32116.483102 29.843228 32.485101 489485.111905 7
6 GZC 79962 84689 159.908158 48.163967 60829.784838 35702.505750 40.969978 55.463993 521269.576366 11
7 HOU 52327 49775 156.571056 57.913864 65358.076043 40454.474520 44.219426 48.886158 691999.044075 11
8 HZS 96271 84623 165.066886 51.045510 69069.351907 45746.309547 44.340600 48.711405 593674.115148 11
9 LDN 37085 26460 90.434697 26.671602 36982.082658 26613.463389 25.221463 24.639127 387766.475242 6
10 NYE 30576 26418 99.575626 24.138331 38255.470540 22063.733172 25.311343 29.345523 503951.861376 6
11 PAR 47618 46164 83.029907 33.794198 36440.938464 32370.046951 26.240437 24.154430 350082.354087 6
12 PHI 22529 22620 78.232372 27.090128 31924.133892 15973.523240 19.257253 23.235296 385046.356130 5
13 SEO 69111 44090 159.211885 42.290420 63252.547481 36999.399026 38.336938 44.785125 520537.701585 10
14 SFS 51678 39636 156.843551 40.146791 65342.859290 29724.106798 39.777856 52.126540 692734.994042 9
15 SHD 69402 44080 155.626680 49.550898 68986.768585 30876.841884 39.830569 53.093820 687468.766518 10
16 TOR 29461 38475 72.679144 27.565865 34029.883995 17312.415607 20.488759 25.676763 245498.218567 5
17 VAL 19483 13215 42.786018 15.343999 18309.481229 7423.094689 11.850342 14.706421 184116.543925 3
18 VAN 74664 69264 154.987665 40.865496 61391.476594 34382.552916 38.925150 46.432199 681441.973097 9
19 WAS 30441 30788 54.089034 18.851711 25049.833807 8057.760008 16.078539 18.847698 278076.144761 4
df_group_team[["team","count"]]
team count
0 ATL 10
1 BOS 3
2 CDH 10
3 DAL 10
4 FLA 7
5 GLA 7
6 GZC 11
7 HOU 11
8 HZS 11
9 LDN 6
10 NYE 6
11 PAR 6
12 PHI 5
13 SEO 10
14 SFS 9
15 SHD 10
16 TOR 5
17 VAL 3
18 VAN 9
19 WAS 4
df_group_team.plot.bar(x = "team", y = "count" )
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a3022b390>
q1 = df_group_team["count"].quantile(.25)
q3 = df_group_team["count"].quantile(.75)
iqr = q3 - q1
lower_bound = q1 -(1.5 * iqr) 
upper_bound = q3 +(1.5 * iqr)
print({"Quartile 1": q1})
print({"Quartile 3":q3})
print({"IQR": iqr })
print({"Lower Bound" : lower_bound})
print({"Upper Bound" : upper_bound})
{'Quartile 1': 5.75}
{'Quartile 3': 10.0}
{'IQR': 4.25}
{'Lower Bound': -0.625}
{'Upper Bound': 16.375}

Although our teams don't have any outliers by the IQR, we probably should exclude the the Boston Uprising, LA Valliant, and Washington Justice as they don't have enough for a team

How Many Eliminations Do Each Team Get?

Let's find out which teams had the most eliminations per 10 minutes

df_group_team["Overall Average Eliminations Per 10m"] = df_group_team["eliminations_avg_per_10m"]/df_group_team["count"]
df_team_largest_elim = df_group_team[["team","Overall Average Eliminations Per 10m"]]
df_team_largest_elim.nlargest(20,"Overall Average Eliminations Per 10m")
team Overall Average Eliminations Per 10m
14 SFS 17.427061
18 VAN 17.220852
10 NYE 16.595938
13 SEO 15.921189
0 ATL 15.779398
12 PHI 15.646474
15 SHD 15.562668
5 GLA 15.534861
9 LDN 15.072450
8 HZS 15.006081
4 FLA 14.565607
6 GZC 14.537105
16 TOR 14.535829
17 VAL 14.262006
7 HOU 14.233732
2 CDH 14.068550
1 BOS 13.943937
11 PAR 13.838318
19 WAS 13.522258
3 DAL 13.460005
df_group_team.plot.bar(x = "team", y = "Overall Average Eliminations Per 10m" )
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a30163940>

This looks pretty messy, let's calculate for any outliers

q1 = df_group_team["Overall Average Eliminations Per 10m"].quantile(.25)
q3 = df_group_team["Overall Average Eliminations Per 10m"].quantile(.75)
iqr = q3 - q1
lower_bound = q1 -(1.5 * iqr) 
upper_bound = q3 +(1.5 * iqr)
print({"Quartile 1": q1})
print({"Quartile 3":q3})
print({"IQR": iqr })
print({"Lower Bound" : lower_bound})
print({"Upper Bound" : upper_bound})
{'Quartile 1': 14.192436660434511}
{'Quartile 3': 15.679705219204635}
{'IQR': 1.4872685587701238}
{'Lower Bound': 11.961533822279325}
{'Upper Bound': 17.91060805735982}

How Much Damage is Dealt by Each Team?

df_group_team["Overall Average Damage Dealt per 10m"] = df_group_team["hero_damage_avg_per_10m"]/df_group_team["count"]
df_team_largest_damage = df_group_team[["team","Overall Average Damage Dealt per 10m"]]
df_team_largest_damage.nlargest(20,"Overall Average Damage Dealt per 10m")
team Overall Average Damage Dealt per 10m
1 BOS 7446.346681
14 SFS 7260.317699
5 GLA 7015.557935
15 SHD 6898.676859
18 VAN 6821.275177
16 TOR 6805.976799
2 CDH 6501.850558
12 PHI 6384.826778
10 NYE 6375.911757
13 SEO 6325.254748
8 HZS 6279.031992
19 WAS 6262.458452
0 ATL 6222.953476
9 LDN 6163.680443
17 VAL 6103.160410
11 PAR 6073.489744
7 HOU 5941.643277
3 DAL 5783.273114
4 FLA 5655.945709
6 GZC 5529.980440
df_team_largest_damage.plot.bar(x = "team", y = "Overall Average Damage Dealt per 10m" )
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a3010a198>

Surpisingly enough, Boston seems to have a higher damage dealt dispite having less players. This is odd because it wasn't an issue for eliminations.

How Many Deaths is Recieved By Each Team?

df_group_team["Overall Average Deaths Per 10m"] = df_group_team["deaths_avg_per_10m"]/df_group_team["count"]
df_team_smallest_death = df_group_team[["team","Overall Average Deaths Per 10m"]]
df_team_smallest_death.nsmallest(20,"Overall Average Deaths Per 10m")
team Overall Average Deaths Per 10m
10 NYE 4.023055
13 SEO 4.229042
5 GLA 4.345492
6 GZC 4.378542
9 LDN 4.445267
14 SFS 4.460755
18 VAN 4.540611
8 HZS 4.640501
19 WAS 4.712928
15 SHD 4.955090
0 ATL 5.049067
17 VAL 5.114666
4 FLA 5.251202
7 HOU 5.264897
3 DAL 5.389080
12 PHI 5.418026
2 CDH 5.473528
16 TOR 5.513173
11 PAR 5.632366
1 BOS 6.102479
df_team_smallest_death.plot.bar(x = "team", y = "Overall Average Deaths Per 10m" )
<matplotlib.axes._subplots.AxesSubplot at 0x7f5a2fcee6d8>

Linear Regression?

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model = model.fit(df[["eliminations_avg_per_10m","deaths_avg_per_10m","hero_damage_avg_per_10m", "healing_avg_per_10m"]], df["ultimates_earned_avg_per_10m"])