My leaderboard is missing one stat (StatPoints) and also will not count kills or deaths or anything. Here is the script.

--rbxsig%XYC6H9oKVLF//1itmbaGn5wI5a4YNtkf4beIsIVZsrT29WveOsrP4YfpYDED5Xa8A1oBA/5oDwtjy4/wlvl/DH0rigLCzfNVjszNya26GajrkOvCFifnNhOCVAOLBySGJ7z5gMoZR/XQjW5EO+K1zDWiQi5CLNwBOxOTMDLS8dU=%
--rbxassetid18966%
print("LinkedLeaderboard script version 5.00 loaded")

goldKey = "PlayerGold"
killsKey = "PlayerKills"
deathsKey = "PlayerDeaths"
XPKey = "PlayerXP"
statpointKey = "PlayerStatPoints"
lvlKey = "PlayerLevel"
 
game.Players.PlayerAdded:connect(function(player)
    if player:WaitForDataReady() then
	
	    -- create leaderboard
	    local ls = Instance.new("IntValue")
	    ls.Name = "leaderstats"
	    ls.Parent = player
 
	    --create the score stat
	    local gold = Instance.new("IntValue")
	    gold.Name = "Gold"
	    gold.Parent = ls
        gold.Value = player:LoadNumber(goldKey)

	    --create the score stat
	    local kills = Instance.new("IntValue")
	    kills.Name = "Kills"
	    kills.Parent = ls
        kills.Value = player:LoadNumber(killsKey)

	    --create the score stat
	    local deaths = Instance.new("IntValue")
	    deaths.Name = "Deaths"
	    deaths.Parent = ls
        deaths.Value = player:LoadNumber(deathsKey)

	    --create the score stat
	    local lvl = Instance.new("IntValue")
	    lvl.Name = "Level"
	    lvl.Parent = ls
        lvl.Value = player:LoadNumber(lvlKey)

	    --create the score stat
	    local XP = Instance.new("IntValue")
	    XP.Name = "XP"
	    XP.Parent = ls
        XP.Value = player:LoadNumber(xPKey)

	    --create the score stat
	    local statpoint = Instance.new("IntValue")
	    statpoint.Name = "StatPoints"
	    statpoint.Parent = ls
        statpoint.Value = player:LoadNumber(statpointKey)
    end
end)
 
game.Players.PlayerRemoving:connect(function(player)
    if player:FindFirstChild("leaderstats") then
        player:SaveNumber(goldKey, player.leaderstats.Gold.Value)
        player:SaveNumber(killsKey, player.leaderstats.Kills.Value)
        player:SaveNumber(deathsKey, player.leaderstats.Deaths.Value) 
        player:SaveNumber(statpointKey, player.leaderstats.StatPoints.Value)
        player:SaveNumber(XPKey, player.leaderstats.XP.Value)
        player:SaveNumber(lvlKey, player.leaderstats.Level.Value)  
    end
end)

function onxPChanged(player, XP, level) 
if XPKey.Value>=lvlKey.Value * 50 then --XP needed to level up.
XPKey.Value = XPKey.Value - XP.Value --XP lost on level up.
lvlKey.Value = lvlKey.Value + 1 --Levels added on level up.
StatPointsKey.Value = StatPointsKey.Value + 1
end 
end 

function onLevelUp(player, XPKey, lvlKey)
	if player.Character~=nil then
		for i = 1,10 do
			local fireworks = Instance.new("Part")
			fireworks.Shape = "Ball" --Shape of XP points.
			fireworks.formFactor = "Symmetric" 
			fireworks.Reflectance = 1 --How shiny?
		    fireworks.Transparency = 0 --How transparent?
			fireworks.Size = Vector3.new(2,2,2)
			fireworks.BrickColor = BrickColor.Random()
			fireworks.CFrame = player.Character.Head.CFrame + Vector3.new(0,2,0)
			fireworks.Parent = game.Workspace
			game:GetService("Debris"):AddItem(fireworks, 2)
			fireworks.Velocity = Vector3.new(math.random(-30,30),math.random(-30,30),math.random(-30,30))
		end
	end
	local m = Instance.new("Hint")
	m.Parent = game.Workspace
	m.Text = "Level up!:"..player.Name.." is now level"..level.Value
	wait(2) --How long well hint show?
	m.Parent = nil
end




function onHumanoidDied(humanoid, player)
	local stats = player:findFirstChild("leaderstats")
	if stats ~= nil then
		local deathsKey = stats:findFirstChild("Deaths")
		deathsKey.Value = deathsKey.Value + 1

		-- do short dance to try and find the killer

		local killer = getKillerOfHumanoidIfStillInGame(humanoid)

		handleKillCount(humanoid, player)
	end
end

function onPlayerRespawn(property, player)
	-- need to connect to new humanoid
	
	if property == "Character" and player.Character ~= nil then
		local humanoid = player.Character.Humanoid
			local p = player
			local h = humanoid
			humanoid.Died:connect(function() onHumanoidDied(h, p) end )
	end
end

function getKillerOfHumanoidIfStillInGame(humanoid)
	-- returns the player object that killed this humanoid
	-- returns nil if the killer is no longer in the game

	-- check for kill tag on humanoid - may be more than one - todo: deal with this
	local tag = humanoid:findFirstChild("creator")

	-- find player with name on tag
	if tag ~= nil then
		
		local killer = tag.Value
		if killer.Parent ~= nil then -- killer still in game
			return killer
		end
	end

	return nil
end

function handleKillCount(humanoid, player)
	local killer = getKillerOfHumanoidIfStillInGame(humanoid)
	if killer ~= nil then
		local stats = killer:findFirstChild("leaderstats")
		if stats ~= nil then
			local killsKey = stats:findFirstChild("Kills")
			local goldKey = stats:findFirstChild("Gold")
			local XPKey = stats:findFirstChild("XP")
			if killer ~= player then
				killsKey.Value = killsKey.Value + 1
				goldKey.Value = goldKey.Value + 10
				XPKey.Value = XPKey.Value + 10
				
			else
				killsKey.Value = killsKey.Value - 1
				
			end
		end
	end
end

Also, in some games like Guest Defense, the money, xp, and health are in their own GUI. I was wonder if someone could teach me how to do that or point me in the right direction.

Thanks for the help but with your fix could you please tell me why it happened, what happened, how to prevent it in the future, and basically anything important that will help me become a better scripter because I REALLY REALLY want to master this. Thanks again mates :)!