完整源碼可在公衆號:「01二進制」後臺回覆:「公衆號數據分析」獲取python
在同窗的影響下,我在18年9月註冊了一個公衆號「01二進制」,由於種種緣由(其實就是懶)直到11月11日纔在這個公衆號上發佈了第一篇文章。到寫這篇文的時候,我已經發布過21篇文章,用戶也只有86人,這不由引起了我深深的思考。爲啥個人公號沒有用戶?數組
爲此我還特意請教了個人好友🐔哥,他告訴我,文筆是一方面,另外一方面還要能抓住熱點,說完便給我發了一份某知名公衆號的相關數據,讓我給安排安排。bash
這不,一分析才發現原來想讓公衆號有閱讀量也是要講究套路的,接下來就讓咱們以一個coder的角度去分析下到底是哪些套路吧。網絡
筆者在本項目中的分析目的主要有3個:app
(1)對某知名公衆號內容運營方面的若干分析,主要是對發文量、點贊量、發文時間等方面的描述性分析;echarts
(2)經過對標題的分析,來講明什麼樣標題更受人喜歡;函數
(3)將冗雜無序的結構化數據和非結構化數據進行可視化,展示數據之美。工具
工欲善其事,必先利其器,在開始分析以前,我先說明這次分析所處的實驗環境,以避免出現異常:post
本次數據集是經過網絡爬蟲爬取某公衆號的因此文章整理而成,該部分不進行闡述,須要數據集能夠直接下載源碼查看或者在公衆號:「01二進制」後臺回覆:「公衆號數據集」獲取。spa
在該項目中,我使用了Pandas進行數據的讀取和預覽,Pandas在數據科學中使用很是普遍,有興趣的小夥伴能夠去搜索相關資料瞭解下。
數據預覽代碼以下:
import pandas as pd
# 讀取數據集
df=pd.read_excel('data/data.xlsx')
# 顯示前五行數據
df.head()
複製代碼
這次的數據集長下面這樣👇:
我統計了下,截至2019年1月22日,該公衆號總共發表文章1111篇(對單身🐶還真是一個友好的數字呢)。
該部分中,筆者將會對該數據集中主要的數值型數據進行描述性的統計分析,屬於較爲常規的數據分析,能揭示出一些問題。可視化工具採用的是pyecharts,官網地址:pyecharts.org/#/,推薦使用他的緣由…
單靠一我的的力量想要讓公衆號保持每日一文的活躍度很難。因此,不少公衆號都會適時的轉載一些別人寫的比較好的文章。但若是轉載文章過多,原創性就大大下降了,那麼比例要多少比較好呢?咱們來看看該知名公衆號的轉載文章數量和原創文章數量吧:
# 獲取轉載文章
df_copy = df[df['原文連接'].str.len() > 5]
print('轉載文章數量爲:'+str(len(df_copy)))
print('原創文章數量爲:'+str(len(df)-len(df_copy)))
複製代碼
在該數據集中,只要原文連接這一欄裏有數據的則默認爲轉載,沒有數據的默認爲原創,輸出的結果爲:
轉載文章數量爲:249
原創文章數量爲:862
複製代碼
粗略計算下比例大約爲3.5:1
從文章開始我就在說這個數據集是某知名公衆號的數據集,那麼到底有多知名呢?接下來咱們從發文數量、點贊數量和平均每篇文章的點贊數量入手來一探究竟。
其實這個部分的思路不難:只須要建立一個5行4列(表示5年,4個季度)的矩陣,獲取到時間所在的年份和季度後再在相應位置上加1:
# 獲取文章數隨季度變化的矩陣
def getPostJiDu(df):
# 生成一個5行4列全爲0的矩陣
list_jidu = [[0]*4 for i in range(5)]
for articleTime in df['發文時間']:
# 獲取日期
date = str(articleTime).split(' ')[0]
# 獲取所在年份
year = getYear(date)
# 獲取所在季度
jidu = getJiDu(date)
list_jidu[year-2015][jidu-1] += 1
return list_jidu
複製代碼
而後在利用pyecharts將圖標畫出來便可:
# 畫出發文數量隨季度變化的走勢圖
def drawPostJiDu(df):
# 獲取文章季度矩陣
res_list = getPostJiDu(df)
# 構造標題列表
attr = []
for year in range(len(res_list)):
for month in range(len(res_list[year])):
attr.append("{}年第{}季度".format(str(year+2015),str(month+1)))
# 構造值列表
v1 = reduce(operator.add, res_list)
# 去掉無用值
attr = attr[2:-3]
v1 = v1[2:-3]
line = Line("發文數量變化走勢圖", width=1500, height=500)
line.add("某知名公衆號", attr, v1, is_stack=True,
is_label_show=True, is_smooth=True, is_fill=True, xaxis_name='季度', yaxis_name='發文數',xaxis_rotate=30)
return line
複製代碼
這裏提一下,由於該公衆號2015年第一、2季度和2019年二、三、4季度均沒有數據,因此須要執行一步去掉無用值的操做。
以此類推咱們也能夠獲得點贊數量隨時間變化的走勢圖:
下面是平均每篇文章點贊數量的變化。
不得不說,這個公衆號的流量真的不容小覷,平均一篇文章能有1w+的點贊量(還不算閱讀量),難怪廣告商都排隊買她家的廣告位,聽說有的廣告商甚至開出了30w的廣告費!(啥時候個人文章也能有這麼多流量啊😢)
說實話,筆者在作分析的時候,看到上面的數據異常震驚,他天天到底發的是什麼樣的文章纔能有這麼龐大的流量啊。
高中語文老師常常跟咱們提起,一個好的文章標題能夠給你的文章加分很多。想到這我就開始懷疑這傢伙會不會是一個標題黨?又或是它的標題真的那麼吸引人?實踐是檢驗整理的惟一標準。來來來,收起笑容,咱們來分析下。
這一部分咱們的思路以下:獲取到文章標題,而後進行分詞、停用詞過濾、統計詞頻,生成詞雲。這些都是上篇文章介紹過的,若是不清楚,移步《李鬼見李逵——我用翟天臨的論文作了分析》,這裏直接上代碼:
# 選擇文章標題並分析
def chooseMostPop50Titles(df):
texts=[]
for title in list(df['標題']):
# 防止出現沒有標題的文章
if len(str(title))>3:
if str(title) not in ['分享圖片']:
# 分詞、去掉停用詞
text=cleanWord(str(title))
texts.append(text)
# 將二維數組變成一維數組
title_cuts=reduce(operator.add, texts)
# 統計每一個詞的詞頻
counter = Counter(title_cuts)
# 選出詞頻最高的50個
counter=counter.most_common(50)
# 輸出詞頻最高的50個單詞
pprint.pprint(counter)
name = []
value = []
for count in counter:
name.append(count[0])
value.append(count[1])
return drawWordCloud(name,value)
# 數據可視化(生成詞雲)
def drawWordCloud(name, value):
wordcloud = WordCloud(width=800, height=400)
wordcloud.add("標題詞雲圖", name, value, word_size_range=[
20, 100], rotate_step=20)
return wordcloud
複製代碼
考慮到篇幅的問題,詞頻統計的結果我就不放出來了,這裏直接放出詞雲圖:
看到這張詞雲圖,大體就能猜到該公衆號面向的主要羣體是哪一類人了。有興趣的能夠在評論區留言說說你對這張詞雲圖的想法。
標題能抓住痛點天然是好事,可是和長度有沒有關係呢?(這個部分很簡單,就是歸類下長度,因此直接放代碼了)
# 畫出標題長度和點贊數之間的關係
def drawTitleLenAndFavourite(df):
v1 = [0]*6
for i in range(len(df['標題'])):
title_len = len(str(df['標題'][i]))
if title_len >= 5 and title_len <= 8:
v1[0] += df['點贊'][i]
elif title_len >= 9 and title_len <= 12:
v1[1] += df['點贊'][i]
elif title_len >= 13 and title_len <= 16:
v1[2] += df['點贊'][i]
elif title_len >= 17 and title_len <= 20:
v1[3] += df['點贊'][i]
elif title_len >= 20 and title_len <= 24:
v1[4] += df['點贊'][i]
elif title_len >= 25:
v1[5] += df['點贊'][i]
attr = ['5-8', '9-12', '13-16', '17-20', '21-24', '24+']
bar = Bar("標題長度和點贊數之間的關係", title_pos='center')
bar.add("", attr, v1, is_label_show=True)
return bar
複製代碼
可視化結果:
如今想一想,高中語文老師說的標題不宜過長,也不宜太短,13-16字之間最適宜原來不是忽悠我啊。
每一個人看文章的時間都不肯定,可是大多數人的空閒時間仍是差很少的,因此到這就有人會問了何時推送文章會比較好呢?咱們先來看看這個公衆號是怎麼安排的。
粗略的瀏覽了下數據發現大多都是在晚上,因此這裏我以爲採用餅狀圖來可視化兩者之間的關係比較好(其實就是想順便換個圖表試試)
# 畫出發文數量和所在小時之間的餅狀關係圖
def drawPostHour(df):
# 獲取發文時間
list_hour = getPostHour(df)
array = np.array(list_hour)
# 獲取發文時間最多的5個時間段
attr = list(sorted(np.argsort(array)[-5:]))
attr = ["{}時".format(i) for i in attr]
# 獲取發文時間最多的5個時間的數量
v1 = list(array[sorted(np.argsort(array)[-5:])])
pie = Pie("發文時間分佈圖")
pie.add("", attr, v1, is_label_show=True)
return pie
複製代碼
在上述代碼中,咱們用getPostHour()
這個函數來生成一個集合,思路和上面相似,先生成一個全爲0的列表,在時間內的加一就能夠了。下面是生成的餅圖:
能夠看到該公衆號大多數文章都是在晚上10點、11點左右推送的,細想一下確實也是。大多數上班族在睡覺以前也就是這個時間段躺在牀上刷手機,長此以往都讓用戶養成天天睡覺前必看一篇文章的習慣了,不得不說這種用戶黏性是真的強啊!
公衆號推文給用戶,那用戶對文章的反應怎麼樣呢?咱們來看看用戶點贊隨發文時間的柱狀圖:
代碼的思路和以前的一致,這裏就不放出來了,總的來講,這個公衆號的點贊量仍是很可觀的。
經過上述幾個分析,我以爲若是想讓公衆號有更多的讀者和閱讀量上一個臺階能夠從下面2個角度去考慮:
此外,本文是基礎的探索性質的數據分析文,不是數據分析報告,重在啓迪思路,授人以漁,並且受限於數據規模,得出結論不是本文的目的,對結果的分析分散在各個部分,「文末結論控」不喜勿噴。
完整源碼可在公衆號:「01二進制」後臺回覆:「公衆號數據分析」獲取