在 Dev.to 上发帖的最佳时间是什么时候?
获取数据
准备数据
什么时候发帖最好?
为特定标签撰写
互动与评论
我们应该写些什么主题?
概括
使用 Python 计算并可视化 Dev.to 上的最佳时间和主题
Dev.to 拥有一个国际化的社区,这意味着全天候都有用户活跃,因此很难掌握社区最活跃的时间段。了解这一点有助于更好地了解你的受众,并帮助你获得更高的内容互动率。
利用一些简单的 Python 代码,我们可以尽可能多地了解 Dev.to 的用户及其行为,例如何时发布内容才能让更多人看到。更重要的是,这也是学习数据准备和处理的好机会。
去年,我参与了一个项目,旨在了解用户在我们公司 Yammer(类似于企业版 Facebook)上发布的内容;我们使用 Python 来追踪团队成员感兴趣的话题的互动情况、这些话题的评价以及互动发生的时间。在寻找一些可视化方案时,我看到了Pierre关于在 Yammer 上发布内容的最佳时间的帖子。
既然我已经开始更频繁地在这里发帖,我想尝试一些类似的事情,所以我决定尝试一个短期项目,以更多地了解这里的用户在阅读时的情况,是否存在任何趋势以及他们最常与哪些主题互动。
为了了解读者,我们需要弄清楚什么决定了一篇文章的成功——通常是阅读量、评论和互动量。
由于我们无法获取每篇文章的阅读量,我们将关注点赞数,因为两者密切相关:点赞越多,阅读量越高;阅读量越高,点赞数也越多。因此,点赞数将是我们用来衡量用户对文章行为或反应的指标!
获取数据
首先,我们需要数据。
我们需要了解之前的帖子表现如何,幸运的是,我们团队提供了一个很棒的API供我们使用!
使用 Python 和requests库,我们可以调用 API 并为每个帖子构建一个 JSON 行文件:
# To get the first page on articles on Dev.to
URL = "https://dev.to/api/articles"
payload = {"page":1}
r = requests.get(URL, params=payload)
r.raise_for_status()
f.write(r.text)
将有效负载拆分出来,我们可以向上遍历页面值,获取指定页码之前的所有帖子,利用这一点,我们可以获取每个帖子或大致获取某个日期。
运行此程序,我们可以构建一个数据集,但需要进行一些清理,才能将其转换为更易于解析的格式,以便我们将要使用的下一个库——Pandas(与Numpy一起,它是 Python 中数据操作的支柱)——进行解析。
使用 Pandas 和一个简单的生成器,我们可以将数据加载到 DataFrame 中;
# Generator for data
def json_line_gen(file_name):
for row in open(file_name, "r"):
yield row
json_response = json_line_gen('./data.json')
for json in json_response:
df = df.append(pd.read_json(json), sort=False)
数据框非常实用,它本质上就是一个带有标签的行和列的表格,具有高度的灵活性和丰富的内置功能。数据框易于扩展和操作,只需一个库即可实现各种数据处理功能。
准备数据
设置好数据框后,我们可以进行一些初步探索,发现我们需要像皮埃尔那样,将日期和时间拆分到单独的列中,以便于操作。同时,我们还可以删除不感兴趣的列,例如封面图片或规范网址;
df = df.drop(columns=unwanted_columns)
# Splitting Timestamp into hour and day of week
df['hour'] = pd.to_datetime(df['published_at']).dt.hour
df['day_of_week'] = pd.to_datetime(df['published_at']).dt.strftime('%A')
什么时候发帖最好?
我们首先想了解用户何时阅读帖子,而这可以通过他们对帖子的反应来判断。之所以将时间单位定为小时而不是分钟,部分原因是希望能够进行概括。试图将时间精确到分钟过于细致,实际上并不会比知道小时数更有帮助。
因此,可视化此数据的最佳方法是使用热图——我们首先对所需数据(反应次数和时间)进行分组,然后透视表格,使其列为一周中的日期:
# Get the average reactions per post at a given timeslot
reaction_df = df.groupby(["day_of_week", "hour"]) ["positive_reactions_count"].mean()
# Pivot the dataframe & reorganise the columns
reaction_df = reaction_df.reset_index().pivot('hour', 'day_of_week', 'positive_reactions_count')
reaction_df = reaction_df[["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]]
然后我们使用数据可视化库Seaborn生成热图:
plt.figure(figsize=(16, 16))
sns.heatmap(reaction_df , cmap="coolwarm")
我们遇到了一个问题,没有明显的趋势,有时候确实如此,但周日的这一个小时似乎是个异常值。那段时间比其他时间暗得多——我们来验证一下,可以用箱线图来简单地检查一下,以下是来自 Seaborn 的示例:
sns.boxplot(reaction_df)
这绝对是一个异常值。既然我们要进行概括,那就让我们过滤掉异常值,看看这会如何影响我们的可视化结果。使用z 分数,我们可以从原始数据框中删除一些异常值帖子;
z = np.abs(stats.zscore(reaction_df))
reaction_df = reaction_df[(z < 3).all(axis=1)]
这种筛选方式会移除一些表现最佳的帖子,但当我们再次生成热图时,可以更全面地了解大多数帖子的表现!
这样一来,我们就只剩下一个比较清晰的时段了:工作日中午 UTC 左右!
这与皮埃尔关于时间的发现类似,但范围更窄,可能是因为网站的影响力不断扩大,用户群更加广泛,或者只是多积累了一年的数据!
为特定标签撰写
热力图非常笼统,如果您只对围绕某些特定标签制作内容感兴趣,那么让我们试试我最喜欢的标签之一——讨论;
# Tag to find map for
tag = 'discuss'
tag_df = tag_df.loc[tag_df['tags'].str.contains(tag, case=False, na=False)]
tag_df = tag_df.groupby(["day_of_week", "hour"]) ["positive_reactions_count"].mean()
tag_df = tag_df.reset_index().pivot('hour', 'day_of_week', 'positive_reactions_count')
tag_df = tag_df[["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]]
不太明确的是,问题在于我们剔除了太多数据集,导致数据缺失,进而造成结果偏差。即便如此,一些最热门的标签可能仍然包含足够的数据值得深入研究。
互动与评论
“讨论”标签让我尝试了另一种方法:我们能否查看帖子阅读量、点赞量和评论量之间的关联?这对于“讨论”这类标签尤其重要,但如果你希望读者与你的帖子进行更多互动(而不仅仅是点赞),这一点也同样适用。
我们可以使用回归图来比较点赞数和评论数,看看它们之间是否存在相关性:
sns.regplot(comment_df["comments_count"], comment_df["positive_reactions_count"])
这表明两者之间存在中等程度的相关性,但这并不意味着存在因果关系,不过值得投入时间和精力去研究二者之间的联系。
如果我们用评论数列替换之前热图中的反应数列,并生成新的热图:
comment_df = comment_df.groupby(["day_of_week", "hour"]) ["comments_count"].mean()
comment_df = comment_df.reset_index().pivot('hour', 'day_of_week', 'comments_count')
comment_df = comment_df[["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]]
plt.figure(figsize=(16, 16))
sns.heatmap(comment_df , cmap="coolwarm")
我们可以看到,未来我们可以测试两个大型集群:
- 周六和周日清晨(UTC时间)
- 周二至周日傍晚 5/6 点(UTC 时间)
利用这些趋势可以提高帖子评论和讨论的参与度,值得一试,看看是否存在因果关系,或者您是否想与用户进行更多互动。
我们应该写些什么主题?
那我们再回到标签的话题,如果有人想全面做SEO呢?最热门的话题是什么?这能告诉我们关于社区的什么信息?
首先,我们需要将标签列表列拆分成单独的项目。在 Pandas 中,这以前非常麻烦,但现在只需要一个方法调用即可:
popular_df = popular_df.explode('tag_list')
# Fill in any gaps
popular_df["tag_list"] = popular_df["tag_list"].fillna('None')
由此我们可以按出现次数进行汇总,但结果发现这项工作已经有人做过了!其中一些是意料之中的热门话题,比如 JavaScript 等,这当然是用户喜欢发帖的内容,但这真的是社区想要的吗?这些话题的互动性最强吗?
我们首先来获取平均反应值进行比较:
popular_df['positive_reactions_count'].mean()
然后,我们可以使用去除异常值后的数据集,生成平均反应次数最高的热门标签列表:
popular_sum_df = popular_df.groupby(['tag_list'])["positive_reactions_count"].mean()
# Get top 50 average posts
popular_sum_df.sort_values(ascending=False).head(50)
在检查了一些标签后,发现大多数标签仍然受到少数几个高互动帖子的影响,与平均水平相比存在较大偏差,但一些热门标签并非昙花一现。它们是持续表现良好、互动性强的标签,乍一看,其中一些标签如下:
- 职业
- 初学者
- 钩子
- SQL
- 学习
(完整的标签列表可在代码仓库中找到,请在那里查看)
有些内容在我的预料之中(例如“职业发展”),有些则出乎我的意料(例如“SQL”),但这让我们能够了解用户真正感兴趣的内容以及他们不感兴趣的内容。这意味着我们可以筛选出最适合本网站的内容,并根据用户关注的趋势或话题进行优化。
概括
通过数据了解你的受众只是成功的一半,仅仅在这些时间发布内容并不能立即增加你的阅读量。你仍然需要专注于了解最终读者,并首先创作高质量的内容!
这个问题还有进一步研究的空间;什么样的内容长度或类型效果最好?帖子中是否存在某种情感或结构方面能更好地吸引读者?以及在特定时期哪些话题比较流行?
要实现这些目标,我们需要构建一个更丰富的数据集,API 看起来可以用于此目的,但这又是另一个话题了。
如果你想尝试构建更大型的项目,可以自己动手,或者看看用 Python 可以多么快速地完成类似的项目,Jupyter notebook 和脚本可以在这里找到;
现在花点时间试着了解你的读者吧,祝你发帖愉快!
文章来源:https://dev.to/m_nevin/when-s-the-best-time-to-post-on-dev-to-5824





