利用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!

推薦閱讀: