统计推断及不同类型变量检验概念和代码

正态分布,区间估计及置信区间计算

import pandas as pd
house_price_gr = pd.read_csv('house_price_gr.csv', encoding='gbk')
house_price_gr.head()

# 查看增长率分布是否符合正态分布
# %matplotlib inline
import seaborn as sns
from scipy import stats

sns.distplot(house_price_gr.rate, kde = True, fit=stats.norm)

# 使用qqplot看变量与正态分布接近程度
import statsmodels.api as sm 
from matplotlib import pyplot as plt 

fig = sm.qqplot(house_price_gr.rate, fit = True, line = '45')
fig.show()

# 区间估计
se = house_price_gr.rate.std()/len(house_price_gr) ** 0.5
LB = house_price_gr.rate.mean() - 1.98 * se 
UB = house_price_gr.rate.mean() + 1.98 * se
(LB, UB)

# 计算不同置信度下的置信区间
def confint(x, alpha = 0.05):
    n = len(x)
    xb = x.mean()
    df = n-1
    tmp = (x.std() / n **0.5) * stats.t.ppf(1-alpha/2, df)
    return {'Mean' : xb, 'Degree of freedom': df, 'LB':xb-tmp, 'UB':xb+tmp}

confint(house_price_gr.rate, 0.05)
confint(house_price_gr.rate, 0.01)

主要图形结果:
查看增长率分布是否符合正态分布
qqplot看变量与正态分布接近程度

单样本t检验

检验样本均值与总体均值的差异是否显著

# 单样本t检验: 样本与总体的检验
d1 = sm.stats.DescrStatsW(house_price_gr.rate)
print('t-statistic = %6.4f, p-value = %6.4f, df=%s' %d1.ttest_mean(0.1))

双样本t检验

检验两个样本的均值差异是否显著
双样本t检验考虑条件:
1.观测之间独立,即观测之间不能互相影响
2.两组均服从正态分布,即样本分布正态
3.两组样本的方差是否相同,视其是否相同会采用不同统计量进行检验

  • 方差齐性检验(F统计量)来检验两个方差是否相同
  • F统计量由两组样本方差中最大值除以最小值得到
    在这里插入图片描述
    双样本t检验流程:
    1.获得两组样本数据,计算其均值
    2.进行方差齐性检验
    3.若方差齐,则进行方差齐双样本t检验;若不齐,则进行方差不齐的双样本t检验
#################################
#  双样本t检验: 两个样本之间的检验
# 数据源是信用卡
creditcard_exp= pd.read_csv(r'creditcard_exp.csv', skipinitialspace=True)
creditcard_exp = creditcard_exp.dropna(how='any')
creditcard_exp.head()

# 查看按性别分类后的描述性分析
creditcard_exp['avg_exp'].groupby(creditcard_exp['gender']).describe()

# 双样本t检验前,有三个基本条件
# 观测之间独立,两组服从正态分布,两组样本方差是否相同
# 故需进行方差齐次性检验
gender0 = creditcard_exp[creditcard_exp['gender']==0]['avg_exp']
gender1 = creditcard_exp[creditcard_exp['gender'] == 1]['avg_exp']
leveneTestRes = stats.levene(gender0, gender1, center = 'median')
print('w-value = %6.4f, p-value = %6.4f'%leveneTestRes)

# 方差齐,开始进行双样本t检验
stats.stats.ttest_ind(gender0, gender1, equal_var=True)

方差分析

方差分用于检验多个样本均值是否有显著差异,故其用于分析多于两个分类的分类变量与连续变量的关系
在这里插入图片描述

1.单因素方差分析

单因素可得到不同因素对观测变量的影响程度,这里因素的不同水平表示因素不同的状态或等级。
原假设:所有组方差相等,备择假设为至少有两组方差不等。
数据总误差分为组内误差和组间误差

  • 组间变异(SS_m):同类别下数据的离均差平方和,代表同类别下数据变异程度
  • 组内变异(SS_e):组内均值与总均值的离均差平方和,代表不同类别数据的变异程度
    组间变异与组内变异之和为总变异
  • 组内离差平方和受随机误差影响;组间离差平方和受不同水平的影响
    在这里插入图片描述

组内差异与组间差异的统计量:
在这里插入图片描述

当F值越大,说明组间差异越大,越拒绝原假设,即组间有差异;反之,组间无差异。

单因素方差分析另一种方法类似于回归:
在这里插入图片描述

########################################
# 方差分析:检验多个样本均值是否有显著差异,或多于两个分类的分类变量与连续变量关系
# 单因素方差分析:检验一个分类变量与一个连续变量关系,其前提与双样本t检验相似
edu = []
for i in range(4):
    edu.append(creditcard_exp[creditcard_exp['edu_class'] == i]['avg_exp'])
stats.f_oneway(*edu)

2.多因素方差分析

单因素方差分析可检验一个分类变量与一个连续变量间的关系,多因素方差分析可检验多个分类变量与一个连续变量的关系。
多因素方差分析中,除考虑多个分类变量对连续变量影响外,还应考虑分类变量之间的交互效应
在这里插入图片描述

# 多因素方差分析: 检验多个分类变量与一个连续变量的关系
# 还需考虑不同分类变量间的交互效应
# 可通过构建线性回归模型进行方差分析
# 注意:这里的C(edu_class)将变量中的每个类都进行了划分,如不加,则edu_class的value表示数值
from statsmodels.formula.api import ols
ana = ols('avg_exp ~ C(edu_class) + C(gender)', data = creditcard_exp).fit()
sm.stats.anova_lm(ana)
ana.summary()

# 考虑交互效应
ana1 = ols('avg_exp~C(edu_class) + C(gender) + C(edu_class)*C(gender)',\
     data = creditcard_exp).fit()
sm.stats.anova_lm(ana1)
ana1.summary()

相关分析(两连续变量关系检验)

两个连续变量之间的关系可以使用相关分析

两个连续变量之间关系可划分为线性关系和非线性关系:

  • 线性关系
  • 可用皮尔逊相关系数对两变量线性相关关系进行探索
  • pearson相关系数适合计算两个独立连续的线性相关变量相关程度,前提是变量服从
    正态分布

    在这里插入图片描述
  • 计算出pearson相关系数后,可用t检验检查该系数是否有统计学意义
    在这里插入图片描述

简单相关分析是研究两个变量之间相关关系的方法,按变量性质的不同,采用的相关分析方法也不同。
连续变量可用Pearson相关系数描述变量的相关关系;对于有序变量,则用Spearman相关系数描述。

  • Spearman相关系数称为秩相关系数,其使用排序信息而不是变量观测的取值信息进行相关分析,优点是不用假设变量服从正态分布,故使用较广泛
  • 非线性关系
  • kendall相关系数主要用于探索两连续变量间的非线性关系
    在这里插入图片描述
#####################################33
# 相关分析(两连续变量关系检验)
# pearson可检测是否存在线性相关关系
# kendall检测两连续变量是否有非线性关系
creditcard_exp[['Income', 'avg_exp']].corr(method='pearson')
creditcard_exp.plot(x='Income', y = 'avg_exp', kind='scatter')

# 散点矩阵图:多个变量间相关关系进行直观全面了解
sns.pairplot(creditcard_exp[['avg_exp', 'Age', 'Income', 'dist_home_val', \
    'dist_avg_income']])
plt.show()

# 通过参数hue可以指定分组变量
sns.pairplot(creditcard_exp[['avg_exp', 'Age', 'Income', 'dist_home_val',\
    'dist_avg_income', 'gender']], 
    hue = 'gender', kind = 'reg', diag_kind = 'kde', size =1.5)
plt.show()

主要图形结果:
散点图散点矩阵图
分组散点矩阵图

卡方检验(二分类变量关系检验)

若一个分类变量的分布随着另一个分类变量水平不同而发生变化时,则两个分类变量就有关系,反之则没有关系。
在这里插入图片描述

  • 列联表
    一种常见的分类汇总表,该表将待分析的两类变量中一个变量的每个类别设为列变量,另一个变量的每个类别设为行变量,中间对应不同变量不同类别下的频数
    在这里插入图片描述

在生成列联表后,虽然能对比出差异,但这种差异是否有统计学意义就需要进行检验,检验方法为卡方检验,其检验统计量可以从列联表的频数计算出来。

  • 卡方检验
  • 思想在于比较期望频数与实际频数的吻合程度
    在这里插入图片描述

卡方检验原假设是期望频数等于实际频数,即两个分类变量无关,备择假设为期望频数不等于实际频数,即两个变量有关。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注:卡方检验不能展示两个分类变量相关性的强弱,只能展现两个分类变量是否相关。

#######################################33
# 卡方检验(二分类变量关系检验)
# 先构建列联表来统计变量不同分类的频率,再通过卡方来进行检验
accepts = pd.read_csv('accepts.csv')
cross_table = pd.crosstab(accepts.bankruptcy_ind, columns = accepts.bad_ind,\
    margins = True)
cross_table

# 将频数转换为频率
cross_table_rowpct = cross_table.div(cross_table['All'], axis = 0)
cross_table_rowpct

# 再用卡方检验比较期望频数与实际频数的吻合程度
print('chisq = %6.4f\n p-value = %6.4f\n dof = %i\n expected_fre = %s'\
    %stats.chi2_contingency(cross_table))

主要表结果:
列联表
列联表频数矩阵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值