大数据 爬虫Python AI Sql数据蛙数据分析每周作业大数据

第二篇数据分析项目实战:链家二手房分析

2019-02-20  本文已影响46人  夜希辰

这是我第二篇数据分析项目实战,当凌晨一点分析结束后深刻体会到学以致用的重要性、接触实战项目的重要性。

因为按照我的学习计划只练习一篇实战项目即"cd用户消费行为分析",不过……庆幸的是在朋友的影响下练习了本项目,并进一步了解python第三方库。

在开篇之前附上数据分析思路

1、数据的清洗

导入常用的包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']#显示中文

导入数据并读取前五行

df = pd.read_csv("链家二手房.csv",engine='python')
df.head()

因为中文字符的列名在处理的时候比较麻烦,将其转化为英文字符的列名,并查看数据显示前五行

df.rename(columns = {'小区名称':'village','户型':'house_type',
                     '面积':'area','区域':'district','朝向':'orientations','价格(W)':'total_price',
                     '单价(平方米)':'unit_price','建筑时间':'construction_time','楼层':'floor'},inplace = True)
df.head()

查看数据类型及缺失情况

df.dtypes     #查看数据类型

df.isnull().sum()  #查看数据缺失情况

由上面数据预览可知,应将floor列分成两列以便后续分析使用,故在此将其分成两列并查看前五行数据

df1 = pd.concat([df,df['floor'].str.split('/',expand = True)],axis = 1)
df1.head()

删除floor列,重命名新得到的列

del df1['floor']
df1.rename(columns = {0:'floor_level',1:'floor'},inplace = True)
df1.tail()

数据清洗:提取construction_time和floor字段中的数字、删除文字部分,查看前5行数据

df1['construction_time']=df1['construction_time'].str.extract('(\d+)年建')
df1['floor']=df1['floor'].str.extract('(\d+)层')
df1.head()

查看数据类型

df1.info()
df1['construction_time'] = df1['construction_time'].astype(float)
df1['floor'] = df1['floor'].astype(float)
df1.dtypes

查看描述性统计

df1.describe()   #查看描述性统计

2、数据分析:各城区房源数量分布

【找一张上海地区结构图】
上海市区共分为三个等级:
1、黄浦区、长宁区;
2、静安区、徐汇区;
3、杨浦区、虹口区、普陀区。

上海郊区共分为三个等级:
1、宝山区、闵行区;
2、松江区、嘉定区、青浦区;
3、奉贤区、崇明区、金山区。

district_number=df1.district.value_counts().reset_index().sort_values(by='district',ascending=False)
district_number

可视化

plt.figure(figsize=(9,4))
district_number.plot(x = 'index',y = 'district',kind = 'line')
plt.title('各城区房源数量')

3、各城区总面积和平均面积的分布

3.1各城区总面积分布

因为静安、金山、崇明区的房源较少无法代表整体,所以在这里删除这三个区的数据

dis_list=list(df1.district.drop_duplicates())#drop_duplicates()去除确定列下的重复列
#drop_duplicates()去除确定列下的重复列
dis_list.remove('崇明')
dis_list.remove('金山')
dis_list.remove('静安')
dis_list

删除上述的三个区,并查看删除后的所有数据前五行

df2 = df1[df1.district.isin(dis_list)]
df2.head()

计算各城区二手房源总面积:

grouped_total_area = df2.groupby('district').sum().sort_values('area',ascending = False).reset_index()
grouped_total_area

可视化:作出各城区总面积折线图

plt.figure(figsize=(12,5))
grouped_total_area.plot(x = 'district',y = 'area',kind = 'line')
plt.title('各城区总面积分布')

3.2各城区平均面积分布

grouped_area = df2.groupby('district').area.mean().reset_index().sort_values('area',ascending = False)
grouped_area

可视化:作出各城区平均面积折线图

plt.figure(figsize = (9,5))
plt.plot(grouped_area.district,grouped_area.area)
plt.title('各城区平均面积分布')

3.3全市平均面积分布

以区间[0,50)、[50,100)、[100,150)、[150,200)、[200,+∞)为划分标准,将面积划分为tinysmall、small、medium、big、huge五个等级,分别对应极小户型、小户型、中等户型、大户型和巨大户型。

df2.loc[(df2['area'] >= 0) & (df2['area'] < 50),'area_level'] = 'tinysmall'
df2.loc[(df2['area'] >= 50) & (df2['area'] < 100),'area_level'] = 'small'
df2.loc[(df2['area'] >= 100) & (df2['area'] < 150),'area_level'] = 'medium'
df2.loc[(df2['area'] >= 150) & (df2['area'] < 200),'area_level'] = 'big'
df2.loc[(df2['area'] >= 200),'area_level'] = 'huge'
df2.head()

求出各户型的数量:

grouped_area_level=df2.groupby('area_level').total_price.count().reset_index()
grouped_area_level

可视化:作出各户型数量柱状图

plt.bar(grouped_area_level.area_level,grouped_area_level.total_price)
plt.title('各户型数量分布')

4、数据分析:各城区总价和单价分布

4.1总价分布

# 把分区后的总价组成一个字典,以便下面将它转化为dataframe
good=dict(list(df2.groupby('district')['total_price']))
# 转化为dataframe
gooddf=pd.DataFrame(good)
# 作出总价箱线图
plt.figure(figsize=(12,5))
gooddf.boxplot()
plt.ylim(0,3000)
plt.title('各城区总价箱线图')

各城区总价平均值排名:

total_price_mean = df2.groupby('district')['total_price'].mean().reset_index().sort_values('total_price')
total_price_mean

4.2、平均总价分布

df2.total_price.hist(bins = 20)
plt.title('平均总价分布图')

4.3、各城区单价分布

good1=dict(list(df2.groupby('district')['unit_price']))
good1df=pd.DataFrame(good1)
plt.figure(figsize=(12,5))
good1df.boxplot()
plt.ylim(0,150000)
plt.title('各城区单价分布箱线图')

各城区单价排名:

unit_price_mean = df2.groupby('district')['district','unit_price'].mean().reset_index().sort_values('unit_price',ascending = False)
unit_price_mean

全市单价分布:

df2.unit_price.hist(bins = 20)
plt.title('全市单价分布直方图')

4.4、总价和单价排名前十小区

对小区进行分组,计算出各小区房源数量,并按照房源数量降序的顺序排序

df3 = df2.groupby('village').total_price.count().reset_index().sort_values('total_price',ascending = False)
df3.head()
df4 = df3[df3.total_price > 20]
df4.head()

提取房源数大于20的全部数据

df5 = df2[df2.village.isin(df4.village)]
df5.head()

4.5、计算各小区总价排名前15的小区:

对小区进行分组,计算出各小区房源数量,并按照房源数量降序的顺序排序

df3 = df2.groupby('village').total_price.count().reset_index().sort_values('total_price',ascending = False)
df3.head(20)

因为很多小区房源数量太少,其统计值不具有代表性,故在此过滤掉房源数量小于20的小区

# 过滤掉房源小于20的小区
df4 = df3[df3.total_price > 20]
df4.head(10)

提取房源数量大于20的小区的全部数据

df5 = df2[df2.village.isin(df4.village)]
df5.head()

计算各小区总价排名前15的小区:

totalp_village = df5.groupby('village').total_price.mean().sort_values(ascending = False).reset_index().head(15)
totalp_village

可视化:作出平均总价排名前十小区的平均总价柱状图

plt.figure(figsize=(20,4))
plt.bar(totalp_village.village,totalp_village.total_price)
plt.title('平均总价排名前15的小区')

4.6、计算单价排名前十五的小区

totalp_village1=df5.groupby('village').unit_price.mean().sort_values(ascending=False).head(15).reset_index()
totalp_village1

可视化:作出平均单价排名前十小区的单价柱状图

plt.figure(figsize = (20,5))
plt.bar(totalp_village1.village,totalp_village1.unit_price)
plt.title('平均单价排名前15小区')

5、房价与户型、楼层、朝向、建筑年代的关系

5.1、房价与户型的关系

按户型进行分组,计算出每个户型的房源数量,过滤掉房源数量小于100的户型

grouped_house_type = df2.groupby('house_type').total_price.count().sort_values(ascending = False).reset_index()
grouped_house_type2 = grouped_house_type.loc[grouped_house_type.total_price> 100]
grouped_house_type2

可视化:作出各户型的数量柱状图

plt.figure(figsize = (10,5))
plt.bar(grouped_house_type2.house_type,grouped_house_type2.total_price)
plt.title('各户型数量柱状图')

户型与房屋均价的柱状图

grouped_house_type3 = df6.groupby('house_type').unit_price.mean().sort_values(ascending = False).reset_index()
grouped_house_type3
plt.figure(figsize=(15,5))
plt.bar(grouped_house_type3.house_type,grouped_house_type3.unit_price)
plt.title('户型-房屋均价图')

5.2、房价与楼层的关系

计算各个楼层等级的房源数量,注意这里是按照地区高中中区划分的,并不是按照floor划分的

a_list=['高区','中区','低区']
df7 = df2[df2.floor_level.isin(a_list)]
grouped_floor_level = df7.groupby('floor_level').unit_price.count().reset_index()
grouped_floor_level.head()

可视化:并作出其柱状图

plt.title('楼层等级-数量')
plt.bar(grouped_floor_level.floor_level,grouped_floor_level.unit_price)

计算各楼层等级的平均单价平均总价
平均单价

grouped_floor_level1 = df7.groupby('floor_level').unit_price.mean().reset_index()
grouped_floor_level1

可视化:作出其柱状图

plt.title('楼层等级—平均单价')
plt.bar(grouped_floor_level1.floor_level,grouped_floor_level1.unit_price)

由上图可知,低、中、高区楼层平均单价在6万元附近
平均总价

grouped_floor_level2 = df7.groupby('floor_level').total_price.mean().reset_index()
grouped_floor_level2

可视化:柱状图

plt.title('楼层等级—平均总价')
plt.bar(grouped_floor_level2.floor_level,grouped_floor_level2.total_price)

由上图可知,低、中、高区楼层平均总价均超过500万,其中低区总价最高,为590万
查看缺失值

df2.isnull().sum()

缺失值的处理

# 填充floor列中的空值为999
df2.floor=df2.floor.fillna('999')
# 找出floor列中值为999的行号
c_list=df2[df2.floor=='999'].index.tolist()
# 删除上面查找到的行
df8=df2.drop(c_list)
df8.isnull().sum()

计算楼层平均单价排名前15位

df2.groupby('floor').unit_price.mean().sort_values(ascending = False).reset_index().head(15)

计算各楼层单价平均值,并作出其折线图:

plt.figure(figsize=(15,5))
df2.groupby('floor').unit_price.mean().plot()
plt.title('楼层数-单价')

5.3、房价与朝向的关系

查看房屋的朝向

df2.orientations.drop_duplicates().values.tolist()

朝向重新构成一个列表

b_list=list(['朝东','朝东北','朝东南','朝东西','朝北','朝南','朝南北','朝西','朝西北','朝西南'])
df8 = df2[df2.orientations.isin(b_list)]
grouped_orientations = df8.groupby('orientations').unit_price.mean().sort_values(ascending = False).reset_index()
grouped_orientations

可视化:作出其柱状图

plt.figure(figsize=(12,5))
plt.bar(grouped_orientations.orientations,grouped_orientations.unit_price)
plt.title('朝向—单价')

5.4、房价与建筑年代的关系

缺失值的处理

# 填充construction_time字段中的空值为000
df2.construction_time=df2.construction_time.fillna('000')
# 找出construction_time字段中值为123的行号
d_list=df2[df2.construction_time=='000'].index.tolist()
# 删除construction_time列中的空值
df9=df2.drop(d_list)

计算各个年份建造房屋的数量 ,作出其折线图:

plt.figure(figsize=(15,5))
df9.groupby('construction_time').unit_price.count().plot()
plt.title('建筑时间-数量')

计算各个年份平均总价,作出其折线图

plt.figure(figsize=(15,5))
df9.groupby('construction_time').total_price.mean().plot()
plt.title('建筑时间-平均总价图')

计算各个年份平均单价,作出其折线图

plt.figure(figsize=(15,5))
df9.groupby('construction_time').unit_price.mean().plot()
plt.title('建筑时间-平均单价图')

资料
1、第一篇数据分析项目实战:用户消费行为分析
2、链家二手房数据

上一篇 下一篇

猜你喜欢

热点阅读