数据可视化(九):Pandas北京租房数据分析——房源特征绘图、箱线图、动态可视化等高级操作

news2025/1/23 6:18:51

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊!

喜欢我的博客的话,记得点个红心❤️和小关小注哦!您的支持是我创作的动力!数据源存放在我的资源下载区啦!

数据可视化(九):Pandas北京租房数据分析——房源特征绘图、箱线图、动态可视化等高级操作

目录

  • 数据可视化(九):Pandas北京租房数据分析——房源特征绘图、箱线图、动态可视化等高级操作
    • 案例一:北京租房数据分析
      • 问题1:填充空值(如有,否则不处理);删除重复信息(如有,否则不处理)
      • 问题2: 更改列名:房屋类型厅室: 户型, 房屋类型精装修: 装修
      • 问题3: 删除 URL、房屋类型面积 列
      • 问题4: 区域 ‘列’ 分为三部分,请拆分成 ‘行政区域’、‘商圈’、‘小区’ 三个列
      • 问题5: 按要求格式化数据
      • 问题6:选择 '房源编号', '行政区', '商圈', '小区', '户型', '面积', '租金', '单价', '装修', '朝向', '楼层位置', '总楼层', '电梯', '车位', '用水', '用电', '燃气', '采暖', '经纪人' 列 组成新的 DataFrame 保存为lianjia_cleaned.csv
      • 问题7:画出 租金 的箱线图分布,采用 darkgrid 风格,采用boxenplot()函数
      • 问题8:画出 不同行政区域 租金 的箱线图
      • 问题9:画四个子图:分别按 行政区域、 商圈(前20)、户型(前10)、面积(自行分段)画出房源数量柱状图
      • 问题10:以 总楼层 为横坐标,画出 房源数量 柱状图
      • 问题11:房源特征绘图,画四幅子图
      • 问题12:仿照上面例子,对用水、用电、燃气、采暖 进行饼状图分析
      • 问题13:以 行政区域、商圈 两列 分组,汇聚一室的 房源数量 和 平均租金,并可视化

本次作业绘图可采用seaborn、matplotlib库或者pandas内置绘图功能

案例一:北京租房数据分析

# 加载模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # SimHei.ttf
plt.rcParams['axes.unicode_minus'] = False 
# 导入数据
df = pd.read_csv('data/lianjia.csv', encoding='gbk', index_col=False)
df.sample(1)
# 默认语言'gbk',另外要设置inex_col = False 默认原数据无行索引,不然会导致URL默认为行索引。
# header = False, 默认原数据无列索引。

在这里插入图片描述

# 查看数据总体信息,空值统计,查看重复数据信息

df.info()

在这里插入图片描述

df.isnull().sum()

在这里插入图片描述

df[df.duplicated()==True]

在这里插入图片描述

问题1:填充空值(如有,否则不处理);删除重复信息(如有,否则不处理)

# 没有空值,不处理

# 删除重复值
df.drop_duplicates(inplace=True)
df[df.duplicated()==True]

问题2: 更改列名:房屋类型厅室: 户型, 房屋类型精装修: 装修

df.rename(columns={'房屋类型厅室':'户型', '房屋类型精装修':'装修'}, inplace=True)

问题3: 删除 URL、房屋类型面积 列

df.drop(columns='URL', inplace=True)
df.drop(columns='房屋类型面积', inplace=True)

问题4: 区域 ‘列’ 分为三部分,请拆分成 ‘行政区域’、‘商圈’、‘小区’ 三个列

df['行政区域'] = df['区域'].apply(lambda x:x.split()[0])
df['商圈'] = df['区域'].apply(lambda x:x.split()[1])
df['小区'] = df['区域'].apply(lambda x:x.split()[2])
df

在这里插入图片描述

问题5: 按要求格式化数据

# 户型列 统一修改为 几室几厅几卫 格式
# 例如:‘房间’ 改为 ‘室’
# 1室1卫 改为 1室0厅1卫
df['户型'].replace('房间', '室', inplace=True)
df['户型'].replace(['1室1卫', '2室1卫', '3室1卫', '1室0卫', '2室2卫', '3室2卫', '1室2卫', '5室2卫', '4室2卫'], 
                 ['1室0厅1卫', '2室0厅1卫', '3室0厅1卫', '1室0厅0卫', '2室0厅2卫', '3室0厅2卫', '1室0厅2卫', '5室0厅2卫', '4室0厅2卫'], 
                inplace=True)

# 面积 列去掉单位,保留数字
df['面积'].apply(lambda x:x[:-1])

# 装修 列 数据格式修改
# 精装修 改为 精装
# '#' 改为 '简装'
df['装修'].replace('精装修', '精装', inplace=True)
df['装修'].replace('#', '简装', inplace=True)

# 楼层 列 拆分为 楼层位置、总楼层 两列
df['楼层位置'] = df['楼层'].apply(lambda x: x.split('/')[0])  
df['总楼层'] = df['楼层'].apply(lambda x: x.split('/')[1]).str[:-1]
df

在这里插入图片描述

问题6:选择 ‘房源编号’, ‘行政区’, ‘商圈’, ‘小区’, ‘户型’, ‘面积’, ‘租金’, ‘单价’, ‘装修’, ‘朝向’, ‘楼层位置’, ‘总楼层’, ‘电梯’, ‘车位’, ‘用水’, ‘用电’, ‘燃气’, ‘采暖’, ‘经纪人’ 列 组成新的 DataFrame 保存为lianjia_cleaned.csv

data_cleaned = df[['房源编号', '行政区域', '商圈', '小区', '户型', 
                   '面积', '租金', '押金', '装修', '朝向', 
                   '楼层位置', '总楼层', '电梯', '车位', '用水', 
                   '用电', '燃气', '采暖', '经纪人']]
data_cleaned = data_cleaned.reset_index(drop=True)  # 重设索引
data_cleaned.to_csv('lianjia_cleaned.csv') # 导出清洗后的数据到新的csv
df = pd.read_csv('lianjia_cleaned.csv', index_col=0)
df

在这里插入图片描述

问题7:画出 租金 的箱线图分布,采用 darkgrid 风格,采用boxenplot()函数

with sns.axes_style('darkgrid'):
    plt.figure(figsize=(6, 10))
    ax = plt.subplot()
    sns.boxenplot(y='租金', data=df)
    ax.set_ylabel('租金(元/月)', fontsize=15)
    ax.set_title('房源租金分布', fontsize=18)
    
# 从箱型分布看出,全市整租房源的租金主要分布在2500-5500元/套左右。

在这里插入图片描述

问题8:画出 不同行政区域 租金 的箱线图

plt.figure(figsize=(14, 10))

sns.boxenplot(x='行政区域', y='租金', data=df)

plt.show()

在这里插入图片描述

问题9:画四个子图:分别按 行政区域、 商圈(前20)、户型(前10)、面积(自行分段)画出房源数量柱状图

fig, axes = plt.subplots(2, 2, figsize=(20, 18)) # 绘制2*2多子图
fig.subplots_adjust(hspace=0.5, wspace=0.1) # 设置子图的间距

df_ = df.copy()
df_['面积'] = df_['面积'].map(lambda x:eval(x[:-1]))

area = df_['行政区域'].value_counts()
sns.barplot(x=area.index, y=area.values, palette='Blues_d', ax=axes[0, 0])
axes[0, 0].tick_params(labelsize=15) # 设置轴刻度文字大小,两个轴同时设置
axes[0, 0].set_xticklabels(axes[0, 0].get_xticklabels(), rotation=35) # 设置轴刻度文字方向,旋转角度
axes[0, 0].set_xlabel('行政区域', fontsize=18)
axes[0, 0].set_ylabel('房源数量', fontsize=18)

trade_top20 = df_['商圈'].value_counts()[:20]
sns.barplot(x=trade_top20.index, y=trade_top20.values, palette='Blues_d', ax=axes[0, 1])
axes[0, 1].tick_params(labelsize=15) 
axes[0, 1].set_xticklabels(axes[0, 1].get_xticklabels(), rotation=70) 
axes[0, 1].set_xlabel('Top20商圈', fontsize=18)
axes[0, 1].set_ylabel('')

type_top10 = df_['户型'].value_counts()[:10]
sns.barplot(x=type_top10.index, y=type_top10.values, palette='Blues_d', ax=axes[1, 0])
axes[1, 0].tick_params(labelsize=15)
axes[1, 0].set_xticklabels(axes[1, 0].get_xticklabels(), rotation=30)
axes[1, 0].set_xlabel('Top10户型', fontsize=18)
axes[1, 0].set_ylabel('房源数量', fontsize=18)

# 划分面积区间。
bins = [7, 15, 30, 60, 90, 125, 156] 
size = pd.cut(x=df_['面积'], bins=bins).value_counts()
sns.barplot(x=size.index, y=size.values, palette='Blues_d', ax=axes[1, 1])
axes[1, 1].tick_params(labelsize=15)
axes[1, 1].set_xticklabels(axes[1, 1].get_xticklabels(), rotation=0)
axes[1, 1].set_xlabel('面积区间', fontsize=18)
axes[1, 1].set_ylabel('')

plt.suptitle('房源数量分布总览', fontsize=25) # 多子图加总标题

在这里插入图片描述

问题10:以 总楼层 为横坐标,画出 房源数量 柱状图

plt.figure(figsize=(10,6))

ax = plt.subplot()
s = df.总楼层.value_counts()
sns.barplot(x=s.index, y=s.values)
ax.set_xlabel('总楼层', fontsize=18)
ax.set_ylabel('房源数量', fontsize=18)
ax.set_title('房源所在楼栋总层高', fontsize=20)

plt.show()

在这里插入图片描述

问题11:房源特征绘图,画四幅子图

  • 柱状图画出朝向(前10)分布柱状图 (朝向 列)
  • 饼图画出装修分布 (装修 列)
  • 饼图画出楼层高度分布 (楼层位置 列)
  • 饼图画出有无电梯分布 (电梯 列)
fig, axes = plt.subplots(2, 2, figsize=(12, 12))
plt.subplots_adjust(wspace=0.1, hspace=0.4)

s1 = df.朝向.value_counts()[:10]
sns.barplot(x=s1.index, y=s1.values, ax=axes[0, 0])
axes[0, 0].set_xticklabels(axes[0, 0].get_xticklabels(), rotation=90)
axes[0, 0].set_xlabel('朝向')
axes[0, 0].set_ylabel('房源数量')
axes[0, 0].set_title('Top10 朝向', fontsize=16)

s2 = df.装修.value_counts()
axes[0, 1].pie(x=s2.values, explode=np.ones(len(s2))*0.01, 
               labels=s2.index, autopct='%.1f%%')
axes[0, 1].set_title('装修', fontsize=16)

s3 = df.楼层位置.value_counts()
axes[1, 0].pie(x=s3.values, explode=np.ones(len(s3))*0.01, 
               labels=s3.index, autopct='%.1f%%')
axes[1, 0].set_title('楼层', fontsize=16)

s4 = df.电梯.value_counts()
axes[1, 1].pie(x=s4.values, explode=np.ones(len(s4))*0.01, 
               labels=s4.index, autopct='%.1f%%')
axes[1, 1].set_title('电梯', fontsize=16)

plt.suptitle('房源特征', fontsize=20)

plt.show()

在这里插入图片描述

问题12:仿照上面例子,对用水、用电、燃气、采暖 进行饼状图分析

fig, axes = plt.subplots(2,2,figsize=(12, 12))
plt.subplots_adjust(wspace=0.1, hspace=0.4)

s1 = df.用水.value_counts()
axes[0,0].pie(x=s1.values, labels=s1.index, explode=np.ones(len(s1))*0.1, autopct='%.1f%%')

s2 = df.用电.value_counts()
axes[0,1].pie(x=s2.values, labels=s2.index, explode=np.ones(len(s2))*0.1, autopct='%.1f%%')

s3 = df.燃气.value_counts()
axes[1,0].pie(x=s3.values, labels=s3.index, explode=np.ones(len(s3))*0.1, autopct='%.1f%%')

s4 = df.采暖.value_counts()
axes[1,1].pie(x=s4.values, labels=s4.index, explode=np.ones(len(s4))*0.1, autopct='%.1f%%')

plt.show()

在这里插入图片描述

问题13:以 行政区域、商圈 两列 分组,汇聚一室的 房源数量 和 平均租金,并可视化

注意:一室分为 ‘1室1厅1卫’, ‘1室0厅1卫’, ‘1室0厅0卫’, ‘1室1厅0卫’

df1 = df[df['户型'].isin(['1室1厅1卫', '1室0厅1卫', '1室0厅0卫', '1室1厅0卫'])] # 1室的房源共1511条
df1_group = df1.groupby('商圈')['租金'].agg([('房源数量', 'count'), ('平均租金', 'median')]) # 按照商圈分类,并计算count, median
df1_price = df1_group[df1_group['房源数量']>14].sort_values(by='平均租金') # 筛选出超过15套房源的商圈,按照租金进行升序排序

# 可视化
fig, ax = plt.subplots(1, 1, figsize=(23, 10))
ax1 = ax.twinx()

df1_price['房源数量'].plot.line(ax=ax1, color='red' ,linewidth=4)
# ax1.set_ylim(0, 70)
ax1.set_yticks([0, 20, 40, 60, 80]) # 设置y轴的刻度范围及标记,默认不从0开始
ax1.legend(('房源数量',), loc='upper center', fontsize=20)

df1_price['平均租金'].plot.bar(ax=ax, color='blue', alpha=0.5)
ax.legend(('平均租金',), fontsize=20)

ax.set_xticklabels(ax.get_xticklabels(), rotation=65)
ax.set_xlabel('')
ax.set_ylabel('平均租金', fontsize=20)
ax.tick_params(labelsize=20)
ax1.set_ylabel('房源数量', fontsize=20)
ax1.tick_params(labelsize=20)

ax.set_title('1室户型的平均租金与房源数量', fontsize=25)

plt.show()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据可视化(十一):Pandas餐饮信息表分析——交叉表、离群点分析,多维分析等高级操作

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

简述RocketMQ系统架构及其相关概念

一、概述 RocketMQ是一款高性能、高吞吐量的分布式消息队列系统,它采用了分布式架构,支持多生产者和消费者并发读写,具有高可用性、高吞吐量、低延迟等特点。本文将对RocketMQ的系统架构进行详细解析。 二、架构设计 RocketMQ采用了分布式架…

AI如何改变PPT制作流程?推荐四款ai生成ppt工具

提起PPT,大家的第一反应就是痛苦。经常接触PPT的学生党和打工人,光看到这3个字母,就已经开始头痛了: 1、PPT内容框架与文案挑战重重,任务艰巨,耗费大量精力。 2、PPT的排版技能要求高,并非易事…

ATA-4315高压功率放大器在高频理疗仪驱动中的应用

现代社会,面对生活压力、工作压力,再加上不良的生活习惯,难免身体会出现这样或那样的问题,随着科技的发展,我们除了来到医院进行具体的治疗,一些可以用来辅助医生进行治疗的仪器设备也越来越多的应用到了临…

JavaScript 对象入门:基础用法全解析

目录 对象 语法 属性和访问 方法和调用 this关键字 null 遍历对象 内置对象 Math 属性 方法 Date 创建日期对象 获取和设置日期 ⭐对象 对象是 JavaScript 数据类型的一种,数据类型也包括数值类型、字符串类型、布尔类型、undefined。对象数据类型可…

Apache访问控制与虚拟主机

目录 一. Web服务简介 以下是一些 Web 服务的基本概念和特征 以下是一些主流的 Web 服务器 WEB 服务协议 二. Apache 服务的搭建与配置 2.1 Apache 介绍 2.2 Apache安装 2.3 Apache目录介绍 三. 访问控制 四. 修改默认网站发布目录 五. 虚拟主机 5.1 基于域名的虚拟…

Java入门——继承和多态(下)

抽象类 语法规则 在上一篇文章刚才的打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape 的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法 包含抽象方法的类我们称为 抽象…

试试这四款高效AI论文写作工具和降重技术

在科研领域,AI写作工具如同新一代的科研利器,它们能够极大提高文献查阅、思路整理和表达优化的效率,本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息,还帮助我们精确提炼中心思想,显著提升论文写作…

花趣短视频源码淘宝客系统全开源版带直播带货带自营商城流量主小游戏功能介绍

1、首页仿抖音短视频 ,关注 ,我的 本地 直播 可发布短视频 可录制上传 2、商城页面 广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加…

【JavaEE网络】HTTPS详解:从对称与非对称加密到证书认证

目录 HTTPSHTTPS 是什么“加密” 是什么HTTTPS 的工作过程引入对称加密引入非对称加密引入证书完整流程总结 HTTPS HTTPS 是什么 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现…

openGemini v1.2.0版本正式发布,IoT 场景性能大幅提升!

在openGemini v1.2.0版本中,我们为您带来了一系列令人振奋的内核优化,将您的体验提升到新的高度,这包括 针对IoT场景的性能优化,查询效率有极大的提升。针对数据存储的优化,进一步节约磁盘空间,降低数据存…

MySQL基础指南:从入门到精通

MySQL基础指南:从入门到精通 MySQL是一个流行的开源关系型数据库管理系统,被广泛用于Web应用程序和服务器端开发。本文将从MySQL的基本概念开始,逐步介绍MySQL的安装、常用操作、数据类型、查询语句等内容,帮助你快速入门MySQL数…

雇佣 K 位工人的总代价

题目链接 雇佣 K 位工人的总代价 题目描述 注意点 costs[i]是雇佣第 i 位工人的代价每一轮雇佣后,剩余工人的下标可能会发生变化一位工人只能被选择一次如果剩余员工数目不足 candidates 人,那么下一轮雇佣他们中代价最小的一人如果有多位代价相同且最…

排序-堆排序(Heap Sort)

堆排序(Heap Sort)是一种基于比较的排序算法,它利用了完全二叉树的特性,将待排序的序列构造成一个大顶堆(每个父节点的值都大于或等于其子节点的值)或小顶堆(每个父节点的值都小于或等于其子节点…

哪个品牌led灯好?五大好用护眼台灯推荐

哪个品牌led灯好?目前LED护眼台灯当中做得比较好的有明基、松下、书客等品牌。在如今LED灯市场的海洋中,选择一款可靠的护眼台灯变得愈发重要。然而,众多品牌和产品的涌现也让消费者面临着选择困难。为了帮助大家找到最合适的LED台灯&#xf…

【亿事君】1688专业级知识库-阿里巴巴诚信通运营必修课程

01 课程介绍 课程来自亿事君老师的1688专业级知识库/白皮书/全攻略/阿里巴巴诚信通运营必修课程,价值1588元。这是一门系统的学习运营课程,干货满满,诚意十足。主要内容包括:基础、权重、活动玩法、付费流量玩法等,运…

中国196个城市边界

中国196个城市的城市边界形状文件是通过对Li等人(2018)的输出进行处理和过滤生成的。根据全球人工不可渗透区域 (GAIA) 数据绘制全球城市边界。 城市建成区边界是城市研究中的一个重要指标,在很多城市研究中都会涉及到…

一键同步用户信息和组织架构,简化用户管理,可道云teamOS插件化集成LDAP/AD的实战应用

随着企业规模的扩大和全球化布局的加深,管理分散在全球各地的员工和用户信息成为了企业IT部门的一大挑战,传统的手动添加用户和管理权限的方式已经无法满足需求。 有没有能自动同步用户信息和组织架构的企业网盘呢? teamOS插件化集成LDAP/AD…

CorelDRAW2024新特性全解析!

CorelDRAW2024是一款备受赞誉的图形设计软件,它以其强大的功能和用户友好性赢得了全球数百万设计师的青睐。该软件提供了丰富的绘图、排版、图像处理、矢量编辑以及网页设计工具,无论是初学者还是专业设计师,都能在这款软件中找到满足自己需求…

升级版ComfyUI InstantID 换脸:FaceDetailer + InstantID + IP-Adapter

在使用ComfyUI的InstantID进行人脸替换时,一个常见问题是该工具倾向于保留原始参考图的构图,即使用户的提示词与之不符。 例如,即使用户提供的是大头照并请求生成全身照,结果仍是大头照,没有显示出用户所期望的构图。…