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 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).
TL;DR: What This Means
Basically, each game you play is compared to a theoretically "perfect" game. A "perfect" game (as far as Skill is concerned) would be 1000 SPM, 3 KPM, 5 KDR. The closer you are to each of those ideals, the higher your Skill is for that game. Then the skill for that game is factored into your overall skill either raising or lowering it. The higher your skill, the harder it is to advance it more. For example, if my starting skill had been 300, I would've gained +29 Skill for the above game instead of only +8. Also, since Skill is calculated on a running basis from each game, you can have much better overall stats than someone, but still have a lower skill. It is very much a "What have you done for me lately" stat, and has almost nothing to do with your career numbers. You can gain or lose a couple hundred skill in just a few games. Any questions?