赞
踩
1、明确分析目的和思路/提出假设
2、数据收集
3、数据处理/整理
4、数据分析/验证假设
5、数据展现/可视化图表
6、报告撰写
已有某地产网站的数据,存储在csv文件中。
import numpy as np #用于常规的数据运算
import pandas as pd #用于数据分析,包括数据的引入,特征的提取以及数据的清洗转移等
import matplotlib as mpl #用于数据的可视化
import matplotlib.pyplot as plt #方便快速绘制2D图表
mpl.rcParams["font.family"] = "SimHei" #设置字体
mpl.rcParams["axes.unicode_minus"]=False # 用来正常显示负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
% matplotlib inline #将那些用于matplotlib绘制的图显示在页面里而不是弹出一个窗口
lianjia = pd.read_csv("XXXXXXXX.csv", encoding="utf-8", sep="\t") # 读取csv文件
pd.set_option("max_colwidth", 60) # 设置每个字段,最多显示60个字符
pd.set_option("max_columns", 50) # 设置每个dataframe显示 50个字段
lianjia.head(3) #查看前三行
结果:
成交价(万) 成交时间 所在小区 户型 建筑面积 挂牌价格(万) 成交周期(天) 调价(次) 带看(次) 关注(人) 浏览(次 链家编号 交易权属 挂牌时间 房屋用途 房屋年限 房权所属 房屋户型 所在楼层 户型结构 套内面积(㎡) 建筑类型 房屋朝向 建成年代 装修情况 建筑结构 供暖方式 梯户比例 产权年限 配备电梯 xx1 xx2
0 大兴 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 297 2019-10-29 成交 格林云墅 3室1厅 89.95 300 608 1.0 4.0 43.0 6424 1.01E+11 商品房 2018/3/1 普通住宅 满两年 非共有 3室1厅1厨1卫 中楼层(共9层) 暂无数据 73.63 塔楼 南 北 2014 精装 钢混结构 集中供暖 一梯两户 70 有 NaN NaN
2 366 2019-10-29 成交 三羊里 2室1厅 89.79 368 31 0.0 3.0 4.0 118 1.01E+11 商品房 2019/9/29 普通住宅 满两年 非共有 2室1厅1厨1卫 中楼层(共6层) 平层 80.44 板楼 南 北 2009 其他 钢混结构 集中供暖 一梯两户 70 无 NaN NaN
查看数据整体结构
lianjia.info() #查看数据整体结构
结果:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 38393 entries, 0 to 38392 Data columns (total 32 columns): 成交价(万) 38393 non-null object 成交时间 38379 non-null object 所在小区 38379 non-null object 户型 38379 non-null object 建筑面积 38379 non-null object 挂牌价格(万) 38379 non-null object 成交周期(天) 38379 non-null object 调价(次) 38379 non-null float64 带看(次) 38379 non-null float64 关注(人) 38379 non-null float64 浏览(次 38379 non-null object 链家编号 38379 non-null object 交易权属 38379 non-null object 挂牌时间 38379 non-null object 房屋用途 38379 non-null object 房屋年限 38379 non-null object 房权所属 38379 non-null object 房屋户型 38379 non-null object 所在楼层 38379 non-null object 户型结构 38379 non-null object 套内面积(㎡) 38379 non-null object 建筑类型 38379 non-null object 房屋朝向 38379 non-null object 建成年代 38379 non-null object 装修情况 38379 non-null object 建筑结构 38379 non-null object 供暖方式 38379 non-null object 梯户比例 38379 non-null object 产权年限 38379 non-null object 配备电梯 38379 non-null object xx1 3022 non-null object xx2 3022 non-null object dtypes: float64(3), object(29) memory usage: 9.4+ MB
成交价比其他字段非空数据要多,经查看原始表是因为大区存放在这个字段下。下面新增加一个大区字段。
lianjia["大区"] = lianjia["成交价(万)"] # 把 "成交价(万)" 这个字段的值赋值给 大区 这个字段
lianjia[["大区", "成交价(万)"]].head(10) #查看新增加字段
大区 成交价(万)
0 大兴 大兴
1 297 297
2 366 366
3 226 226
4 548 548
5 245 245
6 254 254
7 193 193
8 280 280
9 347 347
将大区字段中的数字替换为区名
lianjia["大区"] = lianjia["大区"].str.replace("-", "").replace("\d+", np.nan, regex=True) #去掉特殊符号-,将数字替换为nan lianjia["大区"].fillna(inplace=True, method="ffill") #将空值替换为前面的区名 lianjia.dropna(axis=0, inplace=True, thresh=20) #删除大区nan nan nan这样的行 # 将大区字段挪到第一列 lianjia_daqu = lianjia["大区"] lianjia.drop("大区", axis=1, inplace=True) lianjia.insert(0, "大区", lianjia_daqu) display(lianjia[["大区", "成交时间", "所在小区", "户型", "建筑面积"]].sample(10))#查看结果 大区 成交时间 所在小区 户型 建筑面积 6654 房山 2019-08 成交 碧桂园小区二区 1室0厅 58 15175 门头沟 2019-09 成交 新桥路小区 2室1厅 51.47 29127 西城 2019-05-12 成交 龙爪槐胡同 2室1厅 67.36 25210 通州 2019-06 成交 海棠湾一期 2室2厅 91.07 1797 大兴 2019-07 成交 丽园C区 3室2厅 141.48 33204 昌平 2019.09.03 新龙城 2室1厅 100.2 36054 东城 1905/7/11 前门东大街 3室1厅 69.79 5760 朝阳 2019-09-04 成交 富力城D区 2室1厅 85.04 12756 海淀 2019-09-30 成交 定慧北里 3室1厅 82.44 32146 亦庄开发区 2017-03-07 成交 荣京丽都 1室0厅 41.44
从前面的info列表可以看到xx1,xx2两个字段绝大多数是缺失值
display(lianjia["xx1"].unique()) # 查看xx1去重后的值
display(lianjia["xx2"].unique()) # 查看xx2去重后的值
array([nan, '70', '40', '50', '未知'], dtype=object)
array([nan, '有', '无', '暂无数据'], dtype=object)
### 删除 xx1, xx2 这两列
lianjia.drop(axis=1, columns=["xx1", "xx2"], inplace=True) #删除xx1,xx2这两列
所有字段均无缺失值
<class 'pandas.core.frame.DataFrame'> Int64Index: 35357 entries, 1 to 35369 Data columns (total 31 columns): 大区 35357 non-null object 成交价(万) 35357 non-null object 成交时间 35357 non-null object 所在小区 35357 non-null object 户型 35357 non-null object 建筑面积 35357 non-null object 挂牌价格(万) 35357 non-null object 成交周期(天) 35357 non-null object 调价(次) 35357 non-null float64 带看(次) 35357 non-null float64 关注(人) 35357 non-null float64 浏览(次 35357 non-null object 链家编号 35357 non-null object 交易权属 35357 non-null object 挂牌时间 35357 non-null object 房屋用途 35357 non-null object 房屋年限 35357 non-null object 房权所属 35357 non-null object 房屋户型 35357 non-null object 所在楼层 35357 non-null object 户型结构 35357 non-null object 套内面积(㎡) 35357 non-null object 建筑类型 35357 non-null object 房屋朝向 35357 non-null object 建成年代 35357 non-null object 装修情况 35357 non-null object 建筑结构 35357 non-null object 供暖方式 35357 non-null object 梯户比例 35357 non-null object 产权年限 35357 non-null object 配备电梯 35357 non-null object dtypes: float64(3), object(28) memory usage: 8.6+ MB
#查看跟日期有关的所有字段
display(lianjia[["成交时间", "成交周期(天)", "挂牌时间"]].sample(10))
display(lianjia[["成交时间", "成交周期(天)", "挂牌时间"]].dtypes)
# 先把 "成交时间" 这个字段上的 " 成交" 字符串去掉
lianjia["成交时间"] = lianjia["成交时间"].str.replace(" 成交", "")
# 统一时间格式
lianjia["成交时间"] = pd.to_datetime(lianjia["成交时间"])
lianjia["挂牌时间"] = pd.to_datetime(lianjia["挂牌时间"])
# 计算成交周期,并转换为天数
lianjia["成交周期(新)"] = lianjia["成交时间"] - lianjia["挂牌时间"]
lianjia["成交周期(天)"] = lianjia["成交周期(新)"].dt.days
#获取成交时间年、周
lianjia["成交时间(年)"] = lianjia["成交时间"].dt.year
lianjia["成交时间(周)"] = lianjia["成交时间"].dt.week
lianjia[["大区", "所在小区", "户型", "建筑面积"]].loc[[30922, 32852, 8784, 31629]]
大区 所在小区 户型 建筑面积
30922 亦庄开发区 林肯公园二期C区 #NAME? --
32852 昌平 首开智慧社 车位 6.99 户型结构
8784 房山 行宫园一里 #NAME? --
31629 亦庄开发区 新海南里 #NAME? --
#删除户型为车位的行,并不需要分析车位,而且对应的建筑面积也不规范
lianjia.drop(lianjia[(lianjia["户型"] == "车位")].index, inplace=True)
#删除户型为#NAME?,删除建筑面积为--的行
lianjia.drop(lianjia[(lianjia["户型"] == "#NAME?") | (lianjia["建筑面积"] == "--")].index, inplace=True)
# 建筑面积中文字符和空格变为空,并转换为浮点值
lianjia["建筑面积"] = lianjia["建筑面积"].str.replace("[\s\u4e00-\u9fa5]", "", regex=True)
lianjia["建筑面积"] = lianjia["建筑面积"].astype(np.float32)
lianjia[["成交价(万)", "挂牌价格(万)", "调价(次)", "带看(次)", "关注(人)", "浏览(次"]].sample(10)
成交价(万) 挂牌价格(万)调价(次)带看(次) 关注(人)浏览(次
10648 290 290 0.0 2.0 8.0 288
30125 363 390 0.0 6.0 14.0 3680
14244 648 680 0.0 0.0 0.0 暂无数据
21619 209-214 226 1.0 2.0 3.0 155
27061 327-334 355 1.0 6.0 132.0 1423
4598 499 480 0.0 27.0 42.0 924
35070 805 850 1.0 24.0 51.0 13856
5253 437 437 1.0 46.0 82.0 962
1369 293-324 暂无数据 0.0 0.0 0.0 暂无数据
12051 586 600 1.0 84.0 55.0 5399
# 成交价类似293-324,取两个数字的平均值 #函数按照-拆分,如果是一个数字则直接返回该数字,如果是两个数字则计算平均值后返回 def handle(value): values2 = str(value).split("-") if len(values2) == 1: return value else: result = (float(values2[0]) + float(values2[1])) / 2 return str(result) lianjia["成交价(万)"] = lianjia["成交价(万)"].map(handle) # 调用函数进行映射 lianjia["成交价(万)"] = lianjia["成交价(万)"].astype(np.float32) #处理 lianjia["挂牌价格(万)"] = lianjia["挂牌价格(万)"].str.replace("暂无数据", "0") lianjia["浏览(次"] = lianjia["浏览(次"].str.replace("暂无数据", "0") #转换数据类型 lianjia["挂牌价格(万)"] = lianjia["挂牌价格(万)"].astype(np.float32) lianjia["成交周期(天)"] = lianjia["成交周期(天)"].astype(np.float32) lianjia["浏览(次"] = lianjia["浏览(次"].astype(np.float32)
lianjia[[ "链家编号", "交易权属", "房屋用途", "房屋年限"]].sample(10) 链家编号 交易权属 房屋用途 房屋年限 30379 1.01E+11 商品房 普通住宅 暂无数据 32736 1.01E+11 商品房 普通住宅 暂无数据 4078 1.01E+11 商品房 普通住宅 满五年 9624 1.01E+11 商品房 普通住宅 满五年 7003 1.01E+11 商品房 普通住宅 满五年 31937 1.01E+11 商品房 公寓 暂无数据 13796 1.01E+11 商品房 普通住宅 暂无数据 5560 1.01E+11 已购公房 普通住宅 满五年 11346 1.01E+11 商品房 普通住宅 满五年 598 1.01E+11 商品房 普通住宅 满五年 lianjia[[ "房权所属", "房屋户型", "所在楼层", "户型结构", "套内面积(㎡)"]].sample(10) 房权所属 房屋户型 所在楼层 户型结构 套内面积(㎡) 29047 非共有 2室2厅1厨1卫 低楼层(共7层) 平层 暂无数据 17853 共有 2室1厅1厨1卫 顶层(共6层) 平层 暂无数据 29596 暂无数据 2室1厅1厨2卫 中楼层(共19层) 平层 暂无数据 14038 非共有 2室1厅1厨1卫 高楼层(共18层) 暂无数据 暂无数 27348 非共有 1室0厅1厨1卫 中楼层(共26层) 暂无数据 18.53 31512 非共有 2室1厅1厨1卫 中楼层(共6层) 平层 77.18 25027 非共有 1室0厅1厨1卫 低楼层(共7层) 暂无数据 暂无数据 687 非共有 1室1厅1厨1卫 中楼层(共15层) 平层 46.22 3567 共有 3室1厅1厨1卫 低楼层(共6层) 平层 暂无数据 15897 非共有 1室1厅1厨1卫 底层(共6层) 平层 暂无数据 #使用相同户型面积填充套内面积 temp_df1 = lianjia[~lianjia["套内面积(㎡)"].str.contains("暂无|建|数")][["房权所属", "房屋户型", "所在楼层", "户型结构", "套内面积(㎡)"]] temp_df2 = lianjia[lianjia["套内面积(㎡)"].str.contains("暂无|建|数")][["房权所属", "房屋户型", "所在楼层", "户型结构", "套内面积(㎡)"]] temp_df2["套内面积(㎡)"] = temp_df2["套内面积(㎡)"].replace("暂无数据", np.nan) temp_df2["套内面积(㎡)"] = temp_df2["套内面积(㎡)"].replace("暂无数", np.nan) temp_df2["套内面积(㎡)"] = temp_df2["套内面积(㎡)"].replace("\d+\s+.*", np.nan, regex=True) lianjia_new5 = pd.concat((temp_df1, temp_df2)) lianjia[["房权所属", "房屋户型", "所在楼层", "户型结构", "套内面积(㎡)"]] = lianjia_new5[["房权所属", "房屋户型", "所在楼层", "户型结构", "套内面积(㎡)"]] lianjia[["房权所属", "房屋户型", "所在楼层", "户型结构", "套内面积(㎡)"]].tail(10) 房权所属 房屋户型 所在楼层 户型结构 套内面积(㎡) 35360 暂无数据 2室1厅1厨1卫 中楼层(共6层) 平层 NaN 35361 非共有 2室2厅1厨1卫 底层(共6层) 平层 NaN 35362 非共有 3室1厅1厨2卫 高楼层(共21层) 平层 117.11 35363 暂无数据 1室1厅1厨1卫 底层(共5层) 平层 NaN 35364 非共有 3室1厅1厨1卫 高楼层(共6层) 平层 84.11 35365 暂无数据 3室1厅1厨1卫 高楼层(共6层) 平层 NaN 35366 非共有 1室0厅0厨1卫 低楼层(共28层) 平层 NaN 35367 暂无数据 1室0厅0厨1卫 低楼层(共28层) 平层 NaN 35368 非共有 1室2厅1厨1卫 高楼层(共6层) 平层 NaN 35369 非共有 2室2厅1厨2卫 高楼层(共6层) 平层 NaN # 类型转换 lianjia["套内面积(㎡)"] = lianjia["套内面积(㎡)"].astype(np.float32) # 使用每种户型的面积的平均值来进行替换 lianjia["套内面积(㎡)"] = lianjia["套内面积(㎡)"].fillna( lianjia.groupby("房屋户型")["套内面积(㎡)"].transform("mean"))
lianjia[[ "建筑类型", "房屋朝向", "建成年代", "装修情况", "建筑结构"]].sample(10) 建筑类型 房屋朝向 建成年代 装修情况 建筑结构 28721 板楼 南 北 1960 简装 混合结构 21679 板楼 南 北 2009 其他 钢混结构 20617 板楼 东 西 2004 简装 混合结构 30381 板楼 南 北 2001 简装 混合结构 32116 板楼 南 北 2013 简装 钢混结构 2539 板楼 南 北 2003 精装 混合结构 15401 板楼 南 北 1980 精装 混合结构 21363 板楼 南 北 2012 简装 钢混结构 13273 板楼 南 北 1996 其他 混合结构 5942 板楼 南 西 北 2007 其他 钢混结构 lianjia[[ "供暖方式", "梯户比例", "产权年限", "配备电梯"]].sample(10) 供暖方式 梯户比例 产权年限 配备电梯 22469 集中供暖 一梯四户 70 无 29064 集中供暖 两梯七户 70 有 23215 集中供暖 一梯三户 70 无 26982 集中供暖 一梯三户 70 无 3056 集中供暖 一梯三户 70 有 25895 集中供暖 一梯两户 70 无 33206 自供暖 一梯四户 70 无 31214 自供暖 两梯三户 70 有 7638 集中供暖 一梯九户 70 无 23420 集中供暖 一梯三户 70 无 #产权年限未知的用70填充 lianjia["产权年限"] = lianjia["产权年限"].str.replace("未知", "70") lianjia["产权年限"] = lianjia["产权年限"].astype(np.int32) # 删除 成交周期(新) 这个字段 lianjia.drop("成交周期(新)", axis=1, inplace=True)
lianjia.info() <class 'pandas.core.frame.DataFrame'> Int64Index: 34520 entries, 1 to 35369 Data columns (total 34 columns): 大区 34520 non-null object 成交价(万) 34520 non-null float32 成交时间 34520 non-null datetime64[ns] 所在小区 34520 non-null object 户型 34520 non-null object 建筑面积 34520 non-null float32 挂牌价格(万) 34520 non-null float32 成交周期(天) 34520 non-null float32 调价(次) 34520 non-null float64 带看(次) 34520 non-null float64 关注(人) 34520 non-null float64 浏览(次 34520 non-null float32 链家编号 34520 non-null object 交易权属 34520 non-null object 挂牌时间 34520 non-null datetime64[ns] 房屋用途 34520 non-null object 房屋年限 34520 non-null object 房权所属 34520 non-null object 房屋户型 34520 non-null object 所在楼层 34520 non-null object 户型结构 34520 non-null object 套内面积(㎡) 34475 non-null float32 建筑类型 34520 non-null object 房屋朝向 34520 non-null object 建成年代 34520 non-null object 装修情况 34520 non-null object 建筑结构 34520 non-null object 供暖方式 34520 non-null object 梯户比例 34520 non-null object 产权年限 34520 non-null int32 配备电梯 34520 non-null object 成交周期(新) 34520 non-null timedelta64[ns] 成交时间(年) 34520 non-null int64 成交时间(周) 34520 non-null int64 dtypes: datetime64[ns](2), float32(6), float64(3), int32(1), int64(2), object(19), timedelta64[ns](1) memory usage: 8.3+ MB lianjia.sample(3) 大区 成交价(万) 成交时间 所在小区 户型 建筑面积 挂牌价格(万) 成交周期(天) 调价(次) 带看(次) 关注(人) 浏览(次 链家编号 交易权属 挂牌时间 房屋用途 房屋年限 房权所属 房屋户型 所在楼层 户型结构 套内面积(㎡) 建筑类型 房屋朝向 建成年代 装修情况 建筑结构 供暖方式 梯户比例 产权年限 配备电梯 成交周期(新) 成交时间(年) 成交时间(周) 17501 门头沟 160.0 2017-12-20 双峪路小区 2室1厅 53.779999 180.0 151.0 1.0 85.0 144.0 8739.0 1.01E+11 商品房 2017-07-22 普通住宅 满两年 非共有 2室1厅1厨1卫 底层(共5层) 平层 38.150002 板楼 南 北 1980 简装 混合结构 集中供暖 一梯三户 70 无 151 days 2017 51 1675 大兴 203.0 2019-07-11 康泰园 1室1厅 60.099998 203.0 492.0 1.0 62.0 192.0 10405.0 1.01E+11 商品房 2018-03-06 普通住宅 暂无数据 非共有 1室1厅1厨1卫 底层(共18层) 平层 46.389999 板楼 南 北 2009 简装 钢混结构 集中供暖 一梯两户 70 有 492 days 2019 28 14601 海淀 938.5 2019-08-01 今日家园 4室1厅 179.509995 1380.0 66.0 1.0 21.0 17.0 842.0 1.01E+11 商品房 2019-05-27 普通住宅 暂无数据 非共有 4室1厅1厨3卫 中楼层(共9层) 跃层 156.351532 板楼 南 北 2000 精装 钢混结构 集中供暖 一梯六户 70 有 66 days 2019 31
# 总建筑面积
lianjia["建筑面积"].sum()
2961666.2
# 总成交金额
lianjia["成交价(万)"].sum()
15145877.0
# 计算每平米单价
result = lianjia["成交价(万)"].sum() / lianjia["建筑面积"].sum()
display(str(result) + "万")
'5.1139717万'
result_df = lianjia.groupby("大区")["建筑面积"].agg({"建筑面积":"sum"}) result_df = result_df.sort_values("建筑面积", ascending=False) display(result_df) 建筑面积 大区 亦庄开发区 300565.843750 昌平 289278.125000 顺义 286023.375000 房山 259237.218750 大兴 253338.468750 通州 251888.953125 朝阳 247918.687500 海淀 238134.578125 门头沟 230544.812500 丰台 229984.734375 西城 202130.656250 石景山 165606.250000 其他(平谷密云怀柔延庆) 7014.509766
result_df = lianjia.groupby(["成交时间(年)","成交时间(周)"]).size() display(result_df.loc[2019].head(60)) 成交时间(周) 1 459 2 110 3 144 4 157 5 283 6 1 7 46 8 104 9 620 10 190 11 176 12 151 13 171 14 690 15 270 16 286 17 292 18 1252 19 365 20 445 21 439 22 1642 23 418 24 470 25 486 26 651 27 1625 28 602 29 700 30 913 31 2432 32 660 33 733 34 769 35 2596 36 956 37 1007 38 994 39 1229 40 1541 41 861 42 988 43 1157 44 508 dtype: int64
year = 2019 mpl.rcParams["font.size"] = 12 plt.figure(figsize=(12,6)) plt.bar(result_df.loc[year].index, result_df.loc[year].values) plt.xticks(result_df.loc[year].index) plt.yticks(np.linspace(0, 2750, 20)) font = {"family":"Kaiti", "style":"oblique", "weight":"normal", "color":"green", "size": 20 } plt.xlabel("周", fontdict=font) plt.ylabel("成交数", fontdict=font) plt.grid(axis="y", color="g", ls=":", lw=1) plt.title(str(year) + "年北京市各周二手房成交量", fontdict=font, color= "r")
成交量在每四周左右会有一个大幅上涨。有可能是在月初或者月末的时间点,需要进一步探查。
result_df = lianjia.groupby(["成交时间(年)","成交时间(周)"])[["成交价(万)", "建筑面积"]].agg({"成交价(万)":"sum", "建筑面积":"sum"})
result_df["单位均价"] = result_df["成交价(万)"] / result_df["建筑面积"]
display(result_df.loc[2019].head(60))
year = 2019
mpl.rcParams["font.size"] = 12
plt.figure(figsize=(12,6))
plt.plot(result_df.loc[year].index, result_df.loc[year]["单位均价"])
单位均价程上升趋势,到20周后保持平稳。
result_df2= lianjia.groupby(["成交时间(年)","成交时间(周)"])["成交周期(天)"].agg( {"成交周期(天)":"mean"}) display(result_df2.loc[2019].head(60)) year = 2019 mpl.rcParams["font.size"] = 12 plt.figure(figsize=(12,6)) plt.bar(result_df2.loc[year].index, result_df2.loc[year]["成交周期(天)"]) plt.xticks(result_df.loc[year].index) plt.yticks(np.linspace(0, 225, 10)) font = {"family":"Kaiti", "style":"oblique", "weight":"normal", "color":"green", "size": 20 } plt.xlabel("周", fontdict=font) plt.ylabel("成交周期(天)", fontdict=font) plt.grid(axis="y", color="g", ls=":", lw=1) plt.title(str(year) + "年北京市各周二手房成交周期", fontdict=font, color= "r")
第6、18、22、27、31、35、40周成交周期较长还需进一步分析
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。