数据分析学习之路——(二)链家网部分城市新开楼盘分析

2023-12-30 21:40

本文主要是介绍数据分析学习之路——(二)链家网部分城市新开楼盘分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        近一个月一直在Udacity学习数据分析课程,因此很久没有更新博客。我根据自己的学习安排,已经完成提交了项目一——对Stroop现象用数理统计方法进行假设检验并得出结论。这次来分析一下链家网公开的部分城市新楼盘数据(2017.07获取的数据),主要对城市楼盘数量、价格进行分析。

数据读取

        为了操作方便,我从网上爬取的数据保存为csv格式,因此直接用pandas库的read_csv方法可以直接读取并赋值给DataFrame数据类型的变量。

data = pd.read_csv('C:/Users/Nekyo/HJQ/document/pyfile/lianjiaData1.csv')

数据预处理

        将爬取的数据我用excel打开,主要信息如下图。由于数据源的原因,获取的数据比较乱,处理起来需要兼顾很多东西。例如:建筑面积这一栏,有的是空数据,有的是固定一个值,有的是一个范围,有的城市是按照建筑面积算,有的城市是按照套内面积算;还有如均价一栏,大多是按照“元/平”来算,部分也按照“万/套”来算,另外也有空数据;地址这一栏数据比较统一,“-”符号将地址分割为城市下面的区县和楼盘具体的地址;居室这一栏由于数据太散乱意义不大,没有使用。因此我主要给出各城市,以及城市下面的区县新楼盘面积和均价的分析情况。

         202852_uYxQ_3642529.png

 在分析过程中,为了统一我都把建筑面积按照套内面积来算;将特殊数据,如空值、价格待定等数据去除。

data = data.drop_duplicates(keep='first')  #去除重复数据,保留重复数据的第一行数据
data = data.reset_index()[['城市','地址','居室','建筑面积','均价']] #由于删去了部分数据,重置索引
data['居室'] = data['居室'].str.split('-',1)
data['建筑面积'] = data['建筑面积'].str.replace('建面','').str.replace('套内','').str.strip().fillna('0') #全部统一为同一单位的面积
data['均价'] = data['均价'].str.strip().str.replace('价格待定','').str.strip().fillna('0') #去除均价垃圾数据

数据处理

        经过以上步骤,我们将数据稍微规整了一下,但是数据格式仍然不统一,因此需要细化处理:1、地址一栏只保留“-”符号前面的区县;2、建筑面积一栏,去除空数据后,如果是一个面积范围则取平均值;3、均价一栏由于是两种维度的数据,因此通过正则匹配方式查找并只筛选出单位为“元/平”的数据。

addr=[]
area=[]
roomnum=[]
price=[]
pattern0=re.compile('万/套')
pattern=re.compile('<span class="num">(.*?)</span>')  #通过正则匹配均价的数值,需引入re库
llen = len(data)
for i in range(llen):addpos = data['地址'][i].find('-')addr.append(data['地址'][i][:addpos])areapos1 = data['建筑面积'][i].find('~')  #"~"所在的位置,如果找不到则返回-1
    areapos2 = data['建筑面积'][i].find('m')  #"m"所在的位置,如果找不到则返回-1
    if areapos2!=-1:if areapos1!=-1:area1=data['建筑面积'][i][:areapos1]area2=data['建筑面积'][i][areapos1+1:areapos2]areaavg = (float(area1)+float(area2))/2area.append(areaavg)else:area1=data['建筑面积'][i][:areapos2]areaavg=float(area1)area.append(areaavg)else:area.append(0.0) roomnum.append(data['居室'][i][0].strip())prices0 = re.findall(pattern0, data['均价'][i])prices = re.findall(pattern,data['均价'][i])if prices:if prices0:price.append(0.0)   # 因为有部分是按照 万/套来计算房价的,因此之后会清理掉       else:price.append(float(prices[0]))else:price.append(0.0)

将处理后的数据和原数据框拼接,这样就得到了比较统一规整的数据。

data['区县']=Series(addr)
data['房屋面积']=Series(area)
data['房间数']=Series(roomnum)
data['房价']=Series(price)
newdata = data[data['房价']>0][['城市','区县','房屋面积','房价']] 
newdata = newdata[newdata['房屋面积']>0][['城市','区县','房屋面积','房价']]

结果如下

               202212_vMPL_3642529.png

数据分析过程

 先来看看简单的统计描述,只截取了北京大连两个城市的数据供参考。

newdata.groupby('城市').describe()

              203438_8Rl2_3642529.png

各城市的新开楼盘信息(平均值),用条形图来展示

newdata.groupby('城市')[['房屋面积','房价']].mean()

              203943_EXrZ_3642529.png

data1=newdata.groupby('城市')[['房屋面积','房价']].mean()
mpl.rcParams["font.sans-serif"] = ["Microsoft YaHei"]
mpl.rcParams['axes.unicode_minus'] = False
fig = plt.figure(figsize=(10,5))  # 设置绘图区域大小及子图
ax1 = fig.add_subplot(121)
ax1.set_xlabel('城市')
ax1.set_ylabel('房屋面积(㎡)')
ax1.set_title("城市新楼盘平均面积比较")
data1['房屋面积'].plot(kind='bar')
ax2 = fig.add_subplot(122)
ax2.set_xlabel('城市')
ax2.set_ylabel('房价(元/平)')
ax2.set_title("城市新楼盘平均房价比较")
data1['房价'].plot(kind='bar')
plt.rcParams['font.sans-serif'] = ['SimHei']  # matplotlib画图坐标轴中文字体设置
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.show()

        214411_3Aj7_3642529.png

        从房价均价图可以看出,各城市的房价水平会比真实情况略高,这可能是楼盘信息挂在网络平台导致的虚高,但是各城市的分布对比是能够和现实情况对上的。

下面再从每个城市下辖的区县维度展示云图效果,需要安装使用wordcloud库。

toawnavgarea={}   #按区县楼盘面积
toawnavgprice={}  #按区县楼盘均价
toawncounts={}    #按区县楼盘数量toawn_avg = newdata.groupby('区县').apply(lambda x:x.mean()).reset_index()   # 使用匿名函数计算平均值
toawn_counts = newdata.groupby('区县')['城市'].apply(lambda x:x.count()).reset_index()
for i in range(len(toawn_avg)):toawnavgarea[toawn_avg.ix[i]['区县'].decode('utf-8')] = float(toawn_avg.ix[i]['房屋面积'])toawnavgprice[toawn_avg.ix[i]['区县'].decode('utf-8')] = float(toawn_avg.ix[i]['房价'])
for j in range(len(toawn_counts)):toawncounts[toawn_counts.ix[j]['区县'].decode('utf-8')] = float(toawn_counts.ix[j]['城市'])
wordcloud=WordCloud(font_path='C:/Users/Nekyo/tools/SOFTWARE/Anaconda2/Library/lib/fonts/songti.ttf', width=1000,height=600,background_color='white')        # 云图使用的汉字字体,自带的字体库没有需要下载
f=plt.figure(figsize=(10,5))
ax1 = f.add_subplot(121)
wordcloud.fit_words(toawncounts)
axs1=plt.imshow(wordcloud)
ax1.set_title("2017年7月区县新楼盘数量云图")
plt.axis('off')  # 不显示坐标轴
ax2 = f.add_subplot(122)
wordcloud.fit_words(toawnavgprice)
axs2=plt.imshow(wordcloud)
ax2.set_title("2017年7月区县新楼盘均价云图")
plt.axis('off')
plt.show()

      220027_Vthi_3642529.png

        可以看到,成都高新区、大连甘井子区、广州顺德等地新开楼盘数量居前列;平均房价较高的几个地区:东城、西城、朝阳、海淀等,都在北京!!再仔细看一下我们才会看到位于深圳的福田、南山和罗湖区房价也紧随其后,由此我们有理由感慨:北京的房价是真高啊!!深圳也不差!

最后将数据大幅度调整一下,把每个城市的房价数据拿出来构造一个新的DataFrame,由于每个城市数据量不一样,因此数据量较少的城市在构造过程中会产生空值(NaN表示),不过对分析过程无影响。

newdata_bj = newdata[['房价','城市']][newdata['城市']=='北京'].reset_index()
newdata_cq = newdata[['房价','城市']][newdata['城市']=='重庆'].reset_index()
newdata_cd = newdata[['房价','城市']][newdata['城市']=='成都'].reset_index()
newdata_sh = newdata[['房价','城市']][newdata['城市']=='上海'].reset_index()
newdata_hz = newdata[['房价','城市']][newdata['城市']=='杭州'].reset_index()
newdata_gz = newdata[['房价','城市']][newdata['城市']=='广州'].reset_index()
newdata_sz = newdata[['房价','城市']][newdata['城市']=='深圳'].reset_index()
newdata_dl = newdata[['房价','城市']][newdata['城市']=='大连'].reset_index()
newdata_wh = newdata[['房价','城市']][newdata['城市']=='武汉'].reset_index()
newdata_xa = newdata[['房价','城市']][newdata['城市']=='西安'].reset_index()
newdata_cs = newdata[['房价','城市']][newdata['城市']=='长沙'].reset_index()
data_bycity = pd.concat([newdata_bj,newdata_cd,newdata_cq,newdata_hz,newdata_gz,newdata_sz,newdata_dl,newdata_wh,newdata_xa,newdata_cs],axis=1)  # concat拼接函数
data_bycity = data_bycity.drop(['index','城市'],axis=1)  # 去掉索引
data_bycity.columns=['北京','成都','重庆','杭州','广州','深圳','大连','武汉','西安','长沙']  # 设置列名

新构造的数据集

          222037_kIjn_3642529.png

用箱线图对比展示各城市的房价

           222451_U3Qk_3642529.png

        很明显,无论是从中位数还是最大值来看,北京的房价一骑绝尘,深圳紧随其后;再根据四分位距的对比情况,北京深圳也令其它城市难以望其项背,两个城市的房价分布比较分散,会大概率出现某一楼盘开出特别高的房价,也会大概率出现某一楼盘开出相对城市均价来说比较低的房价。

再找一个城市分析其下辖区域的情况,以成都市为例

datacd=newdata[newdata['城市']=='成都']
datacd=datacd.groupby('区县')[['房屋面积','房价']].mean()
fig = plt.figure(figsize=(10,5))  # 设置绘图区域大小及子图
ax1 = fig.add_subplot(121)
ax1.set_xlabel('成都市各区县')
ax1.set_ylabel('房屋面积(㎡)')
ax1.set_title("2017年7月成都市各区县新楼盘平均面积比较")
datacd['房屋面积'].plot(kind='bar')
ax2 = fig.add_subplot(122)
ax2.set_xlabel('城市')
ax2.set_ylabel('房价(元/平)')
ax2.set_title("2017年7月成都市各区县新楼盘平均房价比较")
datacd['房价'].plot(kind='bar')
plt.show()

    224005_Ae5u_3642529.png

        可以看到,新津、高新西区、天府三个区域新建楼盘面积居前列;房价比较高的区域都在诸如高新、青羊、锦江这样的热门市区,而且均价居然都达到了2w,而像蒲江、仁寿、彭州这样离市区稍远的县连5k都不到,跟省内一个地级市房价差不多,放在全国来看,甚至不如一个发达地区的县城的房价。

总结

        由于数据源的因素,本次分析可能会与现实情况略有出入,但是大致方向,大致比较分布是没有问题的,也通过这些数据和图形展示对自己感兴趣的城市房价有了一个直观印象。由于是第一次通过博文展示,因此为了加深自己的理解,尽可能的描述了很多细节,显得比较啰嗦,之后的分析案例会尽量简洁,不会每个步骤每段代码都进行说明。

转载于:https://my.oschina.net/nekyo/blog/1538823

这篇关于数据分析学习之路——(二)链家网部分城市新开楼盘分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/554088

相关文章

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java