(五)统计分析基本算法

1 参数估计

给定一个变量X改变,另一个变量Y均值改变说明两个变量有关,则这两个变量不独立。X可预测Y,y=f(x)。
分析过程:建立两个变量的描述性统计,观察一个变量改变另一个变量均值是否改变(是否独立)。若不独立,则说名一个变量对另一个变量有预测作用。

  • 检验两变量是否有关的四个检验:
    在这里插入图片描述

统计学中检验两个变量是否有关,都是通过检验同组两个变量均值的差值是否等于0.如果与0无差异,说明两个变量无关,如果与0有差异,说明两个变量有关。
#样本对总体有代表性,用于对总体的某些指标推断使用
#总体参数(均值、方差、标准差)确定,样本参数是随机变量
估计方法:

  1. 点估计
    统计量由样本获取,用于对总体参数进行估计
  2. 区间估计——置信区间 (以样本均值为中心,2倍标准差的范围作置信区间)
    95%置信区间代表总体参数值有95%的可能在估计值的置信区间内
    标准误=均值的标准差=S/根号n
    均值标准误是衡量估计的均值的变异程度,随样本的标准差的变化而变化
    中心极限定理:样本量足够大时,总体服从正态分布
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()
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值