链家网房价数据分析

Pandas

Posted by 粘世强 on May 23, 2018

之前的几期中,我们谈到了python的基本语法,以及pandas中的常用操作命令。今天我们用链家网房价的这样一份数据,来亲自动手实践一下,看一下pandas这个数据处理的大熊猫是如何让众多数据从业者爱不释手的。好了,废话少说,我们来看一下这份数据的分析过程。这份数据是链家网2017年7月份的房价数据。

首先,做数据分析,咱啥也别逼逼,先把numpy和pandas两个库导进来再说,要是想做可视化,再加载可视化的包。np和pd是两个包的缩写,大家约定俗成的简写就是np和pd。

import numpy as np
import pandas as pd

然后接下来,需要把数据读到notebook里来,就用下边的命令就好。括号里填的是这个csv文件的路径,一般把它和notebook放到一个文件目录下就好。

lj_data = pd.read_csv('1_LJdata.csv')

读进来之后,好奇想看下这个文件长什么样子,于是就想,要不看下前5行吧。.head()就是用来查看数据前5行的,当前你想看前10行,就在括号里填10。对应的还用数据的最后5行,.tail()用法和.head()是一摸一样的。

lj_data.head()

数据就长成上边这个样子,看起来还比较规整。有一个小问题就是列名全都是中文,在代码领域里,大家还是能用英文尽量就用英文吧。后边万一遇到中文的编码问题,就悔不当初了。直接下边一行代码搞定,把每一列的名字换成英文,实在不知道恰当的英文,就写中文拼音也是没有丝毫问题的。

lj_data.columns = ['district', 'address', 'title', 'house_type', 'area', 'price', 'floor', 'build_time', 'direction', 'update_time', 'view_num', 'extra_info', 'link']

ok,那接下来咱们就开始正式来分析一下这个数据。

首先,需要对数据的整体情况有个大致的把握,一般第一步都是来看下数据的info

lj_data.info()

从这上边可以看出,这份数据有2760条记录,可以看出每一列的数据类型,每一列有多少个非空的数据。发现有一列build_time中有两个数据是空值,心里有个数就好了。其实这样的数据已经很不错了,数据质量可以说非常高了。

另外,还有两个命令可以来查看一下数据的总体信息。

lj_data.shape#查看数据有多少行和多少列

lj_data.describe()#对数据分布的描述

看完了数据总体分布之后,我们对这份数据有了一个总体印象。

  • 一共有2760条房子信息记录。
  • 只有两个数据有缺失,质量相当高。因为如果缺失值较多的话,需要考虑数据的删除或者用一些方法来填充缺失值。
  • 每个房子的信息也比较全,房价,地理位置,看房人数等等都有。

有上边的基本认识之后,我们可以来对数据做一些具体的分析了。

北京房价

拿到一份房价的数据,大家最想知道的是啥?大家都说北京房价贵,租房要了命,那咱们就从数据上来看下北京最贵的房子和最便宜的房子都是个什么情况。最直接的想法就是我给房价那一列从大到小排个序,第一个是最贵的,最后一个是最便宜的。

#按照价格这一列进行排序,降序排列
lj_data.sort_values(by = "price",ascending = False)

最贵的房子21万!不过看看这位置(地铁2号线周边,雍和宫),看看这房子类型,6室3厅,也值了。

回过头来再来看一下这个方法,不得不说有些简单粗暴,全都给排个序,这数据2000多条还好说,万一数据几万条,几十万条,再用这种方法排序估计就行不通了。我们要一剑封喉,直接在这里边找到那个最贵的,然后取出来,请看下边代码:

lj_data.loc[lj_data['price'] == lj_data['price'].max()]

在pandas里边,.loc是一个定位的方法,在这里定位的条件就是“价格等于价格最大值”,找个满足这个条件的那一列,然后取出来。

这就是结果,只取出这一列。用同样的方法也可以找到房价最便宜的房源信息。

lj_data.loc[lj_data['price'] == lj_data['price'].min()]

人们对房子的关注度(看房人数)

接下来,我们想看一下人们对房子的关注热度,这个指标可以用“平均看房人数”这个指标来刻画一下,平均看房的人数越多,说明这个房子越受欢迎。

lj_data['view_num'].median()

10

这里选择中位数而不是平均数,是为了摆脱极端值的影响,大部分情况下均值比平均值更能反映数据的实际情况。

平均一个房子会被看10次,说明人们对房子的关注度还是很高的。

房龄最小的10套房子的面积,价格

我们想看一下一些最新的楼房的相关信息,这个要看房龄的大小,可是仔细观察数据,会发现,房龄信息包含在build_time这个属性中,我们需要从这里提取出房子的建造时间。这时候需要用到apply函数,来对这一列做一下变换。

#定义一个函数
def fun(x):
    try:
        #取出build_time中的前4个字符,并且转换为整数
        return int(x[:4])
    except:
        return -1
#添加新的一列,保存房子的建造年份
lj_data["build_year"] = lj_data["build_time"].apply(fun)
lj_data.head(2)

之所以要将年份转换为整数,是因为后边需要对这个年份进行排序,寻找房龄最小的10套房子。

房型数量的分布

很好奇在北京是哪种类型的房子更受欢迎呢?两室一厅?一室一厅?我们用数据来看一下真实的结果。

#用value_counts来统计每种类型的房子的数量,reset_index是重新来设置索引值
a = lj_data["house_type"].value_counts().to_frame().reset_index()
#重新设置列名
a.columns = ["house_type","num"]
#设置索引值
a.set_index("house_type",inplace= True)
#查看前5大最受欢迎的房型
a.head()

从结果可以看出,2室1厅的房子最受欢迎,接下来是1室1厅。

关于这份数据,我们就先分析这么多,还可以继续在其它方面进行挖掘,extro_info中其实包含了很多信息,比如距离地铁站的远近与房子价格的关系,是否有集中供暖会不会是影响房子价格的一大因素等。有兴趣的同学可以继续挖掘,也欢迎一起交流。

关于这份原始数据,如果有需要的话可以添加我微信(18810781215),我会提供给大家。

最近看了两个数据分析的项目,深深感到在整个数据分析的过程中,真正的高手不是那些模型选的多么厉害的人,因为大家常用的模型也没有很多,调参过程中也包含了一部分运气,不能算作成功的决定因素。最厉害的地方在于数据预处理和特征工程这两点,优秀的项目真的是把这两点做到了极致。这两点要想做得出彩,pandas以及后边会推出的可视化部分绝对是重中之重。