从家庭账本到预测模型:一个Python案例讲透线性回归怎么用(附OLS源码)
从家庭账本到预测模型一个Python案例讲透线性回归怎么用附OLS源码翻开记账本你是否好奇每月消费和收入之间究竟存在怎样的数学关系当收入增加1000元时消费会同步增长多少这些问题背后隐藏着一个经典的数据分析工具——线性回归。本文将以家庭财务数据为场景带你用Python从零构建消费预测模型不仅理解OLS普通最小二乘法的原理更学会如何让数学模型为现实决策服务。1. 数据准备从Excel到分析矩阵任何数据分析项目的第一步都是获取高质量数据。假设你已坚持记账半年每月记录可支配收入和消费支出数据如下月份收入元食品支出交通支出娱乐支出总消费1月8,0002,2008001,0006,3802月11,0003,1009501,5009,350..................关键数据处理步骤import pandas as pd import numpy as np # 从Excel加载数据 df pd.read_excel(家庭账本.xlsx, sheet_name月度汇总) # 数据清洗处理缺失值和异常值 df df.dropna() # 删除包含缺失值的记录 df df[(df[收入] 0) (df[总消费] 0)] # 过滤无效数据 # 提取分析变量 X df[收入].values # 自变量月收入 y df[总消费].values # 因变量月消费注意实际数据中常存在收入为0但消费为正的特殊月份如失业期动用存款这类数据点需要单独分析不宜直接纳入回归模型。2. OLS原理最小二乘法的几何解释普通最小二乘法的核心思想是找到一条直线使所有数据点到该直线的垂直距离残差平方和最小。用数学公式表示$$ \min_{\beta_0, \beta_1} \sum_{i1}^n (y_i - \hat{y_i})^2 \min_{\beta_0, \beta_1} \sum_{i1}^n [y_i - (\beta_0 \beta_1 x_i)]^2 $$通过求导可得闭式解$$ \beta_1 \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sum (x_i - \bar{x})^2}, \quad \beta_0 \bar{y} - \beta_1 \bar{x} $$手动实现OLS算法def manual_ols(X, y): x_mean, y_mean np.mean(X), np.mean(y) cov_xy np.sum((X - x_mean) * (y - y_mean)) var_x np.sum((X - x_mean)**2) beta_1 cov_xy / var_x beta_0 y_mean - beta_1 * x_mean return beta_0, beta_1 beta_0, beta_1 manual_ols(X, y) print(f截距项: {beta_0:.2f}, 斜率: {beta_1:.2f})执行后输出截距项: 142.00, 斜率: 0.67这个结果意味着消费函数可表示为 $$ \text{消费} 142 0.67 \times \text{收入} $$3. 模型解读系数背后的现实意义斜率0.67具有重要的经济学解释——边际消费倾向MPC表示每增加1元收入消费平均增加0.67元。这个数字揭示了家庭的消费习惯储蓄率估算1 - 0.67 0.33即约33%的新增收入转为储蓄基本生存支出截距142元可理解为即使零收入时仍需的基本支出如水电费消费结构对比表收入区间元食品支出占比娱乐支出占比储蓄率8,000-12,00042%18%25%12,000-20,00035%22%30%20,00028%25%35%提示当斜率接近1时表明消费与收入几乎等比例增长储蓄行为不明显而斜率小于0.5则显示较强的储蓄倾向。4. 模型诊断这些限制你必须知道虽然OLS模型给出了明确的数学关系但盲目应用可能导致严重误判。以下是三个关键限制线性假设陷阱实际消费函数可能在收入临界点如房贷还款额突变处呈现非线性检查方法绘制残差图观察模式import matplotlib.pyplot as plt # 计算预测值和残差 y_pred beta_0 beta_1 * X residuals y - y_pred # 残差诊断图 plt.figure(figsize(12,4)) plt.subplot(121) plt.scatter(X, residuals) plt.axhline(0, colorred) plt.title(残差vs收入) plt.subplot(122) plt.scatter(y_pred, residuals) plt.axhline(0, colorred) plt.title(残差vs预测值)外推风险模型在训练数据范围800-3500元内有效预测月收入5万元时的消费结果可能严重失真遗漏变量偏差未考虑家庭人数变化、突发医疗支出等关键因素改进方案构建多元线性回归模型5. 实战进阶用模型指导财务决策基于现有模型我们可以开发实用的财务规划工具未来12个月消费预测器def consumption_forecast(current_income, income_growth_rate, months): forecast [] for m in range(1, months1): projected_income current_income * (1 income_growth_rate)**m projected_spending beta_0 beta_1 * projected_income forecast.append((m, projected_income, projected_spending)) return pd.DataFrame(forecast, columns[月份, 预测收入, 预测消费]) # 假设当前月收入1.5万元预计月增长2% df_forecast consumption_forecast(15000, 0.02, 12) print(df_forecast.tail(3))输出示例月份 预测收入 预测消费 9 10 18284.34 12372.51 10 11 18649.98 12637.49 11 12 19022.98 12917.40财务健康度评估指标def financial_health_assessment(income, spending): savings_rate (income - spending) / income mpc beta_1 # 边际消费倾向 if savings_rate 0.1: status 风险储蓄不足 elif abs((spending - (beta_0 beta_1 * income))/income) 0.2: status 异常消费偏离常态 else: status 健康 return status # 当月检测 current_status financial_health_assessment(18000, 12500) print(f财务状态: {current_status})6. 模型优化从一元到多元的进化更精准的预测需要引入更多解释变量。使用statsmodels库构建多元线性模型import statsmodels.api as sm # 添加家庭人数作为新特征 df[家庭成员] [2, 2, 3, 3, 3, 4, 4, 4, 4, 4] # 示例数据 # 构建多元回归 X_multi df[[收入, 家庭成员]] X_multi sm.add_constant(X_multi) # 添加截距项 model sm.OLS(df[总消费], X_multi) results model.fit() print(results.summary())关键输出解读家庭成员的系数为387.5表示每增加1名成员月消费增加约388元调整R-squared从0.98提升到0.99模型解释力增强变量重要性排序月收入系数0.61p值0.001家庭成员数系数387.5p值0.03截距项统计不显著可考虑去除)7. 可视化呈现让数据自己说话专业的可视化能增强分析结果的说服力plt.figure(figsize(14,6)) # 三维散点图收入、家庭成员、消费 ax plt.subplot(121, projection3d) ax.scatter(df[收入], df[家庭成员], df[总消费], cr, markero) ax.set_xlabel(月收入) ax.set_ylabel(家庭成员) ax.set_zlabel(月消费) # 预测区间图 plt.subplot(122) plt.scatter(df[收入], df[总消费], alpha0.7) plt.plot(X, y_pred, colorblue, linewidth2) plt.fill_between(X, y_pred-300, y_pred300, colorblue, alpha0.1) plt.title(消费预测区间±300元) plt.xlabel(月收入) plt.ylabel(实际消费)最后需要提醒的是任何模型都是现实的简化。在我的财务咨询案例中曾遇到模型预测消费1.2万元实际支出却突破2万元的客户——后来发现是因为突然增加的育儿开支。这正印证了统计学家George Box的名言所有模型都是错的但有些是有用的。关键在于理解模型的适用边界将其作为决策的辅助工具而非绝对真理。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2540726.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!