1 数据搜集

使用 urllib 库中的request 模块爬取赶集网发布的上海二手房信息,包括包括户型、面积、单价等,再使用BeautifulSoup 库解析爬取的HTML数据,最终将数据保存到CSV文件中。

import urllib.request
from bs4 import BeautifulSoup
import pandas as pd#爬取数据
def request_Data(url):#创建requests对象req = urllib.request.Request(url)page_data_list = []with urllib.request.urlopen(req) as response:data = response.read()htmlstr = data.decode()L = parse_HTMLData(htmlstr)page_data_list.extend(L)return page_data_list#解析数据
def parse_HTMLData(htmlstr):sp = BeautifulSoup(htmlstr,'html.parser')#获得房子信息列表house_list = sp.select('#f_mew_list > div.f-main.f-clear.f-w1190 > div.f-main-left.f-fl.f-w980 > div.f-main-list > div > div')#当前页中的记录列表page_list = []for house in house_list:#每一行数据rows_list = []#获得房子标题title = house.select('dl > dd.dd-item.title > a')title = (title[0].text).strip()rows_list.append(title)#获得房子信息infos = house.select('dl > dd.dd-item.size > span')# 获得房子户型house_type = (infos[0].text).strip()rows_list.append(house_type)# 获得房子面积house_area = (infos[2].text).strip()rows_list.append(house_area)# 获得房子面积house_face = (infos[4].text).strip()rows_list.append(house_face)# 获得房子楼层house_floor = (infos[6].text).strip()rows_list.append(house_floor)#获得房子所在城区addr_dist = house.select('dl > dd.dd-item.address > span > a.address-eara')addr_dist = (addr_dist[0].text).strip()rows_list.append(addr_dist)#获得房子所在小区addr_name = house.select('dl > dd.dd-item.address > span > a > span')addr_name = (addr_name[0].text).strip()rows_list.append(addr_name)#获得房子总价total_price = house.select('dl > dd.dd-item.info > div.price')total_price = (total_price[0].text).strip()rows_list.append(total_price)#获得房子单价price = house.select('dl > dd.dd-item.info > div.time')price = (price[0].text).strip()rows_list.append(price)page_list.append(rows_list)return page_listurl_temp = 'http://sh.ganji.com/ershoufang/pn{}/'data_list = []for i in range(1,71):  #总共70页url = url_temp.format(i)print(url)print('+++++第{}页++++++'.format(i))try:L = request_Data(url)data_list.extend(L)except Exception as e:#不再循环print('不再有数据,结束循环')breakprint(data_list)#保存数据
#列名
colsname = ['标题', '户型', '面积', '朝向', '楼层', '城区', '小区名', '总价', '单价']  df = pd.DataFrame(data_list, columns = colsname)
df.to_csv('data/house_data.csv',index = False,encoding='gbk')

2 数据清洗

import pandas as pd
import numpy as np
house_df = pd.read_csv('data/house_data.csv',encoding='gbk')
house_df.rename(columns={'标题': 'title', '户型': 'type', '面积': 'area', '朝向': 'face', '楼层': 'floor', '城区': 'addr_dist',  '小区名': 'addr_name',  '总价': 'total_price',  '单价': 'price'},inplace=True)
house_df.head()

前5条房源记录

2.1 处理缺失值

house_df.isnull().sum()

没有缺失值,工作量减轻

2.2 删除重复数据

删除重复行

house_df.duplicated().sum()

有832条重复数据

house_df2 = house_df.copy()
house_df2.drop_duplicates(inplace = True)
house_df2.count()

去重后剩余2626条数据

删除重复列

总价与单价重复,因此删除总价

house_df3 = house_df2.copy()
house_df3.pop('total_price')

2.3 统一数据格式

去掉面积的单位:m2,去掉单价的单位:元/m2

house_df4 = house_df3.copy()
house_df4['area'] = house_df4['area'].map(lambda x : float(x[0:-1]))
house_df4['price'].map(lambda x : float(x[0:-3])).head()
house_df5['price'] = house_df5['price'].map(lambda x : float(x[0:-3]))

2.4 过滤数据

过滤掉地址为“上海周边”的房源记录

house_df6 = house_df5[house_df5['addr_dist'] != '上海周边']
house_df6.count()

数据清洗后剩余2484条数据
保存数据

house_df6.index = list(range(1,2485))
house_df6.to_csv('data/house_info.csv',encoding='gbk')

3 数据分析

house_df = pd.read_csv('data/house_info.csv',encoding='gbk')
house_df.pop('Unnamed: 0')
house_df.head()

3.1 数据分组和聚合

grouped_house_df = house_df.groupby(['addr_dist'])
grouped_house_df.mean()


各区房屋平均面积、单价

3.2 数据透视

各区不同朝向的房屋平均单价

house_df.pivot_table(index = ['addr_dist'], columns = ['face'], values='price',fill_value=0)


各区不同户型和朝向的房屋平均单价

house_df2.pivot_table(index = ['addr_dist'], columns = ['face','type'], values='price',fill_value=0)

4 数据可视化

import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['simhei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

4.1 各区二手房价格可视化

mean_price_district = house_df.groupby('addr_dist')['price'].mean().sort_values(ascending=False)
mean_price_district.plot(kind='bar',color='b')
plt.ylim(10000,80000,10000)
plt.title("上海市各区二手房平均价格")
plt.xlabel("上海市行政区划")
plt.ylabel("房屋平均价格(元/平方米)")
plt.xticks(rotation = 360)
plt.rcParams['figure.dpi'] = 300
plt.savefig('picture/上海市各区二手房平均价格.jpg')


可以看出黄浦区均价最贵,其次是徐汇、长宁、虹口等,房价均价较高的前八名均属于上海中心城区(黄浦、徐汇、长宁、杨浦、虹口、普陀、静安以及浦东新区的外环内城区);奉贤、金山、崇明等周边城区的均价较低。

house_df.boxplot(column='price', by='addr_dist')
plt.title("上海市各区二手房价格箱形图")
plt.suptitle("")
plt.xlabel("上海市行政区划")
plt.ylabel("房屋单价(元/平方米)")
plt.savefig('picture/上海市各区二手房价格箱形图.jpg')

上海中心城区具有较多上侧异常值,其中浦东最多,这与常识相符,如靠近知名商圈或豪宅小区的房价会特别贵。 相反,上海的周边城区异常值极少,房价分布区间相对较小。

4.2 各区二手房价格受面积影响情况可视化

def plot_scatter():plt.figure(figsize=(10,8),dpi=256)colors = ['red', 'red', 'red', 'red','blue', 'blue', 'blue', 'blue','green', 'green', 'green', 'green','gray', 'gray', 'gray', 'gray']addr_dist = ['黄浦','徐汇','长宁','虹口','普陀','杨浦','静安','浦东','闵行', '宝山','松江','嘉定','青浦','奉贤', '金山', '崇明']markers = ['o','s','v','x','o', 's', 'v', 'x','o', 's', 'v', 'x','o', 's', 'v', 'x']print(addr_dist)for i in range(16):x = house_df.loc[house_df['addr_dist'] == addr_dist[i]]['area']y = house_df.loc[house_df['addr_dist'] == addr_dist[i]]['price']plt.scatter(x, y, c=colors[i], s=20, label=addr_dist[i], marker=markers[i])plt.legend(loc=1,bbox_to_anchor=(1.138,1.0),fontsize=12)plt.xlim(0,500)plt.ylim(0,200000)plt.title('上海各区二手房面积对房价的影响',fontsize=20)plt.xlabel('房屋面积(平方米)',fontsize=16)plt.ylabel('房屋单价(元/平方米)',fontsize=16)plt.savefig('picture/上海各区二手房面积对房价的影响.jpg')plot_scatter()


按照平均房价的顺序排列,红色为价格第一梯队,蓝色为价格第二梯队,绿色为价格第三梯队,灰色为价格第四梯队,每个梯度包含四个行政区划。从散点图中可以观察到第一梯队的红色散点相对偏向左上方,各个梯队相比于上一梯队整体向下偏移。

4.3 各区二手房价受朝向影响情况可视化

df = (house_df['face'].value_counts()).to_frame()
plt.figure(figsize=(15,15))
plt.pie(df['face'], labels=df.index.values, autopct='%.1f%%', pctdistance=0.9)
plt.title('上海市二手房朝向',fontsize=20)
plt.savefig('picture/上海市二手房朝向.jpg')

朝向主要是南和南北朝向,接下来针对这两种朝向展开分析。

house_df2 = house_df.rename(columns={'price': '房屋价格(元/平方米)', 'addr_dist': '上海市行政区划', 'face': '朝向'})
house_df2 = house_df2[house_df2['朝向'].isin(['南','南北'])]
g = sns.catplot(data=house_df2,x='朝向',y='房屋价格(元/平方米)',col='上海市行政区划',kind='swarm',col_wrap=4,aspect=1.2)
plt.savefig('picture/上海市各区二手房朝向对房价影响.jpg')

规律不是很明显,总体上,各区南朝向的房屋数量更多,最高价格更高。

4.4 各区二手房价受户型影响情况可视化

df = (house_df['type'].value_counts())[:16].to_frame()
plt.figure(figsize=(15,15))
plt.pie(df['type'], labels=df.index.values, autopct='%.1f%%')
plt.title('上海市二手房户型',fontsize=20)
plt.savefig('picture/上海市二手房户型.jpg')


户型主要是1室1厅1卫、2室1厅1卫、2室2厅1卫、3室2厅1卫、3室2厅2卫,接下来针对这5种户型展开分析。

house_df2 = house_df.rename(columns = {'type':'户型','price': '房屋平均价格(元/平方米)','addr_dist': '城区'})
house_df2 = house_df2[house_df2['户型'].isin(['1室1厅1卫','2室1厅1卫','2室2厅1卫','3室2厅1卫','3室2厅2卫'])]
g = sns.catplot(kind="bar",data=house_df2, x='户型', y='房屋平均价格(元/平方米)', col='城区', col_wrap=4, aspect=1.2, order = ['1室1厅1卫','2室1厅1卫','2室2厅1卫','3室2厅1卫','3室2厅2卫'])
plt.savefig('picture/上海市各区二手房户型对房价影响.jpg')


随着户型的增大,平均价格也基本增大;在部分区存在1室1厅1卫、2室2厅1卫这两种户型价格较高的现象。

个人练手项目,以上代码有参考来自CSDN的[Python数据分析实战篇:从数据搜集到数据可视化一步一步完成二手房价数据分析]以及[Python数据分析——上海市二手房价格分析](放链接审核不通过,说有广告,我也是醉了)。

Python数据分析实战:上海二手房价分析相关推荐

  1. SQL实战:上海二手房价分析

    数据来源可见我的上篇博文Python数据分析实战:上海二手房价分析.将CSV文件中的数据导入到Navicat中,导入过程中需选择"10008(MAC-Simplified Chinese G ...

  2. 2020互联网数据分析师教程视频 统计学分析与数据实战 r语言数据分析实战 python数据分析实战 excel自动化报表分析实战 excel数据分析处理实战

    2020互联网数据分析师教程视频 统计学分析与数据实战 r语言数据分析实战 python数据分析实战 excel自动化报表分析实战 excel数据分析处理实战

  3. 数据分析项目——深圳二手房价分析及价格预测

    目录 一.需求说明 1.1基本任务 1.2 任务目的 1.3测试数据 二.概要设计说明 三.详细设计 3.1 数据检测模块 3.2 因变量分析模块 3.3 自变量分析模块 3.4 可视化模块 3.5  ...

  4. Python数据分析实战之葡萄酒质量分析

    文章目录 1. 明确需求和目的 2. 数据收集 3. 数据预处理 3.1 数据整合 3.1.1 加载相关库和数据集 3.1.2 数据概览 3.2 数据清洗 3.2.1 列名重命名 3.2.2 数据类型 ...

  5. python数据分析实战之超市零售分析

    文章目录 1.明确需求和目的 2.数据收集 3.数据预处理 3.1 数据整合 3.1.1 加载相关库和数据集 3.1.2 数据概览 3.2 数据清洗 3.2.1 列名重命名 3.2.2 数据类型处理 ...

  6. Python数据分析实战:降雨量统计分析报告分析

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于菜J学Python ,作者小小明 最近遇到一个有点烧脑的需求,其实也不算烧pytho ...

  7. 视频教程-Python数据分析与案例教程:分析人口普查数据-Python

    Python数据分析与案例教程:分析人口普查数据 多年互联网从业经验: 有丰富的的企业网站.手游.APP开发经验: 曾担任上海益盟软件技术股份有限公司项目经理及产品经理: 参与项目有益盟私募工厂.睿妙 ...

  8. Python数据分析实战基础 | 初识Pandas

    这是Python数据分析实战基础的第一篇内容,主要是和Pandas来个简单的邂逅.已经熟练掌握Pandas的同学,可以加快手速滑动浏览或者直接略过本文. 01  重要的前言 这段时间和一些做数据分析的 ...

  9. Python数据分析实战学习与分享(一)

    学习的书籍: Python Data Analytics Python数据分析实战(尚未出版电子书) 1.1数据分析 当今世界对信息技术的依赖程度日渐加深,每天都会产生和存储海量的数据.数据的来源多种 ...

最新文章

  1. ADO.NET中带参数的Sql语句的陷阱
  2. sqlite库——c语言实现匹配已知字符串中某个字段(该字段在其他表中),在其他表中获取值并显示
  3. 采购订单交货容差限制
  4. kafka认知--(1)
  5. win7无法连接打印机拒绝访问_“Windows无法连接打印机,操作失败,错误为0x000003e3”...
  6. corba的兴衰_代码广播的兴衰
  7. ASP.NET使用Session的七点认识
  8. 如何制作一个横版格斗过关游戏 Cocos2d x 2 0 4
  9. cefsharp irequesthandler_CefSharp请求资源拦截及自定义处理
  10. 使用dbca创建oracle实例
  11. 4.11_facade_结构型模式:外观模式
  12. Java开发全套学习!java判断字符串中是否包含中文
  13. java int sum 0 i_【亲和数】 (Java代码)
  14. ListCtrl使用
  15. 用计算机画图截图图片,如何快速截图保存图片
  16. 【C语言】—— 通讯录
  17. 替代CATIA查看stp/step格式模型免费软件推荐
  18. Python数据分析与展示(一)(基于北理MOOC)
  19. 英特尔核显驱动hd630_全新CPU性能天梯图,十代英特尔与R3 3100/3300X定位讲解
  20. 在Linux下用sopcast/qsopcast收看网络电视

热门文章

  1. NLPIR:九眼文档智能核查系统有效解决合同管理问题
  2. 当下用途最广的计算机语言,目前为止国际上最主流的计算机编程语言是什么?...
  3. Python基础 if判断语句 篇
  4. 微信中不能下载apk包的问题
  5. SAP MM 公司代码间质检库存的STO (I)
  6. 网络技术入门 :HTTP报文和TCP/IP数据包
  7. 设计一个用于填充n阶方阵的上三角区域的程序。填充规则是:使用1,2,3...的自然数列,从左上角开始, 按照顺时针方向螺旋填充
  8. 浮点数——科学计数法、浮点数表示、加减运算和浮点数的使用
  9. [RK3399][Android7.1] Uboot 固件生成方式
  10. 京东双十一店铺装修,免费海报设计软件