Aggressive Style 5

Aggressive Style 5

昨今はコミケ関係を中心に書いています。同人やニコニコ動画方面で活躍される方の相互リンクをお待ちしています。

pixivのタグ情報を用い、「魔法少女まどか☆マギカ」のカップリングをネットワーク分析【PHP】【Cytoscape】

はじめに

f:id:RyuichiXP:20140811230008j:plain

いや〜夏真っ盛り、コミックマーケットのシーズンがやってまいりました。コミックマーケットと言えばやっぱり同人誌ですが、昨今では同人誌の頒布の告知をpixivでやる所も増えて来ました。pixivのイラストと言えば、タグで同じキャラクターや同じアニメのイラストを順次見る事が可能でしたね。

一方データ分析の見地では、「同じタグのイラストの投稿枚数」や「同じタグのイラスト数百枚の閲覧数の合計」等の情報から、キャラクター同士のカップリングの人気度を探ってみる動きが盛んです。

こうした方法として、htmlの特定のタグの情報のみ抜き去る「Webスクレイピング」の手法や、あるいはサイトが提供しているAPIを使う方法もあります。今日はこれからデータ分析を始めたい人向けに、何をすれば良いかについて説明していきます。

f:id:RyuichiXP:20140811230036j:plain

尚、本記事は以下の流れで進んで行きます。

f:id:RyuichiXP:20140811230057j:plain

第一章:グラフ編

まず第一章では「ネットワーク分析」を理解するために必要なグラフについて簡単に説明したいと思います。

f:id:RyuichiXP:20140811230125j:plain

グラフは主に、2つ以上の要素(人物、駅、場所など)を結んで行き、節点同士の関連性を見いだすことに用いられます。

f:id:RyuichiXP:20140811230201j:plain

又グラフは2つ以上の節点と、それらを結ぶに依って構成されます。辺に方向が定まっているグラフの事を有向グラフと呼びます。

f:id:RyuichiXP:20140811230226j:plain

さらに辺に数値などの重みをもたせたグラフを重み付き有向グラフと呼びます。これは主に2地点間の時間に注目して、最短経路を求める(最短経路問題)ときに用いられます。

f:id:RyuichiXP:20140811230305j:plain

とグラフの説明が終了したので、次はpixivイラスト検索APIの説明を始めます。

第二章:プログラム編

f:id:RyuichiXP:20140811230343j:plain

全体の流れ

まず全体の流れをざらっと確認します。要約すると、pixiv APIからcytoscape用のcsvファイルを生成し、cytoscapeでグラフのネットワークを作成する流れとなります。

pixivイラスト検索API

ここで今回用いるpixivイラスト検索API(以下pixiv API)について確認してみましょう。pixiv APIとは特定のURLにアクセスすると得られるcsvファイルのようなものです。以下のURLから様々な情報を得る事ができます。

http://spapi.pixiv.net/iphone/search.php?&s_mode=s_tag&word=(A)%20&order=date&PHPSESSID=0&p=1

f:id:RyuichiXP:20140813130420j:plain

恐らくcsvを見ても「何を出力してるの?」と思う事だと思います。幸いな事にQiitaのnezuq氏が「Pixivイラスト検索APIの取得結果のデータ構造を調べる」についてまとめておられます。以下のスライドではその中で特に重要な箇所のみまとめてみましたのでご確認下さい。

f:id:RyuichiXP:20140811230458j:plain

pixiv APIをプログラムで用いる!

さてここからはpixiv APIをプログラムで用いる方法について説明します。一般的にはネットワーク分析を行う場合は、「pixivのタグ頻度から考えるラブライブのカップリング(驚異のアニヲタ社会復帰への道)」さんのようにR言語+igraphで作業を進めることが多いようです。

上記の場合データをさばく部分(R)と、データを描画する部分(igraph)に分かれます。又R+igraphを用いる利点は、重みに応じてグラフの辺の太さを変えられる点です。しかし自分は上記ブログを読んでも真似できなかったため、自分のできるPHPでやる方法を思いつきました。

PHPPythonなどのサーバー向けの言語を使う利点は、データベースと連動しやすい点です。データベースを上手く使うと、特定の時間に応じてネットワークの変化を追っかけやすくなります。ともすれば時間に応じてネットワークやデータの変化を観察しやすくなります。絵柄やグラフィックが好きな方なら、データを描画する部分をWebGLCanvasで一から実装し、グラフの絵柄に拘る事も可能になることでしょう。

さてオークションサイトの「オークファン」などでも、ヤフオクの過去の購入履歴の情報を蓄積する事を商売にしています。ヤフオク側が提携するのも、過去の資産の量がオークファン側に充分あるからだと考えます。このように過去のデータを蓄積する事が思わぬ事につながる事も少なくありません。

f:id:RyuichiXP:20140813130551j:plain

さて夢を語るのはここまでにしてpixiv APIについて説明しましょう。見えづらいかもしれませんが、pixiv APIを開いた時の様子は以下のようになります。今回は閲覧数(view_cnt)の合計を出すために、ここから閲覧数の情報を引っ張ってくる必要があります。今回は23019などの数値を引っ張ってきて、その合計を計算する流れになります。

f:id:RyuichiXP:20140811230622j:plain

次はAPIの情報をPHPで取得し、「,」で区切ってやるなどして目的の情報にたどり着くようにします。閲覧数の合計は横から数えて18番目のようなので、最後の添字の番号は17となります。

f:id:RyuichiXP:20140811230648j:plain

最後は、タグ別に集計した合計の値をcsvに書き込む作業となります。何番目に何を書き込むか?読み込むソフトウェアの文字コードなどに注意します。cytoscapeの場合は[(節点の)矢印の始点、矢印の終点、重み]の順に、文字コードutf-8で書き込むと良いでしょう。

f:id:RyuichiXP:20140813130627j:plain

ソースコード

ここまでの様子をすべて書いたソースコードは以下のようになります。各自自由に改造したり、無断で用いたりしても差し支え有りません。尚、ソースコードの不備や綺麗さに関してはご容赦下さい。

第三章:cytoscape

f:id:RyuichiXP:20140811230911j:plain

cytoscape

cytoscapeとはJavaで書かれたグラフ描画アプリケーションです。第二章で生成したcsvファイルを読み込み、グラフで描画するまでを書こうと思います。まず本記事ではcytoscapeを使うので、インストールされてない方はcytoscape公式サイトよりインストールして下さい。

f:id:RyuichiXP:20140811230954j:plain

cytoscapeを起動

cytoscapeを起動したら、「File」→「Session」を選択し新規作成。次に「Import Network From File」を選択してcsvを読み込みます。後はInteraction Difinitionのところで「Column 1、3、2」の順で入力していきます。

f:id:RyuichiXP:20140811231024j:plain

グラフの形状を変えたいときは?

こうするとグラフが画面右に描画されます。描画されたグラフのレイアウトを変えたいときは「Layout」から選択することができます。

f:id:RyuichiXP:20140811231055j:plain

一方グラフの節点の色などを変えたい場合は、「Control Panel」で調整していきます。

f:id:RyuichiXP:20140811231128j:plain

以上で第三章を終了します。次はいよいよ結果発表です。

最終章:結果発表

f:id:RyuichiXP:20140811231200j:plain

結果発表

簡単ながら結果発表をと行きます。調査は8月5日におこない、そのときの結果を講評していきます。

今回は「鹿目まどか(まど)、暁美ほむら(ほむ)、美樹さやか(さや)、佐倉杏子(杏)、巴マミ(マミ)」の5人のすべてのカップリングの順列(5P2 = 20通り)における、投稿数の合計の表を以下に列挙します。順列の性質上(まどほむ)(ほむまど)などは区別して数えるものとします。

f:id:RyuichiXP:20140811231227j:plain

そして5人の表をネットワークにしたのが下図です。こうやってみると「まどほむ」「ほむまど」「マミほむ」「ほむマミ」「マミ杏」 「さや杏」「杏さや」「さやまど」などが多いことがわかりました。

f:id:RyuichiXP:20140811231257j:plain

最後の雑談

今回ネットワーク分析を扱いました。多くのブログを見て、見よう見まねでやってみたいと思い、このような大長編となってしまいました。さてpixiv APIにおけるイラスト閲覧数の合計を取る発想は、「pixiv のタグ情報を用いた「ラブライブ! School idol project」のカップリングネットワークの構築(iwi) 備忘録」さんから参考にさせて頂きました。

f:id:RyuichiXP:20140811231523j:plain

一方cytoscapeの使い方においても、「Cytoscape J」さんを参考にさせて頂いた次第です。

f:id:RyuichiXP:20140811231615j:plain

謝辞(というより最後の最後の雑談)

そんなこんなで、最後に謝辞と行きます。数学やプログラムの解説だったので、女の子のイラストを使ってやろうと思った訳です。そんな訳でpixivのyももさんにOKもらえ、感謝の念でいっぱいです。
ちなみにイラスト名は「立ちマミさん(yもも氏:45063978)」となります。

この他多分事後報告になっちゃうかもですが、Pixiv APIの情報をまとめて下さったnezuq氏にも本当に感謝いたします。

f:id:RyuichiXP:20140811231700j:plain

と言う訳でここまでお読み頂いた皆さんありがとうございました。説明を後で読みたい人向けにダウンロード用スライドを用意しました。本記事を読んだついでにお持ち帰り下さい。