D3.jsとその活用事例について


D3.jsとは?

D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。

ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。

D3.jsの基本的な使い方

D3.jsはHighChartsGoogleChartsのようにぽんっとデータを渡せばいい感じのグラフを出してくれるようなライブラリではありません。
もっと低レイヤーのライブラリで、学習コストはそれなりに高いと思います。
が、覚えるととても便利です。(まだまだ僕も使いきれていませんが)

では、さっそく基本的な使い方です。

データをhtmlとして書き出してみましょう。

var data = [1,2,3,4];
d3.select("body")
    .selectAll("p")
    .data(data)
    .enter()
    .append("p")
    .text(function(d) {return "データ: " + d});

これを実行すると以下のようにhtmlが生成されます。

d3sample1

  • d3.select(“body”).selectAll(“p”)
    まずD3.jsのメソッドでbodyを選択し、HTML内のすべてのpタグを取得しています。
    ※ただし、この時点ではpタグ存在せず、追加するタグになります。
    ※セレクタの使い方はjQueryとほとんど同じです。

  • .data(data).enter()
    データセットをバインドし、enter()メソッドでデータを保存します。

d3.select(“body”).selectAll(“p”).data(data).enter()
まで実行した場合の戻り値を見てみると、

[
    0 : {
        __data__ : 1
    },
    1 : {
        __data__ : 2
    },
...
]

と「__data__」にデータが保存されていることがわかります。

  • .append(“p”).text(function(d) {return “データ: ” + d});
    pタグを挿入し、pタグ内のテキストとして、function(d) {return “データ:” + d}を挿入しています。
    function内のdにはバインドした値が入ってきます。今回は”データ”という文字列を付与してreturnしていますので、
    さきほどの画像のように表示されます。

ヒートマップを作ってみる

基本的な使い方からかなり飛んでいるような気もしますが、D3.jsを使ってヒートマップを作ってみたいと思います。

  • データ

曜日/時間帯ごとのPV数のデータを用意しました。

[
    {
        "week" : "月",
        "time" : 0,
        "pv": 43605
    },
    {
        "week" : "月",
        "time" : 1,
        "pv": 24782
    },....
    {
        "week" : "日",
        "time" : 23,
        "pv": 24782
    }
]
  • コード
var dataset = [{"week" : "月","time" : 0,"pv": 43605}, ...];
// カラースケール作成のためdatasetのmax,min,medianを取得
var max = d3.max(dataset, function(d){ return Number(d.pv) });
var min = d3.min(dataset, function(d){ return Number(d.pv) });
// カラースケールを作成
var colorScale = d3.scale.linear().domain([min, max]).range(["#fefcfc","#f8696b"]);

// ヒートマップのテーブルを追加
var tbl = d3.select("body").append('table');

// 横軸の0~23時の配列を生成
var hours = d3.range(24);

// 生成したtableにtheadを追加
var thead = tbl.append('thead');

// theadに0~23時の横軸を入れる
tbl.append('th');
tbl.selectAll('class')
	.data(hours)
	.enter()
	.append('th')
	.text(function(d){ return d + " 時" });

// 縦軸のデータを生成する(曜日をキーにする)
var weekdata = d3.nest().key(function(d){ return d.week; }).entries(dataset);
// tbodyを生成し、tbodyにtrを追加する
var tbody = tbl.append('tbody');
var tr = tbody.selectAll('tr')
	.data(weekdata)
	.enter()
	.append('tr')
tr.append('th').text(function(d){ return d.key;});

// 実際のデータをtdに入れる
tr.selectAll('td')
	.data(function(d){ return d.values} )
	.enter()
	.append('td')
	// 作成したカラースケールから背景色を設定
	.style("background-color", function(d){ return colorScale(d.pv); })
	// td内に数値を入れる(3桁区切りでカンマを入れる)
	.text(function(d){
		var num = new String(d.pv).replace(/,/g, "");
		while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
		return num
	})

これを実行するとこんな感じになります。
d3sample2

まあ、内容はコメントに書いてあるとおりで、割りと簡単に作れます、と言いたかったのです。

活用事例

最後にD3.jsの活用事例について紹介します。

弊社が提供しているAudienceOne®では、今回紹介したD3.jsを使って、オウンドサイトのリーセンシー/フリークエンシー毎のユニークユーザ数をヒートマップを使って直感的に可視化できる機能を提供しています。

AoneCapture

また、今回のサンプルでは実装しませんでしたが、Javascriptのイベントも自由に設定することができるため、ドラッグ操作で任意の範囲選択の数値を出力といったことも分析できます。

気になる方は、ぜひお問い合わせください。AudienceOne®


【2015/08/27 追記】
DAC AD TECH BLOGで、AudienceOne®について詳しく紹介しております。
ぜひご一読ください。顧客を可視化し、データドリブンなマーケティングを支援/「AudienceOne」


DACエンジニア採用情報

  関連記事

no image
Polymer on Rails

Web Componentsをご存知だろうか。これが普及すればWebの開発は画期的に変わるだろう。 説明すると長くなるので、LIGさんのにその辺はお任せして。(この記事読んでください。) 簡単に言えば、下記にあるような新たに提案されたブラウザ向けAPIの総称。 Custom Elements, 説明 …

11396380473_26f323b1e4_z
Google BigQuery / Tableauを使ってみた

TableauからGoogle BigQueryへ接続してみました。 弊社で利用しているTreasureDataからデータ出力してBigQueryへロード、Tableauから接続まで実際に行った手順について記載します。 TreasureDataからAmazonS3へデータ出力 まず、データが蓄積され …

【超入門】Hivemallで機械学習_サムネイル
【超入門】Hivemallで機械学習 〜Treasure Dataでロジスティック回帰編〜

こんにちは。俺やで。 ビッグデータとかデータサイエンティストとかいう言葉が未だブームですね。 (「データサイエンティスト」は下火か。) ビッグデータ扱えるエンジニアも、 統計解析ができるアナリストも、 どっちもできるスーパーマンも世の中にはたくさんいますが、 ビッグデータも統計解析も扱えるインフラは …

no image
【未経験からのRuby on Rails – 第1回】楽しく書けるプログラミング言語 “Ruby” とは

こんにちは、はじめまして。新卒1年目のmatsuari(女子)です。 この度、Rubyの勉強を始めることになりまして、 まずはたくさんあるプログラミング言語の中で、なぜ自分がRubyを学ぶのか? しっかりと把握した上で学習に取り組んでいきたいと考え、『Rubyとは何か?』調べました。 超基礎的なこと …

data-tenki
気象予報士とビッグデータ解析の意外な関係

DACから気象予報士が誕生しました ビッグデータ解析部のMikeです。 2015年1月の気象予報士試験に合格し、めでたく4月からアドテク業界ただ一人(本当?)の気象予報士となりました 。 そんなわけで、今回は気象予報士とビッグデータ解析の関係についてお話したいと思います。 なぜ気象予報士を目指したか …

no image
Treasure Dataで長期間の集計

プラットフォーム・ワン T氏です。プラットフォーム・ワンでは、DSPのMarketOneとSSPのYIELD ONE提供しています。 MarketOneやYIELD ONEのログを調査する場合にTreasure Dataを使うことがあります。Treasure Dataでは大量のデータに対してHive …

chain
PyStanによるはじめてのマルコフ連鎖モンテカルロ法

はじめに こんにちは。システム開発部の中村です。 社内で行っている『データ解析のための統計モデリング入門』(所謂緑本)の輪読会に参加した所、 大変わかりやすい本だったものの、Macユーザには悲しい事に実装サンプルがWinBUGSだったため、 9章の一般化線形モデルのベイズ推定によるアプローチをPyt …

PPG_anteli-kunatokei_TP_V
Treasure Dataで大規模なマスタデータを扱う際にはtimeカラムインデックスを活用しよう

DACではTreasure Dataを利用して各種データの蓄積や集計を行っています。Treasure Dataは時系列のデータを扱うのに特にすぐれたアーキテクチャなのですが、セグメントIDとユーザーIDの組み合わせといった大量のマスタデータを利用した計算にも利用することもできます。そのような場合にt …

curry
【小ネタ】JSで要素の組み合わせを列挙する

下記のような、キーの数や要素数が可変のデータの組み合わせを、列挙するjavascriptコードです。 pythonにはitertoolなどの順列・組み合わせ計算を行う定番ライブラリがあるようです。 やっている事ですが、イメージとしては組み合わせを数列に置き換えています。 1桁目が2進数、3桁目が3進 …

6914441342_605f947885
Treasure Dataの新機能(Data Tank)をAudienceOneのレポート機能で利用した話

Data Tankとは? Treasure Dataの新機能でTreasure Dataのプラットフォーム上に構築されたデータマートです。 Tableau等のBIツールとの接続を想定されており、AWSでいうところのRedshift的なものだと考えるとわかりやすいかと。 Data TankはPostg …