K-S檢驗,皮爾遜相關係數,spearman相關係數總結
K-S檢驗
Kolmogorov-smirnov是一個比較頻率分布f(x)與理論分布g(x)或者兩個觀測值分布的檢驗辦法
假設檢驗問題
H0:樣本的分布服從某個特定分布
H1:樣本的分布不服從某個特定分布
F(X):樣本的累計分布函數
F0(X)理論分布的分布函數
D=max|F(X)- F0(X)|
D>D(n,α)相比較
p>0.05接受H0,p
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = [87,77,92,68,80,78,84,77,81,80,80,77,92,86,
76,80,81,75,77,72,81,72,84,86,80,68,77,87,
76,77,78,92,75,80,78]
df = pd.DataFrame(data, columns =["value"])
u = df["value"].mean()
std = df["value"].std()
print("樣本均值為:%.2f,樣本標準差為:%.2f" % (u,std))
print("------")
2計算相關的 指標
#統計個數並排序
s=df["value"].value_counts().sort_index()
df_s=pd.DataFrame({"血糖濃度":s.index,"次數":s.values})
df_s["累計次數"]=df_s["次數"].cumsum()
df_s["累計頻率"]=df_s["累計次數"]/len(data)
df_s["標準化取值"]=(df_s["血糖濃度"]-u)/std
df_s["理論分布"] =[0.0244,0.0968,0.2148,0.2643,0.3228,0.3859,0.5160,0.5832,0.7611,0.8531,0.8888,0.9803] # 通過查閱正太分布表
df_s["D"] = np.abs(df_s["累計頻率"] - df_s["理論分布"])
dmax = df_s["D"].max()
#這步結束之後,可以查表找到p介於0.2-0.4之間
#方法二:直接調用函數,求出相應的P值
from scipy import stats
data = [87,77,92,68,80,78,84,77,81,80,80,77,92,86,
76,80,81,75,77,72,81,72,84,86,80,68,77,87,
76,77,78,92,75,80,78]
df = pd.DataFrame(data, columns =["value"])
u = df["value"].mean()
std = df["value"].std()
stats.kstest(df["value"],"norm",(u,std))
3畫圖
2 pearson correlation coeffcient 和 sperman秩相關係數
2.1pearson相關係數(注意:描述的是兩個樣本的線性相關性,服從正態分布的連續變數)
實現過程
1 構造相關數據
# 創建三個數據:data1為0-100的隨機數並從小到大排列,data2為0-50的隨機數並從小到大排列,data3為0-500的隨機數並從大到小排列,
fig = plt.figure(figsize = (9,4))
ax1 = fig.add_subplot(1,2,1)
ax1.scatter(data1, data2)
plt.grid()
ax2 = fig.add_subplot(1,2,2)
ax2.scatter(data1, data3)
plt.grid()
#計算pearson相關係數
data = pd.DataFrame({"value1":data1.values,
"value2":data2.values})
data["(x-u1)*(y-u2)"] = (data["value1"] - u1) * (data["value2"] - u2)
data["(x-u1)**2"] = (data["value1"] - u1)**2
data["(y-u2)**2"] = (data["value2"] - u2)**2
r = data["(x-u1)*(y-u2)"].sum() / (np.sqrt(data["(x-u1)**2"].sum() * data["(y-u2)**2"].sum()))
print("Pearson相關係數為:%.4f" % r)
方法二:直接調用函數
2 spearman相關係數例子
data = pd.DataFrame({"智商":[106,86,100,101,99,103,97,113,112,110],
"每周看電視小時數":[7,0,27,50,28,29,20,12,6,17]})
data.sort_values("智商", inplace=True)
data["range1"] = np.arange(1,len(data)+1)
data.sort_values("每周看電視小時數", inplace=True)
data["range2"] = np.arange(1,len(data)+1)
data["d"] = data["range1"] - data["range2"]
data["d2"] = data["d"]**2
n = len(data)
rs = 1 - 6 * (data["d2"].sum()) / (n * (n**2 - 1))
print("spearman相關係數為:%.4f" % rs)
方法二
說明看電視和智商不存在特別大的線性相關關係
TAG:馬小白成長記 |