回顾所有推文

推文数量的时间序列分析

我觉得这反映了我自己的一些事情,所以我将对推文数量的变化进行时间序列分析。

  • 可视化时间序列数据
  • (总体/年/月/日)趋势可视化
  • 使用变化点检测逻辑进行变化点检测

被扔进 Prophet 进行分析。

参考:这个博客

准备数据 - 从 Twitter 获取数据

花了很长时间才得到推特官方的推文,
微博我会尝试从
当我用csv得到它时,处理推文中的换行符很麻烦,所以我尝试用xml得到它。

准备库 - 用于处理 XML

导入 xml 处理所需的库。

import pandas as pd
! pip install xmljson
import xmljson
from lxml import etree

数据导入

由于它在 Colaboratory 上运行,因此将 xml 文件放在 GoogleDrive 上,挂载并读取它。

xml_tree = etree.parse('/content/drive/MyDrive/works/gg_hatano220206.xml')

# すべてのタグの取得
xml_root = xml_tree.getroot()
# xmlデータをdict型に変換
xml_dict = xmljson.yahoo.data(xml_root)

数据整形

xml > tweets > tweet > time 包含发布时间,所以得到它。
如果您在开头添加“20”,它看起来像 YYYYmmdd,因此此时将其格式化。

from datetime import datetime as dt
tweet_time_list = []

for d in xml_dict['tweets']['tweet']:
  tmp = '20' + d['time']

  tmp = dt.strptime(tmp, '%Y%m%d %H%M%S')
  tweet_time_list.append(tmp)

通过按时间顺序排列它们并分配数字,您可以看到推文数量的变化。

dat = pd.DataFrame({'time' : tweet_time_list})
dat = dat.sort_values('time', ascending=True).reset_index(drop = True)
dat = dat.assign(tweet_num=range(len(dat)))
dat['tweet_num'] = dat['tweet_num'] + 1
dat.head(5)
时间 推文编号
0 2011-11-12 21:35:08 1
1 2011-11-12 21:43:03 2
2 2011-11-13 10:04:13 3
3 2011-11-13 11:09:01 4
4 2011-11-13 11:33:26 5

39393行×2列

我做到了。

帖子数量变化的可视化

现在,让我们想象一下帖子数量的增加。

import pandas as pd
import matplotlib.pyplot as plt

x = dat["time"]
y = dat["tweet_num"]

plt.plot(x,y)

ProphetとTwitterで人生を振り返る

似乎斜率已经改变了好几次。

生活似乎在这里发生了变化。

准备库 - 使用 Prophet 进行时间序列数据分析

对于趋势分析和变化点检测,预言家我会尝试使用

! pip install fbprophet
from fbprophet import Prophet

学习

Prophet的模型公式如下:趋势$g_t$,季节$s_t$,事件$h_t$,误差$\epsilon_t$

$$
y_t = g_t + s_t + h_t + \epsilon_t
$$

它看起来像这样。参考

让我们暂时学习。这个model.fit需要时间。 (在 Colab 上花了大约 5 分钟)
change_point_range 似乎是用于学习的数据的百分比(最旧的 XX% 用于学习)。
我们不需要预测这个时间,所以我们以 100% 的速度学习。 n_changepoints 是预期的变更点数量吗?是。我将其适当地设置为 10。

dat = dat.rename(columns={'time':'ds', 'tweet_num':'y'})
model = Prophet(n_changepoints = 10, changepoint_range=1.0, growth='linear')
model.add_seasonality(name='monthly', period=30.5, fourier_order=5)
model.fit(dat)

趋势可视化

让我们可视化这些变化。它似乎给了它一些周期性。方便,不是吗?

future = model.make_future_dataframe(periods=90)
forecast = model.predict(future)
model.plot_components(forecast)
plt.show()

ProphetとTwitterで人生を振り返る

看着每个...

  • 趋势
    • 2013 年 4 月左右的减速被分配到硕士实验室。
    • 我认为2015年10月左右的放缓是由于新员工培训后的分配。
    • 2018年伊始……不知是不是该被甩了……
  • 每周
    • 我觉得周一晚上发帖数少可能是因为没有棒球比赛
  • 每年
    • 三月、五月和八月安静(假期?)
    • 十一月的元气(CS 和日本系列?)
  • 每日
    • 25:00 左右似乎有一个高峰
      • 通宵日本假名
  • 每月
    • 20 日沉默……发薪日?

将我的学生日(-2015/03)和我的工作日(2015/04-)分开可能会更好。
我有不同的休假方式。

变化点检测

现在,我将保持原样。

import seaborn as sns

df_input = dat
# add change rates to changepoints
df_changepoints = df_input.loc[model.changepoints.index]
df_changepoints['delta'] = model.params['delta'].ravel()

# get changepoints
df_changepoints['ds'] = df_changepoints['ds'].astype(str)
df_changepoints['delta'] = df_changepoints['delta'].round(2)
df_selection = df_changepoints[df_changepoints['delta'] != 0]
date_changepoints = df_selection['ds'].astype('datetime64[ns]').reset_index(drop=True)

# plot
sns.set(style='whitegrid')
ax = sns.factorplot(x='ds', y='delta', data=df_changepoints, kind='bar', color='royalblue', size=4, aspect=2)
ax.set_xticklabels(rotation=90)

ProphetとTwitterで人生を振り返る

唔...?

  • (增加) 2012-06-17:你在准备研究生考试吗?
  • (增加)2013-05-15:我想知道M1 GW结束时发生了什么->我一个人伤心
  • (增加) 2015-09-18 : 新员工培训尚未结束

Bocchi饭不辣#颤抖的声音

— 哈塔姆 (@gg_hatano)2013 年 5 月 15 日

国和形冷大 HG#Bocchi餐

— 哈塔姆 (@gg_hatano)2013 年 5 月 15 日

当我观察趋势时,我觉得我能够获得更多与我的直觉相匹配的洞察力。

入社后回看推文

我不记得过去,所以我会尽量关注我在社会黑暗时期的数据。它是从 2015 年 4 月开始的。

dat_work = dat[dat['ds'] > dt.strptime("20150401 000000", '%Y%m%d %H%M%S')]
dat_work = dat_work.reset_index(drop=True)
dat_work.head()
ds 是的
0 2015-04-01 12:14:37 25999
1 2015-04-01 12:17:12 26000
2 2015-04-01 12:22:15 26001
3 2015-04-01 14:12:59 26002
4 2015-04-01 17:12:07 26003

学习

这需要时间

model_work = Prophet(changepoint_range=1.0, growth='linear')
model_work.add_seasonality(name='monthly', period=30.5, fourier_order=5)
model_work.fit(dat_work)

是的

趋势可视化

让我们来看看

future_work = model_work.make_future_dataframe(periods=90)
forecast_work = model_work.predict(future_work)
model_work.plot_components(forecast_work)
plt.show()

ProphetとTwitterで人生を振り返る

气氛和以前不一样了。

  • 趋势
    • 2016 年 6 月左右放缓……那个项目。
    • 2017 年 3 月左右放缓……那个项目。
    • 2018 年 6 月左右上升...是
    • 2019 年 4 月左右减速……那个案例
    • 2020 年 5 月左右放慢速度……那个情况
  • 每周
    • 周一晚上有更多帖子。
      • 似乎棒球的影响力已经减弱,因为我看到的巨人越来越少。
  • 每年
    • 5、6月见底,11月见顶
    • 每年10月底,帖子数量都会增加。
  • 每日
    • 25:00 左右似乎有一个高峰 All Night Nippon
  • 每月
    • 20 号左右保持沉默...发薪日?为什么

概括

  • 一个人吃饭后变了
  • 项目启动前后推文数量变化
  • 发薪日附近一片寂静

原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623725.html

相关文章:

  • 2021-07-03
  • 2021-08-26
  • 2022-12-23
  • 2021-11-15
  • 2022-12-23
  • 2022-12-23
  • 2021-11-24
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-28
  • 2022-01-23
  • 2022-12-23
相关资源
相似解决方案