数据分析之北京房价复习

 篇头总结:数据分析师最重要的还是能站在一系列分析方法之外看问题,能熟练的应用各种库的内置函数固然很重要,但最重要的还是要精准把握业务中用到的指标。一句话:吃透业务逻辑比吃透分析方法更为重要。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#明确分析目的:了解北京房价总体情况,为自己买房做指导
#加载数据文件
#df = pd.read_csv('./beijing_houst_price.csv')
#我们会看到让我们明确数据类型的警告:所以我们会指明
df = pd.read_csv('./beijing_houst_price.csv',dtype = {'id':'str','tradeTime':'str'
                                                      ,'livingRoom':'str','drawingRoom':'str'
                                                      ,'bathRoom':'str'})
                                                    
                                                     
#简单地浏览一下数据
df.head()
#查看一下数值类型的常用统计量,为数据清洗做好一定的准备
df.describe()
#查看各列的非空值数量,这里还能看到哪些列有空值,很有用
df.count()
#接下来开始数据清洗
#1.重复值检查
df[df.duplicated()]#可以看到没有重复值
#2.单独检查ID这一列有没有重复值
df[df.id.duplicated()]#也可以这样写df[df['id'].duplicated()] 可以看到无重复
#3.tradeTime一列的重点检查
df['tradeTime'].value_counts
#年份跨度较大,有些年份的数据可能就比较少
#看一下每年数据的数量,确定是否要删除数据少的年份
#但是这里的日期是字符串格式,我们要将其转换成日期格式以便使用pandas中的内置函数
df['tradeTime'] = pd.to_datetime(df['tradeTime'])
#检查是否已经改成日期格式
df.dtypes #可以看到已经修改成功
#按照年份来统计每一年的数据量
df['tradeTime'].dt.year.value_counts()#可以看到2002年到2011年的数据量很少
#删除年份数据量过少的数据只保留2012到2017的数据
df.drop(df[df['tradeTime'].dt.year < 2012].index, inplace = True)
df.drop(df[df['tradeTime'].dt.year > 2017].index, inplace = True)
#再次查看每年的数据量
df['tradeTime'].dt.year.value_counts()
#北京的房价挺贵的,看看有没有成交额太小的,不多的直接删除
df[df['totalPrice'] < 100]#观察数据发现这些数据确有异常值
#再看看有多少这样的数据
df[df['totalPrice'] < 100].count()#可以看到有5057条这样的数据,相对于总体数据不多
#故删掉
df.drop(df[df['totalPrice'] < 100].index, inplace = True)
#占地面积是合理的,而且没有空值不做处理
#commuityAverage最大值最小值合理,但是有空值,需要看看是要填充还是直接删除较为合适
df[df['communityAverage'].isnull()] #只有427条数据,可以删除也可以填充
#删除
df.drop(df[df['communityAverage'].isnull()].index, inplace = True)
#数据清洗完毕,开始分析
#常用统计值
df.describe()
#二手房市场的状况可以简单分析下总价,单价,面积等信息
#时长的冷热可以参考成交量,关注人数等信息
#均价日趋势
#统计每日所有房源的平均单价
df_priceMean = df.groupby('tradeTime').mean()['price']
#按照索引排序
df_priceMean.sort_index(inplace = True)
#画出趋势图
#df_priceMean.plot()
#总价各区间房源数量
bins_arr = np.arange(100,1850,50)
bins = pd.cut(df['totalPrice'], bins_arr)
totalPrice_counts = df['totalPrice'].groupby(bins).count()
totalPrice_counts
#这样看意义不大,因为有几年的涨幅很大
#可以尝试看看每年的数据
#为了方便处理,增加年份列
df['year'] = df['tradeTime'].dt.year
#以2017年为例,其他年份类似,可以封装成一个方法
df_2017 = df[df['year'] == 2017]
bins_arr = np.arange(100, 1850, 50)
bins = pd.cut(df_2017['totalPrice'], bins_arr)
bin_counts = df_2017['totalPrice'].groupby(bins).count()
bin_counts
#可以过滤出感兴趣的总价区间继续分析
#总价在 300万到500万的房源占比
len(df_2017[(df_2017['totalPrice'] > 300) & (df_2017['totalPrice'] < 500)]) / len(df_2017)
#分析2017年的数据
df_2017.describe()
#均价各区间房源数
bins_arr = np.arange(5000,155000,5000)
bins = pd.cut(df_2017['price'], bins_arr)
price_count = df_2017['price'].groupby(bins).count()
price_count
#price_count.plot() #有一点点右偏啊, 这个图形
#单价在4万到7万的房源占比
len(df_2017[(df_2017['price'] > 40000) & (df_2017['price'] < 70000)]) / len(df_2017)
#面积各区间房源数
bins_arr = np.arange(10,250,10)
bins = pd.cut(df_2017['square'], bins_arr)
type(bins)
square_count = df_2017['square'].groupby(bins).count()
plt.figure(figsize = (10,10))
square_count.plot()
#从图上可以看出来,50平-60平、60平-70平的房源最为充足。而200平以上的就很少了

 

发布了4 篇原创文章 · 获赞 0 · 访问量 144

猜你喜欢

转载自blog.csdn.net/li_ming_joy/article/details/105495068