前回から、Dockerで環境構築、Twitter機能の一つであるTwitterアナリティクスのデータを用いて、jupyterlabにてPythonによる分析方法を記載していきます。
今回は、Twitterデータを時系列分析してみます。
本記事を読むと、
- 自分でTwitterアナリティクスの分析ができる
- 分析用のサンプルコード(Python)を使用できる
- Dockerでコンテナ内の環境構築ができる(Anaconda)
ので、ぜひ最後までご覧いただけると幸いです。
なお、サンプルコードは最後に記載していますので、サンプルコードだけほしい方は、目次リンクで飛んでご覧いただけると幸いです。
それではやっていましょう!
▼ Contents
1. 解析用データの準備(前回記事)
環境構築、Twitterデータを解析用に変換する準備が終わってない方は、下記記事をご参考いただけると幸いです。
Dockerは超便利なので、ぜひご自身でも調べていただけると幸いです。
以下の内容は、Docker環境で構築したJupyterlabをベースに作成しています。予めご了承ください。使用環境概要は以下となります。
- OS: Windows10 Pro
- Visual Studio Code: Version 1.47.0
- Docker image: ubuntu:18.04
- Anaconda: Anaconda3-2020.07-Linux-x86_64
- Python: Version 3.8.3 (64bit)
2. Twitterデータに新たな時系列データを作成する(初級編)
今回は、Twitterデータの”Time”カラムをいじっていきます。まずは、indexである”Time”をマルチインデックス化していきます。
何を言っているかわからないかもしれないので、まずはコードを見てみましょう。
""" "Time"indexを用いて、"week"という新たなindexを作成する """
w_twitter_df = twitter_df.set_index([twitter_df.index.week, twitter_df.index])
w_twitter_df.index.names = ['week', 'date']
w_twitter_dfの出力結果は以下のようになります。

つまり、indexに”week”の項目を増やして、”week”と”date”の2つのindexを設けました。これにより、”week”というindexを用いて、数値をまとめたりすることができます。
以下で数値をまとめの具体的なコードをみてみましょう。
"""1週間ごとのデータをまとめ(groupby)、その合計(sum)を適用する """
w_twitter_df = w_twitter_df.groupby(level='week').agg('sum')
w_twitter_dfの出力結果を確認すると、以下のように各週(図は23週目、24週目)の各項目の合計値を表していることがわかります。

一点注意なのが、”Engagement_ratio”は比率なので、合計値を表示しても意味がありません(このままだと、エンゲージメント率90%を超えている素晴らしいツイートをしていることになります笑)
そのため、以下のコードを追加して、しっかり比率を出しておきましょう。
w_twitter_df['Engagement_Ratio'] = w_twitter_df['Engagement'] / w_twitter_df['Impression']
w_twitter_dfの出力結果を確認すると、しっかり計算されていますね!(エンゲージメント率90%以上がほしかった。。。)

これで時系列作成の初級編は完了です。
3. Twitterデータに新たな時系列データを作成する(応用編)
「2.Twitterデータに新たな時系列データを作成する」で”Time”のindexを”week”と”date”の2つにマルチインデックス化しましたが、実は名前の通り複数のインデックスを持つことができます。
以下のコードを入力してみてください。
yqmwwd_twitter_df = twitter_df.set_index([twitter_df.index.year, twitter_df.index.quarter,\
twitter_df.index.month, twitter_df.index.week,\
twitter_df.index.weekday, twitter_df.index.day, twitter_df.index])
yqmwwd_twitter_df.index.names = ['year', 'quarter', 'month', 'week', 'weekday', 'day', 'date']
yqmwwd_twitter_dfの出力結果は以下です。

ご覧のとおりですが、各インデックスの意味は
- year: 年度
- quarter: 四半期
- month: 月
- week: 週
- weekday: 曜日(月曜日が0, 日曜日が6)]
- day: 日にち
のように複数の時系列インデックスを取得できます。また、計算用に呼び出せる関数も”sum”以外にもあります。以下のコードを入力しましょう。
""" 1週間ごとのデータをまとめ(groupby)、関数('count', 'sum', 'mean', 'max', 'min')を適用する """
w2_twitter_df = yqmwwd_twitter_df.groupby(level='week').agg(['count', 'sum', 'mean', 'max', 'min'])
w2_twitter_dfの出力は以下のようになります。

各カラムの関数(‘count’, ‘sum’, ‘mean’, ‘max’, ‘min’)の値が表示されています。以上から、ほしい時系列のデータに対し、必要な関数を適用して取得することができます。
例えば、[“Impression”, “Engagement”]のデータに対して、”week”ごとの[“sum”, “mean”]のデータがほしければ、以下のようなコードになります。
w3_twitter_df = yqmwwd_twitter_df[["Impression", "Engagement"]].groupby(level='week').agg(['sum', 'mean'])
w3_twitter_dfの出力結果は以下です。

また、全データに対して、”month”ごとの[“sum”]のデータがほしければ、以下のようなコードになります。(Engagement_ratioの計算は忘れないように!)
m_twitter_df = yqmwwd_twitter_df.groupby(level='month').agg('sum')
m_twitter_df['Engagement_Ratio'] = m_twitter_df['Engagement'] / m_twitter_df['Impression']
m_twitter_dfの出力結果は以下です。

いかがでしょうか。
上記のように時系列作成用のコードを書いてしまえば、あとはpythonが自動で計算してくれるので、大変便利ですね!
また、時系列データを構築しておくと、今後記事予定のグラフ化などにも応用できるので、是非マスターしていただけると幸いです。
4. サンプルコードとまとめ
以上の内容をまとめたサンプルコードは以下です。
ただ、前回からの続きのため、コードが長くなってきたので、関数化、リスト内包表記を実施しています。
""" Twitter_analytics.ipynb """
from pathlib import Path
import pandas as pd
import datetime
Data_path = './data'
Data_file_name = '*ja.csv'
Encode = 'CP932'
def data_path(folder_path, file_name):
return Path(folder_path).glob(file_name)
def data_df(file_path):
LIST = [pd.read_csv(file, encoding=Encode) for file in file_path]
df = pd.concat(LIST)
return df
def yqmwwd_df(df):
yqmwwd_df = df.set_index([df.index.year, df.index.quarter,\
df.index.month, df.index.week,\
df.index.weekday, df.index.day, df.index])
yqmwwd_df.index.names = ['year', 'quarter', 'month', 'week', 'weekday', 'day', 'date']
return yqmwwd_df
def groupby_df(df, level_time='week', agg_iterable='sum'):
groupby_df = df.groupby(level=level_time).agg(agg_iterable)
return groupby_df
""" main """
"""1.準備編をご確認ください """
twitter_data_path = data_path(Data_path, Data_file_name)
twitter_df = data_df(twitter_data_path)
twitter_df = twitter_df[["ツイート本文","時間","インプレッション",\
"エンゲージメント","エンゲージメント率","リツイート", \
"返信","いいね","ユーザープロフィールクリック",\
"URLクリック数","ハッシュタグクリック","詳細クリック"]]
twitter_df.columns = ["Tweet", "Time", "Impression", "Engagement", \
"Engagement_Ratio", "RT", "Return", "Good", "User_Click", \
"URL_Click", "Hash_Click", "Detail_Click"]
twitter_df['Time'] = pd.to_datetime(twitter_df['Time'].apply(lambda x: x[:-5]))
twitter_df = twitter_df.set_index('Time').sort_index()
"""2.時系列編 """
yqmwwd_twitter_df = yqmwwd_df(twitter_df)
w_twitter_df = groupby_df(yqmwwd_twitter_df, 'week', 'sum')
w_twitter_df['Engagement_Ratio'] = engagement_ratio(w_twitter_df)
m_twitter_df = groupby_df(yqmwwd_twitter_df, 'month', 'sum')
m_twitter_df['Engagement_Ratio'] = engagement_ratio(m_twitter_df)
これで分析するtwitterデータの時系列インデックス構築が完成しました!
次回以降で、このtwitter_dfを使用してグラフ化していきます。また、今後の分析内容としては
- グラフによる考察
- 評価基準の設定およびその可視化
などを予定しています。乞うご期待ください。それでは、よいPythonライフを!!

関連する次の投稿は以下です。ご覧いただけると幸いです。
[…] Python] Twitterアナリティクスを分析してみた(①準備編) [Docker, Python] Twitterアナリティクスを分析してみた(②時系列編) [Docker, Python] Twitterアナリティクスを分析してみた(③グラフ化編) [Docker, […]
[…] [Docker, Python] Twitterアナリティクスを分析してみた(②時系列編) […]
[…] [Docker, Python] Twitterアナリティクスを分析してみた(②時系列編) […]