我用Python剖析了某咪的数据,终于知道如何运营公众号了!
完整源码可在本公众号或者公众号「01二进制」后台回复:「公众号数据分析」获取
1. 前言
在同学的影响下,我在18年9月注册了一个公众号「01二进制」,因为种种原因(其实就是懒)直到11月11日才在这个公众号上发布了第一篇文章。到写这篇文的时候,我已经发布过21篇文章,用户也只有86人,这不禁引发了我深深的思考。为啥我的公号没有用户?
为此我还特地请教了我的好友?哥,他告诉我,文笔是一方面,另一方面还要能抓住热点,说完便给我发了一份某知名公众号的相关数据,让我给安排安排。
这不,一分析才发现原来想让公众号有阅读量也是要讲究套路的,接下来就让我们以一个coder的角度去分析下究竟是哪些套路吧。
2. 分析目的
笔者在本项目中的分析目的主要有3个:
(1)对某知名公众号内容运营方面的若干分析,主要是对发文量、点赞量、发文时间等方面的描述性分析;
(2)通过对标题的分析,来说明什么样标题更受人喜欢;
(3)将冗杂无序的结构化数据和非结构化数据进行可视化,展现数据之美。
3. 实验环境
工欲善其事,必先利其器,在开始分析之前,我先说明此次分析所处的实验环境,以免出现异常:
MacOS 10.14.3
Python 3.6.8(Anaconda)
Visual Studio Code(开发)
Jupyter Notebook(调试环境)
使用的包有:
pkuseg(分词)
pyecharts(绘图)
numpy(数学计算)
pandas(数据计算)
4. 数据获取及预览
4.1 数据获取
本次数据集是通过网络爬虫爬取某公众号的所以文章整理而成,该部分不进行阐述,需要数据集可以直接下载源码查看或者在公众号:「01二进制」后台回复:「公众号数据集」获取。
4.2 数据预览
在该项目中,我使用了Pandas进行数据的读取和预览,Pandas在数据科学中使用非常广泛,有兴趣的小伙伴可以去搜索相关资料了解下。
数据预览代码如下:
import pandas as pd
# 读取数据集
df=pd.read_excel('data/data.xlsx')
# 显示前五行数据
df.head()
此次的数据集长下面这样?:
我统计了下,截至2019年1月22日,该公众号总共发表文章1111篇(对单身?还真是一个友好的数字呢)。
5. 描述性分析
该部分中,笔者将会对该数据集中主要的数值型数据进行描述性的统计分析,属于较为常规的数据分析,能揭示出一些问题。可视化工具采用的是pyecharts,官网地址:http://pyecharts.org/#/,推荐使用他的原因是因为他的图表好看(颜即正义)。
5.1 文章来源
单靠一个人的力量想要让公众号保持每日一文的活跃度很难。所以,很多公众号都会适时的转载一些别人写的比较好的文章。但如果转载文章过多,原创性就大大降低了,那么比例要多少比较好呢?我们来看看该知名公众号的转载文章数量和原创文章数量吧:
# 获取转载文章
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.2 他到底有多火
从文章开始我就在说这个数据集是某知名公众号的数据集,那么到底有多知名呢?接下来我们从发文数量、点赞数量和平均每篇文章的点赞数量入手来一探究竟。
其实这个部分的思路不难:只需要创建一个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年第1、2季度和2019年2、3、4季度均没有数据,所以需要执行一步去掉无用值的操作。
以此类推我们也可以得到点赞数量随时间变化的走势图:
下面是平均每篇文章点赞数量的变化。
不得不说,这个公众号的流量真的不容小觑,平均一篇文章能有1w+的点赞量(还不算阅读量),难怪广告商都排队买她家的广告位,据说有的广告商甚至开出了30w的广告费!(啥时候我的文章也能有这么多流量啊?)
5.3 会不会是标题党
说实话,笔者在做分析的时候,看到上面的数据异常震惊,他每天到底发的是什么样的文章才能有这么庞大的流量啊。
高中语文老师经常跟我们提起,一个好的文章标题可以给你的文章加分不少。想到这我就开始怀疑这家伙会不会是一个标题党?又或是它的标题真的那么吸引人?实践是检验整理的唯一标准。来来来,收起笑容,我们来分析下。
5.3.1 什么样的文章标题更讨喜
这一部分我们的思路如下:获取到文章标题,然后进行分词、停用词过滤、统计词频,生成词云。这些都是上篇文章介绍过的,如果不清楚,移步《李鬼见李逵——我用翟天临的论文做了分析》,这里直接上代码:
# 选择文章标题并分析
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
考虑到篇幅的问题,词频统计的结果我就不放出来了,这里直接放出词云图:
看到这张词云图,大致就能猜到该公众号面向的主要群体是哪一类人了。有兴趣的可以在评论区留言说说你对这张词云图的想法。
5.3.2 标题多长比较好
标题能抓住痛点自然是好事,但是和长度有没有关系呢?(这个部分很简单,就是归类下长度,所以直接放代码了)
# 画出标题长度和点赞数之间的关系
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字之间最适宜原来不是忽悠我啊。
5.4 什么时候发文章比较好
每个人看文章的时间都不确定,但是大多数人的空闲时间还是差不多的,所以到这就有人会问了什么时候推送文章会比较好呢?我们先来看看这个公众号是怎么安排的。
5.4.1 发文数量和所在时间段的关系
粗略的浏览了下数据发现大多都是在晚上,所以这里我觉得采用饼状图来可视化二者之间的关系比较好(其实就是想顺便换个图表试试)
# 画出发文数量和所在小时之间的饼状关系图
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点左右推送的,细想一下确实也是。大多数上班族在睡觉之前也就是这个时间段躺在床上刷手机,久而久之都让用户养成每天睡觉前必看一篇文章的习惯了,不得不说这种用户黏性是真的强啊!
5.4.2 用户点赞量如何
公众号推文给用户,那用户对文章的反应怎么样呢?我们来看看用户点赞随发文时间的柱状图:
代码的思路和之前的一致,这里就不放出来了,总的来说,这个公众号的点赞量还是很可观的。
6. 结语
通过上述几个分析,我觉得如果想让公众号有更多的读者和阅读量上一个台阶可以从下面2个角度去考虑:
要起一个好的标题,这个标题一定要符合你面向群体的喜好,而且不能太长
思考一下你面向群体的空闲时间,在空闲时间内推送文章,逐渐让用户对公众号产生黏性
此外,本文是基础的探索性质的数据分析文,不是数据分析报告,重在启迪思路,授人以渔,而且受限于数据规模,得出结论不是本文的目的,对结果的分析分散在各个部分,“文末结论控”不喜勿喷。
完整源码可在本公众号或者公众号「01二进制」后台回复:「公众号数据分析」获取
推荐阅读
今日问题
PreFixSpan算法是另一个序列模式挖掘算法,你所了解的PreFixSpan算法是什么样的?
打卡格式:打卡第n天,答:xxx
我用Python剖析了某咪的数据,终于知道如何运营公众号了!相关推荐
- python中的条件判断稀硫酸_大学mooc2020用Python玩转数据期末考试查题公众号答案...
大学mooc2020用Python玩转数据期末考试查题公众号答案 更多相关问题 下列表述或叙述中,正确的是().A.1 mol氢B.3 mol H2C.2 mol氢分子D.1 mol H 相同质量的钠 ...
- 南京工业大学python考试期末题库_大学慕课用Python玩转数据期末考试查题公众号答案...
大学慕课用Python玩转数据期末考试查题公众号答案 更多相关问题 雪松的树形为 (5.0分) - Do you think I can borrow your bike for a few hour ...
- python write非法字符报错_Python爬虫实现的微信公众号文章下载器
平时爱逛知乎,收藏了不少别人推荐的数据分析.机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑).但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便. 所以我就想有什么方法能否 ...
- 爬虫python下载文献代码_Python爬虫案例:爬取微信公众号文章
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 文章转载于公众号:早起Python 作者:陈熹 大家好,今天我们来讲点Selenium自动化,你是 ...
- python 协程 asyncio_Python 原生协程------asyncio(选自公众号)
所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyncio 是并发(concurrency)的一种方式.对 Python 来说,并 ...
- 慕课python第四周测试卷_中国大学慕课用Python玩转数据期末考试查题公众号答案...
[单选] 某船在雾中航行仅用雷达嘹望而放弃用视觉嘹望以至于碰撞他船,这属于().①对遵守<内河避碰规则>各条的疏忽:②对船员通常做法所要求的任何戒备上的疏忽:③对当时特殊情况要求的任何戒备 ...
- 大学计算机python期末考试用什么软件_大学计算机--Python算法实践_章节测验,期末考试,慕课答案查询公众号...
[单选题]IP 地址10.0.10.65 和掩码255.255.255.224 代表的是一个 A. 主机地址 B. 网络地址 C. 广播地址 D. 以上都不对 [单选题]一般而言,在常年定期.定量交易 ...
- 能搜python题的软件_中国大学MOOC的APP用Python玩转数据期末考试搜题公众号答案...
[单选题]宾客不在房间,如有来访者,服务员不应(). A. 让来访者等候 B. 让来访者在房间等候 C. 让来访者留言 D. 让来访者留下电话号码 刀具半径补偿功能的建立和取消是在刀具移动过程中实现的 ...
- url 里面 等号_【Python成长之路】从零学爬虫给微信公众号阅读量作个弊:刷阅读量...
[写在前面] 小燕同学:鹏哥,我在微信公众号上写的一些美妆博客,都没什么阅读量,老板要求我在这个月底至少让几篇博客阅读量达到10W+,你说我要不要每天自己去刷或者找水军呀? 鹏哥:博客刷阅读量?这不是 ...
最新文章
- 互联网公益平台米多乐获近千万天使轮融资,熊猫资本投资...
- 用init-connect+binlog实现用户操作追踪【转】
- python 数据分析学什么-python数据分析师要学什么
- OVS使用笔记(四十三)
- Writing a Tile Engine in JavaFX
- 使用cpan安装perl模块
- linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为
- 2020最新版SpringMVC面试题高频精选
- 制作斜坡单元的两种方法
- mapgis转arcgis数据后发现属性表内没有数据
- python pygame模块_python中pygame模块用法实例
- Ubuntu18.04 ROS melodic 版本的rivz教程
- android 4.0 蓝牙分析之二
- Struts2返回JSON数据的具体应用范例
- CAD图纸、影像地形、倾斜摄影、矢量数据统统搬入图新地球,一键浏览分析
- spring调用webservice
- 【Proteus仿真】BME280温湿度气压传感器数据串口输出
- 考研日语线上笔记(六):完型专项篇
- 排序算法的代码--选择排序综合训练题
- 方差、标准差、协方差概念与意义梳理
热门文章
- Visio对mysql怎么画er图_Microsoft Office Visio如何绘制ER图?Microsoft Office Visio绘制ER图的方法步骤...
- 视频前面怎么加片头?好用的方法分享介绍
- 别扯了,这世界上根本没有稳定的工作
- java websocket 认证_Websocket配置证书支持wss
- python matplotlib 计算并显示均值中值
- 大学物理第三版朱峰课后答案详解_大学物理习题答案(朱峰版).doc
- PHP在线模拟考试系统源码(带操作文档)源码分享
- adf被打开_hp一体机上显示adf门打开怎样关闭
- 什么是聚合支付,聚合支付有什么优势
- WIFI-DIRECT 网卡初探