在数据分析的江湖里,有一个绝对的核心技能,叫做回归分析(Regression Analysis)。
无论你是刚入行的新手,还是想要进阶的老手,掌握它,你就拥有了预测未来的“水晶球”。
很多初学者一听到“回归”两个字,脑子里全是复杂的数学公式,立刻想打退堂鼓。
别急!今天我们不讲枯燥的数学推导,只讲它是什么、怎么用,以及如何用Python代码解决实际问题。
1. 什么是回归分析?
想象一下,你正在做饭。你知道火开得越大(变量X),锅里的水烧开的时间就越短(变量Y)。这种探寻变量之间因果关系或相关关系的过程,就是回归分析。
在数据分析中,回归分析主要帮我们解决两个问题:
- 归因:是谁影响了结果?(比如:是学历还是工作经验决定了你的薪资?)
- 预测:根据现有数据推测未来。(比如:根据上个月的广告费,预测下个月的销量。)
2. 线性回归:一切的起点
线性回归是最简单、最基础的模型,它假设变量之间的关系是一条直线。
2.1. 简单线性回归
公式:$ y = ax + b $
比如我们要研究 “工作经验”和“薪资”的关系。
这里的核心是找到那个最好的 $ a $(斜率,代表经验每增加一年,工资涨多少)和 $ b $(截距,代表刚毕业时的起薪)。
我们通常使用最小二乘法,简单来说,就是画一条线,让所有实际的数据点到这条线的距离之和最小。
代码示例:预测你的薪资- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.linear_model import LinearRegression
- # 1. 模拟数据:工作年限 vs 月薪 (单位:千元)
- # 真实世界中数据总会有波动(加上一些随机噪声)
- np.random.seed(42)
- X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1) # 工作年限
- y = 3 * X + 5 + np.random.normal(0, 1.5, size=(10, 1)) # 假设大概规律是:起薪5k,每年涨3k
- # 2. 建立模型并训练
- model = LinearRegression()
- model.fit(X, y)
- # 3. 打印回归系数
- print(f"回归方程: y = {model.coef_[0][0]:.2f} * x + {model.intercept_[0]:.2f}")
- print("解读:起薪约 {:.2f}k,每年约涨 {:.2f}k".format(model.intercept_[0], model.coef_[0][0]))
- # 运行结果:
- '''
- 回归方程: y = 2.99 * x + 5.73
- 解读:起薪约 5.73k,每年约涨 2.99k
- '''
复制代码
2.2. 多元线性回归
现实生活中,影响薪资的不止是年限,还有学历、所在城市等。
当自变量 $ x $ 变成多个($ x_1, x_2, ... $)时,这就是多元线性回归。
虽然超过3维画图比较困难,但Python处理起来代码几乎和简单线性回归一样,只是把 $ X $ 数据集多加几列而已。
3. 非线性回归:现实世界通常是弯曲的
并不是所有关系都是直线的。比如:
- 细菌分裂:一开始很少,突然爆发(指数函数)。
- 学习曲线:刚开始进步快,后面越来越慢(对数函数)。
- 网红产品生命周期:爆发增长 -> 趋于饱和(S曲线/逻辑函数)。
针对这些非线性关系,我们需要用到不同的“数学模型”来拟合。
以下是 **10种常用非线性模型 **的公式。
我们将使用 Python 的 scipy.optimize.curve_fit 库,这个库非常强大,只要你给出公式,它就能帮你找到参数。- import numpy as np
- # --- 定义各种非线性函数 ---
- # 1. 二次式 (抛物线,如投篮轨迹)
- def func_quadratic(x, a, b, c):
- return a * x**2 + b * x + c
- # 2. 三次式 (波动更复杂的数据)
- def func_cubic(x, a, b, c, d):
- return a * x**3 + b * x**2 + c * x + d
- # 3. 增长函数 (常用于人口增长、复利计算)
- def func_growth(x, a, b):
- return np.exp(a * x + b)
- # 4. 幂函数 (如物理学中的万有引力、规模效应)
- def func_power(x, a, b):
- return a * (x ** b)
- # 5. 指数函数 (病毒传播初期)
- def func_exponential(x, a, b):
- return a * np.exp(b * x)
- # 6. 对数函数 (边际效应递减,如广告投入与销量的后期关系)
- def func_logarithmic(x, a, b):
- # 防止x为0报错,通常处理为 x+1 或确保数据 > 0
- return a * np.log(x) + b
- # 7. 复合函数 (根据具体复合形式定义,此处示例 y = a * b^x)
- def func_compound(x, a, b):
- return a * (b ** x)
- # 8. S曲线 (S-Curve, 早期慢,中期快,晚期平缓)
- def func_scurve(x, a, b):
- return np.exp(a + b / x)
- # 9. 逆函数 (双曲线,如某种反比关系)
- def func_inverse(x, a, b):
- return a + b / x
- # 10. 逻辑函数 (Logistic, 典型的S型增长,有上限,如市场渗透率)
- # u: 上限, a, b: 形状参数
- def func_logistic(x, u, a, b):
- return 1 / (1/u + a * (b ** x))
复制代码 [table][tr]模型类型数学形式实际案例关键特征[/tr][tr][td]二次式模型[/td][td]$ y=ax^2+bx+c $[/td][td]1. 广告投入与销售额(边际递减)
2. 生产成本与产量(U型成本曲线)
3. 车速与燃油效率[/td][td]• 只有一个极值点
• 描述先增后减或先减后增
• 适合局部非线性[/td][/tr][tr][td]三次式模型[/td][td]$ y=ax3+bx2+cx+d $[/td][td]1. 经济周期波动分析
2. 复杂化学反应速率
3. 生物生长多阶段模型[/td][td]• 可有多个极值点
• 描述S型或N型曲线
• 灵活但易过拟合[/td][/tr][tr][td]增长函数[/td][td]$ y=e^{(ax+b)} $[/td][td]1. 病毒传播初期
2. 初创公司用户增长
3. 复利计算[/td][td]• J型增长曲线
• 增长率恒定
• 无上限增长[/td][/tr][tr][td]幂函数[/td][td]$ y=ax^b $[/td][td]1. 代谢率与体重(克莱伯定律)
2. 城市规模与经济产出
3. 学习曲线(熟练度提升)[/td][td]• 双对数坐标下呈直线
• 描述规模效应
• b>1:超线性;b0:指数增长
• b 线性回归。看着像抛物线? -> 二次函数。
看着像先慢后快? -> 指数函数。
看着像S型? -> 逻辑函数。
</ul>看业务:
- 只要是涉及“资源有限”、“市场饱和”的,多半是 S曲线 或 对数函数。
- 只要是涉及“病毒传播”、“裂变”的,初期多半是 指数函数。
看误差:
- 用 $ R^2 $ 或 均方误差(MSE)来评估,哪个模型误差小,就选哪个。
</ol>回归分析并不难,难的是理解业务背后的逻辑,并选择正确的数学模型去描述它。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |