统计分析
- 1 参数估计
- 2 假设检验与单样本T检验
- 3 两样本T检验
- 3 方差分析
- 4 相关分析
- 5 列联表卡方检验
1 参数估计
给定一个变量X改变,另一个变量Y均值改变说明两个变量有关,则这两个变量不独立。X可预测Y,y=f(x)。
分析过程:建立两个变量的描述性统计,观察一个变量改变另一个变量均值是否改变(是否独立)。若不独立,则说名一个变量对另一个变量有预测作用。
- 检验两变量是否有关的四个检验:
统计学中检验两个变量是否有关,都是通过检验同组两个变量均值的差值是否等于0.如果与0无差异,说明两个变量无关,如果与0有差异,说明两个变量有关。
#样本对总体有代表性,用于对总体的某些指标推断使用
#总体参数(均值、方差、标准差)确定,样本参数是随机变量
估计方法:
- 点估计
统计量由样本获取,用于对总体参数进行估计 - 区间估计——置信区间 (以样本均值为中心,2倍标准差的范围作置信区间)
95%置信区间代表总体参数值有95%的可能在估计值的置信区间内
均值标准误是衡量估计的均值的变异程度,随样本的标准差的变化而变化
中心极限定理:样本量足够大时,总体服从正态分布
import pandas as pd
import os
- 导入地区房价增长率数据
os.chdir(r'D:\python商业实践\《Python数据科学技术详解与商业实践》PDF+源代码+八大案例\《Python数据科学技术详解与商业实践》PDF+源代码+八大案例\源代码\Python_book\6Inference')
house_price_gr=pd.read_csv('house_price_gr.csv',encoding='gbk')
- 对房屋价格增长率作描述性统计
house_price_gr.describe(include='all')
- 可视化
(1)
get_ipython().magic('matplotlib inline')
import seaborn as sns
from scipy import stats
sns.distplot(house_price_gr.rate, kde=True, fit=stats.norm)
(2)
import statsmodels.api as sm
from matplotlib import pyplot as plt
fig = sm.qqplot(house_price_gr.rate, fit=True, line='45')
fig.show()
(3)
house_price_gr.plot(kind='box')
- 置信区间估计 作95%置信区间
se = house_price_gr.rate.std() / len(house_price_gr) ** 0.5 #根号下n
LB = house_price_gr.rate.mean() - 1.98 * se #下界 两倍(1.98)标准误
UB = house_price_gr.rate.mean() + 1.98 * se
(LB, UB)
############或者使用DescrStatsW得到置信区间
d1 = sm.stats.DescrStatsW(house_price_gr.rate)
d1.tconfint_mean(0.05)
注:95%置信区间的面积对应1.98倍的标准误(2是约等于)
=>房价同比增长率小于等于10%的概率不超过2.5%
2 假设检验与单样本T检验
基本原理:检验样本均值是否等于某个值。如果总体均值在置信区间内,则接受原假设;反之拒绝原假设。
假设检验步骤:
(1)假设 H0=0.1,H1≠0.1
(2)设置显著度 显著度设置与样本量有关 <100 取10%;100~500 取5%;500~1000取1%
(3)收集样本,得到均值
(4)假设均值分布
- t检验
假设H0:μ=μ0,计算t统计量
根据t统计量相应p值判断是否拒绝原假设
DescrStatsW
->statsmodels.api
包内方法import statsmodels.api as sm
d1 = sm.stats.DescrStatsW(house_price_gr.rate) #检验样本均值与假设的均值的t值
print('t-statistic=%6.4f, p-value=%6.4f, df=%s' %d1.ttest_mean(0.1)) #假设均值μ=0.1,返回t值、p值、自由度
3 两样本T检验
(二分类变量、连续变量)
原理:分类变量分别对应的连续变量是否相等。例:开卡人的平均收入与没开卡人平均收入相等——检验平均收入对开卡是否有影响。
(1)原假设H0:μ1=μ2 、悖假设H1:μ1≠μ2
(2)显著度α:5%
(3)采集样本
(4)计算统计量
- 导入信用卡客户信息数据
creditcard= pd.read_csv(r'creditcard_exp.csv',skipinitialspace=True) #skipinitialspace=True在空格处填充NaN
- 按是否开卡对平均收入作描述性统计
creditcard['Income'].groupby(creditcard['Acc']).describe()
- 两样本t检验时,首先进行Levene方差齐性检验,p<α,认为其显著。
Suc0 = creditcard[creditcard['Acc'] == 0]['Income']
Suc1 = creditcard[creditcard['Acc'] == 1]['Income'] #把开卡和没开卡的人分别拿出来,得到两列数
leveneTestRes = stats.levene(Suc0, Suc1, center='median') #center='median'集中趋势
print('w-value=%6.4f, p-value=%6.4f' %leveneTestRes) #p<α,显著
- 进行t检验
stats.stats.ttest_ind(Suc0, Suc1, equal_var=False) #equal_var=False代表显著
p值远小于显著度α
**在实际运用中,方差齐性检验与否并不影响最后结论,省略,只需进行t检验即可
stats.stats.ttest_ind(Suc0, Suc1) #p值仍远小于α
3 方差分析
(多分类变量、连续变量)
总变异(离差平方和):
组内变异SSe:每个样本偏离各自组均值情况,代表模型所不能解释的变异,自由度为n-k+1
组间变异SSm:每个组的均值偏离总体均值情况,代表模型所能解释的变异,自由度为k-1
F(组间变异,组内变异)=MSm/MSe
import statsmodels.api as sm
from statsmodels.formula.api import ols #调用osl线性回归
教育等级(分为四个等级)对月均支出的影响:anova_lm
方差分析
sm.stats.anova_lm(ols('avg_exp ~ C(edu_class)',data=creditcard).fit()) #avg_exp受edu_class的影响
#python默认连续变量 C(edu_class)加大写C说明分类变量
最后得到p值很小,说明教育等级对支出有明显作用
多因素方差分析
sm.stats.anova_lm(ols('avg_exp ~ C(edu_class)+C(gender)',data=creditcard).fit()) #不考虑交叉
sm.stats.anova_lm(ols('avg_exp ~ C(edu_class)+C(gender)+C(edu_class)*C(gender)',data=creditcard).fit()) #考虑交叉
4 相关分析
(连续变量、连续变量)
判断两个变量是否有关:一个变量取值发生改变,另一个变量均值是否改变
三种相关系数:
Pearson相关系数:参数方法、连续变量之间的相关
Spearman相关系数(秩相关系数):非参方法
Kendall相关系数:非参方法,叙述变量之间的相关
- 散点图观察两连续变量的关系
creditcard.plot(x='Income', y='avg_exp', kind='scatter')
#一个变量与另一个变量呈发散关系,说明直方图趋势为右偏,对Y取对数
- 计算Pearson相关系数
creditcard[['avg_exp_ln', 'Income']].corr(method='pearson') #0.6说明中度相关,两变量有关系
注:|r|越大表明两个变量之间的相关性越强,一般认为:
|r|≥0.8 时,两个变量高度相关
0.5≤|r|≤0.8时,两个变量中度相关
0.3≤|r|≤0.5时,两个变量低度相关
|r|<0.3 时,认为两个变量几乎不存在相关性
5 列联表卡方检验
(分类变量、分类变量)
确定两个分类变量间的相关性:一个分类变量的分布会随另一个分类变量的改变而改变。
列联交叉表显示每一行列组合上的观察值出现的频数
#解释变量为行变量,被解释变量为列变量
#是否二手车、是否违约,二手车中违约的比例大,说明这两个分类变量有关
建模之前变量生成,衍生变量
所有的假设都是假设两个变量没关系
卡方检验
卡方检验和对应p值,可以确定两变量是否相关,不能测量相关性的强弱。
#其中A为实际值,T为期望值
#数据导入与清洗
accepts=pd.read_csv('accepts.csv').dropna() #去除有缺失值的行
#验证分类变量相关关系
##生成交叉表
cross_table=pd.crosstab(accepts.used_ind,accepts.bad_ind,margins=True) #margins=True 生成边缘分布
##生成列联表,查看行百分比
def percConvert(ser):
return ser/(ser['All'])
cross_table.apply(percConvert,axis=1) #axis=1 以行为单位进行
#由结果看出二手车中违约的比例大,初步说明这两个变量有关
print('''chisq = %6.4f
p-value = %6.4f
dof = %i
expected_freq = %s''' %stats.chi2_contingency(cross_table.iloc[:2, :2]))
样本量4105,取显著度α=0.01%~0.1%,p<α,拒绝原假设,两个变量有关系。
注:在建模之前,可先创造衍生变量
def divMy(x,y):
import numpy as np
if x==np.nan or y==np.nan:
return np.nan
elif y==0:
return -1
else:
return x/y
divMy(1,2)
#%%创造衍生变量
##
##历史负债收入比:tot_rev_line/tot_income
accepts["dti_hist"]=accepts[["tot_rev_line","tot_income"]].apply(lambda x:divMy(x[0],x[1]),axis = 1)
##本次新增负债收入比:loan_amt/tot_income
accepts["dti_mew"]=accepts[["loan_amt","tot_income"]].apply(lambda x:divMy(x[0],x[1]),axis = 1)
##本次贷款首付比例:down_pyt/loan_amt
accepts["fta"]=accepts[["down_pyt","loan_amt"]].apply(lambda x:divMy(x[0],x[1]),axis = 1)
##新增债务比:loan_amt/tot_rev_debt
accepts["nth"]=accepts[["loan_amt","tot_rev_debt"]].apply(lambda x:divMy(x[0],x[1]),axis = 1)
##新增债务额度比:loan_amt/tot_rev_line
accepts["nta"]=accepts[["loan_amt","tot_rev_line"]].apply(lambda x:divMy(x[0],x[1]),axis = 1)
accepts.head()