Edited at

【Python】twitterのフォロワーはどんな人?wordcloudで可視化


やったこと

twitterのAPIを使って、自分のフォロワーにはどういう人が多いのか?を調べてみました。さらにそれをwordcloudを使って可視化しました。


結果

Figure_1.png

例えば、インフルエンサーを使って広告を打ちたい!っていう仕事をしている人は、これを使うとフォローの属性を知ることができるので、リーチしたい層に向けてより効率よく広告を打つことができます。


準備

まず、フォロワーのデータが必要です。twitterAPIからフォロワーのデータを取得するプログラムはこちらを参考にしました。

【参考】

PythonによるWeb API入門 (3) TwitterでフォロワーのプロフィールデータをCSVにエクスポートしてデータ分析する

このチュートリアルをやると

screen_name :アカウント名

description : 自己紹介文

follow :フォロー数

follower :フォロワー数

を全てのフォロワーに対して取得することができます。

2018-12-28 15.33のイメージ.jpg

僕は自分のアカウントでやったので、このデータをmy_follower.csvとして保存しました。このフォロワーデータがある前提でお話を進めさせていただきます。


モジュール

使うモジュールは

wordcloud Mecab pandas matplotlib です。

Mecabだけ少しめんどくさいので、参考を載せておきます。

【参考】

MeCabをMacにインストールする手順

Python3からMeCabを使う


コードの流れ

手順としてはまず、フォロワーのデータを読み込み、使うカラムをリストにします。これは後ほどfor文でループするためです。次にMeCabのセットアップを行います。


followerAttribute.py

df=pd.read_csv("my_follower.csv")

screen_names=list(df["screen_name"])#アカウント名
descriptions=list(df["description"])#自己紹介文

#MeCabのセットアップ
tagger = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/ipadic')
tagger.parseToNode('')

次にこの自己紹介文を使ってフォロワーがどんな人なのか?について分析していきます。そこで属性に関係ない単語を文から除去したいわけですが、どうすればよいでしょう・・・

これが僕の自己紹介文です。

大企業で機械設計をしている24歳です。プログラミング、経済とビジネスが好きです

ブログ:URL /Qiita: URL /note: URL

ざっと見た感じ、名詞だけ抽出して残りは捨てればいい感じになりそうですよね。

ということで、コードの流れは以下になります。

1.フォロワーのdescriptionを綺麗にする

2.分かち書き

3.名詞だけリストに追加していく

4.さらに必要ない名詞を除去

5.1~4を全フォロワーでループ

6.wordcloudで属性を可視化


cleaning_text

文章を綺麗にしてreturnする関数です。あらかじめ削除する単語のリストdelete_listを作っておきます。

def cleaning_text(s,delete_list):

text=s
for d in delete_list:
text=text.replace(d," ")
return text


word_extraction

綺麗にした文章を分かち書きして名詞だけ抜き出し、リストにしてreturnする関数です。

def word_extraction(text):

n=[]
node=tagger.parseToNode(text)
while node:
hinshi=node.feature.split(",")[0]
if hinshi=="名詞":
word=node.surface
n.append(word)
else:
pass
node=node.next
return n


words2cloud

単語のリストを頻出度に合わせて可視化する関数です。

def words2cloud(word_list):

txt=" ".join(words)
font_path="/System/Library/Fonts/ヒラギノ明朝 ProN.ttc"
wordcloud=WordCloud(background_color="white",font_path=font_path,width=1024,height=674).generate(txt)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

以上の関数を使ってコードを作っていきます。


followerAttribute.py

全体のコードです。可視化された結果を見ながら、delete_listをいじると良いです。


followerAttribute.py

import MeCab

import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt

df=pd.read_csv("my_follower.csv")
screen_names=list(df["screen_name"])
descriptions=list(df["description"])

tagger = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/ipadic')
tagger.parseToNode('')

def cleaning_text(s,delete_list):
text=s
for d in delete_list:
text=text.replace(d," ")
return text

def word_extraction(text):
n=[]
node=tagger.parseToNode(text)
while node:
hinshi=node.feature.split(",")[0]
if hinshi=="名詞":
word=node.surface
n.append(word)
else:
pass
node=node.next
return n

def words2cloud(word_list):
txt=" ".join(words)
font_path="/System/Library/Fonts/ヒラギノ明朝 ProN.ttc"
wordcloud=WordCloud(background_color="white",font_path=font_path,width=1024,height=674).generate(txt)
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

delete_list=["\n","/","#","https","co","こと"]#結果を見ながらいじる
words=[]

for (screen_name,description) in zip(screen_names,descriptions):
print("NOW-->>{}".format(screen_name))
if type(description) is str:#空の自己紹介文はstr型では無かったのでウザいから処理を分ける
text=cleaning_text(description,delete_list)
e_list=word_extraction(text)
for e in e_list:
words.append(e)
else:
pass

words2cloud(words)



参考

参考までにdelete_listを変更するとどうなるのか

delete_list=["\n","/","#"]

Figure_2.png

delete_list=["\n","/","#","https","co","こと","ため","好き","よう"]

Figure_3.png

wordcloudを作成するときにstopwordsで指定しても効果は同じらしいです。

マーケターの方は使ってみてはいかがでしょうか。