二手房房价分析与预测(图表绘制避免中文乱码、饼形图、折线图、条形图(柱形图)、enumerate函数、数据清洗(lambda\map)、二手房预测(scikit-learn))

  • 衣食住行,住房一直以来都是热门话题,而房价更是大家时刻关心的问题。虽然新商品听着上档次,但是二手房是现货交易,并且具有地段较好、配套设施完善、产权权属清晰、选择面更广等优势,使得二手房越来越受到广大消费者的青睐。由此,越来越多的人关注二手房,对房价、面积、地理位置、装修程度等进行多维度对比与分析,从而找到既适合自己又具备一定升值空间的房子。

13.1 概述

  • 随着现代科技化的不断进步,信息化将是科技发展中的重要元素之一,而人们每天都要面对海量的数据,如医疗费、人口数据、人均收入等,因此数据分析将会得到广泛应用。数据分析在实际应用时可以帮助人们在海量数据中找到具有决策意义的重要信息。
  • 本章将通过数据分析方法实现“二手房数据分析预测系统”,用于对二手房数据进行分析、统计,并根据数据中的重要特征实现房屋价格的预测,最后通过可视化图表方式进行数据的显示功能。
  • 在二手房数据分析预测系统中,查看二手房各种数据分析图表时,需要在主窗体工具栏中单击对应的工具栏按钮。主窗体运行效果如图13.1所示。
    在这里插入图片描述
  • 在主窗体工具栏中单击“各区二手房均价分析”按钮,显示各区域二手房均价,如图13.2所示。

在这里插入图片描述

  • 在主窗体工具栏中单击“各区二手房数量所占比例”按钮,了解城市所属区域二手房的销售数量和占比情况,如图13.3所示。
  • 经过分析得知:二手房数据中房子的装修程度也是购买者关心的一个重要元素。在主窗体工具栏中单击“全市二手房装修程度分析”按钮,分析全市二手房装修程度,如图13.4所示。
    在这里插入图片描述
  • 二手房的户型类别很多,如果需要查看所有二手房户型中比较热门的户型均价时,则在主窗口工具栏中单击“热门户型均价分析”按钮,分析热门户型均价,如图13.5所示。
  • 分析二手房数据时,首先分析特征数据,然后通过回归算法的函数预测二手房的售价。在主窗体工具栏中单击“二手房售价预测”按钮,显示二手房售价预测的折线图,如图13.6所示。
    在这里插入图片描述

13.4 图表工具模块

  • 图表工具模块为自定义工具模块,该模块主要定义用于显示可视化数据图表的函数,用于实现饼形图、折线图以及条形图的绘制和显示工作。图表工具创建完成后根据数据分析的类型调用对应的图表函数,就可以实现数据的可视化操作。

13.4.1 绘制饼形图

  • 在实际绘制饼形图时,首先需要创建chart.py文件,该文加为图表工具的自定义模块。然后在该文件中导入matplotlib模块与pyplot子模块。接下来为了避免中文乱码,需要使用rcParams变量。
  • 绘制饼形图的函数名称为pie_chart(),用于显示各区二手房数量所占比例。pie_chart()函数需要以下3个参数:size为饼形图中每个区二手房数量;label为每个区对应的名称;title为图表的标题。

import matplotlib  # 导入图表模块
import matplotlib.pyplot as plt # 导入绘图模块
# 避免中文乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False

# 显示饼图
def pie_chart(size,label,title):
    """
    绘制饼图
    size:各部分大小
    labels:设置各部分标签
    labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径
    autopct:设置圆里面文本
    shadow:设置是否有阴影
    startangle:起始角度,默认从0开始逆时针转
    pctdistance:设置圆内文本距圆心距离
    """
    plt.figure()                         # 图形画布
    plt.pie(size, labels=label,labeldistance=1.05,
            autopct="%1.1f%%", shadow=True, startangle=0, pctdistance=0.6)
    plt.axis("equal")  # 设置横轴和纵轴大小相等,这样饼才是圆的
    plt.title(title, fontsize=12)
    plt.legend(bbox_to_anchor=(0.03, 1))  # 让图例生效,并设置图例显示位置
    plt.show()    # 显示饼图

13.4.2 绘制折线图

  • 绘制折线图的函数名称为broken_line(),用于显示真实房价与预测房价的折线图。该函数需要以下3个参数:y为二手房的真实价格;y_pred为二手房的预测价格;title为图表的标题。
  • 程序代码如下:
def broken_line(y,y_pred,title):
    '''
    y:y轴折线点,也就是房子总价
    y_pred,预测房价的折线点
    color:折线的颜色
    marker:折点的形状
    '''
    plt.figure()                                 # 图形画布
    plt.plot(y, color='r', marker='o',label='真实房价')  # 绘制折线,并在折点添加蓝色圆点
    plt.plot(y_pred, color='b', marker='*',label='预测房价')
    plt.xlabel('房子数量')
    plt.ylabel('房子总价')
    plt.title(title)              # 表标题文字
    plt.legend()                  # 显示图例
    plt.grid()  # 显示网格
    plt.show()  # 显示图表

13.4.3 绘制条形图

  • 绘制条形图的函数一共分为3个,分别用于显示各区二手房均价、全市二手房装修程度以及热门户型均价。下面介绍定义函数的具体方式。
1.绘制各区二手房均价的条形图
  • 绘制各区二手房均价的条形图为纵向条形图,函数名称为average_price_bar(),该函数需要以下三个参数:x为全市中各区域的数据;y为各区域的均价数据;title为图表的标题。
# 显示均价条形图
def average_price_bar(x,y, title):
    plt.figure()                          # 图形画布
    plt.bar(x,y, alpha=0.8)               # 绘制条形图
    plt.xlabel("区域")                    # 区域文字
    plt.ylabel("均价")                    # 均价文字
    plt.title(title)                      # 表标题文字
    # 为每一个图形加数值标签
    for x, y in enumerate(y):
        plt.text(x, y + 100, y, ha='center')
    plt.show()                            # 显示图表
2.绘制全市二手房装修程度的条形图
  • 绘制全市二手房装修程度的条形图为纵向条形图,函数名称为renovation_bar(),该函数需要以下3个参数:x为装修类型的数据;y为每种装修类型所对应的数量;title为图表的标题。
# 显示装修条形图
def renovation_bar(x,y, title):
    plt.figure()                          # 图形画布
    plt.bar(x,y, alpha=0.8)               # 绘制条形图
    plt.xlabel("装修类型")                    # 区域文字
    plt.ylabel("数量")                    # 均价文字
    plt.title(title)                      # 表标题文字
    # 为每一个图形加数值标签
    for x, y in enumerate(y): #关于enumerate的用法,https://blog.csdn.net/Windgs_YF/article/details/89025136
        plt.text(x, y + 10, y, ha='center')
    plt.show()                            # 显示图表
3.绘制热门户型均价的条形图
  • 绘制热门户型均价的条形图为水平条形图,函数名称为bar(),该参数需要以下3个参数:price为热门户型的均价;type为热门户型的名称;title为图表的标题。
# 显示热门户型的水平条形图
def bar(price,type, title):
    """
    绘制水平条形图方法barh
    参数一:y轴
    参数二:x轴
    """
    plt.figure()                                              # 图形画布
    plt.barh(type, price, height=0.3, color='r', alpha=0.8)  # 从下往上画水平条形图
    plt.xlim(0, 15000)                      # X轴的均价0~15000
    plt.xlabel("均价")                    # 均价文字
    plt.title(title)                      # 表标题文字
    # 为每一个图形加数值标签
    for y, x in enumerate(price):
        plt.text(x + 10, y,str(x) + '元', va='center')
    plt.show()                           # 显示图表

13.5 项目实现过程

13.5.1 数据清洗

  • 在实现数据分析前需要先对数据进行清洗工作,清洗数据的主要目的是为了减小数据分析的误差。清洗数据时首先需要读取数据,然后观察数据中是否存在无用值、空值以及数据类型是否需要进行转换等。清洗二手房数据的具体步骤如下所示。
(1)读取二手房数据文件,显示部分数据。
import pandas as pd  # 导入数据统计模块
from sklearn.svm import LinearSVR  # 导入回归函数
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
data = pd.read_csv('data.csv')  # 读取csv数据文件
data.head()

在这里插入图片描述

  • 观察上述数据,首先“Unnamed:0”索引列对于数据分析没有任何帮助,然后“总价”“建筑面积”“单价”列所对应的数据不是数值类型,所以无法进行计算。接下来对这些数据进行处理。
(2)数据清洗
  • 将索引列“Unnamed:0”删除;然后将数据中的所有空值删除;最后分别将“总价”“建筑面积”“单价”列所对应数据中的字符删除仅保留数字部分,再将数字转换为float类型,再次输出数据。
del data['Unnamed: 0']  # 将索引列删除
data.dropna(axis=0, how='any', inplace=True)  # 删除data数据中的所有空值
data['单价'] = data['单价'].map(lambda d: d.replace('元/平米', ''))  # 将单价“元/平米”去掉
data['单价'] = data['单价'].astype(float)  # 将房子单价转换为浮点类型
data['总价'] = data['总价'].map(lambda z: z.replace('万', ''))  # 将总价“万”去掉
data['总价'] = data['总价'].astype(float)  # 将房子总价转换为浮点类型
data['建筑面积'] = data['建筑面积'].map(lambda p: p.replace('平米', ''))  # 将建筑面价“平米”去掉
data['建筑面积'] = data['建筑面积'].astype(float)  # 将建筑面积转换为浮点类型
data.head()

在这里插入图片描述

13.5.2 区域二手房均价分析

  • 实现区域二手房均价分析前,首先需要将数据按所属区域进行划分,然后计算每个区域的二手房均价,最后将区域及对应的房屋均价信息通过纵向条形图显示,具体步骤如下所示。
  • (1)通过groupby()方法实现二手房区域的划分,然后通过mean()方法计算出每个区域的二手房均价,最后分别通过index属性与values属性获取所有区域信息与对应的均价。
# 获取各区二手房均价分析
def get_average_price():
    group = data.groupby('区域')  # 将房子区域分组
    average_price_group = group['单价'].mean()  # 计算每个区域的均价
    region = average_price_group.index  # 获取average_price_group下的index属性(区域)
    average_price = average_price_group.values.astype(int) # 区域对应的均价
    return region, average_price  # 返回区域与对应的均价
  • (2)获取房屋均价的分析图。
region, average_price= get_average_price()  # 获取房子区域与均价
average_price_bar(region,average_price,'各区二手房均价分析')

在这里插入图片描述

13.5.3 区域二手房数据及占比分析

  • 在实现各区房子数量比例时,首先需要将数据中每个区域进行分组并获取每个区域的房子数量,然后获取每个区域与对应的二手房数量,最后计算每个区域二手房数量的百分比。具体步骤如下:
  • (1)通过groupby()方法对房子区域进行分组,并使用size()方法获取每个区域的分组数量(区域对应的房子数量),然后使用index属性与values属性分别获取每个区域与对应的二手房数量,最后计算每个区域房子数量的百分比。
# 获取各区房子数量比例
def get_house_number():
    group_number = data.groupby('区域').size()  # 房子区域分组数量
    region = group_number.index  # 区域
    numbers = group_number.values  # 获取每个区域内房子出售的数量
    percentage = numbers / numbers.sum() * 100  # 计算每个区域房子数量的百分比
    return region, percentage  # 返回百分比
region, percentage = get_house_number()    # 获取房子区域与数量百分比
pie_chart(percentage,region,'各区二手房数量所占比例') # 显示图表

在这里插入图片描述

13.5.4 全市二手房装修程度分析

  • 在实现全市二手房装修程度分析时,首先需要将二手房的装修程度进行分组并将每个分组对应的数量进行统计出来,再将装修分类信息与对应的数量进行数据的分离工作,具体步骤如下。
  • (1)通过groupby()方法对房子的装修程度进行分组,并使用size()方法获取每个装修程度分组的数量,然后使用index属性与values属性分别获取每个装修程度分组与对应的数量。
# 获取全市二手房装修程度对比
def get_renovation():
    group_renovation = data.groupby('装修').size()  # 将房子装修程度分组并统计数量
    type = group_renovation.index     # 装修程度
    number = group_renovation.values  # 装修程度对应的数量
    return type, number  # 返回装修程度与对应的数量
type, number = get_renovation()             # 获取全市房子装修程度
renovation_bar(type,number,'全市二手房装修程度分析')       # 显示图表

在这里插入图片描述

13.5.5 热门户型均价分析

  • 在实现热门户型均价分析时,首先需要将户型进行分组并获取每个分组所对应的数量,然后对户型分组数量进行降序处理,提前前5组户型数据,作为热门户型的数据,最后计算每个户型的均价。具体步骤如下:
  • (1)通过groupby()方法对房子的户型进行分组,并使用size()方法获取每个户型分组的数量,使用sort_values()方法对户型分组数量进行降维处理。然后通过head(5)方法,提前前5组户型数据。通过mean()方法计算每个户型的均价,最后使用index属性与values属性分别获取户型与对应的均价。
# 获取二手房热门户型均价
"""
通过top_five变量获取空余最多的5个户型,然后通过house_type_mean获取每种户型的均价,
tipe变量是获取户型和对应的均价
"""
def get_house_type():
    house_type_number = data.groupby('户型').size()  # 房子户型分组数量
    sort_values = house_type_number.sort_values(ascending=False)  # 将户型分组数量进行降序
    top_five = sort_values.head(5)  # 提取前5组户型数据
    house_type_mean = data.groupby('户型')['单价'].mean()  # 计算每个户型的均价
    type = house_type_mean[top_five.index].index           # 户型
    price = house_type_mean[top_five.index].values        # 户型对应的均价
    return type, price.astype(int)  # 返回户型与对应的数量
type, price = get_house_type()           # 获取全市二手房热门户型均价
bar(price,type,'热门户型均价分析')

在这里插入图片描述

13.5.6 二手房价预测

  • 在实现二手房房价预测时,需要提供二手房源数据中的参考数据(特征值),这里将“户型”和“建筑面积”作为参考数据来进行房价的预测,所以需要观察“户型”数据是否符合分析条件。如果参考数据不符合分析条件,则需要再次对数据进行清洗处理。再通过源数据中已知的参考数据“户型”和“建筑面积”进行未知房价的预测。实现的具体步骤如下:
  • (1)查看源数据中“户型”和“建筑面积”数据,确认数据是否符合数据分析条件。
data_copy = data.copy()      # 拷贝数据
print(data_copy[['户型', '建筑面积']].head())

在这里插入图片描述

  • (2)从输出结果得知:“户型”数据中包含文字信息,而文字信息并不能实现数据分析时的拟合工作,所以需要将“室”“厅”“卫”进行独立字段的处理。
data_copy[['室', '厅', '卫']] = data_copy['户型'].str.extract('(\d+)(\d+)(\d+)卫')
data_copy['室'] = data_copy['室'].astype(float)  # 将房子室转换为浮点类型
data_copy['厅'] = data_copy['厅'].astype(float)  # 将房子厅转换为浮点类型
data_copy['卫'] = data_copy['卫'].astype(float)  # 将房子卫转换为浮点类型
print(data_copy[['室','厅','卫']].head())        # 打印“室”、“厅”、“卫”数据

在这里插入图片描述

  • (3)将数据中没有参考意义的数据删除,其中包括“小区名字”“户型”“朝向”“楼层”“装修”“区域”“单价”“空值”,然后将“建筑面积”小于300平方米的房子信息筛选出来。
del data_copy['小区名字']
del data_copy['户型']
del data_copy['朝向']
del data_copy['楼层']
del data_copy['装修']
del data_copy['区域']
del data_copy['单价']
data_copy.dropna(axis=0, how='any', inplace=True)  # 删除data数据中的所有空值
# 获取“建筑面积”小于300平米的房子信息
new_data = data_copy[data_copy['建筑面积'] < 300].reset_index(drop=True)
print(new_data.head())  

在这里插入图片描述

  • (4)添加自定义预测数据,其中包括“总价”“建筑面积”“室”“厅”“卫”,总价数据为None,其他数据为模拟数据。然后进行数据的标准化,定义特征数据与目标数据,最后训练模型进行未知房价的预测。
#  添加自定义预测数据
new_data.loc[2505] = [None, 88.0, 2.0, 1.0, 1.0]
new_data.loc[2506] = [None, 136.0, 3.0, 2.0, 2.0]
data_train=new_data.loc[0:2504]
x_list = ['建筑面积',  '室', '厅', '卫']    # 自变量参考列
data_mean = data_train.mean()               # 获取平均值
data_std = data_train.std()                 # 获取标准偏差
data_train = (data_train - data_mean) / data_std  # 数据标准化
x_train = data_train[x_list].values  # 特征数据
y_train = data_train['总价'].values  # 目标数据,总价
linearsvr = LinearSVR(C=0.1)  # 创建LinearSVR()对象
linearsvr.fit(x_train, y_train)      # 训练模型
x = ((new_data[x_list] - data_mean[x_list]) / data_std[x_list]).values  # 标准化特征数据
new_data[u'y_pred'] = linearsvr.predict(x) * data_std['总价'] + data_mean['总价']  # 添加预测房价的信息列
print('真实值与预测值分别为:\n', new_data[['总价', 'y_pred']])
  • 查看打印的“真实值”和“预测值”,其中索引编号为2505和2506均为添加自定义的预测数据,输出结果如下:
    在这里插入图片描述
  • 从输出结果得知:“总价”一列为房价的真实数据,而“y_pred”一列为房价的预测数据,其中索引为2505和2506为模拟的未知数据,所以“总价”列中的数据为空,而右侧的数据是根据已知的参考数据预测而来的。
  • (5)在主窗体初始化类中创建show_total_price()方法,用于绘制并显示二手房售价预测折线图。
y = new_data[['总价']][2490:]          # 获取2490以后的真实总价
y_pred = new_data[['y_pred']][2490:]   # 获取2490以后的预测总价

broken_line(y,y_pred,'二手房售价预测')             # 绘制及显示图表

在这里插入图片描述

13.6 小结

本章主要使用Python开发了二手房房价分析与预测系统,该项目主要应用了Pandas和Scikit-Learn模块。其中Pandas模块主要应用于实现数据的预处理以及数据的分类等,而Scikit-Learn模块主要用于实现数据的回归模型以及预测功能,最后通过绘图模块Matplotlib,将分析后的数据绘制成图表,从而形成更直观的可视化数据。在开发中,数据分析时该项目的重点和难点,需要读者认知领会其中的算法,方便读者开发其他项目。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值