読者です 読者をやめる 読者になる 読者になる

ハウテレビジョン開発者ブログ

『外資就活ドットコム』を日夜開発している技術陣がプログラミングネタ・業務改善ネタ・よしなしごとについて記していきます。

当社データサイエンティストがこよなく愛している『mコマンド』で数億行を高速集計する話

データ解析

どうも。

1月に入社したばかりの、データ分析担当のn_maoです。

と言いながら、最近はHTMLとjsばかりいじっております。

それはそれで楽しいです。

さて今回はデータ分析のざっくりとした仕事内容と、その分析にかかる手間を省くツールをご紹介します。

データ分析の仕事

まずは私の行っているデータ分析という仕事の内容をご紹介します。

私の主な仕事は大きく分けて4つです。

  1. 売上げ、会員登録数などの簡単な集計&自動レポーティング
  2. データベースからの知識発見(いわゆるデータ分析)
  3. 分析結果をもとにした企画立案
  4. 実施された企画の効果検証

あくまで私個人の仕事内容であり、データ分析者全員に当てはまるわけではありません。 アルゴリズムの研究開発の方や、インフラ寄りの方もいらっしゃるでしょう。

ですが、同じ職種の方で業務範囲が被っている方も少なからずいらっしゃると思います。

これら4つの業務の中で一番時間がかかり、かつ難しいのは2,3のデータ分析&企画立案です。

スキルや知識、経験・センスなどの総合力が求められます。

とはいえ、難しいからこそ、分析は楽しいのです。

答えが分からないから知的好奇心がそそられます。自然と手も動きます。

問題は前処理ですよ。

データの欠損を補完したり、分析問題に適したデータセットを作ったり。。。誰かやってくれよと思います。

1や4は、2,3と比べて比較的簡単です。簡単と言ったら語弊があるかもしれませんが、データを取得して、加工・集計して、グラフにする技術があれば出来る仕事です。

1度出来るようになれば、精神を宇宙に飛ばしていてもできます。

しかし簡単な集計といえど、各部署が欲しい表・グラフをすべて作るとなると、とても時間がかかる作業です。

また、テーブル構造によっては、複数キーでの処理や、複数のテーブルをまたいだ処理も多く発生します。

そんな処理をサブクエリごりごり書いたり、××言語で1行ずつ条件分岐しながらどうのこうのしていたら、分析する時間なんていつまでたってもとれません。

単純な集計なんてさっさと終わらせて、楽しい分析に時間を割きたいですよね。

そんなあなたに!今回は良いツールをご紹介します。

nysolが開発した、前処理・集計に特化したツール、その名もMCMD(mコマンド)です。

以下のサイトから無料でダウンロードできます。

nysolホームページ

mコマンドの良いところ

- 処理速度がめちゃくちゃ速い

普通のMacBookで数億行のデータも軽く扱えます。

- 記述がとても簡単

多分Rやpythonなどのプログラミング言語で集計していた方からすると衝撃かと思います。

信じられない方もいらっしゃるかと思いますので、以下の条件で簡単な速度実験を行ってみました。

本当はRやpythonなどとの比較を行う予定でしたが、「こう書けばもっと速度上がるし」「このライブラリ使えよ」 などの抗議が恐かった(面倒だった)ため避けました。

気になる方は各自お手元のPCで比較実験してみてください。

その際、記述の容易さ、可読性にも着目しましょう。

条件

  • PC : MacBook Pro (Retina, 13-inch)
  • CPU : 2.6 GHz Intel Core i5
  • メモリ : 16 GB 1600 MHz DDR3
  • 処理内容 : キーを1つ指定して、合計、算術平均、標準偏差、最大値、最小値を算出する
  • 行数 : 10万行, 100万行, 1000万行, 1億行それぞれでテスト
  • キーの値の種類数 : 100種類

入出力データとコード

# 入力データの確認
$ head inp.csv 
key,value
59,396
76,438
45,129

# キーを1つ指定して、合計、算術平均、標準偏差、最大値、最小値を算出するコマンド
$ msummary k=key f=value c=sum,mean,sd,max,min i=inp.csv o=out.csv

# 出力データの確認
$ head out.csv
key,fld,sum,mean,sd,max,min
1,value,500236395,500.7185869992803,288.5789437969041,1000,1
10,value,499597816,500.2822020524077,288.6364641421515,1000,1
100,value,499699103,499.7445797567578,288.8225644172302,1000,1

結果

10万 100万行 1000万行 1億行
time(sec) 0.112 0.503 4.806 58.356

いかがでしょうか。さすがにこのスペックで1億行だと1分近くかかってしまいますね。

それでも1000万行のデータで5秒以内!めちゃくちゃ速くて、めちゃくちゃ記述が楽じゃないですか?

まだまだ良いところはあります。

- パイプで処理を続けることができる

mコマンド | mコマンド | mコマンド のように、複数の処理を続けて行うことができます。 思考が止まらず、パズル感覚で楽しいです。いちいちファイルに吐かなくても良いです。

- シェルコマンドと組み合わせることができる

シェルコマンド | mコマンド | シェルコマンド のように、シェルコマンドと合わせて処理可能です。trやsed,headなどはよく利用します。

- 基礎的な加工・集計の99%はmコマンドとシェルでできる

私はこのツールをもう6年くらい使っていますが、アクセスログや売上げデータの集計・加工レベルで困ったことはほとんどありません。

テキストデータなど、扱うデータによっては他のツールが必要ですが。

- リファレンスが丁寧

nysolホームページのリファレンスを見ていただくとわかると思いますが、とても丁寧に、事例付きで説明してくれています。

また、ターミナル上で

$ msummary --help

のように、--helpと打つと、同様のリファレンスが標準出力されるので、いちいちwebを開く手間もかかりません。

- 誰が書いても同じ記述

自由とはときに残酷なものです。分析者はコードに自由や個性など必要ないのです。分析内容で存分に個性を発揮してください。

最後に

今回は、データ分析の前処理や集計業務にかける時間を短くするために、素晴らしい集計ツールを簡単にご紹介しました。

慣れないうちはリファレンス見たり、正しく動かなかったりで、一時的にアウトプットの量が減るかもしれません。

しかし、1ヶ月もしたら大抵の処理はすらすら書けて、集計スピードにおいて社内であなたの右に出るものはいなくなるでしょう。

これであなたも立派な集計屋さんです!やりましたね!

やりたくない集計の依頼がどんどん舞い込みますよ!

先回りして、大量の依頼の前で死なないように予防線を張りましょう。(データアナリストの鉄則その1)