利用Python將社交網絡進行可視化
前言:
我們平常會使用很多社交媒體,如微信、微博、抖音等等,在這些平臺上面,我們會關註某些KOL,同時自己身邊的親朋好友也會來關註我們,成為我們自己的粉絲。慢慢地,關註和粉絲隨著時間不斷累積,這層關系網絡也會不斷地壯大,很多信息也是通過這樣的關系網絡不斷向外傳播。因此,分析這些社交網絡對於我們做出各項決策來說也是至關重要的。
今天我們就用一些Python
的第三方庫來進行社交網絡的可視化
數據來源
本案例用的數據是來自領英(Linkedin)的社交關系數據。由於作者之前在美國讀書,並且在國外找實習、找工作,都是通過領英投遞簡歷、聯系同事等,久而久之也逐漸地形成瞭自己的社交網絡,將這部分的社交數據下載下來,然後用pandas
模塊讀取
由於涉及隱私信息,數據就不便提供瞭。如果你有領英賬號,可以通過設置裡的“獲取資料副本”導出這樣一份CSV關系數據。或者也可以按照這個表頭自己生成一份假數據:
數據的讀取和清洗
首先導入需要用到的模塊:
import pandas as pd import janitor import datetime from IPython.core.display import display, HTML from pyvis import network as net import networkx as nx
讀取所需要用到的數據集:
df_ori = pd.read_csv("Connections.csv", skiprows=3) df_ori.head()
接下來我們進行數據的清洗,具體的思路就是將空值去除掉,並且數據集當中的“Connected on”這一列,內容是日期,但是數據類型卻是字符串,因此我們也需要將其變成日期格式。
df = ( df_ori .clean_names() # 去除掉字符串中的空格以及大寫變成小寫 .drop(columns=['first_name', 'last_name', 'email_address']) # 去除掉這三列 .dropna(subset=['company', 'position']) # 去除掉company和position這兩列當中的空值 .to_datetime('connected_on', format='%d %b %Y') )
輸出:
company position connected_on
0 xxxxxxxxxx Talent Acquisition 2021-08-15
1 xxxxxxxxxxxx Associate Partner 2021-08-14
2 xxxxx 獵頭顧問 2021-08-14
3 xxxxxxxxxxxxxxxxxxxxxxxxx Consultant 2021-07-26
4 xxxxxxxxxxxxxxxxxxxxxx Account Manager 2021-07-19
數據的分析與可視化
來看一下這些人脈中,分別都是在哪些公司工作的
df['company'].value_counts().head(10).plot(kind="barh").invert_yaxis()
輸出:
再來看一下我的人脈網絡中,大多都是什麼職業的
df['position'].value_counts().head(10).plot(kind="barh").invert_yaxis()
輸出:
接下來我們繪制社交網絡的可視化圖表。但是在這之前呢,需要先說明幾個術語,每一個社交網絡都包含:
- 節點:社交網絡當中的每個參與者
- 邊:代表著每一個參與者的關系以及關系的緊密程度
我們先來簡單的繪制一個社交網絡,主要用到的是networkx
模塊以及pyvis
模塊,
g = nx.Graph() g.add_node(0, label = "root") # intialize yourself as central node g.add_node(1, label = "Company 1", size=10, title="info1") g.add_node(2, label = "Company 2", size=40, title="info2") g.add_node(3, label = "Company 3", size=60, title="info3")
我們先是建立瞭4個節點,也分別給他們命名,其中的參數size
代表著節點的大小,然後我們將這些個節點相連接
g.add_edge(0, 1) g.add_edge(0, 2) g.add_edge(0, 3)
最後出來的樣子如下圖:
我們先從人脈中,他們所屬的公司來進行網絡的可視化,首先我們對所屬的公司做一個統計排序
df_company = df['company'].value_counts().reset_index() df_company.columns = ['company', 'count'] df_company = df_company.sort_values(by="count", ascending=False) df_company.head(10)
輸出:
company count
0 Amazon xx
1 Google xx
2 Facebook xx
3 Stevens Institute of Technology xx
4 Microsoft xx
5 JPMorgan Chase & Co. xx
6 Amazon Web Services (AWS) xx
9 Apple x
10 Goldman Sachs x
8 Oracle x
然後我們來繪制社交網絡的圖表:
# 實例化網絡 g = nx.Graph() g.add_node('myself') # 將自己放置在網絡的中心 # 遍歷數據集當中的每一行 for _, row in df_company_reduced.iterrows(): # 將公司名和統計結果賦值給新的變量 company = row['company'] count = row['count'] title = f"<b>{company}</b> – {count}" positions = set([x for x in df[company == df['company']]['position']]) positions = ''.join('<li>{}</li>'.format(x) for x in positions) position_list = f"<ul>{positions}</ul>" hover_info = title + position_list g.add_node(company, size=count*2, title=hover_info, color='#3449eb') g.add_edge('root', company, color='grey') # 生成網絡圖表 nt = net.Network(height='700px', width='700px', bgcolor="black", font_color='white') nt.from_nx(g) nt.hrepulsion() nt.show('company_graph.html') display(HTML('company_graph.html'))
輸出:
同樣,我們再來可視化一下人脈中各種崗位的分佈。
先做一個統計排序:
df_position = df['position'].value_counts().reset_index() df_position.columns = ['position', 'count'] df_position = df_position.sort_values(by="count", ascending=False) df_position.head(10)
輸出:
position count
0 Software Engineer xx
1 Data Scientist xx
2 Senior Software Engineer xx
3 Data Analyst xx
4 Senior Data Scientist xx
5 Software Development Engineer xx
6 Software Development Engineer II xx
7 Founder xx
8 Data Engineer xx
9 Business Analyst xx
然後進行網絡圖的繪制
g = nx.Graph() g.add_node('myself') # 將自己放置在網絡的中心 for _, row in df_position_reduced.iterrows(): # 將崗位名和統計結果賦值給新的變量 position = row['position'] count = row['count'] title = f"<b>{position}</b> – {count}" positions = set([x for x in df[position == df['position']]['position']]) positions = ''.join('<li>{}</li>'.format(x) for x in positions) position_list = f"<ul>{positions}</ul>" hover_info = title + position_list g.add_node(position, size=count*2, title=hover_info, color='#3449eb') g.add_edge('root', position, color='grey') # 生成網絡圖表 nt = net.Network(height='700px', width='700px', bgcolor="black", font_color='white') nt.from_nx(g) nt.hrepulsion() nt.show('position_graph.html')
輸出:
到此這篇關於利用Python將社交網絡進行可視化的文章就介紹到這瞭,更多相關 Python 可視化 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python機器學習之使用Pyecharts制作可視化大屏
- jQuery實現滑動tab選項卡
- 運籌學-Python實現圖論與最短距離
- Python可視化工具Plotly的應用教程
- 運用Python3實現Two-Pass算法檢測區域連通性