Python案例之Numpy + Pandas——北京房价分析、2018年北京积分落户数据分析

北京房价分析案例

  • 关于数据分析,首先要明确分析目的(分析问题、业务现状、业务指导等),然后确定数据源(抓取、业务数据、打点、报表等),再进行数据清洗、处理与分析,最终得到结论。
# 明确分析目的
# 了解北京房价总体情况,为自己买房做指导

# 引入使用的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据文件
df = pd.read_csv('./beijing_houst_price.csv')

# 如果有警告信息:Columns have mixed types,需要设置dtype
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()

# 开始数据清理

# 看下是否有重复数据
df[df.duplicated()]
# 假如id都是正确的值,看看有没有重复的
df[df['id'].duplicated()]

# tradeTime列数据清洗
df['tradeTime'].value_counts()

# 年份跨度比较大,有些年份可能数据比较少
# 看下每年数据的数量,确定是否要删除数据少的年份
# 先将字符串转为日期格式,方便使用内置函数
df['tradeTime'] = pd.to_datetime(df['tradeTime'])
# 查看下数据类型
df.dtypes
# 统计下每年的数据量
df['tradeTime'].dt.year.value_counts()

# 其他年份数据太少,只统计2012年~2017年的数据
# df[df['tradeTime'].dt.year < 2012]
df.drop(df[df['tradeTime'].dt.year < 2012].index, inplace=True)
# df[df['tradeTime'].dt.year > 2017].index
df.drop(df[df['tradeTime'].dt.year > 2017].index, inplace=True)

# 在看下每年的数据量
df['tradeTime'].dt.year.value_counts()
# totalPrice清洗
# 看最大值最小值,最小值有点不太合理,可以根据自己的需求删除小于某个值的数据
# 例如可以先看下小于50万的数据
df[df['totalPrice'] < 50]
# 删除100万以下的
df.drop(df[df['totalPrice'] < 100].index, inplace=True)

# square列看最大值最小值,都是合理的,而且没有空值,所以不用清洗
# 中间的其他列本次不分析,暂时忽略
# communityAverage最大值最小值合理,不过有空值,需要处理下
df[df['communityAverage'].isnull()]
# 删除空值(也可以使用平均值填充)
df.drop(df[df['communityAverage'].isnull()].index, inplace=True)
# 数据清洗完毕,开始分析

# 常用统计值
df.describe()

在这里插入图片描述

# 二手房市场的状况可以简单分析下总价、单价、面积等信息
# 时长的冷热可以参考成交量、关注人数等信息
# 均价日趋势
# 统计每日所有房源的平均单价
df_price = df.groupby('tradeTime').mean()['price']
# 按照索引排序
df_price.sort_index(inplace=True)
# 画出趋势图
# 图太小了,设置下size
# plt.figure(figsize=(10,10))
df_price.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
df
# 以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()
print(bin_counts)
# 画图看下
bin_counts.plot()
# 可以过滤出感兴趣的总价区间继续分析

# 总价在300万~500万的房源占比
#len(df_2017[(df_2017['totalPrice'] > 300) & (df_2017['totalPrice'] < 500)]) / len(df_2017)
# 可以看出市面上供给最多的是总价300万~500万的房源

在这里插入图片描述

# 面积各区间房源数
bins_arr = np.arange(10, 210, 10)
bins = pd.cut(df_2017['square'], bins_arr)
square_count = df_2017['square'].groupby(bins).count()
plt.figure(figsize=(10,10))

square_count.plot()
# 从图可以看到200平米以上的就很少了,可以根据自己的需求在缩小下面积的范围
square_count
# 

北京的老旧小区很多,所以50-60,60-7-这两个区间房源最多

# 总价各区间关注人数
bins_arr = np.arange(100, 1850, 50)
bins = pd.cut(df_2017['totalPrice'], bins_arr)
print(bins)
followers_count = df_2017.groupby(bins).sum()
print(df_2017.groupby(bins))
print(followers_count)
#plt.figure(figsize=(10,10))
#print(df_2017[df['totalPrice'] >1750].sum().followers)
print(df_2017[df['totalPrice'] >1750].sum()['followers'])
#followers_count.plot()
# 面积各区间关注人数,均价各区间关注人数等指标计算方法类似
# 也可以调整不同的分桶值

2、2018年北京积分落户数据分析

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取文件
luohu_data = pd.read_csv('./bj_luohu.csv', index_col = 'id')
# describe()展示一些基本信息
luohu_data.describe()
# 按照company分组并计算每组个数
# groupby默认会把by的这个列作为索引列返回,可以设置下as_index=False
company_data = luohu_data.groupby('company', as_index=False).count()
[['company','name']]
# 重命名列名称
company_data.rename(columns={'name':'people_count'}, inplace=True)
# 按照某一列排序
company_sorted_data = company_data.sort_values('people_count', ascending=False)
company_sorted_data
# 按条件过滤
# 只有一人的公司
company_sorted_data[company_sorted_data['people_count'] == 1]
# 人数前50的公司
company_sorted_data.head(50)
# 分数分布
# 按照步长5分桶统计下分数的分布
bins = np.arange(90, 130, 5)
bins = pd.cut(luohu_data['score'], bins)
bin_counts = luohu_data['score'].groupby(bins).count()
# 处理index
bin_counts.index = [ str(x.left) + '~' + str(x.right) for x in bin_counts.index
]
bin_counts.plot(kind='bar', alpha=1, rot=0)
plt.show()
# 年龄分布
# 出生日期转为年龄
luohu_data['age'] = ((pd.to_datetime('2019-07') -
pd.to_datetime(luohu_data['birthday'])) / pd.Timedelta('365 days'))
luohu_data.describe()
bins = np.arange(20, 70, 5)
bins = pd.cut(luohu_data['age'], bins)
bin_counts = luohu_data['age'].groupby(bins).count()
bin_counts.index = [ str(x.left) + '~' + str(x.right) for x in bin_counts.index
]
bin_counts.plot(kind='bar', alpha=1, rot=0)
plt.show()
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值