D3.jsとは?
D3とは「Data Driven Document」の略で、データに基づいてドキュメントを操作するための JavaScript ライブラリです。
ご存知の方も多いと思いますが、ちょっとだけD3.jsの基本的な使い方、そして弊社プラットフォームでの利用についてご紹介したいと思います。
D3.jsの基本的な使い方
D3.jsはHighChartsやGoogleChartsのようにぽんっとデータを渡せばいい感じのグラフを出してくれるようなライブラリではありません。 もっと低レイヤーのライブラリで、学習コストはそれなりに高いと思います。 が、覚えるととても便利です。(まだまだ僕も使いきれていませんが)
では、さっそく基本的な使い方です。
データをhtmlとして書き出してみましょう。
[code language="javascript"] var data = [1,2,3,4]; d3.select("body") .selectAll("p") .data(data) .enter() .append("p") .text(function(d) {return "データ: " + d}); [/code]
これを実行すると以下のようにhtmlが生成されます。
- d3.select("body").selectAll("p") まずD3.jsのメソッドでbodyを選択し、HTML内のすべてのpタグを取得しています。 ※ただし、この時点ではpタグ存在せず、追加するタグになります。 ※セレクタの使い方はjQueryとほとんど同じです。
.data(data).enter() データセットをバインドし、enter()メソッドでデータを保存します。
d3.select("body").selectAll("p").data(data).enter() まで実行した場合の戻り値を見てみると、
[code language="javascript"] [ 0 : { data : 1 }, 1 : { data : 2 }, ... ] [/code]
と「__data__」にデータが保存されていることがわかります。
- .append("p").text(function(d) {return "データ: " + d}); pタグを挿入し、pタグ内のテキストとして、function(d) {return "データ:" + d}を挿入しています。 function内のdにはバインドした値が入ってきます。今回は"データ"という文字列を付与してreturnしていますので、 さきほどの画像のように表示されます。
ヒートマップを作ってみる
基本的な使い方からかなり飛んでいるような気もしますが、D3.jsを使ってヒートマップを作ってみたいと思います。
- データ
曜日/時間帯ごとのPV数のデータを用意しました。
[code language="javascript"] [ { "week" : "月", "time" : 0, "pv": 43605 }, { "week" : "月", "time" : 1, "pv": 24782 },.... { "week" : "日", "time" : 23, "pv": 24782 } ] [/code]
- コード
[code language="javascript"] 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 }) [/code]
まあ、内容はコメントに書いてあるとおりで、割りと簡単に作れます、と言いたかったのです。
活用事例
最後にD3.jsの活用事例について紹介します。
弊社が提供しているAudienceOne®では、今回紹介したD3.jsを使って、オウンドサイトのリーセンシー/フリークエンシー毎のユニークユーザ数をヒートマップを使って直感的に可視化できる機能を提供しています。
また、今回のサンプルでは実装しませんでしたが、Javascriptのイベントも自由に設定することができるため、ドラッグ操作で任意の範囲選択の数値を出力といったことも分析できます。
気になる方は、ぜひお問い合わせください。AudienceOne®
【2015/08/27 追記】 DAC AD TECH BLOGで、AudienceOne®について詳しく紹介しております。 ぜひご一読ください。顧客を可視化し、データドリブンなマーケティングを支援/「AudienceOne」