用Python 实现 POI类别与人口密度相关性

基于上一篇文章,python实现TF-IDF算法//www.greatytc.com/p/d9c303c29a67

  • 将POI的类别抽象为文档中的词
  • 划分的区域 抽象为 文档
    则可利用TFIDF的值 计算 与 人口密度的协方差 ,计算出二者的相关性,相关系数越大,则该类别对人口的影响越大 ,后续则可利用得出的结论 研究分析更多的问题。
    下面将给出用python实现TFIDF与人口密度的相关系数
image.png

TLij为相应的TFIDF值
PDj为第j区域的人口密度值

用python实现该公式:

def relative(tf_idf,idf,area):
    #N是第i类所占的分区数
    rou = {}
    for m in idf:
        #tl_pd 是(第i类所在分区的tf_idf值)与(第i类所在分区的栅格值)的乘积 后的求和  
        #sum_2 是 (第i类所在分区的tf_idf值)的平方的求和
        #sum 是 第 (第i类所在分区的tf_idf值)的求和
        #PD 是第i类所在的分区的栅格值的求和
        #PD_2 是第i类所在的分区的栅格值的平方的求和
        N = 0 
        tl_pd = 0
        sum_2 = 0
        sum = 0
        PD = 0
        PD_2 = 0
        for l in tf_idf:
            if m in tf_idf[l].keys():
                N += 1
        for l in tf_idf:
            if m in tf_idf[l].keys():
                sum_2+=tf_idf[l][m]*tf_idf[l][m]
                tl_pd+=tf_idf[l][m]*area[l]
                sum+=tf_idf[l][m]

        for l in tf_idf:
            if m in tf_idf[l].keys():
                PD += area[l]
                PD_2 += area[l]*area[l]
        fenzi = N*tl_pd-sum*PD
        fenmu = (N*sum_2-sum*sum)**0.5- (N*PD_2-PD*PD)**0.5
        poi_md = fenzi/fenmu
        rou[m] = poi_md
     
    return rou

完整的代码如下:
输入数据为:

data1.json
{
  "id":POI的编号
  "type":POI的类别
  "number":POI所属区域的区域编号
}
area.json
{
  "区域编号":区域人口值
}

输出为:

[
  ["h", 232.7468753744591],
  ["f",511.4907105256037],
  ["e",614.9901766893532],
  ["g",697.3614562757045],
  ["d",812.2365216229458],
  ["b",878.0307964717691],
  ["a",1137.981560137959],
  ["c",1448.4753152430358]
]
a b c d e f g h 分别代表不同类别的POI
import csv
import json 
import math

filename = "data1.json"
# 处理基础数据 转换成字典 
#     key为分区代码  相应的value为嵌套字典
#         键为某一分区内 POI的类型代码 相应的值为该类POI出现的次数
def data_parse(filename):
    number_counts = {}
    with open(filename,'r',encoding='utf-8') as f:
        data = json.load(f)
        for l in data:
            if l["number"] not in number_counts.keys():
                number_counts[l["number"]] = {}
                if l["type"] not in number_counts[l["number"]].keys():
                    number_counts[l["number"]][l["type"]] = 1             
            else:
                if l["type"] not in number_counts[l["number"]].keys():
                    number_counts[l["number"]][l["type"]] = 1
                else:
                    number_counts[l["number"]][l["type"]] += 1
    return number_counts

#计算TF值(TF=当前分区含有的I类POI数目/当前分区含有的POI数目)
def tf(number_counts):
    for m in number_counts:
        fenmu = 0
        for j in number_counts[m]:
            fenmu += number_counts[m][j]
        for k in number_counts[m]:
            number_counts[m][k] = number_counts[m][k]/fenmu 
    return number_counts

#计算IDF的值
def idf(number_counts):
    idf = {"a":0,"b":0,"c":0,"d":0,"e":0,"f":0,"g":0,"h":0}
    for l in idf:
        count = 0
        D = 0
        for m in number_counts:
            D += 1
            if l in number_counts[m].keys():
                count+=1
        idf[l] = math.log(D/count)
    return idf

#计算TF-IDF的值
def TFIDF(tf,idf):
    for m in tf:
        for k in idf:
            if k in tf[m].keys():
                tf[m][k] = tf[m][k]*idf[k]
                # for j in tf[m]:
                #     print(m,k)
                #     tf[m][j] = idf[k]*tf[m][j]
                #     print(tf[m][j])
    return tf

#将最终的TF值写入成json文件
def writetojson(number_counts,filename):
    with open(filename,'a') as json_file:
        json.dump(number_counts, json_file, indent=2,ensure_ascii=False) 

def read_area(filename):
    with open(filename,'r',encoding='utf-8') as f:
        area = json.load(f)
    return area

def relative(tf_idf,idf,area):
    #N是第i类所占的分区数
    #tl_pd 是(第i类所在分区的tf_idf值)与(第i类所在分区的栅格值)的乘积 后的求和  
    #sum_2 是 (第i类所在分区的tf_idf值)的平方的求和
    #sum 是 第 (第i类所在分区的tf_idf值)的求和
    #PD 是第i类所在的分区的栅格值的求和
    #PD_2 是第i类所在的分区的栅格值的平方的求和

    rou = {}
    for m in idf:
        N = 0
        tl_pd = 0
        sum_2 = 0
        sum = 0
        PD = 0
        PD_2 = 0                 
        for l in tf_idf:
            if m in tf_idf[l].keys():
                N += 1 
            if m in tf_idf[l].keys():
                sum_2+=tf_idf[l][m]*tf_idf[l][m]
                tl_pd+=tf_idf[l][m]*area[l]
                sum+=tf_idf[l][m]
        for l in tf_idf:
            if m in tf_idf[l].keys():
                PD += area[l]
                PD_2 += area[l]*area[l]
        fenzi = N*tl_pd-sum*PD
        fenmu = (N*sum_2-sum*sum)**0.5- (N*PD_2-PD*PD)**0.5
        poi_md = fenzi/fenmu
        rou[m] = poi_md
    return rou
    
if __name__ == '__main__':
    filename = "data1.json"
    number_counts = data_parse(filename)
    tf = tf(number_counts)
    idf = idf(number_counts)
    tf_idf = TFIDF(tf,idf)
    print(tf_idf)
    area = read_area('area.json',)   
    rou = relative(tf_idf,idf,area)
    rou=sorted(rou.items(),key=lambda x:x[1],reverse=False)
    writetojson(rou,"rou.json")
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,585评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,283评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,760评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,461评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,280评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,268评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,656评论 3 385
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,322评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,629评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,691评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,445评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,299评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,694评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,982评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,244评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,642评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,829评论 2 335

推荐阅读更多精彩内容