网站搜索

Python中的回归:如何在您的数据中找到关系


仅仅收集数据是不够的。你可以用数据填满电子表格,但如果你不能对其采取行动,那它就毫无用处。回归分析是寻找数据中关系的最强大统计工具之一。Python使这一过程变得简单,并且比电子表格灵活得多。放下那支铅笔和直尺,拿起Python。下面是如何开始的。

简单线性回归:寻找趋势

Python中最简单的回归形式就是简单线性回归。通过简单线性回归,你试图查看两个变量之间是否存在关系,第一个被称为"自变量",而后者则为"因变量"。自变量通常绘制在x轴上,而因变量则绘制在y轴上。这产生了经典的数据点散点图。目标是绘制一条最佳拟合此散点图的直线。

我们将首先使用纽约市餐厅的小费示例数据。我们想看看总账单和小费之间是否存在关系。这个数据集包含在Seaborn统计绘图工具包中,这是我最喜欢的数据可视化工具。我已经在Mamba环境中设置了这些工具以便于访问。

首先,我们将导入Seaborn,这是一个统计绘图数据库.

import seaborn as sns
    

然后我们将加载数据集:

tips = sns.load_dataset('tips')
    

如果您使用的是 Jupyter Notebook,比如我在自己的 GitHub 页面上链接的那个,请务必包含这一行代码以便在笔记本中显示图像,而不是在外部窗口中显示:

%matplotlib inline
    

现在我们将使用 relplot 方法查看散点图:

sns.relplot(x='total_bill',y='tip',data=tips)
    

散点图似乎主要呈线性。这意味着账单金额与小费之间可能存在正线性关系。我们可以使用regplot方法绘制回归线:

sns.regplot(x='total_bill',y='tip',data=tips)
    

这条线似乎非常合适。

我们可以使用另一个库 Pingouin 进行更正式的分析。Pingouin 的 linear_regression 方法将计算回归方程的系数,以便拟合数据点并确定拟合度。

import pingouin as pg
pg.linear_regression(tips['total_bill'],tips['tip']).round(2)
    

四舍五入将使结果更易于阅读。在线性回归中需要注意的数字是相关系数。在结果表中,它被列为 "r2",因为它是相关系数的平方。它是0.46,这表明拟合良好。取平方根可以发现它大约是0.68,这接近于1,表明比我们之前看到的图更正式地呈现出正线性关系。

我们还可以用表中的数值构建一个模型。你可能还记得直线方程:y=mx + b。y 是因变量,m 是 x 的系数,或总账单,即 0.11。这决定了直线的陡峭程度。b 是 y 截距,即 0.92。

基于该模型得出的方程是

tip = 0.11(total bill) + 0.92
    

回归方程将这一切反转,所以它将是:

tip = 0.92 + 0.11(total_bill)
    

我们可以写一个简单的Python函数,根据账单金额预测小费。

def tip(total_bill):
return 0.92 + 0.11 * total_bill
    

第二行应该缩进,但我们的内容管理系统无法显示这一点,因此请确保在您的机器上缩进此行。请记住,Python 中的缩进长度为四个空格。

让我们预测一下100美元餐厅账单的消费小费:

tip(100)
    

预期的小费大约是12美元。

多元线性回归:将回归扩展到第三维及更远

线性回归可以扩展到不止两个变量。您可以考虑更多的独立变量。不再是将线拟合到平面上的数据点,而是将平面拟合到散点图上。不幸的是,这比二维回归更难以可视化。我使用多元回归建立了一个基于笔记本电脑规格的价格模型。

我们将使用提示数据集。这一次,我们将查看“大小”列中的聚会规模。在 Pingouin 中这很简单。

pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
    

请注意第一个参数中的双括号,指定了总账单和就餐人数。注意r²是相同的。这再次意味着拟合良好,总账单和桌子大小是小费的良好预测因素。

我们可以重写我们之前的模型,以考虑大小,使用表大小的系数:

def tip(total_bill,size):
return 0.67 + 0.09 * total_bill + 0.19 * size
    

非线性回归:曲线拟合

不仅可以进行线性回归,还可以拟合非线性曲线。我将使用NumPy生成一些数据点来表示一个二次图。

首先,我将在NumPy中为x轴生成一个大型数据点数组:

x = np.linspace(-100,100,1000)
    

现在我将为y轴创建一个二次曲线图。

y = 4*x**2 + 2*x + 3
    

为了创建回归模型,我将构建一个 Pandas 数据框,这是一个类似于关系数据库的数据结构,用于 x 轴和 y 轴。这将为 x 和 y 值创建名为 "x" 和 "y" 的列。我们将传递一个字典给 Pandas,以创建我们想要的数据框。我们将这个数据框称为 "df"。

import pandas as pd
df = pd.DataFrame({'x':x,'y':y})
    

我们可以使用 head 方法检查我们的 DataFrame:

df.head()
    

我们可以使用 Seaborn 创建一个散点图,就像之前使用线性数据时一样:

sns.relplot(x='x',y='y',data=df)
    

它看起来像你可能在数学课上记得的经典抛物线图,绘制在你的图形计算器上(Python 可以替代它)。让我们看看我们是否可以在其上拟合一个抛物线。Seaborn 的 regplot 方法具有 order 选项,指定拟合的多项式线的度数。由于我们想绘制二次线,我们将把 order 设置为 2:

sns.regplot(x='x',y='y',order=2,data=df)
    

它确实似乎符合经典的二次抛物线。

要获得格式回归,我们可以使用Pingouin的非线性回归技术。我们只需向我们的数据框添加另一列以平方x值:

df['x2'] = df['x']**2
    

然后我们可以使用线性回归来拟合二次曲线:

pg.linear_regression(df[['x','x2']],df['y']).round(2)
    

因为这是一个人造的创作,r²值为1,表示非常好的拟合,这种情况在真实数据中可能是看不到的。

我们还可以使用一个函数来构建预测模型:

def quad(x):
return 3 + 2*x + 4*x**2
    

您还可以将此方法扩展到高于2的多项式。

逻辑回归:拟合二元类别

如果您想要找到二元类别之间的关系,比如某个风险因素,例如一个人是否吸烟,我们可以使用逻辑回归。

可视化这个问题最简单的方法是再次使用 Seaborn 库。我们将加载泰坦尼克号乘客的数据集。我们想看看票价是否是预测谁能在这一不幸旅程中幸存下来的因素。

titanic = sns.load_dataset('titanic')
    

我们可以像之前那样检查数据框中的数据:

titanic.head()
    

我们将使用lmplot方法,因为它可以拟合逻辑曲线:

sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)

我们看到乘客数量上的逻辑曲线,按他们是否幸存进行分隔。“幸存”列已经分为 0(“未幸存”)和 1(“幸存”)。

我们可以使用 Pingouin 正式确定票价是否是泰坦尼克号生存的预测因素,Pingouin 提供了多种统计测试,其中包括逻辑回归:

pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)
    

在统计测试中需要关注的数字是p值,在表中表示为“pval”。它是0.0,这表明票价是预测乘坐泰坦尼克号生存的重要因素。


这些操作展示了为什么 Python 是数据分析的首选语言。它使得那些可能需要几天手动完成的操作,或是连统计学家都不愿意做的操作,在 Python 中仅需几秒钟即可完成。这些回归操作将帮助您筛选数据以发现关系并进行预测。