トレジャーデータでは一緒に働ける仲間を募集中です!(エンジニア,ソリューションアーキテクト,セールス)

f:id:doryokujin:20140421150020p:plain

トレジャーデータでは,

  1. エンジニア
  2. ソリューションアーキテクト
  3. セールス

の 3 職種で一緒に働く仲間を募集中です。ご興味のある方は以下のいずれかの方法でコンタクトをよろしくお願いします。

また,キャリアに興味のある方や具体的に詳しい話を聞きたい,といった方は以下の宛先にまずは気軽にご連絡ください。

  • 僕のTwitterへ連絡( @doryokujin )
  • 僕のメールへ連絡( taka@treasure-data.com )

1. エンジニア

トレジャーデータはデータマネジメントの世界を変えつつあります。当社は業界トップクラスのクラウドベースのビッグデータプラットフォームを提供していると自負しております。日々、約100社の顧客企業が今までにない量のデータを処理しています。

トレジャーデータのバックエンドを開発するということは、複雑な分散コンピューティングへの挑戦を意味します。Hadoop/Hive/クラウドスタックという技術基盤の上に、ロバストでスケーラブルなデータプラットフォームを構築するまたとない機会がトレジャーデータにはあります。

ソフトウェア設計、プログラミング、アルゴリズム、データ構造、Java、および、C++の知識を余すところなく活用していただきます。また、当社はMessagePackやFluentdなどのオープンソースソフトウェアにも貢献しています。

理想的には、直観、常識、および、コンピュータサイエンスの深い学術的知識 (アルゴリズム、データ構造など) を用いることで、漠然とした問題を見定め、解決策を導きだせる方です。バックエンドの主要な機能およびコンポーネントの設計と実装に対してリーダーシップを発揮していただけることを求めています。

仕事内容:

  • 当社のクラウドデータ分析プラットフォームのための分散システムを開発(プログラミング)していただきます。
  • 日々の顧客とのコミュニケーションからフィードバックを受けていただきます。

求める人材:

  • コンピュータサイエンスまたは関連する分野の修士または学士を取得している方。また、コンピュータサイエンス (アルゴリズム、データ構造など) を深く理解していること。
  • 高度な専門性を伴うプログラミング経験をお持ちの方。マルチスレッド、分散コンピューティング、パフォーマンス解析、および、最適化の経験があれば、より望ましい。
  • UNIXプログラミングの深い知識 (リチャード・スティーブンスが誰か、ご存知ですか?)
  • JavaC/C++を習熟している方
  • 自律的に仕事を進められる方
  • 協調性があり、コミュニケーション力のある方

歓迎するスキル・経験:

  • Hadoopのプログラミングの経験
  • Rubyのプログラミングの経験

2. ソリューションアーキテクト

トレジャーデータはデータマネジメントの世界を変えつつあります。当社は業界トップクラスのクラウドベースのビッグデータプラットフォームを提供していると自負しております。日々、約100社の顧客企業が今までにない量のデータを処理しています。

高度に技術的なソフトウェア/サービスを販売した実績をお持ちの場合は、ぜひご応募ください。 (時に自分でソフトウェアを開発されているのであればなお歓迎いたします。)。当社は他の何よりも、新たな市場を作り出そうとするチームとともに仕事をするという情熱をもった方を探しています。

仕事内容:

  • 問い合わせ対応や、社外への販売を推進していただきます。
  • 顧客企業が望む方法 (電話、スカイプ、電子メール、チケット、IM) で、また、時には対面でコミュニケーションをとっていただきます。
  • わかりやすいデモやセールス資料を作成し、それを管理していただきます。
  • 顧客を成功に導いていただきます。
  • 当社の顧客企業が直面する技術的かつビジネス上の問題に関する救世主になっていただきます。
  • トレジャーデータサービスをともに販売する、戦略的パートナーとの関係を構築していただきます。

求める人材:

  • IT製品もしくはサービスの営業経験を5年以上お持ちの方
  • テクニカル・プリセールス、ソリューションアーキテクトとしての経験を2年以上お持ちの方
  • エンジニア経験をお持ちで、ソースコードをある程度理解出来る方
  • チームとして協力して提案活動のため、協調して知識・ノウハウをチームメンバーと共有しゴールを達成できる方

歓迎するスキル・経験:

  • クラウド製品やSaaS製品の販売経験をお持ちの方
  • Business Ingelligenceや分析ソフト活用の経験をお持ちの方
  • ビッグデータ製品の開発経験をお持ちの方(例えば、Hadoop, Cassandra, MongoDBなど)

3. セールス

仕事内容:

  • 取引規模と顧客への価値提供を拡大させるために、U.S/日本両国のメンバーと連携を行っていただきます
  • 営業メソッドとプロセスを効果的に活用していただきます
  • チームプレイヤーとして適切かつタイムリーなコミュニケーションを行い、リソースを最も効率的に配分し、それを活用していただきます
  • コンスタントにかつ積極的にサービスの提案を行い、売上目標を実現していただきます
  • テリトリープランニング、販売計画、案件管理を推進していただきます
  • 顧客にサービス価値を提供し費用対効果を最大化していただきます
  • 適切な価格設定とビジネス要件について折衝を行っていただきます
  • 戦略的パートナーと協力関係を構築し、営業効果を最大化していただきます
  • セールスエンジニアリング、インサイドセールスと協力し、営業効果を最大化していただきます
  • プロダクトマネージメントとマーケティングに対して適切かつタイムリーな連携を行っていただきます

求める人材・歓迎するスキル・経験:

  • 共に成長し会社を創造していくことにコミットして頂ける方
  • 数字とデッドラインへのコミットをして頂ける方
  • 予測に対するコミットメントがあり、予測精度が高い方
  • 優れた対人能力そしてプレゼンテーションスキルをお持ちの方
  • テンポが速く、高成長率の急激に変化する環境において成長していける方
  • セルフスターターでチームプレイヤーな方
  • 見込み顧客や既存顧客と共に成功パターンや知識を学んでいける方
  • 海外・国内出張による業務を許容いただける方
  • RDBMS/DWHの営業経験またはセールスエンジニア経験ある方(優遇)
  • なるべく早くご入社いただける方(優遇)
  • 英語と日本語両方の読み書き、会話が可能な方(望ましい)

実データで覚える Treasure Client コマンドラインリファンス 〜3.Data Processing〜

本シリーズではTreasure Client ツールのコマンドラインリファレンスを以下の5つのレイヤーに分解し,各々について解説していくものとします。

No.レイヤーコマンド
1. Data Import

one-time import

bulk import

2. Data Management

db

table

3. Data Processing

schema

query

job

4. Data Scheduling

sched

result

5. Other

help

status

server

sample

 本日は 3. Data Processing に関するコマンドを紹介します。

1. schema コマンド

schema コマンドはインポートしたテーブルの各カラムに正確なスキーマを割り振ることでデータの質とパフォーマンスを上げるコマンドです。

$ td help schema

Additional commands, type "td help COMMAND" for more details:

  schema:show <db> <table>                   # Show schema of a table

  schema:set <db> <table> [columns...]       # Set new schema on a table

  schema:add <db> <table> <columns...>       # Add new columns to a table

  schema:remove <db> <table> <columns...>    # Remove columns from a table

スキーマを設定すると以下の様に td tables $table_name コマンドでテーブル内の各カラムに型が割り振られていることがわかります。

スキーマを設定することでクエリの記述が異なります。スキーマを設定しない場合はカラムへのアクセスが v['$column_name'] と記述する必要がありましたが,設定後は $column_name の記述が可能になります。

それではスキーマを設定してみます。

$ td schema:set carsensor brand_master country_name:string country_code:string name:string code:string

$ td schema:set carsensor body_master name:string code:string

$ td schema:set carsensor catalog body_code:string body_name:string code:string desc:string grade:string height:int length:int model:string name:string period:string person:int price:int series:string width:int

$ td schema:set carsensor color_master name:string code:string

$ td schema:set carsensor country_master name:string code:string

$ td schema:set carsensor large_area_master name:string code:int

$ td schema:set carsensor pref_master name:string code:int large_area_name:string large_area_code:int

$ td schema:set carsensor usedcar  carsensor usedcar body_name:string code:string color:string desc:string engine:string grade:string id:string inspection:string main_caption:string main_photo_l:string main_photo_s:string maintenance:string maintenance_comment:string maintenance_fee:string model:string name:string odd:string odd_km:int price:string recycle:string shop_datum:string shop_lat:float shop_lng:float shop_name:string shop_pref_code:int shop_pref_name:string url_mobile:string url_pc:string url_qr:string warranty:string warranty_comment:string warranty_distance:string warranty_fee:string warranty_length:string warranty_length_kigen:string warranty_length_kikan:string year:int

$ td schema:set carsensor usedcar_cube_without_catalog id:string name:string model:string body_name:string color:string engine:string grade:string inspection:string recycle:string year:int country_name:string used_price:string large_area_name:string shop_pref_name:string shop_lat:double shop_lng:double shop_name:string shop_pref_code:int maintenance:string maintenance_fee:string odd:string odd_numerics:double odd_unit:string odd_km:double warranty:string warranty_distance:string warranty_fee:string warranty_length_kigen:string warranty_length_kikan:string warranty_length_kikan_m:string main_photo_l:string desc:string

$ td schema:set carsensor usedcar_cube_with_catalog id:string name:string model:string body_name:string color:string engine:string grade:string grade_seq:long inspection:string recycle:string year_ym:int start_ym:int end_ym:int country_name:string series:string person:int height:int length:int width:int used_price:string new_price:int large_area_name:string shop_pref_name:string shop_lat:double shop_lng:double shop_name:string shop_pref_code:int maintenance:string maintenance_fee:string odd:string odd_numerics:double odd_unit:string odd_km:double warranty:string warranty_distance:string warranty_fee:string warranty_length_kigen:string warranty_length_kikan:string warranty_length_kikan_m:string main_photo_l:string desc:string

$ td schema:show carsensor brand_master  

で設定されているスキーマを確認できます。

2. query コマンド

query コマンドは記述したクエリを実行するコマンドです。

$ td help query

usage:

  $ td query [sql]

 example:

 $ td query -d example_db -w -r rset1 "select count(*) from table1"

 $ td query -d example_db -w -r rset1 -q query.txt 

description:

 Issue a query 

options:

 -d, --database DB_NAME           use the database (required)

 -w, --wait                       wait for finishing the job

 -G, --vertical                   use vertical table to show results

 -o, --output PATH                write result to the file

 -f, --format FORMAT              format of the result to write to the file (tsv, csv, json or msgpack)

 -r, --result RESULT_URL          write result to the URL (see also result:create subcommand)

 -u, --user NAME                  set user name for the result URL

 -p, --password                   ask password for the result URL

 -P, --priority PRIORITY          set priority

 -R, --retry COUNT                automatic retrying count

 -q, --query PATH                 use file instead of inline query

 -T, --type TYPE                  set query type (hive or pig)

     --sampling DENOMINATOR       enable random sampling to reduce records 1/DENOMINATOR

  -x, --exclude                    do not automatically retrieve the job result

頻繁に使用するオプションは

  • -w: 結果が返って来るまで待機
  • -o: 保存先を指定
  • -f: 出力フォーマットを指定
  • -q: クエリを記述したファイル名を指定

以下の2パターンを覚えていれば十分でしょう。

$ td query -w -d carsensor -q "scatter.sql" -f csv -o "scatter.csv" # -o で指定したファイルに scatter.sql クエリの実行

$ td query -w -d carsensor -q "scatter.sql" "SELECT v FROM usedcar LIMIT 10" # コンソール出力

3. job コマンド

job コマンドは query で実行中ジョブや終了したジョブを参照するコマンドです。このコマンドでジョブの

  • 進捗
  • 成功 / 失敗
  • 結果の取得

を確認することができます。終了済のジョブを指定してその結果を取得するには,

$ td jobs

+---------+---------+---------------------------+---------------+----------+--------+--------+------------------+--------------------------+

| JobID   | Status  | Start                     | Elapsed       | Priority | Result | Type   | Database         | Query                    |

+---------+---------+---------------------------+---------------+----------+--------+--------+------------------+--------------------------+

| 7522693 | success | 2014-02-04 01:37:47 +0900 |         28sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM joined_... |

| 7522617 | success | 2014-02-04 01:33:46 +0900 |         17sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM joined_... |

| 7522465 | success | 2014-02-04 01:24:22 +0900 |         31sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM joined_... |

| 7521447 | success | 2014-02-04 00:47:43 +0900 |         31sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM joined_... |

| 7521415 | success | 2014-02-04 00:42:39 +0900 |         38sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM transac... |

| 7521403 | success | 2014-02-04 00:41:05 +0900 |         48sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM transac... |

| 7521380 | success | 2014-02-04 00:39:15 +0900 |         52sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM transac... |

| 7521264 | success | 2014-02-04 00:29:05 +0900 |         45sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM transac... |

| 7521256 | success | 2014-02-04 00:26:41 +0900 |         44sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM transac... |

| 7521235 | success | 2014-02-04 00:23:05 +0900 |         46sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT * FROM transac... |

| 7521004 | error   | 2014-02-04 00:07:01 +0900 |         15sec | NORMAL   |        | hive   | pos_toshiba_tech | SELECT v[ plu_meishou... |

+---------+---------+---------------------------+---------------+----------+--------+--------+------------------+--------------------------+

20 rows in set

$ td job:show 7521235 -f csv -o output.csv

 

 

Treasure Data Platform で始めるデータ分析入門 〜8. Data Visualization Patterns 〜 Part.3

本シリーズではデータ分析を以下の7つのレイヤーに分解し,各々について解説していくものとします。(Slide Shareの資料は常時更新されます。)

  1. Data Collection
  2. Data Storage
  3. Data Management
  4. Data Processing
  5. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  6. Data Visualization Treasure Viewer, MetricInsights, Tableau
  7. Data Visualization Patterns Part.1 Part.2 Part.3

本日は「7. Data Visulization Patterns」の全 3 回続く第 3 回目の紹介です。

 

2. Table Visualization(続き)

B. Table Segmented by 2 Columns

平面的なテーブル表現は 2 種類のセグメントの使用まで可能です。今回は 2 種類のセグメントによって集計されたテーブルの表現を考えます。 

カテゴリ\年代 15 20 25 30 35 40 45 50 55 60 65
Category A 100 120 87 89 79 123 86 56 67 89 102
Category B 90 110 72 79 60 100 76 47 40 78 40
Category C 48 79 120 139 90 99 89 90 37 60 77
Category D 67 78 102 90 77 68 90 77 56 70 120
Category E 90 79 67 100 98 56 80 67 87 110 150
category F 100 127 123 103 136 128 73 71 82 67 40
図1:2種類のセグメントによって集計されたクロステーブルの例。集計(SUM, AVG)のどれか 1 つの値のみ,テーブルのセルの値として表現可能です。 

A. の 1 種類のセグメントのテーブル場合と違って次元が 1 つ増える,つまり今までの X, Y 軸に加えて何らかの手法で新しく Z 軸 を加えなければなりません。

今回の体系化のポイントは Line, Bar, Pie といった区別では無く,新たな次元軸をどのように表現するかにあります。

  • Chart の重ね合わせ + Legend(凡例)による表現(図2)
  • 奥行きによる表現(図3)
  • Panel を並べることによる表現(図4)
  • X 軸に並べることによる表現(図5,図7)
  • 値を積み上げる(Stack)による表現(図6,図7)
  • Heat Map: 色味による表現(図8,図9)
  • Bubble Chart: 円の半径の大きさによる表現(図10)

f:id:doryokujin:20120629004055p:plain

図2:複数の Line を重ね合わせ,凡例によって区別を説明した Line Chart によるシンプル表現。この場合は要素数が少ないセグメントを Line とする方が見やすいグラフになるが,要素数が多くなれば重なり部分が増えて見にくくなってしまいます。

f:id:doryokujin:20120716042707p:plain

図3:図2 と同じインプットに対して,奥行きを持たせて表現した Area Chart。Area Chart とは Line Chart において値の下側を色づけした Chart です。立体的に表示する場合には Line Chart よりも Area Chart の方が表現領域が増えて各々のグラフの区別がしやすくなります。立体的な表現をする場合は角度を自由に変えられるようなインタラクティブな環境であるほうがより有効です。

f:id:doryokujin:20120716042509p:plain

図4:複数の Bar Chart のパネルを,X 軸のレンジを統一して立てに並べた Bar Chart は全体的にすっきりしており,かつ比較もしやすいのでおすすめです。

f:id:doryokujin:20120716042530p:plain

図5:同じ X 軸の値ごとにぴったり並べた Bar Chart。こちらは 図4 に比べて,同じ変数値間での比較には優れていますが,別の変数による比較は劣っています。

f:id:doryokujin:20120716042547p:plain

図6:積み上げ(stack)による Bar Chart 表現。左は集計値の絶対量で表現しているのに対し,右は X 軸のカテゴリ変数値(A,B,...,F)の総和に対する各カテゴリ変数の割合を使用した Bar Chart 表現。この場合は X 軸の各値毎に積み上げ総計が 1 または 100(%表現の場合) となります。

f:id:doryokujin:20120716042633p:plain 

図7:図5 と 図6 の Bar Chart を Area Chartにて表現したもの(インプットは異なります)。Area Chart の場合は X 軸となるセグメントの要素数が多い場合に Bar Chart より見やすい表現を与えます。下の Area Chart は割合による積み上げ表現(図6右の表現と同じ)になります。

f:id:doryokujin:20120716042748p:plain

図8:X, Y 軸の格子状の各セルの中に,新しい Z 軸として「色味」で表現した Heat Mapによる表現。

f:id:doryokujin:20120716042810p:plain

図9:図 8 の Heat Map はさらに「位置情報」という次元が増えた場合には格子状のセルではなく地図上の各領域内の色味によって値を表現します。

f:id:doryokujin:20120716042953p:plain

図10:Bubble Chart はまず新しい軸をバブルの半径として表現します。加えてもう1つ新しい軸を今度は色味によって表現することができます。このように多数の次元を表現しつつも見やすさを損ねない Bubble Chart はなかなか有効な表現です。

 

終わりに

今回はデータ解析における各ステップ,

  1. サンプルデータセット
  2. 集計済テーブル(1 or 2 種類のセグメントによる)

を区別して Visualization の例を紹介しました。第1回で紹介したサンプルデータセットでは Visualization の背後には統計(とりわけ分布)という概念が常に潜んでいることを学びました。

また,第2回の 1 種類のセグメントによる集計テーブルの Viaualization では使用・着目するセグメント(変数)の種類が,

  1. 数値変数:(さらに「1.1 連続型」と「1.2 離散型」に分類)
  2. カテゴリ変数:(さらに「2.1 順序付」と「2.2 順序無」に分類)

のいずれかにあることで適切な表現が異なる事を学びました。

さらに今回の 2 種類のセグメントによるテーブルの表現においては,新たな次元軸をどのように表現するか,例えば

  1. 重ね合わせ + 凡例による表現
  2. 奥行きによる表現
  3. Panel を並べるによる表現
  4. X 軸に並べるによる表現
  5. 値を積み上げるによる表現
  6. 色味によるによる表現
  7. 円の半径の大きさによるによる表現

のようなパターンがある事を紹介しました。

これらのパターン化はあくまで多くの方法の中の 1 つに過ぎませんが,Visualization を行う時にはこれらのパターンを意識してもらえるようになると幸いです。

Treasure Data Platform で始めるデータ分析入門 〜8. Data Visualization Patterns 〜 Part.2

本シリーズではデータ分析を以下の7つのレイヤーに分解し,各々について解説していくものとします。(Slide Shareの資料は常時更新されます。)

  1. Data Collection
  2. Data Storage
  3. Data Management
  4. Data Processing
  5. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  6. Data Visualization Treasure Viewer, MetricInsights, Tableau
  7. Data Visualization Patterns Part.1 Part.2 Part.3

本日は「7. Data Visulizations」の全 3 回続く第 2 回目の紹介です。

 

前回からの続きです。

2. Table Visualization

Table Visualization とは,サンプルデータセットを集計したテーブルに対して行う Visualization を指します。集計とはデータセットのある変数に対していくつかのセグメントごとに SUM, COUNT などの集計関数を適用することによって次元を 1 つ縮約(行列はベクトルへ,ベクトルは数値へ縮約)することで,各種ツールでいう

といった手続きに該当します。以下の様に具体的に見ていった方が簡単です。

A. Table Segmented by Single Column

まずは 1 種類のセグメントにより集計(SUM, AVG, COUNT などして得られたシンプルなテーブルを紹介します。

ところで,このセグメントを変数とみなすことにすれば,前回で述べたように

  • 数値変数:(さらに「1.1 連続型」と「1.2 離散型」に分類)
  • カテゴリ変数:(さらに「2.1 順序付」と「2.2 順序無」に分類)

に分類することができます。セグメントが上記のどの分類に該当するかによってどの Chart を使用するかが異なってきます。またセグメントのキーの値が X 軸として扱われることになります。

※ 以後は変数とセグメントを同じ意味で扱います。

年代 15 20 25 30 35 40 45 50 55 60 65
Sum 100 120 87 89 79 123 86 56 67 89 102

図1:年代毎に合計を計算した 1 × n テーブル(n はセグメントの要素数)。この場合の変数のタイプはカテゴリ変数(順序付)。このテーブルは例えばSQLならば `GROUP BY generation` を含んだ集計クエリによって得られたテーブルを転置することで得られます。

年代 15 20 25 30 35 40 45 50 55 60 65
Sum 100 120 87 89 79 123 86 56 67 89 102
Count 10 4 3 10 5 3 4 10 8 8 10
Average 10.0 30.0 29.9 8.9 15.8 41.0 21.5 5.6 8.3 11.1 10.2

図2:年代ごとに各種集計値を計算した 3 × n テーブル。セグメントの種類が 1 つという意味ではこれも図1 と同じテーブル分類に入ります。Chart として表現する場合は基本的に 1 つか 2 つの行を選択します。2 つの行を選択した場合はこれらは単位が異なりますので左 Y 軸と右 Y 軸を使用することになります。

A-1. Line Chart(使用ケース:数値変数)

変数が時間や数値を区分けしたものである場合,隣接する変数の間にもデータの存在を仮定しますので変数間を直線および曲線によって「補間」する必要があります。このようにしてプロット点が線して表現された Chart を Line Chart と呼びます。連続か離散,または補間の方法によって以下の 3 パターンを取り上げています。

  • 連続変数:直線補間(図3)
  • 離散変数:水平線補間(図4)
  • 連続変数:曲線補間(図5)
f:id:doryokujin:20120716042049p:plain
図3:数値変数(連続)の隣接するデータ点を直線にて補間した Line Chart。時系列のデータに対して用いられる最もメジャーな Line Chart です。

f:id:doryokujin:20120716042105p:plain

図4:数値変数(離散)の場合は,隣接するデータ点までの間は値が変わらないとする場合が多く,この場合は水平直線によって補完し,階段型の Line Chart となります。例えば特定の距離毎に料金が飛び飛びに変わるタクシー料金などはこれに当たります。

f:id:doryokujin:20120718001841p:plain

図5:数値変数(連続)の隣接するデータ点の間を曲線にて補完した Line Chart 。曲線を求める方法はいくつもあり B-Spline などが有名です。(図はこちらを参照しました。)

A-2. Bar Chart(使用ケース:カテゴリ変数)

カテゴリ変数の場合には変数の間にはデータ点は存在しませんので,個々のカテゴリが独立した Chart 表現が必要です。その際に使用されるのが Bar Chart です。

順序付カテゴリ変数の場合には片方向からの「累積」という概念を導入することができ,累積プロットを併せて表示するのは良い方法です。

順序無カテゴリ変数の場合には順序を持たないので累積という概念を持っていませんが,集計した「値自身」を順序付けることによって「集計値が大きいものからの累積」という概念を導入することは可能です。以下の 3 パターンを取り上げています。

  • 順序付カテゴリ変数 with 累積プロット(図6)
  • 順序無カテゴリ変数(図7上)
  • 順序無カテゴリ変数 with 累積プロット(図7下)

f:id:doryokujin:20120716042133p:plain

図6:カテゴリ変数(順序付)の Bar Chart。同時に左からの累積和の値を総和の値を100として左 Y 軸に同時にプロットしています。

f:id:doryokujin:20120716042154p:plain

図7:カテゴリ変数(順序無)の Bar Chart は上図。集計値の大きさによって変数をソートして表現した下の方の Bar Chart は集計値の累積プロットを同時表現することが可能になります。

A-3. Pie Chart(使用ケース:順序無カテゴリ変数)

順序無のカテゴリ変数においては,図7上のように Bar Chart で表示するよりも Pie Chart の方が有効な場合が多いでしょう。

f:id:doryokujin:20120716042334p:plain

図8:カテゴリ変数(順序無)の Pie Chart 。全体に占める各カテゴリの大きさが一見してわかるところが Bar Chart と比較してのメリットです。

今日はここまで。次は 2 種類のセグメントによって集計された以下のテーブルの表現方法を見ていきます。 

Treasure Data Platform で始めるデータ分析入門 〜8. Data Visualization Patterns 〜 Part.1

本シリーズではデータ分析を以下の7つのレイヤーに分解し,各々について解説していくものとします。(Slide Shareの資料は常時更新されます。)

  1. Data Collection
  2. Data Storage
  3. Data Management
  4. Data Processing
  5. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  6. Data Visualization Treasure Viewer, MetricInsights, Tableau
  7. Data Visualization Patterns Part.1 Part.2 Part.3

本日は「7. Data Visulizations」の全 3 回続く第 1 回目の紹介です。

はじめに

初めの数回は Visualization に関するトピックを紹介するつもりです。

今回のゴールは Bar Chart や Pie Chart などの Graphics のバリエーションを知ることではなく, 多種多様な表現を持つ個々の Graphics がどのような性質を持ち,またどういった場面でどれを使うべきなのか,きちんと体系的に捉えることにあります。

また Visualization 領域におけるこのシリーズでの最終的なゴールは,(数学的に)任意の Graphics を抽象化し,統一的に扱うことのできる概念およびグラマーを導入することです。(今回は全くこちらの方には触れませんが)こちらの方は,世界のあらゆる Visualization 周辺の学術研究機関およびデータマイニング領域で活躍する Visualization Engineer の教科書的存在である,「The Grammer of Graphics」の内容に準じて説明していきたいと思います。

The Grammar of Graphics (Statistics and Computing)

The Grammar of Graphics (Statistics and Computing)

ところで,Visualization を体系的に捉えると同時に任意の Graphics を描く事のできるライブラリとそれを使いこなす技術の習得を行う必要があります。機会があれば現存する3大 Visualization Library: 

の特徴について簡単に紹介したいと思います。

※ d3.js 自身は "Documents Based on Data" を操作するライブラリなので純粋に Visualization Library とは呼ばないのかもしれません。

さて,今回は実際のデータ解析の手順において必要となる次の2つのフェーズにおいて必要な Visualization を紹介することにします:

  1. Sample Datasets Visualization
  2. Table Visualization  

1. は実際にサンプルデータセットを入手した際に,それらがどのような性質を持っているのか,主に統計的な知見を得る目的での Visualization について学びます。 Histogram や Box Plot が登場します。

2. はサンプルデータセットを集計( Group By [SQL], Pivot [Excel], Split-Apply-Combine [R] など)して得たテーブルに関する Visualization を紹介します。こちらの方が一般的で Line Chart や Bar Chart などが登場します。

0. データの変数の分類について

データにおける各項目(カラム)の値の種類は Visualization の種類に大きく影響します。これには 「尺度水準」と呼ばれる概念もありますが,ここではよりシンプルな 4 分類を用いることにします。

  • 数値変数:(さらに「1.1 連続型」と「1.2 離散型」に分類)
  • カテゴリ変数:(さらに「2.1 順序付」と「2.2 順序無」に分類)

数値変数

数値変数は名前の通り数値を値に持つ(常に順序付きの)変数です。「連続」と「離散」の違いは(データセットで得られる値は全て離散的ですが)データ点と点の間にも(今回は得られていないだけで),実は無数の点が存在するのだと仮定するのか否かに依存します。

もし仮定するならば,Visualization においては点と点の間を直線および曲線で「補間」する必要があります。いわゆる Line Chart などによる表現をします。

一方でデータ点の間にデータ点の存在を仮定しないならば,点と点の間とつなげるのはむしろ不自然である場合の方が多いですのでこの場合は Bar Chart で表現します。

これらは次回登場します。

カテゴリ変数 

カテゴリ変数は「A,B,C,...」「男, 女」といったテキスト( 年代「10, 20,...」のように数値をテキストとして利用しても構いません)の変数です。

「順序付」「順序無」の区別はカテゴリ変数のキーがソート可能であるかどうかで決まります。年代は「順序付カテゴリ変数」ですが性別は「順序無変数カテゴリ」です。

順序付の場合は「累積」という概念が登場してきます。10歳ごとにセグメント分けされた年代を例にすると,このセグメントの情報の他に「30代まで」という累積に関する情報を参照するケースが存在し,これを Visualization 側でも考慮してやらないといけません。こちらは累積曲線付 Bar Chart などを活用します。

一方で順序無の場合には累積の概念が存在しません。この場合は Pie Chart などで表示するのがスマートです。

1. Sample Datasets Visualization

あるサンプルデータセットを入手した場合,そのデータセットがどのような統計的性質を持つのか今後どのような解析アプローチをしていくのかを知るために,まず Histogram や Box Plot などを使用して「データを眺める」作業を行うはずです。このフェーズにおける有用な Visualization を紹介していきましょう。

1-1. Histogram

「Histogram 無しにはデータを語れない」と言われるほど重要でありながら,Bar Chart と混同されがちな Histogram。まずは Bar Chart とHistogramの違いについて説明します。

Histogram

  • 数値変数(連続・離散)のみ適用可能。
  • 数値変数が適当な区分に分割され,その区分に属するサンプルの個数(頻度)を表現する。または全体頻度に対する個々の区分の割合を表現する。
  • 頻度の大きさは棒の高さではなく,(棒の面積)= (棒の高さ)×(棒の幅)で表現される。
  • 故に各々の区分は等幅である必要は無い(棒の高さで調節できるので)。
  • 隣接する棒は頻度が 0 出ない限り,無駄に隙間があってはいけない。
  • 全体頻度(または,全体割合)は全ての棒の面積の総和になり,これはどのような区分幅の取り方に寄らず一定である。

Bar Chart

  • カテゴリ変数(主に順序付)に適用可能。
  • 頻度に限らず,データのある観測値および集計値が表現対象。
  • 値の大きさは棒の高さのみによって定まる。
  • 各カテゴリにおける棒の幅(それには意味が無いので)は等しくあるべきである。
  • 隣接する棒は隙間があった方が良いが,隙間が無い場合も多い。
  • 全体の総和は全ての棒の高さの総和である。

Histogram と Bar Chart の違いを鮮明に表しているのが以下の例です(こちらのページを参照しました)。

階級    度数
0	28
1〜2	34
3〜4	20
5〜9	35
10〜19	112
20〜29	79
30〜39	41
40〜49	18 

f:id:doryokujin:20120716230323p:plain

図1:同じ度数分布テーブルに基づいた Bar Chart(左)と Histogram(右)。Histogram では面積で頻度を表現するので等幅で無い度数分布においては各棒の幅は異なります。Bar Chart においては個々の度数が1つ1つの「カテゴリ」であるためカテゴリ間の隙間には興味が無く,棒と棒の間は離して置くのが一般的です。

Histogram を扱うという事は,(当たり前ですが)現在手元にあるデータセットは「母集合からのサンプル」であるという認識を持っており,背後には常に「分布」という存在を意識しているということです。

故に Histogram を描く場合でかつ連続数値変数の場合には,各棒の頂点中央をなめらかに結んだサンプル分布,または(サンプル平均・サンプル分布に基づいた)正規分布の確率密度曲線を同時に描くことができます。

また Histogram は数値変数で順序を持つので,「累積分布」という表現を加えることもできます。「どの区分までいくと全体の頻度の50% になるのか」といった情報はそのデータセットの平均などの統計量では知り得ることのできないものです。

f:id:doryokujin:20120716041047p:plain

図2:3つの Histogram は全て同じデータセットを表現しており,上の2つの Histogram は区分幅の取り方が異なっています。幅の取り方はデータセットに依存する問題で,その取り方によって分布の見え方が異なってしまいます。下の左図は同時に正規分布の確率密度曲線を描いています。この場合は単位をあわせる意味も含めて頻度では無く割合で表現しています。下の右図はこの Histogram の累積分布曲線を描いています。

f:id:doryokujin:20120702235350p:plain

図3:また,Histogram は比較を目的としてカテゴリ毎に並べて表現することもできます。その場合は縦向かつ左右対称の Histogram を用いるのが効果的。上図の場合は棒の頂点同士を結んだ(やや角張った)曲線でわかりやすく表現しています。

1-2. Box Plot

Box Plot

Box Plot(箱ひげ図)は Histogram がデータセットのある数値変数における「頻度分布」を表現していたのに対し,Box Plot はある数値変数における

  • 最小値
  • 第1四分位点(Q1)
  • 中央値(Medean)
  • 第3四分位点(Q3)
  • 最大値
  • 平均値(オプション)

という複数の「統計量」を表現したスマートな Visualization です。また Box Plot では1  つの数値変量に関して,カテゴリ間で比較するスタイルが一般的です。

f:id:doryokujin:20120716041415p:plain

図4:左がメジャーなBox Plot。A, B, C, D のカテゴリごとのある数値変数の統計値を表現している。複数の統計値を同時に表現できるという意味で,Box Plot から得られる情報は多い。右はさらに各 Range での頻度も表現したバージョンで Histogram の表現を併せ持っており万能です。

OHLC Chart

また,Box Plot の類似表現として,トレーディング領域で使われている「OHLC Chart」があります。これは Boxplot の前述した統計量を使用するのでは無く,

  • O: Open Value
  • H: High Value
  • L: Low Value
  • C: Close Value

を表現しています。また,カテゴリ間の比較では無く,分単位の時間(数値離散変数)で比較します。

f:id:doryokujin:20120717000444p:plain

図5:トレーディングの分野では当たり前のように活用されるOHLC Chart。左右への棒の突出が Close Value とOpen Value を表現しています(画像はこちらを引用)。

1-3. Scatter Plot

Scatter Plot(散布図)は,2つの数値連続変数をそれぞれ X, Y 軸とし,全レコードのデータ点をプロットしたものです。離散変数やカテゴリ変数でも Scatter Plot は使用される場合もありますが,この場合は格子点上のプロットとなり多くの点が重なりますので Bubble Chart などの方が有効です。

さらに,3つ目の変量としてカテゴリ変数を加える事もできます。この場合はプロット点の色がカテゴリごとに区別されます(よって論文などの紙媒体での使用目的には向いていません)。

f:id:doryokujin:20120716041437p:plain

図6:2つの数値連続変数(X, Y軸)と1つのカテゴリ変数(プロット色)を用いた Scatter Plot。Histogram と違って,複数の変量を持って分布・傾向を調べることができます。

f:id:doryokujin:20120716041452p:plain

図7:2 つの数値連続変数を比較するのは変わりませんが,それらを行列として表現したのが Scatter Matrix。これによりパネル間の比較も可能になります。

1-4. Bubble Chart

Bubble Chart は多くの変数を同時に表現でき,かつバブル(泡)というユニークな表現方法を持った有用な Chart です。数値変数では X, Y 軸の他にバブルの半径として使用でき,カテゴリ変数はバブルの形と色に使用することができます。併せると最大 5 変数まで使用できます。

f:id:doryokujin:20120716041744p:plain

図8:X軸,Y軸に続くいわゆる3番目のZ軸をバブルの半径によって表現したバブルチャート。バブル自身が面積という概念をもつので,カテゴリによってバブルの色分けを行うことで新たにカテゴリ変数も利用できます。さらにバブルの形を三角形や四角形の種類で区別することでさらにカテゴリ変数を追加できますが,ここまでいくとわかりやすさを損ねてしまう可能性があります。

1-5. Radar Chart

Radar Chart は 2 つ以上の n 個の数値変数(連続・離散)を n 多角形として表現します。(場合によっては一部カテゴリ変数を使用することも可能です。)一般的に Radar Chart はむしろ集計済(各数値変量の平均など)テーブルの,それほどレコード数の多くない場合に好んで使用されます。レコード数が多い場合は重なりが多いので線の色で傾向を際立たせる工夫をしたりします。

f:id:doryokujin:20120716041549p:plain

図9:多くの数値連続変数を同時に表現できる Radar Chart。

f:id:doryokujin:20120717005217g:plain

図10:小数レコードにおける Radar Chart。Wikipedia からの引用

1-6. Parallel Coordinates

Parallel Coodinates は Radar Chart と同じインプットを持ちますが,こちらは多角形では無く一直線上に数値変数(連続・離散)を並べて表現します。変数間の傾向を発見するのに有用ですが,変数の並びでいくつかのパターンを作るのが一般的です。

f:id:doryokujin:20120716041639p:plain

図11:Radar Chart を直線上に伸ばした Parallel Coodinates。順番がより重要でいくつかの順番のパターンを見る必要があるが,隣接する変数間へのデータ点の遷移具合など,得られる情報量は非常に多い。

最後に

Sample Datasets に対する Visualization はレコード数が多いことも有り,多くの変量を同時に参照するとやや複雑になってしまいますので,まずは Histogram,Box Plot, Scatter Plot (Matrix) を活用するのが有効な手段です。

Visualization を体系的に理解するために重要なのは,

  • 扱えるデータ変数の種類
  • 同時に使用できる変数の数

にあります。今まで紹介した Visualization では,

  • 1-1. Histogram:1つの数値変量まで
  • 1-2. Box Plot:1つの数値変量と1つのカテゴリ変数まで
  • 1-3. Scatter Plot:2つの数値連続変量と1つのカテゴリ変数まで
  • 1-4. Bubble Chart:3つの数値変量と2つのカテゴリ変数まで
  • 1-5. Radar Chart:n個の数値変量またはカテゴリ変数まで
  • 1-6. Parallel Coodinates:n個の数値変量またはカテゴリ変数まで

となっていました。

今日はここまで。

Treasure Data Platform で始めるデータ分析入門 〜7. Data Visualization 〜 Tableau

本シリーズではデータ分析を以下の7つのレイヤーに分解し,各々について解説していくものとします。(Slide Shareの資料は常時更新されます。)

  1. Data Collection
  2. Data Storage
  3. Data Management
  4. Data Processing
  5. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  6. Data Visualization Treasure Viewer, MetricInsights, Tableau
  7. Data Visualization Patterns Part.1 Part.2 Part.3

本日は「6. Data Visulization」の第3回目,Tableau の紹介です。BIとして世界的な地位を確立しつつある Tableau ですが,前回までに紹介した「Treasure Viewer」「Metric Insights」とは用途・機能は全く異なるものであることを念頭に入れて置いて下さい。

 

f:id:doryokujin:20140204134925p:plain

 

Treasure Data の OEM する BI ツール:tableau は世界中で知名度のある,ユーザーの直感的な操作で可視化・レポーティングできるツールです。

 f:id:doryokujin:20140204135149p:plain

f:id:doryokujin:20140204134909p:plain

 

BI である Tableau と Dashboard である MetricInsights,両者の違いに着目して下さい。おそらく多くの方が想像される可視化ツールは Tableau だと思います。

 

f:id:doryokujin:20140204135228p:plain

 

Tableau 自身は,日本語webページが用意されていますのでそちらを参照下さい。また,以下のビデオは人間の直感的な操作によってデータが可視化がされていくのがわかると思います。

 

 

f:id:doryokujin:20140204140903p:plain

tableau にデータをインポートした時の画面が上図ですが,左の方を見て下さい。インポート時に tableau はその各々のカラムの値の型を調べ,自動的に「ディメンジョン」「メジャー」カラムに分類してくれます。もちろん,メジャーカラムをディメンジョンに変更することも可能です。

f:id:doryokujin:20140201153106p:plain

 

メジャーカラムとディメンジョンカラムはこのシリーズで取り上げている Car Sensor のデータでは上図のようになっておりました。

f:id:doryokujin:20140116115724p:plain

Treasure Cloud Storage と Tableau を繋ぎ込むコネクタを用意しており,アドホッククエリなどと組み合わせて大規模なデータ群からでも Tableau を通じてデータ集計,ドリルダウンなどが可能になっております。

f:id:doryokujin:20140204140208p:plainさらに tableau は Metric Insights を補完する形での使用も可能です。

 

f:id:doryokujin:20140204131313p:plain

 上図は Metric Insights と tableau との連携でより深く,より多くの目的を満たすような環境が実現できることを説明しています。

 

 

 

Treasure Data Platform で始めるデータ分析入門 〜7. Data Visualization 〜 Metric Insights

本シリーズではデータ分析を以下の7つのレイヤーに分解し,各々について解説していくものとします。(Slide Shareの資料は常時更新されます。)

  1. Data Collection
  2. Data Storage
  3. Data Management
  4. Data Processing
  5. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  6. Data Visualization Treasure Viewer, MetricInsights, Tableau
  7. Data Visualization Patterns Part.1 Part.2 Part.3

本日は「6. Data Visulization」の第2回目,Metric Insights の紹介です。これから3つの可視化ツール:「Treasure Viewer」「Metric Insights」「Tableau」について紹介していきます。これらの用途・機能は全く異なるものであることを念頭に入れて置いて下さい。

 

f:id:doryokujin:20140204123802p:plain

今回紹介するのは「Dashboard」と呼ばれるジャンルの可視化ツールを紹介します。Dashboard は後に紹介する BI: Business Inteligence ツールとは明確に異なる事を協調しておきます。

Treasure Data では数ある Dashboard の中でも一覧性と機能性の双方で優れた Metric Insights と呼ばれるツールをOEMとして提供しております。

 

f:id:doryokujin:20140204123817p:plain

さて,それでは Dashboard の役割とは何でしょうか?上図に挙げてみました。 Dashboard と BI との違いは,前者が一覧するという「受動的」であるのに対して,後者は掘り進めるという「能動的」である事です。

Dashboard に求められるのは高い「一覧性」と「アラーティング機能」であり,前者は多数のKPIを一覧でき異変を察知してすぐにアクションに繋げられるように,後者は Dashboard から離れている時でも異変があればアラーティングによって気づかせてくれるようでなければなりません。

 

f:id:doryokujin:20140204123834p:plain

Metric Insights はデータの一覧性はもちろんのこと,メールによるアラート機能とアノテーション機能をもった高機能ツールです。

Metric Insights はその一つ一つが独立したウィジェットになっており,ここに

  • 集計インターバル
  • データソース
  • 集計クエリ
  • 表示するチャートタイプ

の4つの項目を埋め込むことによって指定したインターバルでデータを自動更新してくれます。

 

f:id:doryokujin:20140204123853p:plain

 

データソースとしては上図のように,非常に多くのものに対応しています。

 

f:id:doryokujin:20140204123912p:plain

 

ウィジェット編集画面です。このように,個々のウィジェットに設定を仕込んで行きます。

f:id:doryokujin:20140204123927p:plain

データソースとクエリを埋め込む画面です。

 

f:id:doryokujin:20140204123942p:plain

 

個々のウィジェットに表示されるチャートはシンプルなものです。ここからドリルダウンするような機能は持っていません。ただ,データの表示範囲( x-軸 )を変更することは可能です。

 

f:id:doryokujin:20140204124204p:plain

また,詳細画面ページに行くと,アノテーション・アラート・コメント機能を確認できます。

 

f:id:doryokujin:20140204124234p:plain

 

アラーティング機能は,統計的に優位な変化がある場合や指定した値によって通知してくれる便利なものです。

f:id:doryokujin:20140204131313p:plain

 

Dashboard は,BI とどちらを選ぶかという選択肢ではなく,上図のように現場に近い全面の所では Dashboard,経営やお客様に近い所で BI というようにお互いに補完し合う関係であります。

次回は BI の雄,Tableau を紹介しますね。

Treasure Data Platform で始めるデータ分析入門 〜7. Data Visualization 〜 Treasure Viewer

本シリーズではデータ分析を以下の7つのレイヤーに分解し,各々について解説していくものとします。(Slide Shareの資料は常時更新されます。)

  1. Data Collection
  2. Data Storage
  3. Data Management
  4. Data Processing
  5. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  6. Data Visualization Treasure Viewer, MetricInsights, Tableau
  7. Data Visualization Patterns Part.1 Part.2 Part.3

本日は「6. Data Visulization」の第1回目,Treasure Viewer の紹介です。これから3つの可視化ツール:「Treasure Viewer」「Metric Insights」「Tableau」について紹介していきます。これらの用途・機能は全く異なるものであることを念頭に入れて置いて下さい。

 

f:id:doryokujin:20140204112215p:plain

Treasure Viewer は TQA ( Treasure Query Accelerator ) を使用しているユーザーが Treasure Management Console 内から使用できる,主にローデータの簡易 Viewer という位置付けです。Treasure Viewer は js 実装によりインタラクティブな操作が可能になっており,テーブル内の2つのカラムを x-軸,y-軸にドラッグすることで,サンプルデータテーブルおよび Column, Line, Area, グラフを参照することができます。

 

 

f:id:doryokujin:20140204112242p:plain

Treasure Viewer は後に紹介する Tableau に近い UI を持っていますが,Treasure Viewer の目的は,

  • 現在格納されているテーブル内にどのような項目があるのか,
  • どのようなレコードが入っているのか,
  • そしてそれを少し可視化してみよう

というところまでしかカバーしておりません。逆に Tableau は実際にそのようなローデータを集計した結果に対して様々なビジュアルを提供する意味では似ているとはいえ目的・用途が違っております。

 

f:id:doryokujin:20140204112258p:plain

それでは Management Console より Viewer にアクセスしてみましょう。左にあるアイコンリストから「Chart」を選択すると上の画面が表示されます。まずは対象とするデータベース・テーブルを選択します。

 

f:id:doryokujin:20140204112453p:plain

データベース名・テーブル名を特定すると,まず始めにその中に入っているカラム一覧とレコードサンプルを表示してくれます。この裏側ではアドホッククエリ(TQA)が投げられて10件のレコードを取ってきています。(Your Query のところにクエリが表示されています。)

次にリスト化されたカラムから2つ選択肢 x-軸,y-軸にドラッグし,見たい Chart を選択します。

 

f:id:doryokujin:20140204112437p:plain

結果として選んだ x-軸, y-軸から構成されるグラフが表示されます。こちらも裏側ではアドホッククエリ(TQA)が投げられていることが Your Query から確認できます。

 

なお,Treasure Viewer は現在も開発途上でありますので,今後様々な機能が追加されるかもしれません。

次回はより踏み込んだ可視化ツール,Metric Insights を紹介します。

Treasure Data Platform で始めるデータ分析入門 〜6. Data Processing Design 〜 Part.6

本シリーズではデータ分析を以下の7つのレイヤーに分解し,各々について解説していくものとします。(Slide Shareの資料は常時更新されます。)

  1. Data Collection
  2. Data Storage
  3. Data Management
  4. Data Processing
  5. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  6. Data Visualization Treasure Viewer, MetricInsights, Tableau
  7. Data Visualization Patterns Part.1 Part.2 Part.3

本日は「5. Data Processing Design」の第6回目です。

2. Making Cross Table 

f:id:doryokujin:20140203133727p:plain

 

クロス集計は知っている人には説明の必要が無いかもしれませんが,ここでは前回まで紹介した各クエリパターン毎にクロス集計ステップを考えて行きます。それに並行して作成したクロステーブルに適した可視化方法のいくつかを紹介します。

パターン1:< m | dim1 >

こちらは,クロス集計に最低限必要な2つのディメンジョンを持っていませんのでその必要はありません。

パターン2:< m | time >

こちらも1ディメンジョンなのですが,timeカラム自身が階層を持つ(その他アイテムカラム: category ⊃ sub_category ⊃ item など)ので,クロス集計の対象になります。

Part.3 で紹介した以下の結果に対してクロス集計を適用してみます:

Result     :

+------+----+----+-----------+

| y    | m  | d  | sum       |

+------+----+----+-----------+

| 2012 | 12 | 01 | 1647475.0 |

| 2012 | 12 | 02 | 1110545.0 |

| 2012 | 12 | 03 | 1195025.0 |

...

x-軸にday , y-軸に month を選び,z-軸(セル)に sum を入れます。クロス「集計」と書いていますが,本ケースではセルに関して再集計されることはありません。

f:id:doryokujin:20140203141032p:plain

 

 

さて,このクロステーブルを可視化してみましょう。今回はバブルチャートを用います。上図のセルの値の大きさがバブルの大きさ+温度色で表現しています。

f:id:doryokujin:20140203141504p:plain

上図よりわかるのは,月の始め(1〜5日)および半ば(15日〜22日)の値が大きい傾向にあり,特に5月の値の大きさが目立っています。このバブルチャートはクロステーブルを直感的に表現していてわかりやすいですね。

パターン3:< m | dim1, dim2 >

Part.4 で紹介した,

基本例:トヨタ車のモデル (dim1),年式 (dim2) ごとの平均車両価格が安い TOP20

は x-軸にモデル(dim1),y-軸に年式(dim2)を設定すれば良いですね。

基本例:人気モデルの年式ごとの平均価格

は既にクロス集計を紹介しましたが,再掲載しバブルチャートと異なる可視化をしてみましょう。

f:id:doryokujin:20140201115547j:plain

f:id:doryokujin:20140203143628p:plain

上図はヒートマップと呼ばれ,バブルチャートがz-軸の値を円の半径と色で表現していたのに対し,こちらは色温度のみで表現しています。

パターン5:< m1 | Seg(m2) >

こちらも与えられたディメンジョンが1つなのでクロス集計の必要はありません。

パターン6:< m1 | Seg(m2), Seg(m3) >

基本例:中古車価格別,平均走行距離別,頻度分布

先ほど紹介したヒートマップも,セグメントが密になると境界もあいまいになってきます。この場合には "Contour Matrix" と呼ばれる等高線のような表示が有効です。

f:id:doryokujin:20140201161236p:plain

パターン7:< m1 | dim1, Seg(m2) クエリパターン

基本例:走行距離,年式別平均中古車価格

こちらも前回でヒートマップで可視化しましたが,"Symmetric Area Graph" で表現してみましょう。

f:id:doryokujin:20140203152714p:plain

今日はここまでです。

Treasure Data Platform で始めるデータ分析入門 〜6. Data Processing Design 〜 Part.5

本シリーズではデータ分析を以下の7つのレイヤーに分解し,各々について解説していくものとします。(Slide Shareの資料は常時更新されます。)

  1. Data Collection
  2. Data Storage
  3. Data Management
  4. Data Processing
  5. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  6. Data Visualization Treasure Viewer, MetricInsights, Tableau
  7. Data Visualization Patterns Part.1 Part.2 Part.3

本日は「5. Data Processing Design」の第5回目です。

1. Making Mini Cubes 

f:id:doryokujin:20140201153106p:plain

 

Car Sensor データを元に上記のテーブル "usedcar_cube_without_catalog" を作成しました。

Mini Cube 作成ルール
  • メジャーカラムは 1 つだけ選択する。
  • ディメンジョンカラムは最大 2 つまで選択する。
  • ディメンジョンカラムの中で階層構造を持つものは,その上位階層を全部含めたものを1つのディメンジョンカラムとみなす。

さて,まず先に分布を定義しておきましょう。

定義

パターン5 における < Count(1) | Seg(m1) > ,およびパターン6 における< Count(1) | Seg(m1), Seg(m2) > をそれぞれ「m1 (, m2) における頻度分布(離散)」とよび,それぞれDis<m1>, Dis<m1,m2> と書く。わかりやすく「m1 (,m2) 別の分布」と表現しても良い。また,順序付け可能な dim1, dim2 を含む< Count(1) | Seg(m1), dim1 >,< Count(1) | dim1,  dim2 > も分布と定義する。

--

順序づけ可能な dim1 とは,例えばレベルやアイテム保有数などのディメンジョンにもなりうりますが,順序づけが可能で平均を求めることに意味のあるものを言います。

分布の概念は重要で特に平均を求める集計では,データ数が少なかったりばらつきが大きいことによって意味のある値として使えない事が少なくありません。そこで,分布をみることによってどの領域に多く集中(頻度が高い)しているのかを可視化によって捉える事ができます。

パターン5:< m1 | Seg(m2) >
< Count(1) | Seg(m1) > クエリパターン

こちらのパターンはメジャーの集計方法を頻度集計に限定したものです。

SELECT ceil( #measure1/width )*width AS x, COUNT(1) AS cnt

FROM

(

  SELECT #measure1, 1 AS one

  FROM table

  WHERE condition

) t1

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( #measure1 )))-1) AS width, 1 AS one

  FROM table

  WHERE condition

) t2

ON t1.one = t2.one

GROUP BY ceil( #measure1/width )*width

ORDER BY x

 

基本例:中古車の価格別分布

SELECT ceil(used_price/width)*width AS x, COUNT(1) AS cnt

FROM

(

  SELECT used_price, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 < used_price

) t1

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( used_price )))-1) AS width, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 < used_price

) t2

ON t1.one = t2.one

GROUP BY ceil(used_price/width)*width

ORDER BY x

f:id:doryokujin:20140201150135p:plain

中古車の価格別分布です。30〜40万台をピークになだらかに減少しています。500万円以上のものは500万円のセグメントに集約しましたが,500万円以上の車も4281件エントリーされています。

< m1 | Seg(m2) > クエリパターン

より一般的なこちらのパターンを見ていきます。

SELECT ceil( #measure2/width )*width AS x,

  SUM( #measure1 ), COUNT(1) AS cnt, AVG( #measure1 ) AS avg

FROM

(

  SELECT #measure1, #measure2, 1 AS one

  FROM table

  WHERE condition

) t1

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( #measure2 )))-1) AS width, 1 AS one

  FROM table

  WHERE condition

) t2

ON t1.one = t2.one

GROUP BY ceil( #measure2/width )*width

ORDER BY x 

基本例:中古車価格別,平均走行距離

SELECT ceil( used_price/width )*width AS x,

  SUM( odd_km ), COUNT(1) AS cnt, AVG( odd_km ) AS avg

FROM

(

  SELECT  odd_km,  used_price, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 < used_price

) t1

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( used_price )))-1) AS width, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 < used_price

) t2

ON t1.one = t2.one

GROUP BY ceil( used_price/width )*width

ORDER BY x

f:id:doryokujin:20140201154307p:plain今度は走行距離別の「頻度」ではなく「平均走行距離」を計算しました。500万円以上の車両はまとめて計算し直しています(平均の平均は平均ではありませんので)。

価格帯が安いものほど過走行気味ですが,120万円を越える当たりからは平均5万km前後で推移しているようです。

パターン6:< m1 | Seg(m2), Seg(m3) >
< Count(1) | Seg(m1), Seg(m2) > クエリパターン

SELECT ceil( #measure1/t2.width)*t2.width AS x, ceil( #measure2/t3.width)*t3.width AS y, COUNT(1) AS cnt

FROM

(

  SELECT #measure1, #measure2, 1 AS one

  FROM table

  WHERE condition

) t1

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( #measure1 )))-1) AS width, 1 AS one

  FROM table

  WHERE condition

) t2

ON t1.one = t2.one

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( #measure2 )))-1) AS width, 1 AS one

  FROM table

  WHERE condition

) t3

ON t1.one = t3.one

GROUP BY ceil( #measure1/t2.width)*t2.width, ceil(#measure2/t3.width)*t3.width

ORDER BY x, y

基本例:中古車価格別,平均走行距離別,頻度分布

SELECT ceil(used_price/t2.width)*t2.width AS x, ceil(odd_km/t3.width)*t3.width AS y, COUNT(1) AS cnt

FROM

(

  SELECT used_price, odd_km, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 < used_price

  AND 0 < odd_km

) t1

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( used_price )))-1) AS width, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 < used_price

) t2

ON t1.one = t2.one

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( odd_km )))-1) AS width, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 < odd_km

) t3

ON t1.one = t3.one

GROUP BY ceil(used_price/t2.width)*t2.width, ceil(odd_km/t3.width)*t3.width

ORDER BY x, y

f:id:doryokujin:20140201161236p:plain

中古車価格300万以上,走行距離3万km以上を無視して描いた2次元分布図。70万〜130万円の価格帯で低走行距離の車が多くあつまっているのがわかります。

< m1 | Seg(m2), Seg(m3) > クエリパターン

自明なので省略します。

パターン7:< m1 | dim1, Seg(m2) >
< m1 | dim1, Seg(m2) > クエリパターン

SELECT ceil( #measure1/width )*width AS x, %dim1,

  SUM( #measure1 ), COUNT(1) AS cnt, AVG( #measure1 ) AS avg

FROM

(

  SELECT #measure1, 1 AS one

  FROM table

  WHERE condition

) t1

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( #measure1 )))-1) AS width, 1 AS one

  FROM table

  WHERE condition

) t2

ON t1.one = t2.one

GROUP BY ceil( #measure1/width )*width, %dim1

ORDER BY x, %dim1

基本例:走行距離,年式別平均中古車価格

dim1 として年式,Seg(m2) として走行距離のセグメントで m1: 中古車価格の平均を見ていきましょう。

SELECT ceil(odd_km/width)*width AS x, year,

   SUM( used_price ), COUNT(1) AS cnt, AVG( used_price ) AS avg

FROM

(

  SELECT used_price, odd_km, year, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 <= odd_km AND 0 < year

) t1

JOIN

(

  SELECT POW(10,floor(LOG10(MAX( odd_km )))-1) AS width, 1 AS one

  FROM usedcar_cube_without_catalog

  WHERE 0 <= odd_km

) t2

ON t1.one = t2.one

WHERE 0 <= used_price

GROUP BY ceil(odd_km/width)*width, year

ORDER BY x, year desc

f:id:doryokujin:20140203115320p:plain

パターン8:< m1 | dim1, dim2 >

こちらも省略します。