[Docker, Python] Twitterアナリティクスを分析してみた(②時系列編)

 前回から、Dockerで環境構築、Twitter機能の一つであるTwitterアナリティクスのデータを用いて、jupyterlabにてPythonによる分析方法を記載していきます。

今回は、Twitterデータを時系列分析してみます。

本記事を読むと、

  • 自分でTwitterアナリティクスの分析ができる
  • 分析用のサンプルコード(Python)を使用できる
  • Dockerでコンテナ内の環境構築ができる(Anaconda)

ので、ぜひ最後までご覧いただけると幸いです。

なお、サンプルコードは最後に記載していますので、サンプルコードだけほしい方は、目次リンクで飛んでご覧いただけると幸いです。

それではやっていましょう!

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の出力結果は以下のようになります。

図1. 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週目)の各項目の合計値を表していることがわかります。

図2. w_twitter_df

一点注意なのが、”Engagement_ratio”は比率なので、合計値を表示しても意味がありません(このままだと、エンゲージメント率90%を超えている素晴らしいツイートをしていることになります笑)

そのため、以下のコードを追加して、しっかり比率を出しておきましょう。

w_twitter_df['Engagement_Ratio'] = w_twitter_df['Engagement'] / w_twitter_df['Impression']

w_twitter_dfの出力結果を確認すると、しっかり計算されていますね!(エンゲージメント率90%以上がほしかった。。。)

図3. w_twitter_df(“Engagement_ratio”修正後)

これで時系列作成の初級編は完了です。 

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の出力結果は以下です。

図4. 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の出力は以下のようになります。

図5. 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の出力結果は以下です。

図6. 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の出力結果は以下です。

図7. 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ライフを!!

関連する次の投稿は以下です。ご覧いただけると幸いです。

3件のコメント

[Docker, Python] (重回帰分析編, sk-learn, t値算出, 忘備録) へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US

Baran-gizagiza
経歴:浪人→理系大学院卒業→大手製造業に就職(技術職)→アメリカ赴任中 仕事は、研究・設計など上流工程の仕事に携わっています。企業勤務を継続しながら、新しいことにチャレンジしたいと思い、ブログを下記はじめました。 このブログでは、趣味である 筋トレ(健康、ダイエット) AIとデータ(高校数学、プログラミング) 読書(主に自己啓発系) を中心に、人生経験やおすすめ情報の発信しています。