見出し画像

【PythonでTwitter分析】「いいね数はいくらで1フォロワー増加するのか」を単回帰分析してみた。

こんにちは(@t_kun_kamakiri)

Twitterのフォロワーを増やすためにはTwitter分析が欠かせないですよね。

現在フォロワー数が1520人ですが、Twitter分析を一度もしたことがありませんでした。

Twitter分析をまともにしたことがなかったので今回はPythonを使って簡単に分析をしたいと思います。

今回は「いいね数はいくらで1フォロワー増加するのか」を単回帰分析で見積もってみようと思います。

Twitterアナリティクスからデータ入手

画像1

画像2

こちらからcsvファイルが入手できるので今回は「2020年11月~2021年2月」の4か月分だけ入手しました。

画像3

このようにcsvファイルをjupyter labのファイルと同じ階層に置いておきます。

Pythonでデータの読み込み

まずは分析に使うPythonライブラリをインポートします。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

次にcsvファイルだけを読み込みたいので以下の記述を書きます。

import glob

csv_files = glob.glob('*csv')
csv_files

画像4

これでcsvファイルがリストになりました。
これら別々のcsvファイルを読み込みながら行方向に合体させる必要があります。

import glob

csv_files = glob.glob('*csv')
csv_files

画像5

これでデータの結合が終わりました。
データの大きさを確認しましょう。

df.shape# (1291, 40)

1291行ありますね。
不必要なカラムが多いのでカラムを全部出力してみましょう。

df.columns

画像6

プロモーションなどはしていないので不必要なカラムは削除します。

今回は必要なカラムを以下のみにします。

data_list = ['ツイートID', 'ツイート本文', '時間', 'インプレッション', 'エンゲージメント',
      'エンゲージメント率', 'リツイート', 'いいね', 'ユーザープロフィールクリック', 'URLクリック数',
      'ハッシュタグクリック', '詳細クリック', 'メディアの再生数', 'メディアのエンゲージメント数']

len(data_list)

14項目だけにしました。
日本語だとグラフを書くときに文字化けするので英語にしておきます。

data_list_columns = ['ID', 'text', 'date', 'impression', 'engagement',
      'engagement_ratio', 'RT', 'fav', 'profile_click', 'URL_click',
      'hashtag_click', 'detail_click', 'media_click', 'media_engagement']

len(data_list_columns)

上記をデータフレームのカラムに設定すればよいですね。

df = df[data_list]
df.columns = data_list_columns
df

画像7

いいね数で並べ替えてどのツイートがウケが良かったのか確認してみましょう。

df.sort_values('profile_click', ascending=False).head(30)

画像8

ツイート情報は以下のメソッドで確認できます。

df.info()

画像9

Twitterの可視化をしてみよう

ツイートデータを取得できたらグラフを書いて可視化して眺めてみましょう。
今回、グラフの可視化はseabornを使います。

seabornは超優秀な可視化ライブラリなのでドキュメントを見て色々遊んでみましょう。
まずはライブラリをインポートします。

import seaborn as sns

まずは全データの相関を見てみましょう。

sns.pairplot(df.drop('ID', axis=1))

画像10

量が多いですが着目する点は「プロフィールクリック数」とどの要素が相関があるかですね。

相関係数を確認

では相関係数を見てみましょう。

corr_data = df.corr()
corr_data

画像11

プロフィールクリック数(profile_click)と相関が大きいのは以下の項目であることがわかりました。
●impression:0.801800
●fav:0.786370
●RT:0.685614

なんとなくわかっていたことですがやはり「いいね数(fav)」が多いとプロフィールクリック数も多いのですね。
数字だと見ずらいので相関係数も可視化してみましょう。

plt.figure(figsize=(20,10))
sns.heatmap(corr_data, annot=True)

画像12

その他の統計量も眺めておきましょう。

df.describe()

画像13

だいたい1ツイートで4いいねくらいが平均だとわかりました。
少ない(笑)

3σ法で外れ値を除去する


もっといいね数が多い場合は平均値のまわりでばらつくので正規分布に従うと考えられます。外れ値(極端にバズっとツイート)などがある場合は、その外れ値に釣られて平均値が大きくなったり、相関係数が大きくなったりするため外れ値は除去しておくのが良いと考えられます。
ぼくの場合はいいね数が少なすぎるので正規分布ではありませんが、一応外れ値を3σで除去しておきます。
正規分布ではないのに3σで外れ値を除去するのはおかしいですがPytonのコードを書く練習だと思ってやってみました。
まずは平均値と標準偏差を出しておきましょう。

fav_mean = df['fav'].mean()
fav_std = df['fav'].std() #不偏標準偏差(母集団の分散が不明であるときの母分散の推定値) https://ai-trend.jp/basic-study/estimator/unbiasedness/
fav_std

そして外れ値を除去するため「平均±3σ」を算出します。

sigma3_p = fav_mean + fav_std*3
sigma3_n = fav_mean - fav_std*3

print(f'外れ値+3σ:{sigma3_p}')
print(f'外れ値-3σ:{sigma3_n}')

画像14

僕の場合はいいね数が32以上は外れ値扱いになってしまいます。
マイナスの方はー23なので、やっぱり3σ法で外れ値を除去するのはおかしいやり方ですが、今回はいいでしょう(笑)
僕のツイートは0いいねも多いので、2いいね以上かつ31いいね以下のものだけをデータとして抽出します。

df_3sigma = df[(df['fav'] <sigma3_p) & (df['fav'] >1)]
df_3sigma

画像15

いいね数の数も確認しておきましょう。

df_3sigma['fav'].value_counts()

画像16

2いいねが大半を占めますね(笑)
もう一度相関図を眺めてみましょう。
corner=Trueとすると無駄な相関のグラフを除いてくれます。

sns.pairplot(df_3sigma.drop('ID', axis=1), corner=True)

画像17

plt.figure(figsize=(20,10))
sns.heatmap(corr_data, annot=True)

画像18

では、次にprofile_clickと相関のありそうな要素との関係性をグラフ化してみましょう。
●impression
●fav
●RT
●hashtag_click
●media_engagement

sns.pairplot(df_3sigma, x_vars=["impression", "fav", "RT",'hashtag_click','media_engagement'], y_vars=["profile_click"],height=5, aspect=.8, kind="reg")

画像19

やっぱりimpression数とprofile_clickとの相関は強いですね。

sns.pairplot(df_3sigma, x_vars=["impression", "fav", "RT",'hashtag_click','media_engagement'], 
            y_vars=["profile_click"],height=5, aspect=.8, kind="reg")

画像20

念のため全体のヒストグラムも眺めてみましょう。

df_3sigma.hist(figsize=(20,10))

画像21

やっぱり僕のツイートは反応が鈍いほうに偏っているのであまり良いデータではありませんがまあ気にしない(笑)
いいね数だけの「ヒストグラム」と「カーネル密度分布」にすることができます。

sns.distplot(df_3sigma['fav'])

画像22

プロフィールクリック数とフォロワー増加を見積もる

どれだけのプロフィールクリック数があればフォロワー増加につながるのでしょうか?
毎日のフォロワー増加がわかれば詳細な分析ができますが、フォロワー増加のデータはcsvで入手ができなかったので、今回はアナリティクスから月単位で手動でフォロワー増加を取得しました。

以下のように辞書型にしておきます。

follower = {
   '2020-11':91,
   '2020-12':137,
   '2021-01':69,
   '2021-02':86,
}

ここから月単位でのプロフィールクリック数の平均を出すために月単位でまとめることを考えます。

def date_day(x):
   return x.split(' ')[0].split('-')[0]+'-'+x.split(' ')[0].split('-')[1]
   
df_3sigma['year_month'] = df_3sigma['date'].apply(date_day)

画像23

これで年と月だけがラベル付けされた列が追加されます。
次に月単位でグルーピングして月単位でのプロフィールクリック数を計算します。

df_3sigma_month = df_3sigma.groupby('year_month').sum()
df_3sigma_month

画像24

このようにすると月のプロフィールクリック数の合計が算出できます。
ここで「フォロワー増加/プロフィールクリック数」とすれば月平均の1プロフィールクリック数あたりのフォロワー増加が算出できるので、それを列に追加します。

df_3sigma_month['followers'] = pd.DataFrame(follower.values(), 
                                           index=df_3sigma_month.index)

画像25

もちろん「プロフィールクリック数/フォロワー増加」が月平均の1フォロワー増加に必要なプロフィールクリック数が算出できます。

1/df_3sigma_month['followers_per_profile_click'].mean()

画像26

結果はこのようになりました。
プロフィールクリック数が7.7であれば良いという結果です。


いくつインプレッション数があれば1フォロワー増加になるのか?


プロフィールクリック数とフォロワー増加の数字の関係が上記でわかりました。
さらにインプレッション数とプロフィールクリック数は以下のように相関があることがわかっているので、インプレッション数とフォロワー増加の関係性も数字で出せるはずです。

下記のグラフがy=ax+bの関係ならプロフィールクリック数は7.7のときどれくらいのインプレッション数になるか逆算ができますね。

画像27

インプレッション数が大きいところではかなり分布がまばらなので短回帰分析をするのにデータ数が十分でない可能性もありますが、あまり気にしないことにします。
単回帰分析や重回帰分析はPythonのsklearnを使えば簡単に係数を計算してくれます。


本来の機械学習では学習データと検証データを分けて学習データで学習をし(パラメータフィッティング)、検証データで精度を確認するといった流れですが、今回は何かを予測するためではなくデータから関係性を予測したいだけなのですべてのデータをパラメータフィッティングに使います。
まずは2つのデータをX,yに格納します。

X = df_3sigma[['impression']]
y = df_3sigma['profile_click']

そしてsklearnでパラメータフィッティングを行います。

from sklearn.linear_model import LinearRegression

# 単回帰分析model = LinearRegression()
model.fit(X, y)
y_pred = model.predict(X)
y_pred[:10]

これでパラメータフィッティングは終わりました。
超簡単でしたね。

target_profile_click = 1/df_3sigma_month['followers_per_profile_click'].mean()
x_ = (target_profile_click - model.intercept_)/model.coef_[0]

x_

画像28

結果は1968インプレッション数でフォロワーがひとり増える計算結果となりました。

いくつのいいね数があれば1フォロワー増加になるのか?

インプレッション数をあまり確認する人っていないですよね。それよりもいいね数を見てる人が多いのでプロフィールクリック数といいね数の関係性から、いくるのいいね数ならフォロワーが一人増えるのかを計算してみます。

画像29

データがばらついていますし、まばらですが細かいことには目をつむってy=ax+bの単回帰分析で処理してみます。

# 単回帰分析
X = df_3sigma[['fav']]
y = df_3sigma['profile_click']
model = LinearRegression()
model.fit(X, y)
y_pred = model.predict(X)

x_ = (target_profile_click - model.intercept_)/model.coef_[0]

x_

画像30

1ツイートあたり10いいねを狙えばフォロワーが一人増えるという結果になりました。

あとは他にフォロワー増加に必要な要素や、フォロワーが何に興味を示しているのかなど細かく分析をしていきたいところです。

まとめ

本日は簡単に単回帰分析だけで分析をしました。
1ツイートあたり10いいねを狙えばフォロワーが一人増えるという結果になりました。
次は、10いいね以上もらえるツイート内容は何なのか?・・・それを調べないといけませんね。


Twitter➡@t_kun_kamakiri
Instagram➡kamakiri1225
ブログ➡宇宙に入ったカマキリ(物理ブログ)
ココナラ➡物理の質問サポートサービス
コミュニティ➡製造業ブロガー


この記事が気に入ったらサポートをしてみませんか?