2020年06月19日

アイドルTwitterアカウント分析ダッシュボードを作りました

アイドルTwitterアカウントのフォロワー分析ダッシュボードを作りました。


アイドルさん、アイドル事務所の方々、データが好きなオタクの方々に触っていただけると至福の喜びです。また対象とするアカウントから漏れているアイドルさん及びその関係者(ご家族、事務所、オタク)の方々、大変申し訳ありませんが、ご連絡いただければ可能な範囲で追加対応いたします。




アプリ概要


さて、アプリの概要について。このアプリではアイドルアカウントのフォロワーIDを2020/6/10より、約22時間30分ほどかけて毎日取得しています。

フォロワーIDに着目した理由ですが、フォロワー数という指標だけを追跡するのであれば、そんな面倒なことをする必要がないのですが、フォロワーIDを使ったことで今まで見えてこなかったアイドルのファン構造を可視化することができます。特にフォロワーIDを時系列継続的に組み合わせることで①フォロワーの流入流出を、アイドルグループのフォロワーIDを横断的に組み合わせることで②フォロワーの重複を可視化できます。

まず、①フォロワーの流入流出について。例えばあるアカウントのフォロワーが100人いて、翌日に120人になったとします。このとき20人増加というのがフォロワー数だけを見た時の情報量です。ただこれって、誰もフォローを外さずに20人新たにフォローしてくれたのか、20人フォローを外されて40人新たにフォローしてくれたのか、で意味合いが全然違いますよね。フォロワーIDを追跡することで、新たに何人フォローしてくれたのか(流入)、何人がフォローを外したのか(流出)を分離して観察することが可能となります。

この分析が何の役に立つか。例えば「〇〇メンバー卒業」といった出来事があった際に、メンバー卒業というオタクの方々にとっての寂しい出来事によってフォローを外す人もいれば、その逆、メンバー卒業がメディアに取り上げられることで初めてそのグループを知りフォローする人もいるかもしれません。フォロワー数の推移はそれら要因の影響の合算でしかないのですが、フォロワーの流入流出を正確に追うと、そのイベントによるポジティブな影響とネガティブな影響を分けて観察できます。

ちなみにこの分析の必要性を感じたのは、以前書いた「モーニング娘。19ロッキン出演前後のTwitterフォロワーの可視化」の下の図から。ロッキン前後のフォロワー数は554人増加なのですが、流入と流出を分けてみると、流入が829人、流出が275人と、流入は見た目の数値の554人よりずっと多いですよということなんですが、ということは流出が結構多いんですよね。これを見てTwitterってひょっとするとテレビ番組のチャンネルのように使われていて、チャンネルを変えるような感覚でちょっとフォローしてみて微妙(タイムラインを結構圧迫する)だったらフォローを外す、という行為が結構多いのかもしれないということに気が付いて、この分析機能の必要性を思い立ちました。

rokkinzengo.png

②フォロワーの重複について。これは現場に通うファンにとっては自明ですが、複数のアイドルグループを応援するファンは多いんですよね。その複数グループを応援しているという情報は、「複数グループのフォロワーIDの重複」から読み取れるのではないか、というのが出発点です。この検証は、「アイドルに関するデータ収集~分析:1.1TwitterデータからDD度の可視化」や「Twitterフォロワーの重複情報を用いて推定したタレントのポジショニングマップ」他多数で行っていますので、そちらもよければ見てください。

この分析の楽しさとしては、これまで同一事務所アイドルのファンが重複しているのはオタクにとってはなんとなくわかっていたことですが、それを定量的な指標として求められるようになったことだと思います。もちろん同一事務所だけではなく、他事務所のアイドルファンとの重複も観察できるようになります。あとで是非アプリで「ねぎっこさんとNGT48さんの重複」「ねぎっこさんとSKE48さんの重複」を見てみてください。重複具合が異なるのがよくわかると思います。

更に①②を合わせると、「誰が流入してきたか」がわかるようになります。例えば「モーニング娘。さんとももクロさんとAKB48さんのテレビ共演」といった出来事があった後に、モーニング娘。さんのフォロワー流入が100人あったとします(①)。この100人って誰なんだろうというのを、100人中ももクロさんフォロワーが30人、AKB48さんフォロワーが20人、それ以外の新規参入50人といった具合に分離して考えることができるようになります(②)。ところでこの新規参入の方々、「このあたりの記事」を見ていてめちゃくちゃ観察がいがあるなと期待しています。まだ機能としてはありませんが、この新規参入の人たちが流出せずに残るのか/あるいは流出するのか/流出しやすい人はどんな特徴を持つのか、というのが私の今一番明らかにしたいトピックです。

最後にアーキテクチャについて。データ取得・集計のサーバーとしてGoogle Compute Engineを常時稼働させフォロワーIDを取得後、Google Cloud StorageにフォロワーID及び集計済み結果をテキストファイルとして保存させ、webサーバーはRstudio社のShinyApps.ioを利用し、Cloud Storageから集計済み結果をダウンロードして表示しています。各使用料はCompute Engineの稼働に5000円/月ほど。Cloud Storageは今はほとんどかかっていませんが、200MB/日なので1週間で1.4GB、1か月で6GB、1年で72GB溜まっていきます。ShinyApps.ioは無償版なので無料。

長々と説明しましたが、以下よりアプリの機能のお話です。


アプリ機能1:フォロワー数推移


まず1つ目。ラジオボタン「Number of followers ~」選択して、「Analyze!」を押してください。横軸が日付、縦軸がフォロワー数の折れ線グラフが出てきます。縦軸のスケールはアカウントによって違うのでご注意。AKBさんが途中からなのは、データの取得開始が遅れてしまったためです。

1.PNG


アプリ機能2:フォロワー流入・流出


2つ目。ラジオボタン「Number of inflow/outflow~」選択して、「Analyze!」を押してください。横軸が日付、縦軸がフォロワー数の折れ線グラフで、流入出を色(赤=流入、青=流出)で示しています。流入(赤)が流出(青)より上に来ていると、その日はフォロワー数が増加したことを意味します。

2.PNG

 

アプリ機能3:2グループ間のフォロワー重複


3つ目。ラジオボタン「Venn diagram with ~」選択して、「Analyze!」を押してください。プルダウンで選択した2アカウントと日付けにおける、フォロワーの重複のベン図が出てきます。比率は和集合に占める値であること、円の面積は変わらないことにご注意です。

プルダウンのアカウントを色々と変えてみると、同じ事務所のアイドル間と、別の事務所のアイドル間で重複の大きさが異なることを感じることが出来ると思います。下の図は「モーニング娘。さんとアンジュルムさんの6/10の重複」ですが、この2者の重複は75099アカウントもあります。

3.PNG

一方で、下の図は「モーニング娘。さんとももクロさんの6/10の重複」ですが、この2者の重複は3637アカウントと、先ほどの75099と大きな差があります。

3-2.PNG

アプリ機能4:全グループフォロワーネットワーク


4つ目。ラジオボタン「Followers network of all groups ~」選択して、「Analyze!」を押してください。先ほどベン図で見た重複の大きさを全アカウントの組み合わせについて求めてネットワーク図が出てきます。ベン図の重複が大きいほど、アカウント間の距離が近くなります。アカウントの色は所属する事務所によって変えています。過去のブログで何度か言及してますが例えば、
・同一事務所は距離が近い
・ももクロが他アイドルとの重複が少ない
ということがさっと確認できると思います。

4.PNG

アプリ機能5:流入がどこから来たか


5つ目。ラジオボタン「Where did inflow come from ~」選択して、「Analyze!」を押してください。account1で選択したアカウントについての「誰が流入してきたかの推移」を折れ線グラフ(帯グラフ、積み上げ帯グラフではないのでご注意!)で表示しています。一番上の「All」がその日の流入総数で、「New」が新規参入者(流入のうち、他のどのアイドルもフォローしていない人)の数、「xx」が流入のうちxxをフォローしている数を示します。アカウントには重複があるので、All以外の折れ線グラフを足し合わせるとAllにはならないのでご注意です。


5.PNG

アカウントによって特徴が見えて面白かったので、簡単ですが整理してみます。
■ハロプロ
 ☆新規が最大の流入であるグループは、モーニング娘。アンジュルム、鈴木愛理。
 ☆Juice、つばきファクトリー、ビヨンズは新規よりアンジュルムからの流入の方が多い。
■スタダ
 ☆ももクロ、エビ中ともに新規が最大の流入。
 ☆石田つぶやき:あー、スタダさんはもうひとグループとっとくべきだったな。しゃちほこさんかたこやきさんか。
■46
 ☆乃木坂、けやき坂、日向坂ともに新規が最大の流入。
 ☆石田つぶやき:乃木坂さん改めて毎日1000人から新しくフォローされているの凄いな。。
■48
 ☆それぞれ新規が最大の流入。
 ☆次いで46からの流入が多い。
■ねぎっこ、フィロのス、BISH
 ☆それぞれ新規が最大の流入。
 ☆特にBISHは新規の割合が高い。

ハロプロさんは新規の口がモーニング娘。さん、アンジュルムさん、鈴木さんで、そこからハロプロ別グループに流れていくってのはわかるんですが、モーニング娘。ではなくアンジュルムからの流入が最大ってどういうことだろ。(10分経過)だめだわからない。。こういう違和感を感じるのも可視化できたからですね、成果あり。ということで収めることとします。

取得したアカウント


最後に収集しているアカウントについて。以下21のアカウントを対象としています。

【ハロプロ】
【スタダ】
【48】
【wack】
【他僕が気になっているグループ】

私自身がハロオタのためハロプロ中心に思いついたアカウントから収集しています。追加のご要望がございましたらコメントなどでご連絡いただければと思います。本当は嵐さんとかも取りたいんですけどね。。API制約のためフォロワー75000人集めるのに15分かかり、嵐は235万フォロワー(20/6/19時点)なので8時間かかるんですよね。。

最後に今後の展望ですが、このダッシュボードにTwitter以外の情報も重ねていければいいなと妄想しています。メンバー数や、インスタフォロワー数のような定量的なもの、TV出演・対バンライブなどの定性的なものまで。
posted by 石田泰浩 at 08:33| Comment(0) | アイドル | 更新情報をチェックする

2020年06月14日

バズるについて一考察しようとしましたが、データ分析は「実験」がものすごく大事という話などに脱線します

Twitterの分析をしていると、「バズる投稿」について聞かれることがあったので、自分がもし開発した商品をバズらせたいんだけどと相談を受けた研究者だった場合、どうするかを考えてみました。実現可能性は置いておいて(だめじゃん笑)面白い実験案を思いついたのですが、その実験を考え付く思考プロセスは整理しておくと今後誰かにデータ分析について話すときに便利かもと思ったので、まとめてみます。

まずこのようなご相談があった場合、研究者に大きく期待を寄せられているのは「この条件が整うとバズる」という「再現性」を発見することかなと。「再現性」を発見するために必要なのは、仮説を立て、それを検証するための実験をすること。で、この実験が再現性発見のためには最重要で、実験が適切に行われれば、複雑な統計モデルは不要。得られたデータを比較するだけで本当に終わりです。例えばどういうことか。

中学生の時に「光合成の発生条件は何か」という課題について、あなたはどのように取り組んだか、というのを振り返ってもらうのがわかりやすいと思う。このときに統計モデルは使った記憶はないはずだが、用意された仮説とはいえ、「日光が必要」というものすごい事実を発見できた。それは仮説を立て、その仮説を検証するための実験が非常に適切なものだったから。

「光合成には日光が必要」という仮説を検証するために、どんな実験をしたか。それは「日光を浴びる葉Aと日光を浴びない葉B」を用意したと思う。そしてもう一つ重要なポイントは、「その他の条件を全て同一にした」こと。例えばAにアジサイの葉を使ってBにヒマワリを使った、ということではなく、Aにアジサイを使っているのであれば、Bにもアジサイを使ったはず。こうして日光の有無以外全ての環境を揃え、KPI、これもめちゃくちゃ大事ですね、光合成の条件を考えるには、「光合成でしか発現しえない」ものをKPIとする必要があります。このときはデンプンだったかと思いますが、ヨウ素液にAとBを浸して、Aのみ青紫色になり、めでたく「日光が光合成に必要」ということが検証できた。

よって適切な実験結果さえあれば統計モデルは不要。ただし実は「同一」という条件は本来はパラレルワールドが用意できない限り自然界に存在しなくて、光合成の実験も、AとBは真の意味で「同じアジサイの葉っぱ」ではないですよね。ですが、限りなく条件を近づけることをしたはずで、例えば「同じアジサイの隣接している葉っぱ」を使うとか。この限りなく近い条件を考えることで、我々はパラレルワールドなしで、現象を正しく理解しようとチャレンジしています。

いくつか面白い事例ですが、「受ける教育によって所得が異なるか」の検証方法を考えてみましょう。先ほどの光合成の例と全く同じように考えればよく、「教育を受けるA君と、教育を受けなかったA君」を準備して、教育を受けたA君の所得と教育を受けなかったA君の所得を比較することで検証できます。。。。。つまり、この実験はパラレルワールドなしでは不可能なのですが、この条件を限りなく近づけるための実験というのを考えると、教育を受けたA君に非常によく似た子で、教育を受けていないB君を用意することを考えるのです。教育経済学者の中室牧子先生はこの比較する2者を「双子」とすることで、限りなく近い子を用意することにチャレンジしています。「双子のデータを用いた教育の収益率の推計」。

他にも薬学の分野だと、「薬が本当に効くかどうか」を検証するために、「薬を与えたAさんと、薬を与えなかったAさんに非常によく似たBさん」とするのではなく、Aさんに与えた薬の効果には「本来の効果」と「プラシーボによる効果」があることがわかっているので、「薬を与えたAさんと、薬の成分が入っていない偽薬を与えたAさんによく似たBさん」を実験として用意することを考えています。

という視点で、「バズる投稿」の条件を検証する実験を考えましょう。まず24時間のうち「21時に投稿するとバズりやすい」という仮説を思いついたとします。これを検証したいとするのであれば、「21時に投稿した世界と、21時以外に投稿したパラレルワールド」を用意して、前者はバズって後者がバズらなければ検証成功です。ですが当然パラレルワールドは存在しないので、パラレルワールドに限りなく近づけるための実験を考えます。

例えばですが、日本以外で申し訳ないですが(なんでやねん笑)「時差」ってパラレルワールドに使えないかなということを考えたことがあって、例えばアメリカの西海岸と東海岸によく似た州(ある?笑)があったとき、西海岸では21時、東海岸では西海岸標準の21時に同時に投稿すれば、時間以外について近い条件というのが達成できないでしょうか。あとは誰が投稿する、という問題については西海岸支店と、東海岸支店の別のアカウント(フォロワー数、フォロワーの性質は似ているとする)で行えばOK。うーーん、やっぱ実験って難しいな。。笑

ところで、実は今年、最大のパラレルワールドがコロナによって引き起こされているんじゃないかなと思います。去年の自分に、来年は感染病が流行して、外に出ない社会になるよと言っても信じないでしょう。それぐらい社会が変わったのですが、研究者としてはこれを「何の実験が起きているんだろう」と逆算すると、これまで検証できなかった仮説が検証できるのではと思っています。

例えば「スポーツのホーム試合はなぜ勝率が上がるか、声援が力になるためだろうか?」について。これについて興味深い考察ができるかもと思っていまして、ホーム試合の勝率にはその他にも「場所慣れしている」といった要因も寄与していると言われています。よって「声援が力になっているかどうか」を検証するためには「ホーム試合で声援のある試合と、ホーム試合で声援のない試合」を用意する必要があったのですが、それは当然不可能でした。しかし今年はそのデータが無観客試合によって手に入る(ただし当然、チームの選手構成・能力のような最重要変数を固定できていないので、検証のための問題は山積みですが)。もし声援がないために勝率が下がっていることを最初に検証できたチームは、「声援に変わるナニカ」をチームに付与できれば、もしかすると勝率は上げられるかもしれません。例えば、、味方がヒットを打つと盛り上がりの声援が聞こえたり、敵がヒットを打つとあ~~~~あと言う声援が聞こえたりするような仕組み。(スポーツマンシップにのっとってないか。。)

ということで、まとまりがありませんが、僕がパラレルワールドを楽しむ方法でした。笑
posted by 石田泰浩 at 07:23| Comment(0) | データ分析 | 更新情報をチェックする

2020年06月04日

Twitterにおける誹謗中傷判定ロジックをwebアプリにて実装




背景


先日推しのタレント岡井千聖さんが、SNS・Youtubeにて不特定多数より暴言を吐かれ、SNS・Youtubeでの全ての活動を休止し、僕の気分は最低レベルにまで落ち込んだ。この出来事を機に、誹謗中傷を見なくて済む楽しい世界作りをエンジニアリングによって支援できないかと思い、誹謗中傷のリプライを判定するロジックを社内の皆さんと相談して作ってみた。


誹謗中傷の判定ロジック


誹謗中傷の判定と聞いたときに、どのような判定方法を想像するだろうか。例えば人を傷つけるであろう一般的なワード(例:ばか)を定義して、そのワードが含まれた時、そのつぶやきを誹謗中傷と判定するという方法がまず考えられる。この方法の問題は、「ばか」という言葉を受け取った側は必ずしも「誹謗中傷」と感じない時があることである。例えば私が知らない人から「ばか」と言われるとイラっと来るだろうが、岡井千聖さんから「ばか」と言われたら嬉しくて舞い上がる。またその逆、知らない人からの言葉は「善意のアドバイス」でさえイラっと来るような状況もあるだろう。つまり、受け取った側にとっては「何」を言われているかではなく、「誰」から言われているかが、快・不快の判定基準として大きいのではないか、と考えた。

こうして「誰」に着目し、実際に誹謗中傷をしているアカウントを観察してみたとき、次の特徴が得られた。①誹謗中傷を飛ばしているが、その飛ばした先のアカウントをフォローしていない。②1アカウントに対し誹謗中傷を行うのではなく、不特定多数のアカウントに誹謗中傷リプライを飛ばしている。③フォロワーが少ない。フレンズ(フォロー先)も少ない。(その他、スクリーン名が初期値ランダム英数など)

ここで別の切り口、炎上の参加者は全体の0.5%しかいない、その0.5%が複数回参加している という話があるのだが、まさにこの「複数回参加」という特徴、②の人たちと同じではないか、すなわち②の人たちのリプライが目に入らないようにすれば、誹謗中傷の問題は緩和できるのではないか。

ただし②には「不特定多数のアカウントに誹謗中傷リプライを飛ばしている」判定が必要になるが、これをどうするか。この点を次の通り置き換える。「不特定多数のアカウントに誹謗中傷リプライを飛ばしている」→「フォローしていないアカウントにリプライを飛ばしている」。もちろんフォローしていないアカウントにリプライを飛ばすことはあるが、その頻度が多すぎると、怪しいとみなす。



色々書いたが次の3つをロジックに組みこむ変数とし、①②③に当てはまるほど誹謗中傷を行う確率が高いアカウントと判定する。
①自分をフォローしていない。
②フォローしていないアカウントにリプライを送っている頻度が多い。
③フォロワー数が少ない。

あるアイドルAさんについてのリプライを収集して、①②③の順で並び替えてみたが結構面白い結果が出ていた。それはAさんのファンの1人が誹謗中傷を行う確率が高いと判定されており、そのファンはAさんにはリプライで非常に好意的なことを言っているのだが、②の当てはまりが高く、実際にその人は別の芸能人を攻撃していた。それはテキスト分析では出てこない結果で、このロジックではファンの人は行動を改善しない限りAさんにリプライを読んでもらえない。

webアプリを作った


ロジックをRで実装し、shinyで触れるようにしてみました。

webアプリの入力(A)→処理(B)→出力(C)は次の通り。
A:入力として「X(スクリーン名)」「N(スクリーン名へのリプライ数)」を受け付ける。
B-1:XへのリプライをN件取得する。その中のリプライ者をRとする。
B-2:Rのフレンド(フォロー先)リストFを取得する。
B-3:FにXがあるか確認する。(あれば1、そうでなければ0)
B-4:Rの直近のつぶやき100件を取得し、その中のリプライのうち宛先がFにも含まれる率を集計する。
B-5:Rのフォロワー数を取得する。
C:B-3,B-4,B-5で得られた指標に基づいて、それぞれ降順、降順、降順に並び替える。

B-3,B-4,B-5についてはキャッシュが残るようにしたので、一度取得したRの取得に時間をかけないようにした。

これただ今のところ大変残念で、standard APIでは15件以上取ってこようとすると15分待たなければいけないし、2回連続で取ろうとすると前に実行したクエリでなければ15分待たなければならないので、今のところ分析用には使えない。premium APIに差し替えたい。

2週間で今まで触ったことのないshinyも勉強して作り上げた。僕をここまで動かす推しはやはり偉大。最強の原動力。幸せになってくれよ岡井ちゃん。
posted by 石田泰浩 at 08:43| Comment(0) | Twitter | 更新情報をチェックする