大量データの集計にQlik Senseを使ってみよう

今回お話ししたいこと

はじめまして、西本です。この度、TECHSCORE BLOGに参加することになりました。どうぞよろしくお願い致します。今回は、仕事で使っていてこれは便利だぞと思ったツールを紹介したいと思います。

あるイベント会場にて、ブースごとにビーコンを設置し、来場者にビーコンを検知するアプリをスマートフォンにインストールしていただくことで、付近のブース情報をプッシュ通知でお知らせするという案件がありました。また、スマートフォンアプリが検知したビーコンのログデータを収集することで、来場者の会場内の回遊状況を分析することもできます。ちなみにビーコンとはこういう形状をした端末で、スマートフォンとBLE(Bluetooth Low Energy)で通信することができます。

1日に取得できたログデータは10万件以上。Excelで集計するにはつらいデータ量になっていましたので、分析ツールに流し込んでみることにしました。今回はその時に行った集計を、サンプルデータを使って紹介させていただきます。

Qlik Senseとは

Qlik Senseは、米Qlik社が提供している分析ツールです。ドラッグ&ドロップでダッシュボードを操作し、手軽に多次元データ分析を行うことができます。多次元データ分析を行うには、得てして事前に「キューブ」と呼ばれる多次元データベースを構築しなければならないのですが、Qlik Senseは生のデータをとりあえず読み込んでおけば、オンメモリでキューブを構築してくれるのが特徴です。その分、パソコンにはメモリをたくさん搭載しておく必要があるのですが、今回のデータ量であれば8GB積んでいる私のデスクトップPCでも大丈夫です。

Qlik Senseでは、無償で利用できるQlik Senseデスクトップという製品が提供されています。バージョンごとに利用できる有効期限が設定されていますので、有効期限が切れた後は再度最新版をダウンロードする必要がありますが、利用できる分析機能に制限はありません。Qlik Senseの兄貴分の製品、Qlik Viewをご存じの方もおられるかと思います。Qlik Viewも無償で利用できるPersonal Editionが提供されていますが、Qlik Viewの場合は作成したQlik Viewでしかドキュメントを開くことができないという制限がありました。Qlik Senseデスクトップはこうした制限はなく、分析レポートを他のQlik Senseデスクトップと共有することができます。(逆にドキュメントの閲覧権限を管理したい場合は、有償版のQlik Senseを導入する必要があります)

サンプルデータを作ってみる

まずはサンプルデータを作ってみます。あるイベント会場に設置されたビーコンの検知ログデータを想定して、次の内容でデータを生成しました。

  • イベントの開催は2015年6月30日の1日間
  • イベント会場内のブース数は20で、各ブースに1台ずつビーコンが設置されている
  • 来場者は500人
  • 来場者は5~8ヶ所のブースを回っている
  • 1ブースあたりの滞在時間は2.5分~5分

サンプルデータのフォーマットは次のようなものになります。

ビーコンはメジャー値とマイナー値の組み合わせで一意に識別することができます。今回のサンプルデータではメジャー値は固定で、マイナー値をビーコンごとに割り振るようにしました。また、スマートフォンアプリはビーコンを検知すると、検知している間、ログを記録します。今回のサンプルデータは、3秒単位で検知する想定で作成しました。生成したサンプルデータをこちらに置いておきます。

無償版のQlik Senseをインストールしてみよう

Qlik Senseデスクトップをダウンロードしてみましょう。公式サイト(http://global.qlik.com/jp/)にアクセスし、右上の「無料ダウンロード」を選択して下さい。

Qlik SenseとQlik Viewの2つが表示されますので、Qlik Senseのダウンロードを選んで下さい。ダウンロードには個人情報の入力が必要です。対応しているOSは、Windows Server 2008R2/2012/2012R2および64bit版のWindows 7SP1/8.1/10です。

Qlik Senseを使ってデータを集計してみよう

インストールが完了すると、デスクトップに「Qlik Sense Desktop」アイコンが誕生していると思います。ダブルクリックで起動して下さい。ダイアログが表示されるので、「アプリの新規作成」を選択し、「ビーコンテスト」と入力して追加し、「アプリを開く」を選択して下さい。

これでまっさらなアプリが追加されました。最初に行う作業は、アプリへのデータ追加です。Qlik Senseでは、分析するデータはアプリの中に取り込み、圧縮、最適化した状態で保存します。ですから、アプリにデータを追加すると、それ以降は、元データがなくてもQlik Senseのみで分析作業が可能です。今回はウィザードを使ってデータを追加してみますので、「データの追加」を選択して下さい。

「区切りファイル」を選択し、サンプルデータのCSVファイルを選択して「右矢印」を選択します。

こちらの画面では、読み込む列を選択することができます。1行目は自動的に項目名として読み込まれています。デフォルトで全ての列が選択されていますので、今回はこのまま「データをロードして終了」を選択して下さい。

データの読み込みが終了しました。それでは集計すべく「シートを編集する」を選択してみましょう。

こちらがシートの編集画面です。左側には、Qlik Senseで分析に使用することができるテーブルやグラフが表示されています。簡単な棒グラフを作ってみましょう。スマートフォンごとに検知したビーコンのログ件数を集計してみます。「棒グラフ」をシートの左側にドラッグしてみて下さい。

棒グラフを表示するには、少なくとも「軸」と「メジャー」の2つの設定が必要です。「軸を追加」を選択して「スマートフォン端末ID」を、「メジャーを追加」を選択して「ビーコンメジャー値」→「Count([ビーコンメジャー値])」を選択して下さい。

検知したビーコンのログ件数がスマートフォンごとに集計されました。サンプルデータは24万件ほどあるのですが、Core i5/8GBメモリの私のデスクトップPCでは、瞬時に棒グラフが表示されました。グラフでは、検知したビーコンのログが多いスマートフォンID順に並んでいます。スマートフォンアプリは3秒に1回、周囲にあるビーコンを検知し、ログに残していますから、ブースの滞在時間が長かったスマートフォンID順だと見なすことができます。

では、もっとも多くのブースを巡回したスマートフォンはどれでしょう。今度はテーブルを追加してみます。シートの右側に「テーブル」をドラッグして下さい。

テーブルの「軸を追加」を選択して、「スマートフォン端末ID」を選択して下さい。

このテーブルに、検知したビーコンの件数を追加してみましょう。ログの件数ではなくビーコンの件数です。ログデータは3秒単位で検知したものになっていますから、同一のビーコンのログデータについては重複を削除してカウントする必要があります。テーブルを選択した状態で、右側の「列の追加」を選択して下さい。「軸」か「メジャー」かを選べますから、「メジャー」→「ビーコンマイナー値」→「Count([ビーコンマイナー値])」を選択して下さい。

ビーコンマイナー値の集計列が追加されましたが、この数値はログの件数です。重複を削除するには、数式を書く必要があります。数式項目にある「fx」マークをクリックし、数式エディタを立ち上げます。

「Count([ビーコンマイナー値])」と表示されていますから、これを、重複を削除した後にカウントを取るように変更します。重複を削除するにはdistinct関数を使用します。数式エディタを次のように書き換えてください。

入力した数式に文法エラーがあった場合は、左下に「数式のエラー」と表示されます。ここに「OK」と表示されていたら問題はありません。「適用」を選択して下さい。重複を削除した後にカウントを取った集計値が表示されるようになりました。一度、右上の「完了」を選択して、編集画面を終了してみましょう。

分析シートが表示されました。検知したビーコンの件数順にソートする場合は、テーブルの項目名部分の「Count(Distinct([ビーコンマイナー値]))」を選択して下さい。降順で並ぶようになります。サンプルデータの前提でもあるのですが、このイベントでは、多い人で8個所のブースを回っていたことがわかります。

最後に、時間帯ごとに何台のスマートフォンを検知したかを集計してみましょう。これを行うには、次の2つのことを解決する必要があります。

  1. 「YYYY-MM-DD HH:MM:SS」形式の日時データから60分単位(例:11:24:07→11:00:00)のデータを生成する
  2. スマートフォン端末IDで重複を削除した後にカウントを取る

2については、先ほど使ったdistinct関数で解決します。60分単位のデータは元データのCSVファイルに追加する方法もありますが、Qlik Senseにデータを追加するタイミングで自動的に生成することも可能です。左上の「保存」を選択してシートを保存した後、コンパスを選択して「データロードエディタ」を選択して下さい。

Qlik Senseのデータの追加は、データロードエディタを使って設定するのですが、簡単なロード設定であれば、「データの追加」ウィザードを使って自動的にロードスクリプトを生成することができます。最初の画面では日本での利用向けに日付のフォーマットや曜日の表記が設定されています。左側の「自動生成セクション」を選択して下さい。日時の次に60分単位の日時データを作ってみたいと思います。ウィザードを使って生成されたロードスクリプトは編集できないようロックが掛かっていますので、右上の「ロック解除」からロックを解除して下さい。

60分単位のデータを生成するには、関数を使う必要があります。次のように編集してみて下さい。

MakeTime関数はHH:MM:SS形式のデータから時間を返す関数です。Hour関数はHH:MM:SS形式のデータからHHを、Minute関数はHH:MM:SS形式のデータからMMを返します。ここでは、60分単位のデータを作りたいわけですから、Floor関数を使ってMM部分を60単位で切り下げます。項目名は「日時_60分単位」としておきましょう。右上の「保存」ボタンを押してロードスクリプトを保存した後、右上の「データのロード」を選択して下さい。再びCSVファイルを読み込み、その際に「日時_60分単位」のデータが生成されます。

ロードが終わったら分析のシートでグラフを追加してみましょう。左上のコンパスを選択して「アプリの概要」を選択して下さい。

先ほど作ったシートは「新しいシート」という名前で保存されています。「新しいシート」を選択すると分析シートが表示されます。

もうシートにはグラフを追加するスペースがありませんから、シートを追加しましょう。右上の「新しいシート」を選択した後、「シートの新規作成」を選択して下さい。「新しいシート(1)」というシートが追加されますから、追加されたシートを選択して表示した後、右上の「編集」を選択して下さい。

今回は時間帯別のスマートフォンの件数を棒グラフで表示してみましょう。「棒グラフ」をシートの中央にドラッグし、軸に「日時_60分単位」を、メジャーに「スマートフォン端末ID」→「Count[(スマートフォン端末ID)]」を選択します。

時間帯ごとのスマートフォン端末IDのログ件数が集計されて表示されました。が、求めたい集計値はログの件数ではなくスマートフォンの件数ですから、先ほど使ったdistinct関数を使って重複を削除します。棒グラフを選択した状態で、右側のメジャーの「Count([スマートフォン端末ID])」の項目名を選択して下さい。アコーディオンで設定項目が展開されますから、数式項目にある「fx」マークをクリックし、数式エディタを立ち上げて編集します。

スマートフォン端末IDで重複を削除した後にカウントを取るように編集し、「適用」を選択して下さい。

時間帯ごとのスマートフォンの件数が集計されるようになりました。このグラフを見ると、最もスマートフォンの件数が多かった(=来場者が多かった)のは14時台だと言うことがわかります。右上の「完了」を選択して、編集を終了させましょう。

14時台に何台のスマートフォンを検出したかは、14時台の棒グラフを選択すると表示されます。155台だったことがわかります。

最後に

いかがだったでしょうか。開発や保守作業の中で、大量のデータを集計しなければならないこともあるかと思いますが、Qlik Senseを使えば、手軽に集計することができます。今回は分析と呼べるところまでは踏み込めていませんが、また機会があれば紹介させていただきたいと思います。

Comments are closed, but you can leave a trackback: Trackback URL.