首頁 > 軟體

利用Python將社群網路進行視覺化

2022-06-01 22:00:16

前言:

我們平常會使用很多社交媒體,如微信、微博、抖音等等,在這些平臺上面,我們會關注某些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 視覺化 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com