**Disclaimer: This post is not about whether Skill is a good stat or a useless stat, so you can save that for someplace else. I just wanted to find out how it works.**
I believe I have found the proper formula for calculating the Skill rating you see in Battlelog.
This information was pulled from the game files and posted to Symthic. It served as my starting point.
SkillLevelParameters e6df679ae3633529acb47445de71eab7
$::Asset
$:
ataContainer
Name Persistence/SkillLevelParams
SPM::SkillLevelComponent
MaxValue 1000.0
Weight 0.6
KPM::SkillLevelComponent
MaxValue 3.0
Weight 0.3
KDR::SkillLevelComponent
MaxValue 5.0
Weight 0.1
OldValueWeight 0.9
MaxValue 1000.0
MinimumTimeRequired 300.0
As you can see from this data, Skill is made up of three factors, each weighted by a different amount: 60% SPM, 30% KPM, and 10% KDR. The folks over on Symthic forum tried simply added the weighted amounts together, but that makes no sense. SPM is a huge number compared to the others. The values must be normalized before being weighted and added. What to normalize them against was a problem at first before I realized it was right in front of me. They are normalized against the MaxValues for each one.
You cannot (I don't think) calculate your total skill in a vacuum. Rather, it is built game-by-game by adding or subtracting from your starting skill. In other words, you have to have a starting skill number, then add in data for a game, and you can find out the resulting skill number.
You only need your pre-game Skill and the data from one game to make the calculation. The SPM you must use is derived from the score beside your name on the scoreboard before any awards are added, NOT the giant SPM number from the Battle Report. Take that score and divide by the round time to find your actual SPM. Find KPM by dividing your kills by the round time also. KDR is listed in in the Battle Report. Any values over the max values (1000, 3, and 5 respectively) are reduced to the max values.
It's a three-step calculation:
First, we normalize the values as fractions of the maximum possible.
(SPM/1000) = nSPM
(KPM/3) = nKPM
(KDR/5) = nKDR
Next, we weight the values and add them, then multiply by 1000
((nSPM * .6) + (nKPM * .3) + (nKDR * .1)) * 1000 = GameSkill
GameSkill represents your Skill in that single game.
Finally, we add the GameSkill with our starting skill. You'll notice in the data above "OldValueWeight 0.9". That means we will weight our existing skill by .9 when adding in the single game skill.
(OldSkill * .9) + (GameSkill * .1) = NewSkill
**Real World Example:**
[This is the last game I played](
http://battlelog.battlefield.com/bf4/battlereport/show/1/404851328539527040/293833349/) two days ago. The other team rage quit. I had a pretty good round and I gained +8 Skill. My skill before the game was 510. Although Battlelog shows my SPM was 1018, that's not the value we want to use here because that counts awards. My actual SPM was 463 (12,905 points / 27.83 minutes), my KPM was 2.12, and my KDR was 4.92. We first plug in these numbers to normalize them against their max values.
(463/1000) = 0.463
(2.12/3) = 0.707
(4.92/5) = 0.984
Now we weight them, add them, and multiply by 1000 to get the single game Skill.
((0.463 * .6) + (0.707 * .3) + (0.984 * .1)) * 1000 = 588.2
Lastly, we add the GameSkill in with our weighted starting skill.
(510 * .9) + (588.2 * .1) = 517.82
That rounds up to a New Skill of 518. My calculation says I should have gained +8 Skill for that game, which is exactly what it shows in Battlelog. Also, 518 is my actual current skill at the time of this writing. I have tested it with about a dozen different games and players. It seems to work except it can occasionally be off by 1 point possibly due to rounding(?) or an error on the Battle Report (most likely).