ols模型中的异方差性检验 python_Python数据科学实践 | 统计建模3

本文介绍了如何使用Python的Statsmodels库进行OLS模型的异方差性检验和方差分析。通过火锅团购数据,展示了如何分析不同评分对销量的影响,解释了方差分析的基本概念和应用,包括单因素和多因素方差分析,以及参数估计的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

af25023c0eefef4ff50127f068bee92e.gif更多精彩,请点击上方蓝字关注我们!

1012d0cae1882e63a6a81d880cfdc30c.png

大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由程茜与政委联合推出。

5.4 统计假设检验

在上一节中的模型参数估计中也会涉及到假设检验,但是这都是模型拟合过程中自动给出的结果。本章专门以方差分析为例展示Statsmodels模块的另一项主要功能。首先,大家思考这么一个问题。人们在选火锅团购产品时都习惯于在APP页面看每家店铺的评分,毕竟过来人的经验还是需要参靠地。细心的吃货就会问个问题:不同的评分团购产品的销量是否有差异?这就涉及到统计中的假设检验问题。用什么方法可以解决这个问题?方差分析。

方差分析是利用样本数据检验两个或两个以上总体均值间是否有差异的一种方法。根据研究变量的个数不用,分为单因素方差分析和多因素方差分析。如果我们要解决多个总体的均值是否有差异的检验问题,这就是单因素方差分析;如果是多个自变量对因变量影响,就是多因素方差分析。

5.4.1 问题提出69e0a9db1352220ac5af661182d23bfd.gif

一元单因素方差分析是研究单独一个因素对因变量的影响。首先根据这个单独的因素的不同水平对因变量进行分组,计算其组间和组内方差。之后,对各组的均值比较,最终对每个分组均值相等这个原假设进行检验。

以火锅团购数据为例,因变量是销量(购买人数)。每销售一单,客户都会对其进行评分。此时,我们可以来查看下数据集中的评分,如例1。

例1 火锅数据集

 data_shop.head()

75fc119348c25681984809c3427a839b.png

图1  数据前6行

对因变量购买人数做对数运算,并将“评分”变量转化为分类变量并给出其新的标签:

例2 数据离散化

#对购买人数做对数运算

for i in range(0,197):
    data_shop.iloc[i,10]=math.log(data_shop.iloc[i,10])

#将评分离散化

评分_g=[0,4,4.5,5]

data_shop["评分_g"]=pd.cut(data_shop.评分,评分_g,labels=["小于4分","4-4.5分","4.5-5分"])此时,就完成了对评分的离散化,如图5.4-1-2

a88a146f4c4275e7095c7863c90b2ee4.png

图2    离散后的数据集

对数据变换完以后,我们可以尝试着绘制箱线图来初步考察各评分水平对因变量的影响:

例3 绘制箱线图

from pylab import *

mpl.rcParams['font.sans-serif'] = ['SimHei']

import seaborn as sns

sns.boxplot(x='评分_g',y='购买人数',data=data_shop)

plt.show()

31995aade0061d2e5bfce98bed495ef4.png

图3 各评分水平对购买人数的箱图

从图3中可明显看出,各种评分区间在“对数购买人数”上确实有显著区别。有的童鞋不禁要问了,是仅限于本案例的数据吗?那么,在整个火锅市场上购买人数是否会由于团购的评分不同而引起显著差异呢?那么这个问题就转化成了假设检验问题,需要进一步判定。

5.4.2一元单因素方差分析69e0a9db1352220ac5af661182d23bfd.gif

一元单因素方差分析主要研究单独一个自变量对因变量的影响。通过自变量的不同水平对因变量进行分组,计算其组间和组内方差,然后对各分组形成的总体进行均值比较,从而完成对各总体均值相等的原假设的检验。

本案例中,因变量是对数购买人数,人们吃完火锅后会对其进行打分,这中间加入了人为的影响因素,因此可以控制的定性变量就是评分,它会对对数购买人数产生影响。

Python的statsmodel模块中的anova_lm函数可以用来进行方差分析。如例4。

例4  方差分析

#导入模块

import statsmodels.api as sm

from statsmodels.formula.api import ols

#方差分析

data_shop_anova=sm.stats.anova_lm(ols("购买人数~C(评分_g)",data_shop).fit())

print(data_shop_anova)

7ec66030b7c233ec2e478bdde0d7de59.png

图4  方差分析结果

从结果可以看出,用于判定组内方差和组间方差是否存在差异的F值为5.41,其对应的P值=0.01,小于0.05。由此可知,在0.05的显著性水平下,拒绝各评分区间均值相等的原假设。也就是说,不同的评分区间,会对团购的对数购买人数产生非常显著的影响。所以很多商家会设计各种团购活动来提升各种质量来提高它的评分。这对于商家还是非常重要的,直接关乎销量。

当然,要想知道每类评分间的变动状况对对数购买人数产生的具体影响以及预测,就需要对此模型进行参数估计和预测。可以通过构造模型对象来进行,如例5。   

例5 参数估计

formula='购买人数~C(评分_g)'

data_shop_est=ols(formula,data_shop).fit()

print(data_shop_est.summary())

其结果如下:

dd90e820c4e00f843e9fd57752883d09.png

图5    参数估计结果

模型的结果我们需要以下几个方面去解读:

1)Coef列:此列中缺失了C(评分_g)这一类中的“小于4分”,并不是说这类可以忽略,而是表示截距项(Intercept)的含义,也就是截距项表示评分区间在“小于4分”这一类对“对数购买人数”的具体影响是:在该评分区间下,对数购买人数为3.1276。

2)对其他水平的解读:其他类的解读均以截距项为基准,表示了对因变量的影响相对于基准的差。比如:评分区间为“4-4.5分”的,这个水平的参数估计值为2.2591,表示与截距项相比,该水平下的对数购买人数增加了2.2591。其对应的P值0.002,表示这两个评分水平之间对对数购买人数有显著影响,该水平下对数购买人数具体为5.3867。

但是每次都这么手工计算会不会太麻烦,小编可是计算器都用上了啊。我们说强大的python肯定不会让我们每次都找计算器哒,早就帮助我们解决了,只需要在formula中的~右边加上“-1”。如例6。

例6   方差分析

formula='购买人数~C(评分_g)-1'

data_shop_est1=ols(formula,data_shop).fit()

print(data_shop_est1.summary())

0aaca762cf6bed40d45a0d0f3a5e27f1.png

图6  方差分析结果

可以从结果看出,此时的评分中“4-4.5分”其参数估计的系数就是绝对数值5.3867,与手动计算出的一致。从结果可以看出,评分介于“4-4.5分”的购买人数最多,其次是“4.5-5分”,最少的是“小于4分”。

这时候有童鞋不禁会问,这个结论对于火锅和烧烤都适用吗?那么这就需要考虑两个或者两个以上的因素对购买人数的影响,这就需要利用多因素方差分析。

5.4.3 一元多因素方差分析69e0a9db1352220ac5af661182d23bfd.gif

在多因素方差分析中,由于考虑的因素众多,这些因素不仅自己对因变量产生影响,它们值间也会共同对因变量产生影响,就跟流感的交叉感染似的。我们把因素单独对因变量产生的影响称为“主效应”。

在火锅的案例中,我们考虑不同的城市,不同的关键词(火锅、烧烤)对对数团购人数的影响,建立只有主效应的多因素方差分析。这里可以使用statsmodels中的anova_lm和ols进行分析。如例7。

例7  多因素方差分析

formula='购买人数~C(评分_g)+C(关键词)+C(城市)'

data_shop_anova1=sm.stats.anova_lm(ols(formula,data=data_shop).fit(),typ=3)

print(data_shop_anova1)

dc1eccc305c6f141aede9de8882ccee4.png

图7 方差分析结果

从结果可以看出,在0.05的显著性水平下,城市这个因素对因变量的影响不显著。但是关键词(火锅&烧烤)的P值=0.01,评分_g的P值=0.01,均通过了显著性检验。因此,在上段程序中的formula语句中去除城市这个变量,在只考虑关键词(火锅&烧烤)和评分_g的情况下,再做一次多因素方差分析。

例8 多因素方差分析

formula='购买人数~C(评分_g)+C(关键词)'

data_shop_anova2=sm.stats.anova_lm(ols(formula,data=data_shop).fit(),typ=3)

print(data_shop_anova2)

其结果如图8。

580522a0a792703ccaf558ee1c097fcf.png

图8 多因素方差分析结果

从结果可以看出,评分_g和关键词对对数团购人数影响非常显著,说明大家在团购的时候,主要会考虑是烧烤还是火锅,还有店家的评分。

那么,究竟这些显著的影响因素中具体会对因变量产生如何的影响?下面我们做了模型的参数估计,如例9。

例9 参数估计

data_shop_anova1_set=ols(formula,data=data_shop).fit()

print(data_shop_anova1_set.summary())

a16b5ae1408e9f7c4c74ab9e0affdfc9.png图9 参数估计结果

从结果图9可以看出,评分在“小于4分”的火锅团购,其对数团购人数为2.9236。评分在“4-4.5分”的烧烤团购,其对数团购人数为2.9236+2.0252+1.1220=6.0708,具体为433人。

好了,今天就讲到这里。

▼往期精彩回顾▼初步搭建数据科学工作环境

Conda的使用

Spyder入门

Jupyter入门

Markdown

简单读写数据

数据类型

数据结构

控制流

函数与模块

Numpy

pandas1

pandas2

pandas3

pandas4

绘图模块1

绘图模块2

绘图模块3

绘图模块4

统计建模1

统计建模2

4800e098dad73dfa5f80f51bf220c4e3.png

170ccffcf7398ce88307dfa6da9ac9cd.png

<think>好的,用户现在想要知道如何用Python打开acemoglu.dta文件并构建一个OLS模型。之前他们问过如何计算R平方,所以可能对回归分析有一定的了解,现在需要具体的操作步骤。 首先,我需要确认用户提到的acemoglu.dta是什么格式的文件。.dta是Stata的数据文件,所以需要用Python中能够读取这种格式的库,比如pandas。用户可能需要安装必要的库,比如pandas和statsmodels,因为这两个是处理数据和构建OLS模型的常用工具。 接下来,用户可能不太清楚如何安装这些库,所以应该给出安装命令,比如pip install pandas statsmodels。然后,逐步引导他们读取数据,使用pandas的read_stata函数。需要提醒用户检查数据是否正确加载,比如用head()方法查看前几行。 构建OLS模型部分,用户可能对statsmodels的语法不熟悉,所以要展示如何定义因变量和自变量,如何添加常数项(截距),以及如何拟合模型并输出结果。可能需要解释为什么需要添加常数项,因为很多OLS模型需要截距项来解释数据中的基线值。 用户可能还想知道如何解读结果,比如R-squared、系数及其显著,所以可以简要提到这些内容。此外,可能需要注意一些常见问题,比如数据中的缺失值是否需要处理,变量是否正确编码为数值类型等。 最后,确保步骤清晰,代码正确,并且用户能够复制粘贴运行。可能还需要提醒他们根据实际数据调整变量名,比如将&#39;因变量&#39;和&#39;自变量&#39;替换为实际列名。</think>--- 以下是使用 Python 读取 `.dta` 文件(Stata 格式数据)并构建 OLS 线回归模型的详细步骤: --- ### 一、准备工作:安装所需库 确保已安装以下 Python 库: - **`pandas`**: 用于数据读取和操作 - **`statsmodels`**: 用于统计建模 若未安装,通过以下命令安装: ```python pip install pandas statsmodels ``` --- ### 二、读取 `.dta` 文件 使用 `pandas` 的 `read_stata()` 函数读取数据: ```python import pandas as pd # 读取 Stata 格式文件 df = pd.read_stata("acemoglu.dta") # 替换为你的文件路径 # 查看前5行数据(确保数据正确加载) print(df.head()) ``` --- ### 三、构建 OLS 模型 使用 **`statsmodels`** 库进行回归分析。假设你的因变量为 `Y`,自变量为 `X1, X2`: #### 1. 定义变量 ```python import statsmodels.api as sm # 提取因变量和自变量 Y = df[&#39;Y&#39;] # 替换为你的因变量列名 X = df[[&#39;X1&#39;, &#39;X2&#39;]] # 替换为你的自变量列名列表 # 添加常数项(截距) X = sm.add_constant(X) ``` #### 2. 拟合模型 ```python # 构建 OLS 模型并拟合数据 model = sm.OLS(Y, X).fit() ``` #### 3. 输出结果 ```python print(model.summary()) ``` --- ### 四、结果解读 运行后,输出结果包含以下关键信息: 1. **R-squared**: 模型解释力(越接近1越好) 2. **系数(coef)**: 自变量的影响大小 3. **P值(P>|t|)**: 显著(一般需 <0.05 才显著) 4. **置信区间**: 系数估计的合理范围 --- ### 五、完整代码示例 ```python import pandas as pd import statsmodels.api as sm # 读取数据 df = pd.read_stata("acemoglu.dta") # 定义变量 Y = df[&#39;因变量列名&#39;] X = df[[&#39;自变量1列名&#39;, &#39;自变量2列名&#39;]] X = sm.add_constant(X) # 添加截距项 # 拟合模型 model = sm.OLS(Y, X).fit() # 输出结果 print(model.summary()) ``` --- ### 六、注意事项 1. **变量类型**: 确保自变量和因变量均为数值型(非字符或分类变量需提前处理)。 2. **缺失值**: 数据中若有缺失值(NaN),需先删除或填充(如 `df.dropna()`)。 3. **模型诊断**: 可通过残差图、Q-Q图等检查模型假设是否成立。 --- 如果需要进一步优化模型(如处理异方差、多重共线等),请告知具体需求!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值