统计建模-多元线性回归预测房价

案例:房价预测模型 根据过往已有信息,经过数据清洗和特征分析后,筛选出与房价相关性最大的特征集合,对重要特征进行特征选择与特征融合。构建GBoost模型和Xgboost模型,使用5折交叉验证法评测,并画出回归拟合图。最终选出GBoost模型更适合。 阅读详情

简单聊聊统计建模中,使用多元线性回归模型来预测房价。

变量描述:

price是被解释变量,其余的变量是解释变量。

dist-所在区
roomnum-室的数量
halls-厅的数量
AREA-房屋面积
floor-楼层
subway-是否临近地铁
school-是否学区房
price-平米单价

(1)读取数据

使用shape函数看数据有多少行,多少列;describe函数看各指标数据的分布情况;使用info函数查看变量的是否存在缺失值和变量的数据类型,如果存在缺失值看是否需要进行填充。

import pandas as pd
import numpy as np
import os
import matplotlib as mat
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
from statsmodels.formula.api import ols
# 读取数据,熟悉理解数据的含义,一个小时
raw_data = pd.read_csv('sndHsPr.csv')
print(raw_data.head())

#   --------------------------------------
'''查看原始数据的分布情况,如果有需要,需要对缺失值异常值进行处理'''
raw_num, columns_num= raw_data.shape
print('数据集的大小:', raw_data.shape)
# 描述性统计,一般看均值,最小最大值和中位数,看看是否存在异常值
describ_data = raw_data.describe()
print("数据集的描述分布:", raw_data.describe().T)
# 数据类型和缺失值统计,没有缺失值
print("数据集的信息分布:", raw_data.info())

(2)单变量描述

1、连续变量
通过看连续变量分布可以发现数据的偏态和异常值的情况。
制直方图,看数据的偏度情况(hist绘制直方图);另外还需要看变量的最小、最大、均值、中位数、标准差等这些指标的分布情况(使用agg函数)。

# 连续变量看分布,集中和离散程度,右偏,y也是右偏,可以取对数
raw_data['AREA'].hist(bins = 20)
raw_data['AREA'].agg(['min', 'max', 'mean', 'median', 'std'])

2、离散变量
离散变量通过看频数,占比可以发现数据均衡性问题;

print(pd.DataFrame(raw_data[var].value_counts()).T)

(3)自变量对因变量的影响分析

其实可以根据这个影响程度,大致判断出建模所需要的重要变量、次要变量和无关变量。但是在统计建模中这样粗糙的来进行判断其实是不专业的,那么怎么办呢,对于大样本数据集而言,可以用抽样的方法,再使用统计检验的方式来检验变量重要性。

离散对离散:使用柱形图看差异,卡方检验
离散对连续:使用箱线图,看中位数是否存在差异,方差分析或T检验
连续对连续:散点图,看相关系数

离散对连续,使用boxplot绘制箱线图,看离散自变量与连续因变量之间的关系。

# 字符中文显示
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 离散自变量和因变量之间的关系,T检验和方差分析就,使用箱线图
for j in range(len(conti_var)):
    print('变量是:', conti_var[j])
    # raw_data[conti_var[j]] = raw_data[conti_var[j]].astype('category')
    sns.boxplot(x = conti_var[j], y = 'price', data = raw_data)
    plt.show()

连续对连续,使用scatter绘制散点图,看连续自变量与连续因变量之间的关系:

plt.scatter(raw_data['AREA'], raw_data['price'])
print('连续变量之间的相关系数', raw_data['AREA'].corr(raw_data['price']))

(4)检验变量重要性

1、数据抽样
为什么要对数据进行抽样呢,因为在统计学上来说,样本量太大的话P值就失去了意义,所以统计建模的话,样本量不宜过大,因此需要对样本进行抽样,来参与建模。


def get_sample(df, sampling="simple_random", k=1, stratified_col=None):
    """
    对输入的 dataframe 进行抽样的函数

    参数:
        - df: 输入的数据框 pandas.dataframe 对象

        - sampling:抽样方法 str
            可选值有 ["simple_random", "stratified", "systematic"]
            按顺序分别为: 简单随机抽样、分层抽样、系统抽样

        - k: 抽样个数或抽样比例 int or float
            (int, 则必须大于0; float, 则必须在区间(0,1)中)
            如果 0 < k < 1 , 则 k 表示抽样对于总体的比例
            如果 k >= 1 , 则 k 表示抽样的个数;当为分层抽样时,代表每层的样本量

        - stratified_col: 需要分层的列名的列表 list
            只有在分层抽样时才生效

    返回值:
        pandas.dataframe 对象, 抽样结果
    """
    import random
    import pandas as pd
    from functools import reduce
    import numpy as np
    import math
    
    len_df = len(df)
    if k <= 0:
        raise AssertionError("k不能为负数")
    elif k >= 1:
        assert isinstance(k, int), "选择抽样个数时, k必须为正整数"
        sample_by_n=True
        if sampling is "stratified":
            alln=k*df.groupby(by=stratified_col)[stratified_col[0]].count().count() # 有问题的
            #alln=k*df[stratified_col].value_counts().count() 
            if alln >= len_df:
                raise AssertionError("请确认k乘以层数不能超过总样本量")
    else:
        sample_by_n=False
        if sampling in ("simple_random", "systematic"):
            k = math.ceil(len_df * k)
        
    #print(k)

    if sampling is "simple_random":
        print("使用简单随机抽样")
        idx = random.sample(range(len_df), k)
        res_df = df.iloc[idx,:].copy()
        return res_df

    elif sampling is "systematic":
        print("使用系统抽样")
        step = len_df // k+1          #step=len_df//k-1
        start = 0                  #start=0
        idx = range(len_df)[start::step]  #idx=range(len_df+1)[start::step]
        res_df = df.iloc[idx,:].copy()
        #print("k=%d,step=%d,idx=%d"%(k,step,len(idx)))
        return res_df

    elif sampling is "stratified":
        assert stratified_col is not None, "请传入包含需要分层的列名的列表"
        assert all(np.in1d(stratified_col, df.columns)), "请检查输入的列名"
        
        grouped = df.groupby(by=stratified_col)[stratified_col[0]].count()
        if sample_by_n==True:
            group_k = grouped.map(lambda x:k)
        else:
            group_k = grouped.map(lambda x: math.ceil(x * k))
        
        res_df = df.head(0)
        for df_idx in group_k.index:
            df1=df
            if len(stratified_col)==1:
                df1=df1[df1[stratified_col[0]]==df_idx]
            else:
                for i in range(len(df_idx)):
                    df1=df1[df1[stratified_col[i]]==df_idx[i]]
            idx = random.sample(range(len(df1)), group_k[df_idx])
            group_df = df1.iloc[idx,:].copy()
            res_df = res_df.append(group_df)
        return res_df

    else:
        raise AssertionError("sampling is illegal")
        

# 抽样,然后根据统计检验来筛选变量参与建模,实际上在建模的时候就是抽样之后的样本,其实这样也能很好的解决数据均衡性的问题
data_sample = get_sample(raw_data, sampling="stratified", k=400, stratified_col=['dist'])     
# 看每个自变量对因变量的解释性,挑选出变量参与建模,离散的抽样(P值问题),

2、变量重要性检验并筛选出建模变量
根据抽样后样本的P值,来判定变量重要性,可以多抽样几次,显著的不管怎么抽还是显著,这就是重要变量;次要变量是那种P值忽高忽低的;无关变量每次抽都是不显著的。

print('dist的P值为:%.4f'%sm.stats.anova_lm(ols(formula='price~C(dist)', data=data_sample).fit())._values[0][4])

(5)筛选出重要变量建模

建模的时候,在分类变量前面加个C,就会在建模之前自动将该变量进行哑变量编码,哑变量编码和one_hot编码是有区别的,具体可以参考下面的博客:

两种编码方式的差异:https://www.cnblogs.com/lianyingteng/p/7792693.html

'''建模,可以不进行哑变量编码'''
lm1 = ols("price ~ C(dist)+school+subway+C(floor)+AREA", data =  data_sample).fit()
lm1_summary = lm1.summary()
lm1_summary  #回归结果展示

(6)模型检验,也就是残差检验

从残差图中可以看出,残差呈现发散的趋势,此时需要对模型进行调整,因为price和AREA变量都是右偏,我们取个对数看看情况。

data_sample['predict'] = lm1.predict(data_sample)
data_sample['resid1'] = lm1.resid
plt.scatter('predict', 'resid1', data = data_sample)

在这里插入图片描述

(7)模型调优

对变量取对数之后,残差趋于稳定,模型构造完成,后面可以根据自己的需要,对模型进行预测了。

# 取对数,解决异方差问题
data_sample['price_ln'] = np.log(data_sample['price'])
data_sample['AREA_ln'] = np.log(data_sample['AREA'])

# 重新建模
lm2 = ols("price_ln ~ C(dist)+school+subway+C(floor)+AREA_ln", data =  data_sample).fit()
lm2_summary = lm2.summary()
lm2_summary  #回归结果展示

# 存在异方差
data_sample['predict_ln'] = lm2.predict(data_sample)
data_sample['resid1_ln'] = lm2.resid
plt.scatter('predict_ln', 'resid1_ln', data = data_sample)

在这里插入图片描述

(8)总结

1、统计检验:在这里只是简单介绍了多元线性回归统计建模的基本流程,实际上在数据挖掘或机器学习中,统计检验那块可以省略,直接看图形来筛选变量
2、残差分析:残差分析不够全面,这里只是简单介绍了一下而已
3、共线性:没有对自变量做共线性分析
4、交互项:没有考虑重要自变量交互情况对因变量的影响
5、讨论:连续变量分布不稳定怎么办?离散变量分布不均衡怎么办?

通过线性回归进行房价预测 线性回归是一种常用的回归算法,可以建立输入变量和连续输出变量之间的关系。在本文中,我们将探讨如何使用线性回归算法来进行房价预测,并介绍该方法的步骤和实践技巧。在这个过程中,我们需要选择适当的特征变量和房价的标签,并应用最小二乘法来估算回归系数。通过线性回归进行房价预测有着广泛的应用领域,并且随着机器学习技术的发展,预测模型的准确性和稳定性将不断提升。线性回归算法是一种常用的房价预测方法,通过最小二乘法来估算回归系数,并利用训练数据来拟合线性回归模型。在进行房价预测之前,我们需要准备训练数据和测试数据。 阅读详情

相关推荐

jupyter多元线性回归算法预测房价

目录一、概念二、Excel预测房价三、Python预测房价(不用Sklearn)1.上传数据文件2.导入数据3.数据清洗4.热力图5.多元线性回归建模6.模型末尾提示可能存在多元共线性,需要处理一下四、使用Sklearn包预测房价(一)不处理数据1.导入相关包和数据2.多元线性回归(二)处理数据1.异常值处理2.进行多元线性回归五、三种方式对比六、总结参考资料 一、概念 社会经济现象的变化往往受到多个因素的影响,因此,一般要进行多元回归分析,我们把包括两个或两个以上自变量的回归称为多元线性回归 。 多元

weixin_46129506的博客 7198

机器学习实践八:基于线性回归预测波士顿房价

线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点:只有一个自变量的情况称为单变量回归多于一个变量的情况称为多元回归线性回归模型就是围绕公式开展模型搭建,根据已有的数据进行大量训练得到初步的值和误差,接着优化器优化值使不断减小,经过多轮循环得到更为合适的,从而用已知的公式预测想要得到的数据。...&plus;b...&plus;b...&plus;

weixin_74319382的博客 4277

基于多元线性回归的房价预测

预测房价Excel预测房价数据清洗筛选删除无效值数值转换回归分析python进行回归分析导入包运行结果变量探索删除错误数据热力图拟合随机选择600条数据多元线性回归建模模型优化拼接再次建模处理多元共线性sklearn多元线性回归预测房价导入包和数据去除第一列house_id关系系数矩阵显示变量赋值建模并输出使用清洗后的数据赋值新变量price 列为依据,使用 Z 分数法,z 分位数取 2 来检测异常值.price 列为依据,使用 上下截断点法(iqr) 检测异常值输出数据矩阵Z方法处理相关性矩阵IQR方法处

qq_33700652的博客 2484

深度学习入门——波士顿房价预测

基于神经网络模型的波士顿房价预测 波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的“Hello World”。以“波士顿房价预测”任务为例,我们学习如何使用Python语言和Numpy库来构建神经网络模型。 波士顿地区的房价受诸多因素影响。该数据集统计了13种可能影响房价的因素和该类型房屋的均价,期望构建一个基于13个因素进行房价预测的模型,如下所示。 对于预测问题,可以根据预测输出的类型是连续的实数值,还是离散的标签,区分为回归任务和分类任务。因为房价是一个连续值,所以房价预测是一个回归任务。

Barbara‘s Blog 2万+

多元线性回归预测房价

文章目录一、利用Jupyter实现 一、利用Jupyter实现

qq_55691662的博客 593

Excel实战:多元线性回归预测房价全流程解析

本文详细解析了如何使用Excel进行多元线性回归预测房价的全流程,从数据清洗到建模预测,再到结果解读和模型优化。通过实战案例展示Excel在房价预测中的高效应用,特别适合没有编程基础的业务人员快速上手。文章还提供了避坑指南和进阶技巧,帮助读者避免常见错误并提升模型准确性。

weixin_29038155的博客 191

多元线性回归算法预测房价

多元线性回归算法预测房价一、理论学习(一)背景(二)线性回归检验二、数据清洗(一)数值数据处理(二)非数值型数据转换三、Excel多元线性回归四、多元线性回归模型预测房价(一)基础包与数据导入(二)变量探索(三)分析数据(四)拟合四、sklearn多元线性回归预测房价(一)不进行数据处理(二)对数据进行清洗后再求解五、总结六、参考资料 一、理论学习 学习参考资料“多元线性回归模型预测房价.ipynb”,自己实践重新做一下针对房屋数据集“house_prices.csv”的多元线性回归(基于统计分析库sta

”一只特立独行的猪“的博客 4797

数学建模预测模型——回归分析预测

作为预测模型的大块头,回归分析预测绝对是比较常用的预测模型的一种,下面是对该模型的学习,欢迎大家指正😊。

everything is possible,anything is OK. 1万+

波士顿房价预测python_多元线性回归—波士顿房价预测(版本一)

背景:波士顿房价数据集包括506个样本,每个样本包括12个特征变量和该地区的平均房价。房价(单价)显然和多个特征变量相关,不是单变量线性回归(一元线性回归)问题;选择多个特征变量来建立线性方程,这就是多变量线性回归(多元线性回归)问题。房价和多个特征变量相关,本案例尝试使用多元线性回归建模Y=X1*W1+X2*W2+..+X12*W12+b结果可以由不同特征的输入值和对应的权重相乘求和,加上偏...

weixin_35672512的博客 3027

回归预测算法及应用

线性回归简单线性回归:只涉及一个自变量和一个因变量,建立两者之间的线性关系模型。多元线性回归:涉及多个自变量和一个因变量,通过找到最佳拟合直线来预测因变量的变化。岭回归:在传统线性回归的基础上加入正则化项,以解决多重共线性问题。Lasso回归:类似于岭回归,但使用L1正则化项,可以实现特征选择功能。弹性网络回归:结合了岭回归和Lasso回归的优点,适用于高维数据。

weixin_57332529的博客 1157

自回归预测模型在预测房价中的应用

作者:禅与计算机程序设计艺术 在中国,现在已经成为一个房地产市场的热门话题。而房地产市场的最大问题之一就是房价的波动,也就是说,房价并不是固定的。由于种种原因导致房价出现了价格的上涨、下跌甚至崩盘。因此,如何准确预测房价是一个很重要的问题。 目前,主要存在三种方法可以用来预测房价: 暴力法(Naiv

AI天才研究院 2360

从Excel到Python:多元线性回归预测房价的完整流程对比(附数据集和代码)

本文详细对比了Excel和Python在多元线性回归预测房价任务中的完整流程,从数据导入、清洗到模型构建与评估。通过实际案例展示两种工具的优势:Excel操作直观适合快速验证,Python则更适合大规模数据处理和复杂分析。文章包含完整数据集和代码示例,帮助读者掌握房价预测的核心技术。

egg99的博客 881

埃姆斯住宅房价预测与自动化估值建模

Kaggle房价预测竞赛是数据科学入门的标杆项目,基于美国爱荷华州埃姆斯市79个维度的住宅数据构建预测模型。该竞赛采用对数均方根误差评估指标,确保对高/低价房屋的预测误差平等对待,每日限5次提交仅取2次最佳成绩。数据包含建筑结构、地理位置等多维度信息,适合从数据清洗、特征工程到模型构建的全流程训练。作为长期开放的入门赛,其重点在于学习完整的数据科学流程,而非竞赛排名。解题思路建议从基础线性模型过渡到树模型集成(如XGBoost),并注重特征工程与业务逻辑的结合。

Mr数据杨 541

探索数据的维度:多元线性回归在实际应用中的威力

多元线性回归是一种统计方法,用于研究多个自变量与一个连续因变量之间的关系。它基于线性方程的概念,即假设自变量与因变量之间存在线性关系。多元线性回归的数学表达式如下:在这个方程中,YY 是因变量,X1,X2,…,XpX1​,X2​,…,Xp​ 是自变量,β0,β1,β2,…,βpβ0​,β1​,β2​,…,βp​ 是回归系数,代表了每个自变量对因变量的影响,εε 是误差项。

null18的博客 1416

基于Python的多元线性回归预测实战程序

多元线性回归(Multiple Linear Regression, MLR)是一种用于建模一个因变量(目标变量)与多个自变量(特征变量)之间线性关系的统计方法。其数学模型可以表示为:其中:$ y $:因变量(目标输出)$ x_1, x_2, …, x_n $:自变量(输入特征)$ \beta_0 $:截距项(常数项)$ \beta_1, \beta_2, …, \beta_n $:回归系数,表示各特征对目标变量的影响程度。

weixin_35756624的博客 656

H3C无线控制器二层注册实战:从零配置到AP上线全流程(附常见问题排查)

本文详细解析了H3C无线控制器二层注册的全流程,从网络基础准备、AC核心配置到AP上线,重点阐述了CAPWAP隧道建立的关键步骤。文章提供了清晰的典型配置示例,并针对AP无法上线、状态异常等常见问题,给出了六种典型故障现象的排查思路与解决命令,帮助网络工程师快速定位并解决问题。

weixin_29214199的博客 548

基于Python衡阳市二手房房价的影响因素分析

摘 要衡阳市作为区域中心城市,其二手房市场的价格波动受到多重因素影响,传统的分析方法难以满足精准定价与决策的需求。本研究基于Python编程语言,利用Scrapy爬虫框架从主流房产平台实时抓取衡阳市二手房交易数据,通过Pandas进行数据清洗与特征工程处理。在算法实现上,将多元线性回归的解释性优势与随机森林的非线性拟合能力相结合,构建了针对衡阳房价的影响因素分析模型。研究重点考察了地理位置、建筑面积、房屋户型及周边配套等指标对价格的贡献权重,并基于Django框架开发了一套可视化分析系统。

Zsffbb211 72

银河麒麟服务器操作系统V10 SP1:跨架构激活与设备更换无忧指南

本文详细解析了银河麒麟服务器操作系统V10 SP1的跨架构激活新特性。该特性彻底解除了授权与CPU架构的绑定,允许同一份授权在x86、ARM、龙芯等不同架构服务器间灵活使用。文章提供了从新设备激活到硬件更换后保持激活状态的全流程实战指南,并分享了内网环境部署等高级技巧,助力企业简化运维、提升硬件资源管理灵活性。

ff678的博客 353
上一篇: 关于从事数据分析行业的一些思考
下一篇: 多元线性回归模型检验-续上篇
python_new
博客等级 码龄9年 50粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值