excel学习库

excel表格_excel函数公式大全_execl从入门到精通

数据分析-对数回归分析Python

昨天开始回归系列的第一篇,是最简单的一元线性回归。除了线形关系,还有各种非线性关系,比如指数关系、对数关系、多项式关系,这些都要使用对相应的数据变换后才能进行分析。今天就从对数分析开始,来进行演示说明。很多具体的参数和判别方式和昨天的一元线形回归一样,这一篇就不赘述了。

对数回归是一种非线性回归模型,它假设因变量和自变量之间存在对数关系。与线性回归不同,对数回归利用对数函数来捕捉自变量与因变量之间的非线性关系。通过对数变换,我们可以将原本的非线性关系转化为线性关系,从而使用线性回归的方法进行建模和分析。

对数回归的基本形式可以表示为:y=a+bln(x)。

其中:y是因变量,x是自变量,a是截距,b是斜率。对数回归模型的拟合过程通常通过最小二乘法进行,即最小化预测值与实际值之间的平方差。
【对数回归与线性回归的关系
对数回归本质上是线性回归的一种变形,通过对自变量取对数,解决非线性关系的问题。其核心思想是在对数尺度上使数据满足线性关系,从而利用线性回归的优势进行分析。
【对数回归的参数解释】
和一元线性回归一样,这里就说几个重要的参数:
斜率和截距
在对数回归模型中,斜率(𝑏)表示自变量每变动一个单位,对数变换后的因变量的变化量;截距(a)表示当自变量为1时,因变量的值。
R平方值
R平方值(R^2)是模型拟合优度的指标,表示模型解释了因变量变化的比例。R平方值越接近1,模型的拟合效果越好。
p值和假设检验
p值用于检验模型中自变量的显著性。假设检验中,通常设置显著性水平(例如0.05),当p值小于显著性水平时,认为自变量对因变量有显著影响。
AIC和BIC
AIC(Akaike信息准则)和BIC(贝叶斯信息准则)是模型选择的指标,越小越好。这些指标考虑了模型的复杂度,能够防止过拟合。
【案例演示】
还是使用广告费用的投入和销售额之间的关系来说明,只是现在只指数关系了,说明开始随着费用的投入,销售额是不对增加的,但是到了一定程度,就不会有明显增长了。
首先模拟数据↓

import pandas as pd

import numpy as np

np.random.seed(0)

广告费用 = np.random.exponential(scale=100, size=100)

销售额 = 50 + 15 * np.log(广告费用) + np.random.normal(scale=5, size=100)

data = pd.DataFrame({'广告费用': 广告费用, '销售额': 销售额})

在做分析之前,先通过可视化原始数据和对数变换后的数据,帮助理解数据的分布和关系↓

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体

plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

import seaborn as sns

plt.figure(figsize=(14, 6))

plt.subplot(1, 2, 1)

sns.scatterplot(x=data['广告费用'], y=data['销售额'])

plt.title('原始数据')

plt.xlabel('广告费用')

plt.ylabel('销售额')

data['Log_广告费用'] = np.log(data['广告费用'])

plt.subplot(1, 2, 2)

sns.scatterplot(x=data['Log_广告费用'], y=data['销售额'])

plt.title('Log-Transformed Data')

plt.xlabel('Log of 广告费用')

plt.ylabel('销售额')

plt.tight_layout()

plt.show()

从图形可以清晰的看到,左边是原始数据的分布,呈指数分布;右边是变换后的效果,整体线形分布。

接下来就使用转换后的数据进行线性回归的模型构建。昨天介绍两种方法,今天这里就直接使用statsmodels来实现,更简单,且模型判断参数更丰富↓

import statsmodels.api as sm

# 定义自变量和因变量

X = sm.add_constant(data['Log_广告费用'])

y = data['销售额']

# 拟合模型

model = sm.OLS(y, X).fit()

# 输出模型摘要

print(model.summary())

几个重要的参数:R方是0.939,调整R方是0.938。说明模型的拟合效果还是很好。Prob (F-statistic)接近0,模型整体显著;P值(P>|t|)接近0,模型参数也显著。整体来说模型效果很不错。绘制一下拟合后的图形↓

plt.figure(figsize=(14, 6))

plt.subplot(1, 2, 1)

sns.scatterplot(x=data['广告费用'], y=data['销售额'])

plt.plot(data['广告费用'], model.predict(sm.add_constant(np.log(data['广告费用']))), color='red')

plt.title('原始数据拟合线')

plt.xlabel('广告费用')

plt.ylabel('销售额')

# 拟合效果图(对数变换数据)

plt.subplot(1, 2, 2)

sns.scatterplot(x=data['Log_广告费用'], y=data['销售额'])

plt.plot(data['Log_广告费用'], model.fittedvalues, color='red')

plt.title('对数变化拟合曲线')

plt.xlabel('Log of 广告费用')

plt.ylabel('销售额')

plt.tight_layout()

plt.show()

看上去效果也不错。

接下来就可以使用模型对数据进行预测了,我们先生成需要预测的数据集↓

# 生成新的广告投入数据

new_广告费用 = np.random.exponential(scale=100, size=20)

new_log_广告费用 = np.log(new_广告费用)

# 创建新的DataFrame

new_data = pd.DataFrame({'广告费用': new_广告费用, 'Log_广告费用': new_log_广告费用})

因为模型是对数变换后的,所以预测的输入变量也需要进行对数变换,最终结果如下↓

# 预测销售额

new_data['Predicted_销售额'] = model.predict(sm.add_constant(new_data['Log_广告费用']))

End

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年12月    »
1
2345678
9101112131415
16171819202122
23242526272829
3031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
    文章归档
      友情链接