一个被阅读了50万次的公众号

本文是一篇基于 Python 的数据分析实践教程,数据来源于“Python之禅”公众号的历史文章,数据采集过程在掘金小册上有详细地讲解,感兴趣的可以去阅读一下,数据和完整源代码可以在公众号回复「wxdata」获取

加载数据

开启 juypter notebook,创建新的 notebook,导入基础包(以下代码都是在 jupyter notebook 中完成)

# 加这行不需要再写plt.show(),就可以直接显示图像出来
%matplotlib inline

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

display_columns = ["title","read_num","like_num","comment_num","reward_num","p_date"]
从 CSV 文件中导入,这里的 post.csv 就是你要下载的数据
# 从csv文件中加载
df = pd.read_csv("post.csv")
# 重新设置列的顺序
df = df.reindex(columns=display_columns)
# 将p_date的数据类型从timestamp 转换成 datetime
df.p_date = pd.to_datetime(df['p_date'])
df.head()

前5条数据:

文章与阅读数

数据加载到 Pandas 之后,看下数据的总体概览情况


describe() 函数会返回整个数据集的概览,从上面看出公众号一共发了 203 篇文章(有些文章被我删除没统计到),目前位置文章平均阅读量是 2404,从最高阅读量 8628 到最低阅读量 124 可以说明为什么标准差那么大,因为公众号初期订阅读者少,阅读量也不高,但是随着你读者越来越多,阅读量也会越来越高。

截止2018年1月15日,文章总共被阅读 488153 次 ,如果把删除的文章也加进来就有将近50万阅读量



获取阅读量最高的10篇文章

# 根据阅读数排序,ascending 表示降序排列
top_read_num_10 = df.sort_values(by=['read_num'], ascending=False)[:10]
top_read_num_10 = top_read_num_10[display_columns]
# 重置行索引,drop 表示删除原来的行索引
top_read_num_10.reset_index(drop=True)
ax = top_read_num_10.plot(x='title', y='read_num', kind='barh', figsize=(9,6), fontsize=15)
ax.set_ylabel("") ax.set_xlabel("")
ax.legend().set_visible(False)

历史文章阅读量变化曲线

ax = df.plot(y='read_num', x='p_date', title="文章阅读量趋势",figsize=(9,6))
# 设置y轴标签
ax.set_ylabel("阅读量")
# 设置x轴标签
ax.set_xlabel("")
# 隐藏图例
ax.legend().set_visible(False)


一眼就看出来,阅读量都集中在 2017 这一年,那么前几年究竟发生什么了?是没写文章还是写了文章没人看?我们来统计一下这几年的文章数。


数据告诉我们,13年发了2篇文章(笑cry),而17年发了 149 篇文章(棒棒哒),平均每周大概有近 3 篇文章的更新频率,用柱状图展示就是这样:

ax = year_df.plot(x='p_date', y='total', kind='bar', figsize=(9,6), fontsize=15)
ax.set_ylabel("文章数")
ax.set_xlabel("")
ax.legend().set_visible(False)
# 柱状图上显示数字
for p in ax.patches:
   ax.annotate(str(p.get_height()), xy=(p.get_x(), p.get_height()))

文章与赞赏

再来分析我们的文章赞赏情况


总共有101篇文章赞赏,平均两篇文章就有1次赞赏,读者一共贡献了 518 次赞赏,谢谢可爱的读者们支持(微笑)

用同样的方式可以得到文章赞赏数前10的数据:

top_reward_num = df.sort_values(by=['reward_num'], ascending=False)[:10]
top_reward_num = top_reward_num[display_columns]
top_reward_num
top_reward_num.reset_index(drop=True)


最高的一篇文章有83个打赏,这究竟是一篇什么文章,戳→自学Python编程怎么学才不那么孤独

ax = top_reward_num.plot(x='title',
                        y='reward_num',
                        kind='barh',
                        figsize=(9,6),
                        fontsize=14)
ax.set_ylabel("")
ax.set_xlabel("赞赏数")
ax.legend().set_visible(False)

这里的 kind 用 “barh” 表示横向的条形图

文章与点赞

说完赞赏的数据,再来看看点赞数有文章阅读数有什么关系,我们可以用散点图来表示二者之间关系,散点图用两组数据构成多个坐标点,表示因变量随自变量而变化的大致趋势。

# 散点图
ax = df.plot(kind="scatter", y='like_num', x='read_num',s=10, figsize=(9,6), fontsize=15)
ax.set_xlabel("阅读量")
ax.set_ylabel("点赞数")

z = np.polyfit(df.read_num, df.like_num, 1)
p = np.poly1d(z)
plt.plot(df.read_num,p(df.read_num),"r--")

可以看出文章点赞数大部分集中在10~50之间,而且存在某种线性正相关性,也就是说,文章阅读数越高,点赞数也就越高,如果某篇文章阅读量很高,但是点赞数却很低,这样的文章是标题党或者是资讯类的文章的可能性比较大。

标题关键字

最后,我想基于文章标题做一个词云效果展示,看看这些文章标题都用了哪些关键字。这里需要用到另个包,一个是结巴分词,另一个词云包

conda install jieba
conda install wordcloud
from wordcloud import WordCloud
import jieba

words = []
for i in  df.title:
    seg_list = jieba.cut(i, cut_all=False)
    words.append(" ".join(seg_list))
wordcloud = WordCloud(font_path='/Library/Fonts/Songti.ttc',
                      background_color="white", 
                      max_words=80,).generate(" ".join(words))
plt.figure(figsize=(9,6))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

把所有文章的标题用结巴库分词处理加入到 words 列表中,传递给 WordCloud 组件,另外还需要指定一个中文字体,因为 wordcloud 默认无法处理中文。max_words 用于指定最多显示多少词语


小结

到这里,我们就完成了一个公众号基本分析工作,得到了一些结论,比如阅读量高不是干货内容,而是一些更通俗的文章,而赞赏文章基本集中在带有福利的文章里面(干货内容也得不到什么赞赏,?)

从文章标题看得出这个公众号都是围绕 Python 的文章,关注 Python之禅,教你地道的Python技术


推荐阅读:

关注Python之禅,学点Python

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值