【社会网络分析图】python实现

社会网络分析图—Python实现

主要记录学习《Python数据挖掘方法及应用》(王斌会 著)第八章的内容。

社会网络分析主要有两大要素:
①行动者,在社会网络中用节点(node)表示;②关系,在社会网络中用连线(edge)表示,关系的内容可以是友谊、借贷或沟通,其关系可以是单向或双方的,切关系强度存在强度的差异。

社会网络分析包networkx

networkx是python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便进行复杂网络数据分析和仿真建模等工作。

网络图之知识图谱

知识图谱,又称为科学知识图谱,在图书情报界称为知识域可视化或知识领域映射地图,是显示知识发展进程与结构关系的一系列不同的图形,用可视化技术描述知识资源及其载体,挖掘、分析、构建、绘制和显示知识及它们之间的相互联系。

共现矩阵

图谱共现矩阵是把数据进行整合筛选等操作后,将所要的某一列数据进行处理。这一列中出现的数据,通过矩阵的方式表示它们之间的联系。矩阵中的数字代表相关联的次数。
程序中出现的数据都是本书所给实例。
下载数据的网站[\《Python数据分析》暨南大学 王斌会](http://blog.leanote.com/DaPy)

附上程序
#!/usr/bin/env python
#   -*-   coding:   cp936   -*-  使用中文
import networkx as nx
import matplotlib.pyplot as plt
nG=nx.Graph();#创建一个空的图
nG

一定要加前两行,要不然后面画图会显示不了中文


import pandas as pd   
#分解信息
def list_split(content,separator): 
    new_list=[]
    for i in range(len(content)):
        new_list.append(list(filter(None,content[i].split(separator))))#以separator为分隔符
    return new_list
#清除信息中的空格
def list_replace(content,old,new):            
    return[content[i].replace(old,new) for i in range(len(content))]

WXdata=pd.read_excel('PyDm_data.xlsx','WXdata');

设置一个分解信息函数list_split(content,separator)和清除空格的函数list_replace(content,old,new),由于原始文本数据中含标点符号,对数据进行预处理,去掉这些干扰的东西。

def find_words(content,pattern): #寻找关键词
    return[content[i] for i in range(len(content)) if (pattern in content[i])==True]
    
def search_university(content,pattern):#寻找大学
    return len([find_words(content[i],pattern) for i in range(len(content))
               if find_words(content[i],pattern)!=[]])
university=pd.read_excel('PyDm_data.xlsx','university');
#university1=sum(university,[])

organ=list_split(WXdata['Organ'],';')

data1=pd.DataFrame([[i,search_university(organ,i)] for i in university['学校名称']])

keyword=list_split(WXdata['Keyword'].dropna(axis=0,how='all').tolist(),';;')
keyword1=sum(keyword,[])
author=list_replace(WXdata['Author'].dropna(axis=0,how='all').tolist(),',',';')
author1=list_split(author,';')
author2=sum(author1,[])
data1;

查找函数find_words(content,pattern)用于查找每一列中所要元素
由于后面要画三个图,分别是作者,大学和关键词,这里先提取出数据

#获取前30名的高频数据
data_author=pd.DataFrame(author2)[0].value_counts()[:30].index.tolist()

data_keyword=pd.DataFrame(keyword1)[0].value_counts()[:30].index.tolist()

data_university=data1.sort_values(by = 1,ascending=False,axis=0)[0:30][0].tolist()
#data_university=data1.sort_values(by=1,ascending=False,axis=0)[0:30]['学校名称'].tolist()
data_university;

由于数据较多,这里设置一个提取高频数据的函数,只选取每一列中出现次数最多的三十个来进行研究。


```python
def occurence(data,document): #定义共现矩阵
    empty1=[];empty2=[];empty3=[]
    for a in data:
        for b in data:
            count = 0
            for x in document:
                if [a in i for i in x].count(True)>0 and [b in i for i in x].count(True)>0:
                    count=count+1
            empty1.append(a);empty2.append(b);empty3.append(count)#append() 方法向列表的尾部添加一个新的元素。只接受一个参数
    df=pd.DataFrame({'from':empty1,'to':empty2,'weight':empty3})
    #具有标注轴(行和列)的二维大小可变的表格数据结构
    G=nx.from_pandas_edgelist(df,'from','to','weight')
    #返回包含边列表的图形
    return (nx.to_pandas_adjacency(G,dtype=int))#注意对齐

自定义用于画图的共现矩阵的函数 occurence(data,document)

Matrix1=occurence(data_author,author1)
Matrix1;
Matrix2=occurence(data_university,organ)
Matrix2;
Matrix3=occurence(data_keyword,keyword)
Matrix3;

【社会网络分析图】python实现_第1张图片
作者矩阵Matrix1的结果
【社会网络分析图】python实现_第2张图片
大学矩阵 Matrix2的结果
【社会网络分析图】python实现_第3张图片
关键词矩阵 Matrix3的结果

import networkx as nx
import matplotlib.pyplot as plt              #加入中文汉字
plt.rcParams['font.sans-serif']=['SimHei']   #设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus']=False     #设置正常显示字符
#设置线条样式  plt.rcParams['lines.linestyle'] = '-.'
#设置线条宽度 plt.rcParams['lines.linewidth'] = 3

nf1=nx.from_pandas_adjacency(Matrix1)
#建立布局,对图进行布局美化,networkx 提供的布局方式有:
#- circular_layout:节点在一个圆环上均匀分布;   - random_layout:节点随机分布
#- shell_layout:节点在同心圆上分布;     - spring_layout: 用Fruchterman-Reingold算法排列节点(类似多中心放射状)
#- spectral_layout:根据图的拉普拉斯特征向量排列节

#以下语句绘制以带宽为线的宽度的图

nx.draw(nf1,with_labels=True,node_color='yellow')

作者列的网络图【社会网络分析图】python实现_第4张图片
高频作者之间合作情况

nf2=nx.from_pandas_adjacency(Matrix2)
nx.draw(nf2,with_labels=True,node_color='yellow')

【社会网络分析图】python实现_第5张图片
高校之间合作图谱

graph3=nx.from_pandas_adjacency(Matrix3)
nx.draw(graph3,with_labels=True,node_color='yellow')

【社会网络分析图】python实现_第6张图片
关键词知识图谱

最后,附上一些程序实现过程中参考的网站
1.入门|始于Jupyter Notebooks:一份全面的初学者实用指南http://baijiahao.baidu.com/s?id=1601883438842526311&wfr=spider&for=pc
2.Networkx参考手册 - qingqingpiaoguo的专栏 - CSDN博客
https://blog.csdn.net/qingqingpiaoguo/article/details/60570894
3.python复杂网络库networkx:绘图draw - 皮皮blog - CSDN博客
https://blog.csdn.net/pipisorry/article/details/54291831
4.Drawing — NetworkX 1.10 documentation
https://networkx.github.io/documentation/networkx-1.10/reference/drawing.html
5.《数据挖掘方法》
http://blog.leanote.com/cate/dapy/%E7%9B%AE%E5%BD%95

你可能感兴趣的:(Python,社会网络分析图,Jupyter,Notebook)