グラブルの炎上問題に関する考察〜アンチラの出現確率は妥当だったか〜

blog.esuteru.com

読みました。今回は以前のコンプガチャの問題に比べるとイージーな問題だと思いました。

doryokujin.hatenablog.jp

私はグラブル,というかこの手のゲームをやったことが無いので問題を簡易的なものに置き換えて考察していきます。実際のケースには今回の考察を参考に考えてみてください。さて,今回の騒動の「アンチラ」の出現確率についての噂:

  1. 「アンチラ」の出現確率って他に比べてめちゃくちゃ低いのでは?
  2. 「アンチラ」の出現確率がアップするとどれだけ試行回数が経るのか?

について簡単に検証してみます。以下は引用した2252回の試行におけるSSRキャラの出現回数をまとめたもののようです。

f:id:doryokujin:20160109190114p:plain

引用元:【悲報】『グラブル』の申年限定キャラを手に入れるためガチャを2522連(75万6000円)回したツイッター民をご覧ください : はちま起稿

1. 「アンチラ」の出現確率って他に比べてめちゃくちゃ低いのでは?

ここで,SSRというのは「SS級のレア度」のキャラクターを指すようです。他にもSR(S級レア),普通のレアのキャラクターがいるようです。SSRのキャラクターでも99種類もあるんですね。

今回はこの検証結果を信用して検証を行います。つまり,99種類のSSRキャラクターがいて,全てが等確率で出現するという前提です。かつ,SSRキャラの存在割合が全体のキャラクターの6.35%とします。

この99種類のキャラが等確率で出現するとすると,

各々のSSRキャラの出現確率 = 6.35% × (1/99) ≃ 0.0635%

となります。今,アンチラもこの確率で出現するとすると,2521回のガチャの試行に対してアンチラが一回も出現しない確率は(1-[アンチラ以外のキャラが出現する確率])の2521乗なので,

(1 - 0.000635) ^2521 ≃ 0.20 (20%)

です。逆に言えば 80% の確率でアンチラは,2521回ガチャを回せば少なくとも一回は出てくることになります。つまり2521回ガチャを回す試行を10回繰り返せば,8回はアンチラが出るけれども,2回はアンチラが出ないことになります。

(厳密に2521回までアンチラが出なくて2522回目でアンチラが出る確率は最後に0.000635をかけるのでとても小さい確率になります。)

今回のケースではこの20%の方に該当した例となりますので,実際はもう少し少ない回数で出現が期待できます。しかし,20%の人は不運にもさらなる課金が必要となりまして,今回試された方はこちらに該当したようです。

では,アンチラの出現確率がいくらなら,2521回の試行で五分五分の確率となるのでしょうか?答えは

(1 - 0.00028) ^2521 = 1/2,つまり 0.028%です。

また,2521回の試行でほぼ確実にアンチラが出現するためには,

(1 - 0.0015) ^2521 = 0,つまり0.15%の出現率が必要です。

ちなみに,確率0.0635%で1000回トライすれば1000回全てでアンチラ以外のカードが出る確率は,1から1000回連続アンチラが出ない確率を引いたものなので

(1 - 0.000635) ^1000 = 0.52 (52%),よって 1 - 0.52 = 0.48(48%)

なので,アンチラの出現率0.0635%の元では,100人が皆1000回ガチャトライすれば48%の人がアンチラを得られるでしょう。

以上の考察をまとめると,初めの疑問:「アンチラだけが出現確率が低い」とは断言できなさそうです。SSRが全て等確率でも2000回以上ガチャを回しても,2割のユーザーは取得できませんので。

2. 「アンチラ」の出現確率がアップするとどれだけ試行回数が減るのか?

次にとある期間限定のイベントとして,アンチラの出現確率が

  • 2倍
  • 5倍
  • 10倍

になったとしましょう。この時出現確率はどのように変わるのでしょうか?

a. 2倍

アンチラの出現確率は

0.0635%*2 = 0.127% 

となるので,

(1 - 0.00127) ^ 2521 = 0.04 (4%)

つまり96%の確率で少なくとも一回は「アンチラ」が出現します。2522回では十分過ぎます。ちなみに5分5分となる回数は,500回程度です。

(1 - 0.00127) ^ 500 = 0.53 (53%)

b. 5倍

アンチラの出現確率は

0.0635%*5 = 0.3175% 

となるので,

(1 - 0.003175) ^ 2521 = 0 (0%)

つまりほぼ100%の確率で少なくとも一回は「アンチラ」が出現します。

ちなみに5分5分となる回数は,220回程度です。

(1 - 0.003175) ^220 = 0.5(50%)

c. 10倍

アンチラの出現確率は

0.0635%*10 = 0.635% 

となるので,出現率が5分5分となる回数は,100回程度です。

(1 - 0.00635) ^100 = 0.5(50%)

結論

今,2522回ガチャを回して 1/2 の確率でアンチラが得られる事を前提に考えると,0.028% がアンチラの出現確率になります。さらにこれが「出現確率2倍」適用時の確率だったとすると,実際のノーマル時のアンチラの出現確率は 0.014% となるはずです。

また,2522回ガチャを回せば100%アンチラを獲得できるとした場合には,出現確率は0.3%前後の設定だと思います。このゲームは数百のキャラクターバリエーションを持っている(?)ので,それを考えるとアンチラの出現確率が 0.0x%と低くなるのは妥当かと思います。

こういうのって,他の人もアンチラが出るまで何回回したかを記録していけば,もっと詳細な事が見えてくるんでしょうね。

 

 

doryokujin blogのメイントピックをトレジャーデータ日本語公式ブログへ移設しました。

トレジャーデータ日本語公式ブログ」の開設に伴い,doryokujin blogのメイントピックをそちらの方に移管しました。データアナリティクスの魅力はそちらのブログの方で引き続きお伝え続けたいと思っております。

なお当ブログは立ち位置を模索する段階に入りますが,面白いトピックを取り上げていければと思っております。

過去の人気記事をピックアップしておきますね。

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

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の営業経験またはセールスエンジニア経験ある方(優遇)
  • なるべく早くご入社いただける方(優遇)
  • 英語と日本語両方の読み書き、会話が可能な方(望ましい)

勉強会で発表してきました:「この Visualization がすごい2014 〜データ世界を彩るツール6選〜 」

2014年3月2日(日)のデータ可視化勉強会で発表させて頂きました。

 
エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)

本勉強会は上述の d3.js の入門本の発刊を記念して開催されました。可視化に興味のある全ての方にこの本をお薦めします。

また,BIに関する入門書籍は以下をお薦めします。

BIシステム構築実践入門 (DB SELECTION)

BIシステム構築実践入門 (DB SELECTION)

過去のブログもご参考にしてください。
  1. Data Processing
  2. Data Processing Design Part.1 Part.2 Part.3 Part.4 Part.5 Part.6
  3. Data Visualization Treasure Viewer, MetricInsights, Tableau
  4. Data Visualization Patterns Part.1 Part.2 Part.3

実データで覚える 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 との連携でより深く,より多くの目的を満たすような環境が実現できることを説明しています。