『入門ソーシャルデータ』9章: サンプルコードの実行

『入門 ソーシャルデータ』9章のサンプルコードの実行方法についてメモします。

前置き

9章に関して、先日から急に詳しくメモしているのは、今度の勉強会で発表を担当するためです。

当日は休前日だし、終了後には久々の懇親会もあるし、テーマも身近なFacebookです。忙しくて予習ができなくても、誰かとソーシャルデータのよもやま話をしたいから遊びに行こう、という人がいらっしゃると予想しています。

幸いこの勉強会では1時間前後の自習時間が設けられています。サンプルコードはWebで手に入るので、Python実行環境とFacebookアカウントさえあれば、その場で気軽に試せます。というわけで、予習がまだの方に当日読んで使ってもらえることを目指して、メモを書いています。

このまとめでは、実装の詳細には踏み込めていません。ガチな内容は、自習後の成果発表でいつも面白いものを見せてくださる常連の方々におまかせしたいと思います(スミマセン…いつもありがとうございます)。よろしくお願いします ;)

入門 ソーシャルデータ ―データマイニング、分析、可視化のテクニック

入門 ソーシャルデータ ―データマイニング、分析、可視化のテクニック

9章のサンプルコード群

コードは、原著者のgithubリポジトリhttps://github.com/ptwobrussell/Mining-the-Social-Web)で公開されています。

共通事項

今回、サンプルコードはIDLEで実行します。IDLEは、Pythonをインストールしたら付いてくる実行環境です。

注意
サンプルコードの実行時には、IDLEでプログラムにコマンドライン引数を渡す方法を行ってもよいのですが、今回はとりあえずサンプルを動かしてFacebookのデータを触ってみる体験に主眼を置くため、引数をハードコーディングして、IDLEのGUIから動かす方針とします。ご了承ください。

準備として、Facebookのアクセストークンを手動で取得して、ローカルの {SAMPLECODE_ROOT}\python_code\out\facebook.access_token に保存しておきます。(参考: 『入門ソーシャルデータ』9章: Facebookのアクセストークン取得 - 虎塚

IDLEを起動して、Ctrl+Oでサンプルコードを開き、F5キーで実行できます。

(追記) 本文で紹介されているFacebookのPythonSDK(https://github.com/facebook/python-sdk)はdeprecatedなので、forkされた中で現在最も活発なfacebookforpythonプロジェクトによるバージョン(https://github.com/pythonforfacebook)をインストールすると良いかもしれません。自分はそうしました。

(p.303)例9-5 引数に渡した文字列でFacebookのグループを検索する

次の部分の「sys.argv[1]」を、「"proguramming"」に書き換えます。

try:
    ACCESS_TOKEN = open('out/facebook.access_token').read()
    Q = sys.argv[1]

実行すると、たとえば、次のような結果が得られるでしょう。

Programming 114
Programming Expert 39
Programming 1
C# Programming For All 48
Programming 0
C Programming 0
DIPLOMA IN PROGRAMMING (DNA) 0
I Love Programming 0
Programming 0
PROGRAMMING SOLUTION 0
(以下続く...)

結果セットの上限は500件だそうです。自分が実行した時には、460件取得できました。

(p.309)例9-11 SQLライクな構文FQL(Facebook Query Language)をPythonでラップして実行する

引数を受け取る部分に、FQLを直接書きます。

# Sample usage...

if __name__ == '__main__':
    try:
        ACCESS_TOKEN = open('out/facebook.access_token').read()
        Q = sys.argv[1]

ここでは、自分の友人の名前、性別、リレーションシップステータスを取得するクエリを書きます。

        Q = 'select name, sex, relationship_status from user where uid in (select target_id from connection where source_id = me())'

実行すると、たとえば、次のような結果が得られるでしょう。

[
    {
        "relationship_status": null, 
        "name": "Taro Sato", 
        "sex": "male"
    }, 
(中略) 
    {
        "relationship_status": null, 
        "name": "Hanako Suzuki", 
        "sex": "female"
    }
]

(p.313)例9-13 Facebookの友人データをRGraphで可視化する

このサンプルでは、InfoVis Toolkit(http://thejit.org/)を使って、自分の友人のデータをRGraph形式で表現します。InfoVis Toolkitは、Web上でビジュアライゼーションを実現するためのJavaScriptライブラリです。RGraphがどんなグラフなのかは、InfoVisのデモページで見ることができます。

このサンプルコードは、手を加える必要がありません。実行すると、{SAMPLECODE_ROOT\python_code\out\ 以下に、facebook.friends.json が生成されます。{SAMPLECODE_ROOT\python_code/out/jit/rgraph/rgraph.html がこのJSONファイルを読み込み、ブラウザが開いて次のような画面が表示されるでしょう。

背景が真っ黒ですが、グラフが画面の中央に描画されています。

(p.319)例9-14 Facebookの友人データをSunburstで可視化する

このサンプルでは、Sunburst(http://www.cc.gatech.edu/gvu/ii/sunburst/)を使った可視化を行います。Sunburstは、階層構造を表示するグラフであり、ある集合のさらに詳細な割合を見せることができるのが特徴です。

まず、引数で友人データのJSONファイル名を受け取る部分を変更します。

# Reuses out/facebook.friends.json written out by 
# facebook__get_friends_rgraph.py
DATA = sys.argv[1]

ここでは、例9-13で生成したJSONファイルを再利用します。ファイルへの相対パスを、コードに直接書いてしまいます。

DATA = 'out/facebook.friends.json'

実行すると、{SAMPLECODE_ROOT}\python_code\out\jit\sunburst\以下に、sunburst.html が生成されます。ブラウザが開いて、次のような画面が表示されるでしょう。


(p.321)例9-15 Facebookの友人データをスプレッドシートにエクスポートする

まず、例9-14と同様に、引数で友人データのJSONファイル名を受け取る部分を変更します。

# Reuses out/facebook.friends.json written out by 
# facebook__get_friends_rgraph.py
DATA = open(sys.argv[1]).read()

ここでも、例9-13で生成したJSONファイルを再利用します。ファイルへの相対パスを、コードに直接書きます。

DATA = open('out/facebook.friends.json').read()

次に、文字コードのエラーを避けるために、ファイルを開く箇所でcodecsライブラリを使うように変更します。

filename = os.path.join('out', 'facebook.spreadsheet.csv')
f = open(filename, 'w')
import codecs # for UTF-8

(中略)

filename = os.path.join('out', 'facebook.spreadsheet.csv')
f = codecs.open(filename, 'w', 'utf-8')

実行すると、{SAMPLECODE_ROOT}\python_code\out\ 以下に、facebook.spreadsheet.csv が生成されます。

たとえば、これをLibreOfficeでグラフにすることができます。CSVといいつつタブ区切りなので、ファイルを読み込むときに区切り文字をカンマでなくタブに設定する必要があります。

友人それぞれが持つ友人関係の多寡が、グラフに可視化されています。

(p.324)例9-16 Facebookで特定のグループに属する人々の友人関係を可視化する

  • facebook__filter_rgraph_output_by_group.py

例9-14と同様に、引数で友人データのJSONファイル名を受け取る部分を変更します。

# Reuses out/facebook.friends.json written out by 
# facebook__get_friends_rgraph.py

DATA = sys.argv[1]

ここでも、例9-13で生成したJSONファイルを再利用します。

DATA = 'out/facebook.friends.json'

変更点はこれだけです。たとえば、今巷で話題のPythonJPというFacebookグループに自分が入っていた場合、実行すると次のように表示されます。

>>> 
0) PythonJP
Pick a group, any group: 

ここで、グループの番号を入力します。上の例では、1つのグループにしか入っていないので、選択肢が「0」だけですが、複数のグループに入っていれば複数表示される・・・ハズです。

Enterを押すとブラウザが開き、{SAMPLECODE_ROOT}\python_code\out\jit\rgraph\ 以下の rgraph.html が表示されるでしょう。

(p.328)例9-18 Facebookの友人の出身地と現在地をツリーウィジェットで可視化する

  • facebook__get_friends_current_locations_and_hometowns.py

このサンプルコードは、変更せずに実行できます。

実行すると、{SAMPLECODE_ROOT}\python_code\out\ 以下に、facebook.current_locations_and_hometowns.json が生成されます。ブラウザが開いて、同じフォルダの facebook.current_locations_and_hometowns.html がこのJSONファイルを読み込んで、表示します。

たとえば、次のような結果を得られるでしょう。

ツリーの1階層目に出身県、2階層目に出身市町村、3階層目に現在地、4階層目に友人の名前が表示されています。

上のスクリーンショットでは、北海道出身で現在東京都にいる友人の某さんが表示されているわけです。また、現在は互いに関連のない場所にいる友人ともう一人の友人が、じつは同じ県の出身であることが、見て取れたりします。

もちろん、友人による情報の公開範囲の設定上、出身地/現在地ともに「Unknown」という表示になる人もいます。

まとめ

ひとまずサンプルコードを実行して、可視化の様子を眺めてきました。ここを足がかりに、Facebookデータを扱うアプリをどんどん作っていこう、というのが本文の締めになっています。

ただし、開発者は当然ユーザのプライバシーに対して考慮する必要があります。Facebook側からも、開発者が守るべきポリシーが告知されています。このあたりは、後ほど発表資料で補足したいと思います。

# 本当はもう1つ(p.332)例9-19のコードが残っているのですが、日本語を上手く扱えなくてハマっています。Facebookのウォールデータをタグクラウドで可視化するという内容です。誰かボスケテください・・・(解決したら補足します…)

今回、サンプルコードを実行するだけにもかかわらず、師匠にあちこち助けて頂きました。多謝です。