数分笔记整理22 - 数据处理项目 - 中国姓氏排行研究 & 房价影响因素挖掘

【项目09】 中国姓氏排行研究

'''
【项目09】  中国姓氏排行研究

作业要求
1、数据清洗、整合
要求:
① 将“data01”、“data02”分别读取,并且合并成一个数据
② 结合“户籍地城市编号”及“中国城市代码对照表”数据,将城市经纬度连接进数据中
③ 分别提取“工作地”中的省、市
提示:
① 可以先读取“data01”、“data02”,然后用pd.concat()来连接数据
② 新建字段“工作地-省”,“工作地-市”,“工作地-区县”,如果数据中“工作地”字段无法提取省和市,则用“未识别”填充单元格
   * 通过查看识别后的单元格,如果字数超过5则为“未识别”

2、查看姓氏“普遍指数”,普遍指数=姓氏人口数量
要求:
① 将数据按照“姓”做统计,找到数量最多的TOP20
② 分别制作图表,查看姓氏TOP20的数量及占比
   * 建议用bokeh出柱状图,并且为联动图表
③ 查看“王”姓的全国分布
   * 这里导出excel高版本文件,用powermap查看,绘制密度图
   * 同时可以尝试用echarts绘制空间柱状图来查看
④ 查看“姬”姓的全国分布
   * 这里导出excel高版本文件,用powermap查看,绘制密度图
   * 同时可以尝试用echarts绘制空间柱状图来查看
提示:
① bokeh中绘制联动图表时用gridplot
② powermap需要office2016的excel才会有,并且必须存储xlsx格式
③ powermap中需要通过在“值”中设置“姓的计数”才能正确显示热力图
④ powermap中可以通过“主题”来调节配色风格 / “平面地图”选项来调整球面可视化或者平面可视化
⑤ echarts绘制图表之前,需要对数据按照“lng”(或者“lat”)汇总,得到同一个地点的该姓氏人数,然后绘图
⑥ ecahrts通过设置以下参数来达到效果:视角远近、点柱大小

3、查看姓氏“奔波指数”,奔波指数=姓氏人均迁徙距离。迁徙距离为户籍地所在地级市与现居住地所在地级市的距离。
要求:
① 根据识别的工作地,通过Geocoding查询到对应坐标
② 选择一个姓氏,计算并查看其姓氏的奔波指数,并计算该姓氏的人均通勤距离
   * 在python中筛选数据之后,qgis内做空间分析
③ 按照起点和终点做计数,汇总同一个迁徙路径的数据
④ 通过echart制作通勤OD图
   * 可以将生成的line文件导出geojson,用空间线性轨迹图来表示
   * 这里线的valye为该迁徙路径的汇总计数   
提示:
① 可以筛选一些好玩的姓氏:汤、朴、廉、何、叶、冉等等 
② 需要对数据的工作地进行筛选,其中“工作地_市”、“工作地_区县”未识别的数据删除掉
③ 导出数据时,尽量columns名用全英文,避免qgis中出现乱码
④ 计算人均通勤距离的时候,需要删除掉户籍地与工作地相同的人(未迁移的人)
⑤ 在官网metrodata.cn的小工具中找到geocoding
⑥ qgis中需要安装插件“LinePlotter”来转线,并在qgis中计算平均通勤距离(需要投影,投影经度带可选48)
⑦ shapefile转geojson时:
   * 注意shapefile文件要投影回wgs84地理坐标系
   * 删除乱码子弹
   * 删除路径距离为0的数据


'''

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline

import warnings
warnings.filterwarnings('ignore') 
# 不发出警告

from bokeh.io import output_notebook
output_notebook()
# 导入notebook绘图模块

from bokeh.plotting import figure,show
from bokeh.models import ColumnDataSource
# 导入图表绘制、图标展示模块
# 导入ColumnDataSource模块

'''
1、数据清洗、整合
要求:
① 将“data01”、“data02”分别读取,并且合并成一个数据
② 结合“户籍地城市编号”及“中国城市代码对照表”数据,将城市经纬度连接进数据中
③ 分别提取“工作地”中的省、市
提示:
① 可以先读取“data01”、“data02”,然后用pd.concat()来连接数据
② 新建字段“工作地-省”,“工作地-市”,“工作地-区县”,如果数据中“工作地”字段无法提取省和市,则用“未识别”填充单元格
   * 通过查看识别后的单元格,如果字数超过5则为“未识别”

'''

# 查看数据,数据清洗

import os
os.chdir('C:/Users/Hjx/Desktop/项目09中国姓氏排行研究/')
# 创建工作路径

df01 = pd.read_csv('data01.csv',encoding = 'utf-8')
df02 = pd.read_csv('data02.csv',encoding = 'utf-8')
df_city = pd.read_excel('中国行政代码对照表.xlsx')
# 读取数据

df = pd.concat([df01,df02])
df = pd.merge(df,df_city,left_on='户籍地城市编号',right_on = '行政编码')  
df['工作地'] = df['工作地'].str[:15]   # 只提取工作地前15个字符即可
del df['行政编码']
del df['户籍地城市编号']
# 合并数据,添加经纬度字段
# 删除无用字段

print('读取数据共%i条' % len(df))
df.head(20)

# 分别提取“工作地”中的省、市、区县
# 新建字段“工作地-省”,“工作地-市”,“工作地-区县”,如果数据中“工作地”字段无法提取省和市,则用“未识别”填充单元格
# *通过查看识别后的单元格,如果字数超过5则为“未识别”

df['工作地_省'] = df['工作地'].str.split('省').str[0]  
# 识别工作地-省

df['工作地_市'] = df['工作地'].str.split('省').str[1].str.split('市').str[0]             
df['工作地_市'][df['工作地_省'].str.len() > 5] = df['工作地_省'].str.split('市').str[0]  
# 识别工作地-市
# 在未识别出省的数据中,可能会有市的信息

df['工作地_区县'] = ''
df['工作地_区县'][(df['工作地_市'].str.len() < 5)&(df['工作地'].str.contains('区'))] = df['工作地'].str.split('市').str[1].str.split('区').str[0] + '区'  
df['工作地_区县'][(df['工作地_市'].str.len() > 5)&(df['工作地'].str.contains('区'))] = df['工作地'].str.split('区').str[0] + '区'  
df['工作地_区县'][(df['工作地_市'].str.len() < 5)&(df['工作地'].str.contains('县'))] = df['工作地'].str.split('市').str[1].str.split('县').str[0] + '县'  
df['工作地_区县'][(df['工作地_市'].str.len() > 5)&(df['工作地'].str.contains('县'))] = df['工作地'].str.split('县').str[0] + '县'
# 识别工作地-区县

df['工作地_省'][df['工作地_省'].str.len() > 5] = '未识别'
df['工作地_市'][df['工作地_市'].str.len() > 5] = '未识别'
df['工作地_区县'][(df['工作地_区县'].str.len() > 5) | (df['工作地_区县'].str.len() < 2)] = '未识别'
# 整理未识别单元格

df.columns = ['姓','工作地','户籍所在地_省','户籍所在地_市','户籍所在地_区县','户籍所在地_lng','户籍所在地_lat',
              '工作地_省','工作地_市','工作地_区县']
print('读取数据共%i条' % len(df))
# 数据整理
df.head(20)

'''
2、查看姓氏“普遍指数”,普遍指数=姓氏人口数量
要求:
① 将数据按照“姓”做统计,找到数量最多的TOP20
② 分别制作图表,查看姓氏TOP20的数量及占比
   * 建议用bokeh出柱状图,并且为联动图表
③ 查看“王”姓的全国分布
   * 这里导出excel高版本文件,用powermap查看,绘制密度图
   * 同时可以尝试用echarts绘制空间柱状图来查看
④ 查看“姬”姓的全国分布
   * 这里导出excel高版本文件,用powermap查看,绘制密度图
   * 同时可以尝试用echarts绘制空间柱状图来查看
提示:
① bokeh中绘制联动图表时用gridplot
② powermap需要office2016的excel才会有,并且必须存储xlsx格式
③ powermap中需要通过在“值”中设置“姓的计数”才能正确显示热力图
④ powermap中可以通过“主题”来调节配色风格 / “平面地图”选项来调整球面可视化或者平面可视化
⑤ echarts绘制图表之前,需要对数据按照“lng”(或者“lat”)汇总,得到同一个地点的该姓氏人数,然后绘图
⑥ ecahrts通过设置以下参数来达到效果:视角远近、点柱大小

'''
# 将数据按照“姓”做统计,找到数量最多的TOP10

name_count = df['姓'].value_counts()[:20]
result1_01 = pd.DataFrame({'count':name_count, 'count_pre':name_count/name_count.sum()})
# 筛选top20的姓氏,计数并计算占比
result1_01

# bokeh出联动柱状图

from bokeh.models import HoverTool
from bokeh.layouts import gridplot
# 导入模块

name_lst = result1_01.index.tolist()
source = ColumnDataSource(result1_01)
# 创建ColumnDataSource数据

hover1 = HoverTool(tooltips=[("姓氏计数", "@count")])  # 设置标签显示内容
result1 = figure(plot_width=800, plot_height=250,x_range = name_lst,
                 title="中国姓氏TOP20 - 计数" ,
                 tools=[hover1,'reset,xwheel_zoom,pan'])   # 构建绘图空间
result1.vbar(x='index', top='count', source=source,width=0.9, alpha = 0.7,color = 'red')   
result1.ygrid.grid_line_dash = [6, 4]
result1.xgrid.grid_line_dash = [6, 4]
# 柱状图1

hover2 = HoverTool(tooltips=[("姓氏占比", "@count_pre")])  # 设置标签显示内容
result2 = figure(plot_width=800, plot_height=250,x_range = result1.x_range,
                 title="中国姓氏TOP20 - 占比" ,
                 tools=[hover2,'reset,xwheel_zoom,pan']) 
result2.vbar(x='index', top='count_pre', source=source,width=0.9, alpha = 0.7,color = 'green')   
result2.ygrid.grid_line_dash = [6, 4]
result2.xgrid.grid_line_dash = [6, 4]
# 柱状图2

p = gridplot([[result1], [result2]])
# 组合图表
show(p)

# 查看“王”姓的全国分布

data_wang1 = df[df['姓'] == '王']
writer = pd.ExcelWriter('C:/Users/Hjx/Desktop/wang1.xlsx')
data_wang1.to_excel(writer,'sheet1',index=False)
writer.save()
# 导出数据1

data_wang2 = data_wang1.groupby(['姓','户籍所在地_lng','户籍所在地_lat'])['户籍所在地_市'].count()
data_wang2 = data_wang2.reset_index()
writer = pd.ExcelWriter('C:/Users/Hjx/Desktop/wang2.xlsx')
data_wang2.to_excel(writer,'sheet1',index=False)
writer.save()
# 导出数据2

print('导出完成!')

# 结论 → 老王们无处不在啊!

# 查看“姬”姓的全国分布

data_ji1 = df[df['姓'] == '姬']
writer = pd.ExcelWriter('C:/Users/Hjx/Desktop/ji1.xlsx')
data_ji1.to_excel(writer,'sheet1',index=False)
writer.save()
# 导出数据1

data_ji2 = data_ji1.groupby(['姓','户籍所在地_lng','户籍所在地_lat'])['户籍所在地_市'].count()
data_ji2 = data_ji2.reset_index()
writer = pd.ExcelWriter('C:/Users/Hjx/Desktop/ji2.xlsx')
data_ji2.to_excel(writer,'sheet1',index=False)
writer.save()
# 导出数据2

print('导出完成!')

# 结论 → “姬”传说是黄帝之姓、周朝国姓,并且是10大姓中7个姓的起源
# 千年过去,姬姓后嗣多已改为他姓,开枝散叶。而还保留着这个古老姓氏的人口,也仍然栖息在古老中华文明的发源地——河南。

'''
3、查看姓氏“奔波指数”,奔波指数=姓氏人均迁徙距离。迁徙距离为户籍地所在地级市与现居住地所在地级市的距离。
要求:
① 根据识别的工作地,通过Geocoding查询到对应坐标
② 选择一个姓氏,计算并查看其姓氏的奔波指数,并计算该姓氏的人均通勤距离
   * 在python中筛选数据之后,qgis内做空间分析
③ 按照起点和终点做计数,汇总同一个迁徙路径的数据
④ 通过echart制作通勤OD图
   * 可以将生成的line文件导出geojson,用空间线性轨迹图来表示
   * 这里线的valye为该迁徙路径的汇总计数   
提示:
① 可以筛选一些好玩的姓氏:汤、朴、廉、何、叶、冉等等 
② 需要对数据的工作地进行筛选,其中“工作地_市”、“工作地_区县”未识别的数据删除掉
③ 导出数据时,尽量columns名用全英文,避免qgis中出现乱码
④ 计算人均通勤距离的时候,需要删除掉户籍地与工作地相同的人(未迁移的人)
⑤ 在官网metrodata.cn的小工具中找到geocoding
⑥ qgis中需要安装插件“LinePlotter”来转线,并在qgis中计算平均通勤距离(需要投影,投影经度带可选48)
⑦ shapefile转geojson时,注意shapefile文件要投影回wgs84地理坐标系

'''

# 计算并查看“朴”姓氏的奔波指数

data_tang = df[['姓','户籍所在地_lng','户籍所在地_lat','工作地_市','工作地_区县']][df['姓'] == '汤']
data_tang = data_tang[data_tang['工作地_市'] != '未识别']
data_tang = data_tang[data_tang['工作地_区县'] != '未识别']
data_tang.columns = ['familyname','birth_lng','birth_lat','work_city','work_district']
# 筛选并清洗数据

writer = pd.ExcelWriter('C:/Users/Hjx/Desktop/tang.xlsx')
data_tang.to_excel(writer,'sheet1',index=False)
writer.save()
# 导出数据

print('数据条数为%i条' % len(data_tang))
data_tang.head(10)

【项目10】 房价影响因素挖掘

'''
【项目10】  房价影响因素挖掘

作业要求
1、数据清洗、整合
要求:
① 将“house_rent”、“house_sell”分别读取
② 分别计算平方米建筑面积的月租金、每平方米建筑面积的房价
③ 将数据按照小区名合并
提示:
① 删除缺失值
② 按照小区做均值分析

2、计算“房屋售租比”,并做初步判断
要求:
① 计算指标
② 绘制直方图、箱型图看“售租比”的一个数据分布情况
提示:
① “房屋售租比”=“每平方米建筑面积的房价”/“每平方米建筑面积的月租金” 
② 直方图bins数量大于80来作图

3、上海市人口密度、路网密度、餐饮价格和“房屋每平米均价”是否有关系呢?
要求:
① 首先,导出整理好的数据,并qgis中绘制空间格网图,查看房屋每平米均价、房屋每平米租金及售租比数据的空间分布
② 第二,空间统计,分别按照格网对人口密度、路网密度、餐饮价格进行指标统计并标准化
③ 第三,加载上海中心点point空间数据,计算每个网格到市中心距离
④ 第四,将空间格网的“房屋每平米均价”按照距市中心的距离排序,并制作散点图,看看能否挖掘出什么信息
   *** 这里市中心点坐标为:lng-353508.848122,lat-3456140.926976 (投影坐标系)
提示:
① 导出csv数据,用dataframe.to_csv()
② qgis加载数据后,以“net_population”为格网数据做空间统计
③ 注意qgis数据都为投影坐标系
④ 人口密度指标 → 已有“net_population”数据
   路网密度指标 → 以格网为空间单元,计算道路长度
   餐饮价格指标 → 以格网为空间单元,计算餐饮设施的人均均价数据
   *** 最后数据导入python中,标准化得分至0-1区间
   *** 导入数据后要填充空值为0
   *** qgis中可以用结果net数据作为下一个分析数据,以此将统计结果汇总在一张属性表内
   *** 格网数据在导出前,先转为点数据,并计算经纬度,这里用投影经纬度,好依据中心点坐标计算离市中心距离
⑤ 清洗数据,去除“售租比”为0的数据

4、按照离市中心距离每10km,分别再次判断人口密度、路网密度、餐饮价格和“房屋每平米均价”的相关程度
要求:
① 按照空间距离分别迭代计算三指标和“房屋每平米均价”的关系
② 绘制折线图查看:随着市中心距离增加,不同指标相关系系数变化情况
   *** 建议用bokeh制图
提示:
① 用for循环迭代空间距离,然后筛选数据并计算相关性
② bokeh可以通过多次调用figure.line()来绘制多条折线图

'''

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
% matplotlib inline

import warnings
warnings.filterwarnings('ignore') 
# 不发出警告

from bokeh.io import output_notebook
output_notebook()
# 导入notebook绘图模块

from bokeh.plotting import figure,show
from bokeh.models import ColumnDataSource
# 导入图表绘制、图标展示模块
# 导入ColumnDataSource模块

'''
1、数据清洗、整合
要求:
① 将“house_rent”、“house_sell”分别读取
② 分别计算平方米建筑面积的月租金、每平方米建筑面积的房价
③ 将数据按照小区名合并
提示:
① 删除缺失值
② 按照小区做均值分析

'''

# 查看数据,数据清洗

import os
os.chdir('C:/Users/Hjx/Desktop/项目10房价影响因素挖掘/')
# 创建工作路径

df01 = pd.read_csv('house_rent.csv',engine = 'python')
df02 = pd.read_csv('house_sell.csv',engine = 'python')
# 读取数据

df01.dropna(inplace = True)
df02.dropna(inplace = True)
# 删除缺失值

df01.head()
# 查看租房数据

df02.head()
# 查看售房数据

# 计算指标并按照租金、售价汇总
# ① 每平方米建筑面积的月租金
# ② 每平方米建筑面积的房价
# ③ 按照小区做均值分析

df01['rent_area'] = df01['price']/df01['area']
data_rent = df01[['community','rent_area','lng','lat']].groupby(by = 'community').mean()
data_sell = df02[['property_name','average_price','lng','lat']].groupby(by = 'property_name').mean()
data_rent.reset_index(inplace = True)
data_sell.reset_index(inplace = True)

print('租房数据量为%i条' % len(data_rent))
data_rent.head()
# 查看汇总后的租金

print('售房数据量为%i条' % len(data_sell))
data_sell.head()
# 查看汇总后的售价

# 数据合并

data = pd.merge(data_rent,data_sell,left_on ='community',right_on='property_name')
data = data[['community','rent_area','average_price','lng_x','lat_x']]
data.rename(columns={'average_price':'sell_area', 'lng_x':'lng', 'lat_x':'lat'}, inplace = True)  # 调整列名
print('合并后数据量为%i条' % len(data))
data.head(10)

'''
2、计算“房屋售租比”,并做初步判断
要求:
① 计算指标
② 绘制直方图、箱型图看“售租比”的一个数据分布情况
提示:
① “房屋售租比”=“每平方米建筑面积的房价”/“每平方米建筑面积的月租金” 
② 直方图bins数量大于80来作图

'''

# 计算“房屋售租比”,并做初步判断
# “房屋售租比”=“每平方米建筑面积的房价”/“每平方米建筑面积的月租金” 
# 含义可以简单理解为:“在保持当前的房价和租金条件不变的情况下,完全收回投资需要多少个月?”
#  **一般而言,按照国际经验,在一个房产运行情况良好的区域,应该可以在200-300个月内完全回收投资。
#  **如果少于200个月(17年)就能收回投资,说明这个地区有较高的投资价值;
#  **如果一个地区需要高于300个月(25年),比如1200个月(100年)才能回收投资,则说明该地区有潜在的房产泡沫风险。

data['sell_rent'] = data['sell_area']/data['rent_area']
print('上海房屋租售比中位数为%i个月' % data['sell_rent'].median())
# 计算售租比,及中位数

# 绘制直方图
data['sell_rent'].plot.hist(stacked=True,bins=100,color = 'green',alpha=0.5,grid=True,figsize = (10,4))
plt.title('房屋售租比-直方图')

# 绘制箱型图
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
data['sell_rent'].plot.box(vert=False, grid = True,color = color,figsize = (10,4)) 
plt.title('房屋售租比-箱型图')

# 一个尴尬的结论
# 如果按照中位数725个月来看,假设从25岁研究生一毕业,就立刻全款买了一套房,然后放出去收租
# 那么约85岁时,这60年来陆陆续续所收的租金总数就可以达到了25岁时买房所付的钱啦
# **这里还没考虑净现值折算问题
# ① 如果仅靠租金收入的话,上海全市平均回收投资需要725个月。而这种格局的维持,必须有赖于购房者对上海的房价上升的持续预期。
#    也就是说,在上海,投资房产绝不是利率收益,而是预期收益(其实城市越小租金回报反而越高)
# ② 上海不是这么看住房投资的(绝大多数房子房租收入跑不赢商贷利率,否则按照这个思路看那肯定是买一个亏一个)

'''
3、上海市人口密度、路网密度、餐饮价格和“房屋每平米均价”是否有关系呢?
要求:
① 首先,导出整理好的数据,并qgis中绘制空间格网图,查看房屋每平米均价、房屋每平米租金及售租比数据的空间分布
② 第二,空间统计,分别按照格网对人口密度、路网密度、餐饮价格进行指标统计并标准化
③ 第三,加载上海中心点point空间数据,计算每个网格到市中心距离
④ 第四,将空间格网的“房屋每平米均价”按照距市中心的距离排序,并制作散点图,看看能否挖掘出什么信息
   *** 这里市中心点坐标为:lng-353508.848122,lat-3456140.926976 (投影坐标系)
提示:
① 导出csv数据,用dataframe.to_csv()
② qgis加载数据后,以“net_population”为格网数据做空间统计
③ 注意qgis数据都为投影坐标系
④ 人口密度指标 → 已有“net_population”数据
   路网密度指标 → 以格网为空间单元,计算道路长度
   餐饮价格指标 → 以格网为空间单元,计算餐饮设施的人均均价数据
   *** 最后数据导入python中,标准化得分至0-1区间
   *** 导入数据后要填充空值为0
   *** qgis中可以用结果net数据作为下一个分析数据,以此将统计结果汇总在一张属性表内
   *** 格网数据在导出前,先转为点数据,并计算经纬度,这里用投影经纬度,好依据中心点坐标计算离市中心距离
⑤ 清洗数据,去除“售租比”为0的数据

'''

# 导出数据
data.to_csv('pro10data.csv')
print('finished!')

# 加载数据

data_q3 = pd.read_csv('C:/Users/Hjx/Desktop/result02.csv',engine = 'python')
data_q3.fillna(0,inplace = True)
data_q3.head(10)

# 指标标准化

def f1(data,col):
    return (data[col]-data[col].min())/(data[col].max()-data[col].min())
# 创建函数

data_q3['人口密度指标'] = f1(data_q3,'Z')
data_q3['路网密度指标'] = f1(data_q3,'roadlength')
data_q3['餐饮价格指标'] = f1(data_q3,'人均消费_')
# 指标标准化

data_q3['离市中心距离'] = ((data_q3['lng'] - 353508.848122)**2 + (data_q3['lat']-3456140.926976)**2)**0.5
# 计算市中心距离

data_q3_test = data_q3[['人口密度指标','路网密度指标','餐饮价格指标','sell_area_','离市中心距离']]
data_q3_test = data_q3_test[data_q3_test['sell_area_']>0].reset_index()
del data_q3_test['index']
data_q3_test.head(10)
# 清洗数据,去除“房屋每平米均价”为0的数据

# 查看指标相关性

fig = plt.figure(figsize = (10,9))
plt.subplots_adjust(hspace=0.4)
# 设置绘图空间

ax1 = fig.add_subplot(3,1,1)
ax1.scatter(data_q3_test['人口密度指标'], data_q3_test['sell_area_'],s = 2,alpha = 0.2)
plt.xlabel('人口密度指标')
plt.ylabel('房屋每平米均价')
plt.grid()
# 散点图1 → 人口密度指标 - 房屋每平米均价

ax2 = fig.add_subplot(3,1,2)
ax2.scatter(data_q3_test['路网密度指标'], data_q3_test['sell_area_'],s = 2,alpha = 0.2)
plt.xlabel('路网密度指标')
plt.ylabel('房屋每平米均价')
plt.grid()
# 散点图2 → 路网密度指标 - 房屋每平米均价

ax3 = fig.add_subplot(3,1,3)
ax3.scatter(data_q3_test['餐饮价格指标'], data_q3_test['sell_area_'],s = 2,alpha = 0.2)
plt.xlabel('餐饮价格指标')
plt.ylabel('房屋每平米均价')
plt.grid()
# 散点图3 → 餐饮价格指标 - 房屋每平米均价

# 查看“房屋每平米均价”与离市中心距离的关系

fig = plt.figure(figsize = (10,3))

data_q3_test2 = data_q3_test.sort_values('离市中心距离')
plt.scatter(data_q3_test2['离市中心距离'], data_q3_test2['sell_area_'],color = 'red',s = 3,alpha = 0.5)
plt.xlabel('离市中心距离')
plt.ylabel('房屋每平米均价')
plt.grid()
# 散点图4 → 离市中心距离 - 房屋每平米均价

data_q3_test.corr().loc['sell_area_']
# 查看指标之间相关系数

# 结论
# ① 在上海全市层面,“离市中心距离”与“房屋每平米均价”相关性最强
# ② “人口密度”及“路网密度”和“房屋每平米均价”为中等相关
# ③ “餐饮价格”与“房屋每平米均价”为弱相关
# ④ “房屋每平米均价”数据的离散程度却和空间距离有关 → “房屋每平米均价”越靠近市中心越离散,越远离市中心则越收敛

'''
4、按照离市中心距离每10km,分别再次判断人口密度、路网密度、餐饮价格和“房屋每平米均价”的相关程度
要求:
① 按照空间距离分别迭代计算三指标和“房屋每平米均价”的关系
② 绘制折线图查看:随着市中心距离增加,不同指标相关系系数变化情况
   *** 建议用bokeh制图
提示:
① 用for循环迭代空间距离,然后筛选数据并计算相关性
② bokeh可以通过多次调用figure.line()来绘制多条折线图

'''

# 按照空间距离分别迭代计算三指标和“房屋每平米均价”的关系

dis = []                # 距离空列表
rkmd_pearson = []       # 人口密度相关性系数空列表
lwmd_pearson = []       # 路网密度相关性系数空列表
cyjg_pearson = []       # 餐饮价格相关性系数空列表
zxjl_pearson = []       # 中心距离相关性系数空列表

for distance in range(10000,70000,10000):
    datai = data_q3_test[data_q3_test['离市中心距离'] <= distance]
    r_value = datai.corr().loc['sell_area_']
    # 筛选数据并计算相关系数
    dis.append(distance)
    rkmd_pearson.append(r_value.loc['人口密度指标'])
    lwmd_pearson.append(r_value.loc['路网密度指标'])
    cyjg_pearson.append(r_value.loc['餐饮价格指标'])
    zxjl_pearson.append(r_value.loc['离市中心距离'])
    # 添加列表值
    print('离市中心距离小于等于%i米:' % distance)
    print('数据量为%i条' % len(datai))
    print('人口密度与房屋每平米均价的相关系数为:%.3f' % r_value.loc['人口密度指标'])
    print('路网密度与房屋每平米均价的相关系数为:%.3f' % r_value.loc['路网密度指标'])
    print('餐饮价格与房屋每平米均价的相关系数为:%.3f' % r_value.loc['餐饮价格指标'])
    print('离市中心距离与房屋每平米均价的相关系数为:%.3f' % r_value.loc['离市中心距离'])
    print('-------\n')


# 绘制折线图查看:随着市中心距离增加,不同指标相关性系数变化情况

from bokeh.models import HoverTool

df_r = pd.DataFrame({'rkmd_pearson':rkmd_pearson,
                    'lwmd_pearson':lwmd_pearson,
                    'cyjg_pearson':cyjg_pearson,
                    'zxjl_pearson':zxjl_pearson},
                   index = dis)
source = ColumnDataSource(data=df_r)
# 创建数据

hover = HoverTool(tooltips=[("离市中心距离", "@index"),
                           ("人口密度相关系数", "@rkmd_pearson"),
                           ("道路密度相关系数", "@lwmd_pearson"),
                           ("餐饮价格相关系数", "@cyjg_pearson"),
                           ("中心距离相关系数", "@zxjl_pearson"),])  
# 设置标签显示内容
p = figure(plot_width=900, plot_height=350, title="随着市中心距离增加,不同指标相关性系数变化情况",
          tools=[hover,'box_select,reset,xwheel_zoom,pan,crosshair'])
# 构建绘图空间
p.line(x='index',y='rkmd_pearson',source = source,line_alpha = 0.8, line_color = 'green',line_dash = [15,4],legend="人口密度相关系数") 
p.circle(x='index',y='rkmd_pearson',source = source, size = 8,color = 'green',alpha = 0.8,legend="人口密度相关系数")
# 绘制折线图1
p.line(x='index',y='lwmd_pearson',source = source,line_alpha = 0.8, line_color = 'blue',line_dash = [15,4],legend="道路密度相关系数") 
p.circle(x='index',y='lwmd_pearson',source = source, size = 8,color = 'blue',alpha = 0.8,legend="道路密度相关系数")
# 绘制折线图2
p.line(x='index',y='cyjg_pearson',source = source,line_alpha = 0.8, line_color = 'black',line_dash = [15,4],legend="餐饮价格相关系数") 
p.circle(x='index',y='cyjg_pearson',source = source, size = 8,color = 'black',alpha = 0.8,legend="餐饮价格相关系数")
# 绘制折线图3
p.line(x='index',y='zxjl_pearson',source = source,line_alpha = 0.8, line_color = 'red',line_dash = [15,4],legend="中心距离相关系数") 
p.circle(x='index',y='zxjl_pearson',source = source, size = 8,color = 'red',alpha = 0.8,legend="中心距离相关系数")
# 绘制折线图4
p.legend.location = "center_right"
show(p)
# 绘制折线图

df_r

# 结论
# ① “人口密度”、“道路密度”、“离市中心距离”和“房屋均价”有着明显的相关性,而“餐饮价格”和“房屋均价”相关性较弱
# ② 随着离市中心的距离越远,指标的相关性在数据上体现更明显,而这个分界线大概在20-30km处,这正是上海中心城区和郊区的分界
#    → 上海房价市场的“中心城区-郊区”分化特征
# ③ 中心城区的房产市场对指标因素的影响更加敏锐,而郊区则更迟钝 → 越靠近市中心,影响因素越复杂
  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:点我我会动 设计师:我叫白小胖 返回首页
评论 3

打赏作者

sevieryang

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值