こんにちは、エンジニアの西です。 普段は、ビジネスデータ解析環境構築や、WEBーAPIを活用したツール開発を担当しています。 本稿では、セルフサービス分析ツールTableauの開発ツールセットであるTableauSDKのご紹介をします。 なお開発言語としてはPythonを用います。 本稿は下記の読者が対象です。
・ビジネスデータ解析環境のシステム構築方法に興味がある
・Pythonでプログラム作成をしたことがある
・Windows上でのプログラム作成をしたことがある
昨今はITやセンサー技術の発展で、企業は多くのデータを持つようになり、市場での競争において「ビッグデータ」の活用を迫られています。 また企業のデータ分析は専門部門が行わず、現場の担当者が自ら分析する”セルフサービス型”へ移行してきています。
本稿ではセルフサービス型ビジネス分析ツールTableauを取り上げ、既存のシステムでデータ加工が可能な開発ツールセットであるTableauSDKを利用したサンプルプログラムを動かすまでの手順をご紹介します。

ビジネスデータ分析ツールTableau

BI(ビジネスインテリジェンス)とは、データをビジネス上の判断に使えるようにすることです。
BIツールはこのBIを実現するためのツールです。 本稿ではBIツールとしてTableauを取り上げます。

データ抽出ファイルとSDK

Tableauは分析の操作を高速に動作させるための仕組みとして、TDE(Tableau Data Extract:Tableauデータ抽出)ファイルという中間ファイルを用いる方法を採用しています。 分析の元データとなるデータソースへの接続時に、このTDEファイルを生成します(生成せずに元データに直接接続も選択可能)。 既存のシステムや複雑なデータの組み合わせにも対応する必要があるため、このTDEファイルをプログラムによって自由に生成するSDK(ソフトウェア開発キット)が用意されています。

ツールの入手方法

Tableauは有料のソフトウェアで、ProfessionalとPersonalという2つのラインナップがあります。 本稿で解説するSDKを利用する方法では、どちらでも利用可能です。 下記よりダウンロードしてください(2週間無料で試すことが可能)。
Tableau Desktop | Tableau Software

Tableauによる探索的データ分析

Tableauによるデータ分析の様子を、製品に用意されているサンプルを用いて見ていきます。 ここではツールに標準で用意されているサンプルワークブック「スーパーストア」のサンプルデータを利用します。

Photo1

TableauはセルフサービスBIと呼ばれるカテゴリに分類される製品です。 セルフサービスBIとは、分析のために「データを加工・可視化する作業」を企業の分析部門(アナリストや専門エンジニアが所属)ではなく、現場の各担当者が行うタイプのBIを指します。
セルフサービスBIにおいて重要な要素は「探索的分析が」可能であることです。 探索的分析とは、従来の主流である「仮説検証型分析」と対になる分析方法です。 仮説検証型分析は、なんらかの仮説(例:サイトに週末の夜間に訪問したユーザーは商品を購入する確率が高い)に対し、それを裏付けるデータを確認することで検証する方法です。
一方、探索的分析ではあらかじめ仮説をたてず、データを直接分類したり深掘りしたりしながら、データからなんらかの気付きなど改善に役立つインサイトを得る手法です(例:ウェブサイトでスマートフォンからアクセスした顧客の商品購買率が低いことに気付き、深掘りして特定ページの離脱率が高いことを発見した)。
このような探索的分析をスムーズに実現するには、分析ツールの操作の手軽さやレスポンスの速さなど、UI/UXが大事です。
例として先ほどのサンプルデータで「顧客」ダッシュボードを見てみます。 顧客データは地方別にまとめられた販売データの表、「顧客別の売上・利益」「顧客ランキング」といった分類でそれぞれグラフが表記されており、また右のペインに「カテゴリ」「顧客区分」といった分類が用意されています。

画像②

ここで、「関西地方」で特徴あるデータが確認できる場合、関西地方のデータのみを深掘りする必要が出てきます。 深掘りする際は、該当箇所である関西地方の部分をクリックします(1クリック)。 次に、カテゴリで「家電」に絞って確認したい場合は右側の「カテゴリ」チェックリストから「家電」のみを選択します(3クリック)。

画像③

同様に、顧客区分で「小規模事業所」に絞って確認したい場合は、右側の「顧客区分」チェックリストから「小規模事業所」のみを選択します(3クリック)。以上の操作(7クリック)で、下記のように絞り込まれた状態のデータを確認できました。

画像④

探索的分析では、このように特徴的なデータを特定する作業を頻繁に行い、改善や投資など次の打ち手に繋げます。
セルフサービスBIでは従来のBIと比べて、情報システム部門やデータ分析に携わるエンジニアに必要な仕事は変わってきます。 分析を行うのは現場の担当者ですので、分析の専門家ではありません。 そのため、いかに分析しやすい形でデータを渡せるかが、このようなシステムを作るエンジニアにとって重要な仕事になります。 また、次のステップとして「予測値」「レコメンデーション」のような付加的なデータを出す必要性があるかもしれません。 いずれにしても、現場にとって価値となるデータを取得・加工して現場へ渡す必要があります。
次のセクションでは、一般的なプログラミング言語でデータを取得・加工するためのライブラリーであるTableauSDKをみていきます。

TableauSDKを利用するサンプルプログラム

実際にTableauSDKを用いて、TDEファイルを作成するサンプルプログラムを動かすまでの手順を紹介します。参考として、TableauSDKの詳細リファレンスのリンクを下記に載せておきます。
Tableau SDK: Main Page

TableauSDKの準備

TableauSDKの動作要件は下記の通りです。
■ OS
・Windows
・Mac OS X (10.9 and later)
・Linux(Fedora 18 and later/CentOS 6.5 and later/Ubuntu 12.04 and later)
■ プログラミング言語
・C
・C++
・Java
・Python versions 2.6 and 2.7
今回は以下の環境でサンプルの動作を確認しています。
■ Windows7
■ Python2.7
■ Anaconda2.5
■ Tableau9.2
■ TableauSDK9.2.6
Pythonの実行環境がない方はPythonをインストールしてください。 TableauSDKの要件はPython2系となりますので、2.7を準備します。 なお、WindowsにPython環境を構築するのは、思いのほか手こずる場合があります。 おすすめはAnacondaを利用することです。 解析系のライブラリも丸ごとついてくるので、分析メインのかたにはとくにお勧めです。
Download Anaconda now! | Continuum
TableauSDKは下記よりダウンロードしてください。64ビットと32ビットがありますが、Pythonのバージョンにあわせてください。
Tableau SDK – インストール

TDEファイルを作成する

サンプルプログラムのステップを下記1〜4にわけ、順に説明していきます。
■ ステップ1 ファイルの準備
■ ステップ2 テーブルの作成
■ ステップ3 データ挿入
■ ステップ4 ファイルの後処理
また、今回のサンプルプログラムで使うTableauSDKパッケージのクラスは下記の通りです。
■ Extract
■ Row
■ TalbleDefinition
いずれもネームスペースExtract配下で、今回はimport時にエイリアスとしてextractという名前で参照しています。
import tableausdk.Extract as extract
下記にサンプルプログラムを示します。

リスト1 TableauDataExtractSample.py


# -*- coding:utf-8 -*-
import csv
import os,datetime
import tableausdk.Extract as extract #TableauSDKからExtractモジュールをインポート
# ステップ1 ファイルの準備
# 1.TDE(Tableauデータ抽出)ファイルを作成し、CSVファイルを開く
tdefile = extract.Extract('SuperStoreCSVExtract.tde') # (1-1)
csvReader = csv.reader(open('SuperStoreCSV.csv','rb'), delimiter=',', quotechar='"') # (1-1)
### ステップ2 テーブルの作成
#もし抽出ファイルがすでにあれば、テーブルの定義は必要ない(2と3はスキップ)
if tdefile.hasTable('Extract'): # (2-1)
    table = tdefile.openTable('Extract')
    tableDef = table.getTableDefinition()
else:
    # 既存のtdeファイルがない場合(初回実行時など)
    # まずtableDefによりテーブル定義を作成
    tableDef = extract.TableDefinition() # (2-2)
    tableDef.addColumn('Row ID', Type.CHAR_STRING) # (2-3)
    tableDef.addColumn('Order Date', Type.DATE)
    tableDef.addColumn('Sales', Type.DOUBLE)
    tableDef.addColumn('Profit', Type.DOUBLE)
    tableDef.addColumn('Customer Name', Type.CHAR_STRING)
    tableDef.addColumn('Zip Code', Type.INTEGER)
    tableDef.addColumn('Product Category', Type.CHAR_STRING)
    # 3 tableDefで定義した内容でテーブルを作成する
    table = tdefile.addTable('Extract',tableDef) # (2-4)
###  ステップ3 データ挿入
newrow = extract.Row(tableDef) # (3-1)
csvReader.next()  # (3-2)
for line in csvReader:  # (3-3)
    newrow.setCharString(0, str(line[0])) # (3-4)
    date = datetime.datetime.strptime(line[1], "%m/%d/%Y")  # (3-5)
    newrow.setDate(1, date.year, date.month, date.day)
    newrow.setDouble(2,float(line[2]))
    newrow.setDouble(3,float(line[3]))
    newrow.setCharString(4,line[4])
    newrow.setInteger(5,int(line[5]))
    newrow.setCharString(6,line[6])
    table.insert(newrow)  # (3-6)
### ステップ4 ファイルを閉じる
# TDEファイルを閉じる
tdefile.close()

ステップ1 ファイルの準備

(1-1)ファイル名を指定してTDEファイルを作成します。
(1-2)CSVファイルを読み取りモードで開きます。

ステップ2 テーブルの作成

(2-1)”Extract” テーブルがあるか否かを判断し、あればテーブル定義情報を読み込みます。なお、すでにテーブルがあった場合はこのプログラムの場合、データは新しい行として追加挿入されます。
(2-2)テーブル定義 tableDef を初期化します。
(2-3)テーブル定義にカラムを追加します。このときカラム名とデータ型をそれぞれ指定します。addColumn(‘Row ID’, Type.CHAR_STRING) の場合は ’Row ID’ をカラム名として、データ型として文字列を指定したことを意味しています。
(2-4)上記のテーブル定義を用いてテーブルを作成します。この際にテーブル名として ”Extract” を指定しています。
このステップで用いられているクラス・関数は下記の通りです。
■ Extractクラス
 ・hasTable 指定したTableが存在するか否かを返す
 ・openTable 指定した名前のテーブルを開く
 ・addTable Tableを追加し、Tableの参照を返す
■ TalbleDefinitionクラス
 ・addColumn テーブル定義にコラムを追加

ステップ3 データ挿入

(3-1)上記テーブル定義によって定義されたデータ型を指定して、TDEファイルに挿入するための行データnewrowを準備します。
(3-2)CSVファイルは1行目がカラム名になっているのでスキップします。
(3-3)CSVから1行ずつ読み込み、リストLineに入れます。
(3-4)TDEテーブルのRowクラスの関数によりデータ型を指定して値を入れます。
(3-5)表示形式を指定して日付データを取得します。
(3-6)rowデータとしてテーブルに挿入します。
このステップで用いられているクラス・関数は下記の通りです。
■ Rowクラス
 ・setCharString データ型として文字列を指定
 ・setDate データ型として日付を指定
 ・setDouble データ型として実数を指定
 ・setInteger データ型として整数を指定

ステップ4 ファイルの後処理

(4-1)TDEファイルを閉じて処理終了です。
このステップで用いられているクラス・関数は下記の通りです。
■ Extractクラス
 ・close ファイルを閉じる

実行

コマンドプロンプトで、下記コマンドによりサンプルプログラムを実行します。
サンプルプログラムファイルと同じフォルダに、TDEファイルができていれば成功です。
> python TableauDataExtractSample.py

Tableauでの確認

先ほど作成したTDEファイルをTableauで開きます。

画像⑤

このように取り込むことができました。

応用

これでPythonで取得・加工できるデータはTableauに渡すことができるようになりました。
プログラミングにより自由に加工できますので、たとえば以下のような応用が考えられます。
■ バッチファイルとタスクスケジューラで、定期レポートの自動作成
■ MongoDB など未サポートのデータストアと連携
■ Yahoo!プロモーション広告 API など未サポートのクラウドサービスからのデータ取得
■ TensorFlow など機械学習ライブラリを用いて予測値を算出し、データに追加

まとめ

Tableau と SDK の使い方を紹介しました。
今回は CSV からのデータ読み込みでしたが、Python で可能なものは何でもデータ取得・加工ができます。
また売上予測値など付加価値提供も含め、分析のためのデータ活用にぜひ挑戦してみてください。

ワンモアポイント

~企業システム向けパッケージ導入は拡張性をチェック~
IT 関連の業種の方はよくご存知のように、現代はどのサービスが定着するか分からず、変化がはやい時代です。そのため従来型のオンデマンドなシステム構築ではなく、パッケージソフトウェアを利用する形態が増えていくと考えています。
ただ、パッケージによっては機能拡張が不可能なケースもあり、その場合は既存システムとの連携がうまく進まないでしょう。
今回は Tableau をとりあげましたが、いずれのツールを利用するにしても SDK のような形で拡張性を高く保っているパッケージがお勧めです。

お気軽にご質問、ご相談ください

関連タグ

西潤史郎

九州大学大学院システム情報科学府卒。データ解析エンジニア。ウェブ解析アプリの開発実績あり。

関連ブログ