科學揭秘微博大V如何成為大V,數據分析幫你解開流量的神秘面紗

平凡的科研生活 發佈 2020-05-17T08:23:58+00:00

微博占據現在非常大的流量,同時數據分析專業的工資已經達到了平均10000+的水平,並且在各行各業都有著巨大的需求,學會數據分析可以使你在未來的職業道路上暢通無阻。在這篇文章中,我們會首先了解到如何使用計算機數據分析技術對於熱點問題的解讀,第二也可以學到更多的數據分析思維和手法。

微博占據現在非常大的流量,同時數據分析專業的工資已經達到了平均10000+的水平,並且在各行各業都有著巨大的需求,學會數據分析可以使你在未來的職業道路上暢通無阻。

在這篇文章中,我們會首先了解到如何使用計算機數據分析技術對於熱點問題的解讀,第二也可以學到更多的數據分析思維和手法。

如果想要觀察兩個一維數據的關聯性,例如對於新浪微博,微博等級和關注人數之間有什麼關係,又和被關注者人數有什麼關係,那麼seaborn有個方法regplot可以完成這功能。

我們先來介紹下 regplot函數,必填的有 x, y 和 data。完整文檔如下https://seaborn.pydata.org/generated/seaborn.regplot.html

seaborn.regplot(x, y, data=None, x_estimator=None, 
                x_bins=None, x_ci='ci', scatter=True, 
                fit_reg=True, ci=95, n_boot=1000, units=None,
                seed=None, order=1, logistic=False, lowess=False, 
                robust=False, logx=False, x_partial=None, y_partial=None,
                truncate=True, dropna=True, x_jitter=None, y_jitter=None,
                label=None, color=None, marker='o', scatter_kws=None, 
                line_kws=None, ax=None)


數據集:這個函數我們使用著名的UCI數據集網站的微博數據集,用到的數據表為 user表, 數據包含10個屬性



對於我們的關聯性分析,user_id,user_name,user_image,message是沒有意義的,所以我們只取剩下的6個屬性,但是性別gender屬性是string類型,所以我們需要替換成0,1。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import hashlibpd.set_option('display.max_columns', None)
data = pd.read_csv('/Users/macowner/Desktop/zhihu/microblogPCU/weibo_user-utf-8.csv', encoding='UTF-8')
df = pd.DataFrame(data)
df.replace('male',0,inplace= True)
df.replace('female',1, inplace=True)
new_df = df[['gender', 'class', 'post_num', 'follower_num','followee_num','is_spammer']]
print(new_df.head())


這是未處理之前的輸出信息,可見非常的混亂。

我們現在以 new_df 作為 處理過的數據集用作關聯性分析。

1 我們首先分析一下,發微博數量和粉絲數量之間的關係,按常理來說,發的微博越多,曝光率越高,粉絲數應該越多。

sns.regplot(x = 'post_num', y = 'follower_num', data = new_df)
plt.show()

從上圖我們可以同時看到點狀的分布圖和線狀的關聯性圖

從密度中我們可以得知,發微博條數在 0 -2000 之間占據了絕大部分,同時粉絲數量在0-100萬占據絕大多數,從這個數據我們也可以大概得知這些微博帳號大多數屬於大V,所以有這樣的數據並不奇怪。

從關聯性圖我們可以看到,這是一條斜率大於0的線段,表明發博數量和粉絲數量是呈正相關的,但是關聯性並不高。

2 我們可以再分析一下,粉絲數量和關注數量的關係,根據常識,新號沒有多少粉絲但是會關注很多人,大V則正好相反。我們來看一下實例。

sns.regplot(x = 'follower_num', y = 'followee_num', data = new_df)plt.show()

首先我們還是觀察密度圖,橫坐標為粉絲數量,縱坐標為關注人數

我們可以看到粉絲數量跨度很大,從0-700萬+,但是主要集中區域還是0-200萬之間,並且粉絲人數越多,點越稀疏,這也滿足常識,粉絲越大的號數量越少。

關注數量是0-3000之間,主要集中在0-2000,也是數量越大越稀疏。

然後我們可以觀察相關性線段,發現與上圖不同,斜率是負的,表明這兩者是負相關關係,也就是,粉絲數量越多,自己關注的人越少。這與我們的常識是對應的,比如人民日報就是個典型的例子。


3 改變圖形顏色, 參數 color

sns.regplot(x = 'follower_num', y = 'followee_num', data = new_df, color = 'g' )
plt.show()

4. 替換掉默認的密度圖的標記,默認為原點。參數 marker

sns.regplot(x = 'follower_num', y = 'followee_num', data = new_df, color = 'g',
            marker= '+')
plt.show()

5. 修改置信區間,通過參數 ci,默認為95%。

這次我們拿發博文數和性別做比較,我們通過常識判斷,女性通常要比男性要發的稍微多一點。

fig = plt.figure()ax1 = fig.add_subplot(2,1,1)ax2 = fig.add_subplot(2,1,2)ax1.set_title("default")ax2.set_title("ci = 50")sns.regplot(x = 'post_num', y = 'gender',            data = new_df, color = 'g', marker= '+',ax = ax1)sns.regplot(x = 'post_num', y = 'gender',            data = new_df, color = 'g', marker= '+',ci= 50, ax = ax2)plt.show()

從上圖可以得知,在微博數較少的情況下,女性是發的比男性頻繁的,但是一旦發博數量上去的話,男女的比例就趨於接近了。

同時,第一幅圖是用的默認置信區間,第二幅圖設置為50,從上圖很明顯看到置信區間的區別導致很明顯的相關性線段周圍置信區域的不同。

6 修改坐標軸的疏密程度,通過 x_bins

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)
ax1.set_title("default")
ax2.set_title("ci = 50")
sns.regplot(x = 'post_num', y = 'follower_num', data = new_df, ax = ax1)
sns.regplot(x = 'post_num', y = 'follower_num', data = new_df,
            x_bins=np.arange(0,120000, 5000),ax = ax2)
plt.show()

從上圖,第一幅圖的密度明顯太大,所以在使用了(0, 120000, 5000)的區間,可以很清楚的看清楚密度分布。

7 修改密度的評估方式 通過 x_estimator。可以使用numpy的stat系列(在之前的系列裡也有)。https://docs.scipy.org/doc/numpy/reference/routines.statistics.html

fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)
ax1.set_title("max")
ax2.set_title("mean")
sns.regplot(x = 'post_num', y = 'follower_num',data = new_df,
            x_bins=np.arange(0,120000, 5000),x_estimator= np.max,ax = ax1)
sns.regplot(x = 'post_num', y = 'follower_num',data = new_df,
            x_bins=np.arange(0,120000, 5000),x_estimator=np.mean,ax = ax2)
plt.show()


掌握大數據能力,為未來添磚加瓦。


微信掃一掃關注該公眾號

關鍵字: