分析建模,日常问题整理(二十四)
2019.4.10~2019.4.28
- 相关检验
# 相关系数
pd.DataFrame(pd.DataFrame([[1,1,0,0,0],[0,1,1,0,3]]).T.rename(columns = {0:'A',1:'B'})).corr()
- 正态检验
import scipy
import scipy.stats as scs
import scipy.stats as scs
def normality_tests(arr):
"""
Tests for normality distribution of given data set
:param arr: ndarray
object to generate statistics on
:return:
"""
print("Skew of data set %14.3f" % scs.skew(arr))
print("Skew test p-value %14.3f" % scs.skewtest(arr)[1])
print("Kurt of data set %14.3f" % scs.kurtosis(arr))
print("Kurt test p-value %14.3f" % scs.kurtosistest(arr)[1])
print("Norm test p-value %14.3f" % scs.normaltest(arr)[1])
normality_tests([-1,-0.5,-0.4,-0.3,-0.2,0,0.2,0.3,0.4,0.5,1])
# Skew of data set 0.001
# Skew test p-value 0.292
# Kurt of data set 0.001
# Kurt test p-value 0.625
# Norm test p-value 0.509
KS检验
scipy.stats.kstest (rvs, cdf, args = ( ), N = 20, alternative ='two-sided', mode ='approx')
Anderson 检验,该方法是由 scipy.stats.kstest 改进而来的,可以做正态分布、指数分布、Logistic 分布、Gumbel 分布等多种分布检验。默认参数为 norm,即正态性检验。
scipy.stats.anderson (x, dist ='norm' )
Shapiro-Wilk test检验
scipy.stats.shapiro(x)
- 卡方检验
目的:判别两组数据是否有差别?比较理论频数和实际频数的吻合程度或者拟合优度问题?比较实际数据和理论分布之间的差异有多大。
原假设
H0:两组数据无差异(一般选择有绝对优势出现的事件,如果发生的小概率事件就不得不拒绝掉原假设)
H1:两组数据不是无差异
卡方统计量=,在0假设成立的情况下服从自由度为k-1的卡方分布。
表示理论分布出现的频数或者值,表示实际值。
from scipy.stats import chi2_contingency
kf = chi2_contingency(np.array([[1,2,1,1,2,1],[1,2,2,1,1,2]]))
print('chisq-statistic=%.4f, p-value=%.4f, df=%i expected_frep=%s'%kf)
表1:第X1个变量出现的实际值
Y | V1 | V2 | V3 | 总计 |
---|---|---|---|---|
0 | 4 | 7 | 6 | 17 |
1 | 1 | 3 | 6 | 10 |
总计 | 5 | 10 | 12 | 27 |
表2:第X1个变量出现的理论值
Y | V1 | V2 | V3 | 总计 |
---|---|---|---|---|
0 | 5*17/27=3.1 | 6.3 | 7.6 | 17 |
1 | 5*10/27=1.9 | 3.7 | 4.4 | 10 |
总计 | 5 | 10 | 12 | 27 |
卡方值 =
两个表的数字差距越大,两个表的独立性越强约偏离均匀的分布,01在各组的分布越不均匀,粗分类结果越好(对y的区分效果越好)。
卡方检验和IV值都可以用来评价变量的作用。
from scipy.stats import chi2_contingency
kf = chi2_contingency(np.array([[4,7,6],[1,3,6]]))
# 这里需要算0两类的变量分布
print('chisq-statistic=%.4f, p-value=%.4f, df=%i expected_frep=%s'%kf)
output:
chisq-statistic=1.6994, p-value=0.4275, df=2 expected_frep=[[ 3.14814815 6.2962963 7.55555556]
[ 1.85185185 3.7037037 4.44444444]]
- T检验
T检验,亦称student t检验(Student's t test),主要用于样本含量较小(例如n < 30),总体标准差未知的总体。T检验是用t分布理论来推论差异发生的概率,从而比较两个平均数的差异是否显著。
单总体检验,t分布
双总体检验,t分布
H0:
单总体,样本均值是否等于总体均值20,结论:P<0.05,等于总体均值
from scipy import stats
import pandas as pd
dataSer=pd.Series([15.6,16.2,22.5,20.5,16.4,19.4,16.6,17.9,12.7,13.9])
pop_mean=20
t,p_twoTail=stats.ttest_1samp(dataSer,pop_mean)
p_oneTail = p_twoTail/2
print("t=",t,"p_twoTail=",p_twoTail, "p_oneTail = ", p_oneTail)
output:t= -3.00164952589 p_twoTail= 0.0149164142489 p_oneTail = 0.00745820712445
H0:两样本均值无差异
rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)
rvs2 = stats.norm.rvs(loc=5,scale=10,size=500)
# 检验两样本均值是否有显著差异
# 首先,检验方差是否相等
stats.levene(rvs1, rvs2)
# 如果p>0.05方差相等
stats.ttest_ind(rvs1,rvs2)
# 如果p<0.05方差不相等
stats.ttest_ind(rvs1,rvs2, equal_var = False)
- 卡方检验和T检验区别
T检验主要检验均值,卡方检验主要检验整体差异?
- jupyter进度条展示
from tqdm import tqdm_notebook,tnrange
for i in tqdm_notebook(range(0, new_loc.shape[0], 10),desc = 'lst loop'):
print(i)