JR東日本がSuica情報を売り出したことと、Hadoop MapReduceの実力

話が脇道にそれてしまうが、2013/7/18の読売新聞の記事を見て驚いた。1面トップに「Suica履歴売り出す JR東日本」。
どんな情報を売り出したのだろうと読んでみたところ、

提供データは私鉄を含む首都圏約1800駅の利用者の性別、年齢、乗降日時。定期券として使う客の場合も指名や住所は除き、IDで個々のデータを識別する日立製作所が購入し、駅ごとの集客力や客層を分析した上で販売。情報料は最低で年500万円....

読売新聞(2013/7/18夕刊)より抜粋

と書いてあった。

SuicaPasmoの情報はビッグデータの目玉の一つ。日立製作所はスゴい商材を手に入れたと思う。

ちょうどHadoop MapReduceであれこれやっているので、シミュレーションをしてみようと思い立った。集計や抽出は、MapReduceが一番得意な分野なので、簡単にプログラムできる。

シミュレーションの概要

小手調べに以下のようにデータを作成した。
電車の利用者の総数は200万人(実際には1桁違うが、自分のPC能力で手早くやるサイズ)。1週間7日で52週分(=1年間)とする。

この200万人に[0-2000]の一様乱数で2000の降車駅を選ばせる。降車時間(時間)は17時00分を平均として、標準偏差3時間の正規乱数で決定した。また、分単位は0-60の一様乱数により決定した。
また、人には乱数で男性か、女性かを決定した。
「降車」としたのは、「駅近辺の商圏に人が流れてくる」分析が、一番一般的と考えたため。





上記の仮定のもとで、シミュレーションデータを作成した。

以下がデータのサンプル。左から、週(1-52)、曜日(0-6)、性別(F/M)、駅(1-2000)、降車時間(時)、降車時間(分)となっている。

1 0 M 494 18 41
1 0 M 361 18 24
1 0 F 1196 18 55

データサイズは
2,000,000×52×7=728,000,000(7億2800万)
行。バイト数で12.5GBとなった。


このデータをAmazon S3(以下、S3)に保管して、Amazon Elastic MapReduce(以下、EMR)により以下を集計してみる。

  • 一日の各駅の男女別の降車人数(1時間刻み)
  • 一日の各駅の男女別の降車人数(5分刻み)
  • 特定の駅の特定の一日の男性の降車時刻の抽出

コードは至って簡単なので、1時間ほどで作れてしまう。

インフラ

Hadoop MapReduceのインフラは、EMRに以下のクラスタを用意した。これは、以前のログで行列積を算出するのに用いたものと同等である。

インフラ Amazon Elastic MapReduce
リージョン US Standard
インスタンスタイプ m1.small
マスタ・インスタンスグループ 1インスタンス
コア・インスタンスグループ 8インスタンス
タスク・インスタンスグループ 10インスタンス


ポイントは、m1.smallというPC程度(しかもちょっと古い位)のマシン構成であること。これで計算できれば、サイズをアップすることで、確実に線形にスケールする(∵ MapReduceの一番得意な処理のため)。

結果(実行時間)

一日の各駅の男女別の降車人数(1時間刻み)

実行時間:58mins, 9sec

一日の各駅の男女別の降車人数(5分刻み)

実行時間:1hrs, 30mins, 58sec

1時間刻みの集計と比較して、データの書き込みが11倍になるためのオーバーヘッドが発生したと考えられる。

特定の駅の特定の一日の男性の降車時刻の抽出

実行時間:11mins, 26sec

以下は、上で得た「ある駅の一日の男性客の降車数(5分刻み)」を、度数グラフにしたもの。
17:00を基準にしたシミュレーションだが、この駅をピックアップすると、降車のピークがずれている。

まとめ

上記のシミュレーションは、「電車の利用者が200万人と仮定して、2000駅での利用者の降車時刻(分単位まで)を1年分処理する」というもの。

データは、7億2300万行であったが、Hadoop MapReduceで計算すると、

  • 各駅の降車人数を1時間単位で男女に分けて集計するのに、1時間程度
  • 各駅の降車人数を5分単位で男女に分けて集計するのに、1時間半程度
  • 上記の結果から特定の駅の特定を日の(男性の)降車人数を計算するのに10分程度

という「ちょっとビックリな時間」で計算を行うことができる。実際にJR東日本場合には、この数十倍のオーダーになると思われるが、その場合、EMRのサイズをあげて、数を増やせば、同程度かそれ以下の時間で計算できる可能性がある。


上でも3つ目の結果の度数グラフを出したが、意味を考えると、とても興味深い。グラフは以下のようなことを示している。



上の絵で注目すべきポイントは、時系列的に降車人数と男女、年齢構成比が変化していることと、変化するポイントは1時間ではなくて1時間15分であること。
時間がずれることは、電車の到着時刻などであり得る話と思う。

さて、この場合、最初のピークには女性の比率が多いから、スーパーは総菜などの量を増やすとか、値下げの時刻をここにするなどの施策が打てる。出店際の材料にもなるだろう。出店するには、初期のスタッフ数やシフトを決めなければならない。
女性客の多い、整体や美容院、エステティックサロンなどは、この時間を外さずにビラをまくのがいいだろう。

ピークが一段落する時刻には、アルバイトを減らすことができる。

夜の最終ピークに合わせて、バスやタクシー会社は配車のスケジュールが組めるだろう。

これらの施策は、これまで経験で行われてきた領域である。それが正しかったのか、それとも改めるべきなのかを客観的に決めることができる。1時間おきの集計でもスゴいことなのに、5分おきに決めることすら可能だし、1分おきでも可能だろう。
これを支える技術の一つがHadoop MapReduceのような大規模分散処理であって、上記の結果をみれば、毎日、施策を変えることもできるだろう。
データ処理のコストもチープである(私が、ブログで実験をしているのだから)。
これが、「ビッグデータ」というものの「一つの側面」に他ならない。

JR東日本で売り出した、Suicaのデータには、IDまで含まれているそうだ。
これを個人と紐づけることは個人情報保護法に抵触するからできない。だが、遠くまで通勤する人が多い地域なのか、そうでないのか?遠くまで通勤する地域であれば、キーになる駅までバスを走らせたらいいかもしれない。

これが年500万円から購入できる、というのが、新聞記事の意味である。
大企業には間違いなく「安い買い物」と思う。