【数据分析案列】--- 北京某平台二手房可视化数据分析

一、引言

本案列基于北京某平台的二手房数据,通过数据可视化的方式对二手房市场进行分析。通过对获取的数据进行清冼(至关重要),对房屋价格、面积、有无电梯等因素的可视化展示,我们可以深入了解北京二手房市场的特点和趋势,为购房者和投资者提供有价值的信息和参考。

为了实现这个目标,我们将使用Python编程语言及其相关的数据分析库,包括pandas、matplotlib、seaborn和pyecharts。这些库提供了丰富的功能和工具,使我们能够对数据进行处理、分析和可视化。

二、数据探索和清冼

进行数据探索和清冼的目的主要是因为数据来源并不是官方的,数据中往往存在一些异常情况,这些异常的情况会导致我们分析的结果出现大量的偏差,所以我们需要对爬取的北京二手房数据进行探索的清冼,数据集下载地址:https://download.csdn.net/download/qq_38614074/89017277
废话不多说直接上代码:

  • 1、导入数据探索清冼需要的库
import pandas as pd
  • 2、导入数据进行数据整体的探索
data = pd.read_csv("二手房数据.csv",encoding = 'gb18030')

#查看数据的维度
data.shape
#打印数据的前5行
data.head()

在这里插入图片描述

data.info()

在这里插入图片描述
对数据进行整体的探索,我们发现数据集中"11 Unnamed"列好像都是空值,Id列在后续的分析中也使用不到,故后续需要将这两列进行删除; 并且电梯列中有比较多的缺失值,数据中可以看到电梯有8255条数据缺失记录,后续需要进行清冼;

  • 3、数据中字段级别的数据探索
    后续的分析主要是对数据中的一些字段进行可视化分析,所以需要查看不同维度的数据中是否存在一些异常情况(不应该出现出现的情况)

  • 3.1 市区字段分析

data['市区'].value_counts() 

在这里插入图片描述
分析: 在市区列中,存在异常值[‘15’, ‘有电梯’, ‘京师吉地’],且量非常少,不影响这个数据分析,后续需要将这些数据所在的行数据进行删除;

  • 3.2 户型字段分析
 data['户型'].unique()  

在这里插入图片描述
分析:通过unique()我们发现,后续的处理中我们需要房间替换成室,保证数据的一致性,并需要将一些非户型类型的描述给删除,这里主要包括[‘叠拼别墅’,‘有电梯’, ‘京师吉地’]等户型列中的异常值;

  • 3.3 其它字段的分析
# 小区
len(data['小区'].unique()) 
#电梯
data['电梯'].value_counts()
#朝向
data['朝向'].unique()
#楼层
data['楼层'].unique() 
#装修情况
data['装修情况'].value_counts()
#面积
data['面积(㎡)'].unique()
#年份
data['年份'].unique()

分析:
1、小区列中的字段数据过多,此次不在处理,此份数据对分析结果无影响;
2、电梯列中缺失值比较多,后续将列中的数据不是’有电梯’ or’无电梯’的情况全部替换成’未知‘;
3、朝向列中将[‘97’,‘有电梯’,‘京师吉地’]异常值所在的行进行删除;
4、楼层列中将[‘490’, ‘房山’, ‘精装’, ‘朝阳’, ‘有电梯’, ‘京师吉地’]异常值所在的行进行删除;
5、装修情况列中将[‘无电梯’,‘2013’,‘丽水嘉园’,‘长阳国际城三区’,‘有电梯’,‘京师吉地’]异常数据所在的行进行删除;
6、年份列中将[‘1.01E+11’,‘其他’,‘精装’, ‘西南’,‘22’,‘有电梯’, ‘京师吉地’]异常数据所在的行进行删除;
7、面积(㎡)列中将包含中文的行进行删除;
8、价格(万元)列中将[‘光明西里’]异常数据所在的行进行删除;

  • 4、编写最终的清冼代码
    根据上面的分析,编写对应的代码如下
# clean步骤
# 删除指定的列   ['Unnamed: 11', 'Id']
data = data.drop(['Unnamed: 11', 'Id'], axis=1) 

def remove_outlies(data,col_name='楼层',to_remove = ['490', '房山']):
    mask = data[col_name].isin(to_remove)  
    data = data[~mask] 
    return data

# 市区列中异常值清冼
data = remove_outlies(data,'市区',['15', '有电梯', '京师吉地'])    
# 电梯列中的数据清冼
data['电梯'] = data['电梯'].apply(lambda x:x if (x=='有电梯' or x=='无电梯') else '未知')  
# 户型列中的数据清冼
data['户型'] = data['户型'].apply(lambda x:x.replace("房间",'室'))
data = remove_outlies(data,'户型',['叠拼别墅','有电梯', '京师吉地'])
# 朝向列中的数据清冼
data = remove_outlies(data,'朝向',['97','有电梯','京师吉地'])
# 楼层列中的数据清冼
data = remove_outlies(data,'楼层',['490', '房山', '精装', '朝阳', '有电梯', '京师吉地'] )
# 装修情况列中的数据清冼
data = remove_outlies(data,'装修情况',['无电梯','2013','丽水嘉园','长阳国际城三区','有电梯','京师吉地'])
# 年份列中的数据清冼
data = remove_outlies(data,'年份',['1.01E+11','其他','精装', '西南','22','有电梯', '京师吉地'])

# 面积(㎡)列中的数据清冼
def contains_chinese(s):  
    if isinstance(s, str):  
        return any('\u4e00' <= c <= '\u9fff' for c in s)  
    return False  

mask = data['面积(㎡)'].apply(contains_chinese) 
data = data[~mask]  

data = remove_outlies(data,'价格(万元)',['光明西里'])
  • 5 将清洗后的数据保存
    将清冼后的数据进行保存,方便后续的分析,不用再重新进行数据的清冼;清冼后的数据下载地址:https://download.csdn.net/download/qq_38614074/89017277
    data.to_csv(‘clean_data.csv’,index=False,encoding=‘utf-8-sig’)

三、数据分析和可视化

在这一部分,你可以逐步介绍你对数据进行的分析和可视化的过程。你可以展示一些关键的图表和图形,并解释它们背后的含义和发现。

加载绘图需要的库:

import pandas as pd
from pyecharts.charts import Map
from pyecharts.charts import Bar
from pyecharts.charts import Line
from pyecharts.charts import Grid
from pyecharts.charts import Pie
from pyecharts.charts import Scatter
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Geo

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

导入清冼后的数据:
data = pd.read_csv(‘clean_data.csv’)
data.describe()
在这里插入图片描述
图中显示北京二手房平均平均总价 609万,平均年份2001年,平均楼层 12-13 层,平均房屋面积 99 m²。另还有标准差、最小值、四分之一分位数、二分之一分位数、四分之三分位数、最大值等信息。
下面从几个点上进行数据可视化:

  • 1)各区二手房数量条形图 ,获取数据中各区信息和对应区的房屋数量,绘制条形图
region_list = data['市区'].value_counts().index.tolist()
house_count_list = data['市区'].value_counts().values.tolist()
 
c = Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
c.add_xaxis(region_list)
c.add_yaxis("北京市", house_count_list)
c.set_global_opts(title_opts=opts.TitleOpts(title="北京各区二手房数量柱状图", subtitle=""),
                                     xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(interval=0)))
# c.render("武汉各区二手房数量柱状图.html")
c.render_notebook()

在这里插入图片描述

    1. 北京各个城区二手房价格地图分布
zone_median = data.groupby(['市区'])['价格(万元)'].median()
c = (
        Geo()
            .add_schema(maptype='北京',itemstyle_opts=opts.ItemStyleOpts(color='#A60B63',border_color='#FFFF22'))
            .add(
                "",
                [list(z) for z in zip(zone_median.keys().tolist(),zone_median.tolist())]
                )
            .set_series_opts(
                label_opts=opts.LabelOpts(is_show=False))
            .set_global_opts(
                visualmap_opts=opts.VisualMapOpts(min_=280,max_=720),
                title_opts=opts.TitleOpts(title="北京各个城区二手房平均价格(万元)", subtitle=""),
                )
)
c.render_notebook()

在这里插入图片描述

    1. 各区二手房单价箱型图
      统计各区名称信息及对应单价信息,并绘制箱型图。

统计各个区二手房单价信息

unit_price_list = []
for region in region_list:
    unit_price_list.append(data.loc[data['市区'] == region, '价格(万元)'].values.tolist())
 
# 绘制箱型图
from pyecharts.charts import Boxplot
 
c = Boxplot(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
c.add_xaxis(region_list)
c.add_yaxis("北京市", c.prepare_data(unit_price_list))
c.set_global_opts(title_opts=opts.TitleOpts(title="北京各区二手房总价箱型图"), 
                 xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(interval=0)))
# c.render("boxplot_base.html")
c.render_notebook()

在这里插入图片描述

    1. 二手房面积分布与价格关系图
f, [ax1,ax2] = plt.subplots(1, 2, figsize=(16, 6))
 
# 房屋面积
sns.distplot(data['面积(㎡)'], ax=ax1, color='r')
sns.kdeplot(data['面积(㎡)'], shade=True, ax=ax1)
ax1.set_xlabel('面积')
 
# 房屋面积和价格的关系
sns.regplot(x='面积(㎡)', y='价格(万元)', data=data, ax=ax2)
ax2.set_xlabel('面积')
ax2.set_ylabel('总价')
 
plt.show()

在这里插入图片描述

    1. 房屋朝向饼状图
d = data.groupby('朝向')
direction = d.count()['小区']
direction

在这里插入图片描述

from pyecharts.charts import Pie
 
c = (
    Pie()
    .add(
        "",
        [list(z) for z in zip(direction.keys().tolist(),direction.values.tolist())],
        radius=["30%", "75%"],
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="房屋朝向比"),
        legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),
    )
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)"))
)
c.render_notebook()

在这里插入图片描述
- 6) 各户型横向条形图

series = data['户型'].value_counts()
series.sort_index(ascending=False, inplace=True)
house_type_list = series.index.tolist()
count_list = series.values.tolist()
 
c = Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
c.add_xaxis(house_type_list)
c.add_yaxis("北京市", count_list)
c.reversal_axis()
c.set_series_opts(label_opts=opts.LabelOpts(position="right"))
c.set_global_opts(title_opts=opts.TitleOpts(title="北京二手房各户型横向条形图"),
                datazoom_opts=[opts.DataZoomOpts(yaxis_index=0, type_="slider", orient="vertical")],)
#c.render("北京二手房各户型横向条形图.html")
c.render_notebook()

在这里插入图片描述

    1. 房屋装修程度饼状图
decoration_list = data['装修情况'].value_counts().index.tolist()
count_list = data['装修情况'].value_counts().values.tolist()
 
from pyecharts.charts import Pie
 
c = Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
c.add(series_name="房屋装修",
        data_pair=[list(z) for z in zip(decoration_list, count_list)],
        rosetype="radius",
        radius="55%",
        center=["50%", "50%"],
        label_opts=opts.LabelOpts(is_show=False, position="center"))
c.set_global_opts(title_opts=opts.TitleOpts(
                  title="北京二手房房屋装修饼状图",
                  pos_left="center",
                  pos_top="20",
                  title_textstyle_opts=opts.TextStyleOpts(color="#fff")),
                  legend_opts=opts.LegendOpts(is_show=False))
c.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
                label_opts=opts.LabelOpts(color="rgba(255, 255, 255, 255)"))
# c.render("customized_pie.html")
c.render_notebook()

在这里插入图片描述

    1. 房屋面积分布柱状图
area_level = [0, 50, 100, 150, 200, 250, 300, 350, 400, 1500]
label_level = ['50-100','100-150','150-200','200-250','250-300','300-350','350-400','400-450']
p1 = pd.cut(data['面积(㎡)'],area_level,label_level)
p2 = p1.value_counts()
p3 = p2.values.tolist()

p3
[13647, 5808, 1675, 1561, 541, 217, 93, 54, 53]
c = (
    Bar()
    .add_xaxis(label_level)
    .add_yaxis("面积(㎡)",p3,color="#7944B7")
    .reversal_axis()
    .set_series_opts(
        label_opts=opts.LabelOpts(position='right')
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="房屋面积分布柱状图"),
        xaxis_opts=opts.AxisOpts(name='数量'),
        yaxis_opts=opts.AxisOpts(name='面积(㎡)')
    )
)
c.render_notebook()

在这里插入图片描述

    1. 楼层的分布
 sns.distplot(data['楼层'],color='r')

在这里插入图片描述

    1. 北京市二手房有无电梯的关系(柱状图)和有无电梯和房价的关系(折线图)
df = data[data['电梯']!='未知']

sns.barplot(x="市区", y="价格(万元)", hue="电梯", data=df)

在这里插入图片描述
sns.lineplot(x=“市区”, y=“价格(万元)”, hue=“电梯”, data=df)
在这里插入图片描述

    1. 出售房数大于15间且房价均值Top10的小区
df = data['小区'].value_counts().reset_index()  #data['小区']value_counts的结果转成dataframe
df1 = data.groupby(['小区'])['价格(万元)'].mean().reset_index()
df = df.merge(df1,on=['小区'],how='left')
# 筛选出计数大于15的小区  
filtered_counts = df[df['count'] >= 15] 
sorted_counts = filtered_counts.sort_values(by='价格(万元)',ascending=False)[:10]
sorted_counts

在这里插入图片描述
sns.barplot(x=‘小区’,y=‘价格(万元)’,data=sorted_counts)
在这里插入图片描述
本文完整代码下载地址:https://download.csdn.net/download/qq_38614074/89017277

总结:
通过对北京某平台二手房数据的可视化分析,我们可以得出以下结论:

北京二手房市场的价格呈现出明显的分布特点,不同价格区间的房屋数量和价格水平存在差异。

房屋面积在北京二手房市场中也存在一定的分布特点,不同面积区间的房屋数量和面积大小有所差异。

北京各区域的二手房分布不均,一些热门区域的房源较多,价格也相对较高。

这些分析结果可以为购房者提供有价值的信息和参考,帮助他们更好地了解市场情况,做出明智的购房决策。同时,对于投资者来说,这些数据分析也可以提供市场趋势和投资机会的线索。

需要注意的是,本文仅基于某平台的二手房数据进行分析,可能存在一定的局限性。在实际购房或投资决策中,还应综合考虑其他因素,如房屋质量、交通便利性、配套设施等。

通过数据可视化的方式,我们可以更直观地了解和分析二手房市场的情况,为决策者提供更全面的信息支持。希望本文的分析结果对读者有所启发,并在购房或投资过程中起到一定的指导作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/481470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

校招免费资料大集合

通过以下资料&#xff0c;你可以免费获取到大量的校招资料和相关信息&#xff0c;帮助你更好地准备校园招聘。 学习交流群&#xff1a;进行计算机知识分享和交流&#xff0c;提供内推机会&#xff0c;QQ群号&#xff1a;325280438 夏沫Coding&#xff1a;致力于分享计算机干货…

机器学习聚类分析算法之均值漂移算法

简介 均值漂移算法(Mean Shift Algorithm)是一种非参数化的聚类算法,常用于图像分割、目标跟踪和密度估计等任务。该算法基于密度估计的原理,通过不断地迭代更新数据点的位置,使得数据点向密度较高的区域移动,最终聚集成簇。均值漂移算法的核心思想是在数据点的特征空间…

SQL96 返回顾客名称和相关订单号(表的普通联结、内联结inner join..on..)

方法一&#xff1a;普通联结 select cust_name, order_num from Customers C,Orders O where C.cust_id O.cust_id order by cust_name,order_num;方法二&#xff1a;使用内连接 select cust_name,order_num from Customers C inner join Orders O on C.cust_id O.cust_id …

Jmeter-基础元件使用(二)-属性及对数据库简单操作

一、Jmeter属性 当我们想要在不同线程组中使用某变量&#xff0c;就需要使用属&#xff0c;此时Jmeter属性的设置需要函数来进行set和get操作 1.创建set函数 2.然后采用Beanshell取样器进行函数执行 3.调用全局变量pro_id 4.将上面生成的函数字符串粘贴到另一个线程组即可…

YOLOv8 | 注意力机制 | ShuffleAttention注意力机制 提升检测精度

YOLOv8成功添加ShuffleAttention ⭐欢迎大家订阅我的专栏一起学习⭐ &#x1f680;&#x1f680;&#x1f680;订阅专栏&#xff0c;更新及时查看不迷路&#x1f680;&#x1f680;&#x1f680; YOLOv5涨点专栏&#xff1a;http://t.csdnimg.cn/1Aqzu YOLOv8涨点专栏…

一键掌控:Shell脚本自动化安装与管理Conda环境的艺术

前面写了个博客《conda&#xff1a;解决多项目开发环境配置的神器&#xff01;》简单介绍了 Conda 的安装和基本命令&#xff0c;在做开发时经常会使用 Conda 建立多个应用环境&#xff0c;Conda 的命令虽不复杂&#xff0c;但还是有时会弄混&#xff0c;所以就考虑写个脚本&am…

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现PSO-KELM粒子群优化算法优化核极限学习机分类预测(完整源…

python3文件对象方法seek()心得

python3文件对象方法seek()心得 本文环境&#xff1a; Windows 10 专业版 64 位 Thonny 3.2.6 概述 python3中文件对象的方法 seek() 用于移动文件读写指针到指定位置。 语法 file_object.seek(offset[, whence]) 参数说明 file_object 是文件对象&#xff0c;通常是通…

论文阅读之PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization(2024)

文章目录 论文地址主要内容主要贡献模型图技术细节实验结果 论文地址 PeriodicLoRA: Breaking the Low-Rank Bottleneck in LoRA Optimization 主要内容 这篇文章的主要内容是介绍了一种名为PeriodicLoRA&#xff08;PLoRA&#xff09;的参数高效微调&#xff08;Parameter-…

C++第十弹---类与对象(七)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、再谈构造函数 1.1、构造函数体赋值 1.2、初始化列表 1.3、explicit关键字 2、static成员 2.1、概念 2.2、特性 2.3、面试题 总结 1、再…

一个极简的用于 Web 服务鉴权的反向代理服务

Auth Proxy 一个极简的用于 Web 服务鉴权的反向代理服务 Demo&#xff08;密码为&#xff1a;whoami&#xff09;&#xff1a;https://auth-proxy.wengcx.top/ 极其简约的 UI对你的真实服务无任何侵入性支持容器部署&#xff0c;Docker Image 优化到不能再小&#xff08;不到…

DS-红黑树(RBTree)

一.红黑树 1.1 红黑树的起源 当对对AVL树做一些结构修改的操作时候&#xff0c;性能较为低下&#xff0c;比如&#xff1a;插入时要维护其绝对平衡&#xff0c;旋转的次数比较多&#xff0c;更差的是在删除时&#xff0c;有可能一直要让旋转持续到根的位置。 因此1972年Rudolf…

极大提高工作效率的 Linux 命令

作为一名软件开发人员&#xff0c;掌握 Linux 命令是必不可少的技能。即使你使用 Windows 或 macOS&#xff0c;你总会遇到需要使用 Linux 命令的场合。例如&#xff0c;大多数 Docker 镜像都基于 Linux 系统。要进行 DevOps 工作&#xff0c;你需要熟悉Linux&#xff0c;至少要…

数据库被.[Goodmorningfriends@onionmail.org].faust勒索病毒加密,能恢复吗?

.faust勒索病毒有什么特点及危害&#xff1f; .faust勒索病毒是一种恶意软件&#xff0c;以其复杂的加密技术和勒索行为而闻名。这种病毒的主要目标是通过加密受害者的数据文件&#xff0c;然后勒索赎金以解密这些文件。它通常通过恶意附件、恶意链接或潜在的不安全下载源传播&…

网络编程套接字——实现简单的TCP网络程序

目录 1、TCP socket API详解 socket()&#xff1a; bind()&#xff1a; listen(): accept(): connect(): 2、简易的TCP网络程序 TcpServer.hpp TcpClient.cc Main.cc Log.hpp ThreadPool.hpp Task.hpp Init.hpp Daemon.hpp dict.txt Makefile 1、TCP socket A…

第六十二回 宋江兵打大名城 关胜议取梁山泊-飞桨ONNX推理部署初探

石秀和卢俊义在城内走投无路&#xff0c;又被抓住。梁中书把他两个人押入死牢。蔡福把他俩关在一处&#xff0c;好酒好菜照顾着&#xff0c;没让两人吃苦。 第二天就接到城外梁山泊的帖子&#xff0c;说大军已经来到&#xff0c;要替天行道&#xff0c;让他放人&#xff0c;并…

数据结构从入门到精通——快速排序

快速排序 前言一、快速排序的基本思想常见方式通用模块 二、快速排序的特性总结三、三种快速排序的动画展示四、hoare版本快速排序的代码展示普通版本优化版本为什么要优化快速排序代码三数取中法优化代码 五、挖坑法快速排序的代码展示六、前后指针快速排序的代码展示七、非递…

【Netty】TCP粘包、拆包、编解码问题

TCP粘包、拆包、编解码问题 UserInfo userInfo1new UserInfo();ByteBuf buf Unpooled.copiedBuffer(userInfo1.toString().getBytes(StandardCharsets.UTF_8));UserInfo userInfo1new UserInfo(); 这行代码创建了一个新的UserInfo对象&#xff0c;并将其引用存储在名为userInf…

力扣242. 有效的字母异位词

思路&#xff1a;字母相互抵消的思路&#xff0c;本题字符串中只包含小写字母26位&#xff0c;那就新建record数组int[26]&#xff0c;下标0-25&#xff0c;代表小写字母a-z, 需要通过 某字符减a 来达到这一目的&#xff1b; class Solution {public boolean isAnagram(String…

Tomcat 下载以及安装

Tomcat安装及配置教程主要分为四步&#xff1a; 步骤一&#xff1a;首先确认自己是否已经安装JDK 1. cmd&#xff1a;查看java的版本 步骤二&#xff1a;下载安装Tomcat 1. 下载tomcat :Apache Tomcat - Welcome! 2. 选择对应的tomcat版本&#xff1a; 3. 进行安装&#…