書評:「SQLデータ分析・活用入門 データサイエンスの扉を開くための技術」① 西潤史郎 (著), 山田祥寛 (監修)

はじめに

著者の西潤史郎さんとは、2011年に倉園佳三さんのITガジェット系セミナーでお知り合いになったのだが、当時は歯科開業に関するコンサルティングのお仕事をされていたと記憶している。

Facebookで繋がってたまにメッセージをやり取りする間柄だったのだが、この度SQLの入門書を執筆されたと知り大変驚いた。

早速、購入しようと思っていたのだが、「ブログで紹介してくれたら献本します。」という書き込みがあったので手を挙げることにした。

現在西さんは、データ・サイエンティスト株式会社のチーフデータエンジニアということで、本書は分析系エンジニア向けの入門書という位置付けで書かれている。私はどちらかというと基幹系データベースのエンジニアであるので、自分の周りのエンジニアを意識しながらこの本の紹介をしたいと思う。

基幹系データベース・エンジニアが分析ツールとしてのSQLを学ぶ意義とは

誤解を恐れずに基幹系と分析系の違いを図示すると以下のようになると思う。

両者は相容れない分野という印象を受けるが、共通言語としてのSQL特にウィンドウ関数に精通すれば、基幹系データベース・エンジニアが自らの領域を広げるよいきっかけになるのではということを本書を読んで感じた。(下図)

特定の業務に精通することは大事だが、長いエンジニアとしてのキャリアを考えた場合、汎用的例えばパフォーマンスチューニングやデータモデリング等の知識を得ることは重要だと思う。

汎用的知識の一つとしての分析系領域にSQLをきっかけとして入り込んでいくことを、基幹系に携わる若いエンジニアには是非意識して欲しいと思った。

そのための入門書としても本書は非常に良書と考える。

本書の構成

本書は第一部と第二部に分かれており、 第一部はデータ分析とSQLの世界の全体像の把握と分析SQLの基本的な理解を目的としている。

第二部では、具体的な分析例とデータ分析の目的および実現方法に対する著者の熱い想いが描かれている。

概要と環境

それでは、目次を最初から見ていこう。

第一部 SQLによるデータ分析の基礎
 第1章 SQLデータ分析の世界
  1.1 SQLによるデータ分析とは
   データ分析ニーズの広がり
   データとデータベース
   リレーショナルデータベース管理システムとSQL
   データ分析の流れ
  1.2 分析システムの広がりとSQL
   基幹システムと分析システムの違い
   分析システムのSQLとデータベースの特徴
   コラム ウィンドウ関数という革新で第2の生を得たSQL
  1.3 なぜ分析SQLのスキルが必要なのか
   データベースにある一次データを取得する
   SQLは分析担当者とエンジニアにとっての「英語」
   コラム ビッグデータに対応するデータベースNoSQLによるSQLへの回帰

第1章はSQLによるデータ分析の概要に関する解説となっている。ここで注目したいのは”SQLは分析担当者とエンジニアにとっての「英語」 ”という箇所である。

共通言語としてのSQL を通してデータ分析者とエンジニアが会話できれば、つまり、SQLを使えば何ができるのかということを分析結果のユーザであるデータ分析者が理解していれば、同じ目的を明確化した分析が可能となるということである。

また、2つのコラムも非常に興味深い。ここは是非ミック氏の「達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへー17 順序をめぐる冒険」を併読して欲しい。

第2章はデータ分析環境についての解説である。サンプルコードはDDLと共に書籍内で指定されたURLからダウンロードできるので、第3章以降の内容は手元の検証環境で実際に確認することが可能である。

私はPostgreSQLの環境で、付録の情報を参考にしながら「SQL Workbench/J」を使って確認を行った。

 第2章 データ分析環境を整える
  2.1 データ分析環境の準備
  2.2 アドホック分析とレポーティングの環境
  2.3 その他の分析ツール
  2.4 SQLクライアントをデータ分析で活用する

 付録
  A.1 SQLクライアント「SQL Workbench/J」の導入方法
  A.2 ダッシュボードツール「Redash」の導入方法と可視化手順

SQLの基本

第3章から第6章はSQLの基本についての解説である。SQLをすでに習得している読者であればざっと読み進めてもかまわないが、基本知識のおさらいにはちょうどよい内容である。

 第3章 データの「分ける」「数える」が分析の基本
  3.1 SELECT文でデータを分析する基本
  3.2 WHEREでデータを絞り込む
  3.3 GROUP BYでデータをグループ化する
  3.4 HAVINGでデータをさらに絞り込む
  3.5 ORDER BY句/LIMIT句でデータをさらに整える
 第4章 分析を効率化するSQLによる前処理
  4.1 異なるデータ型への変換
  4.2 数値のデータ加工
  4.3 日付・時間のデータ加工
  4.4 文字列のデータ加工
 第5章 データをさらに活用するためのテクニック
  5.1 サブクエリを使いこなす
  5.2 INとEXISTSによるデータの調査
  5.3 SQLで基本統計量を求める
  5.4 ログデータひとつでできるユーザ分析
 第6章 複数のテーブルを扱うJOINとUNION
  6.1 テーブルの結合とテーブルの正規化
  6.2 JOIN句によるテーブルの結合
  6.3 特殊な結合
  6.4 UNIONで複数のテーブルを扱う

ウィンドウ関数

第7章は第一部の中でも特に強調しておきたい箇所なので小見出しレベルまで紹介する。

 第7章 分析SQLの主役「ウィンドウ関数」徹底入門
  7.1 ウィンドウ関数の概要
   ウィンドウ関数とは
   ウィンドウ関数でランキングを求める
   ウィンドウ関数の構文
   ウィンドウを明記する、別の表記方法
  7.2 ウィンドウの範囲と順序を指定するPARTITION BYとORDER BY
   PARTITION BYでグループ分け
   PARTITION BYを指定しない場合のウィンドウ
   ORDER BYで並び替える
  7.3 ウィンドウ関数に変身する関数と専用の関数
   順序を扱うウィンドウ関数専用の関数
   集約関数からウィンドウ関数に変身する関数
  7.4 フレーム句を使いこなし分析SQLの達人になる
   フレーム句の構文とフレームのイメージ
   フレームで直近の日付を求める
   RANGEによる値単位での行指定

この章のサンプルSQLを実際に試してみるとウィンドウ関数がどのように機能するかよく理解することができる。ウィンドウ関数についてここまで徹底的に解説してくれる入門書にはあまりお目にかかったことがないので、非常に参考になる。

ウィンドウ関数自体に「WINDOW」 という単語は出てこないことが取っつきにくい印象を与えるが、「ウィンドウ=フレーム」という理解をしていればイメージしやすいのではないかと思った。

基幹系のバッチSQLでも集計を行っているものがあるが、各行ごとに合計値列を追加するためだけにテーブルを自己結合しているような事例をよく目にする。

もし、ウィンドウ関数のテクニックがあれば無駄な結合を解消し、よりシンプルなSQLに書き直すことができるかもしれない。

一般的なSQL入門書は数ある機能の一つとしてウィンドウ関数を簡単に 紹介しているものが多いが、本書は第二部以降の実践編へスムーズに入っていくことができるような構成になっているのが非常によいと感じた。

第二部は実践編

本書のメインは第二部の実践編である。第8章はデータ分析の基本的な実践としてアドホック分析を紹介している。

基幹系システムに関わるエンジニアは、SQLとは定型的な業務を実行するためのツールであり、常に期待された正しい結果を正しい時間内に返すクエリーの作成が最も重要であるという共通認識がある。

従って、オンライン処理にせよバッチ処理にせよ、データの内容によって実行計画が変動し、性能が急激に劣化するような状況が最も問題である。

一方、分析系の世界はその場一回限りの(アドホックな)クエリーを対話的に何度も実行することで、求めるモデルを追求していくという特徴がある。

私は本格的な分析業務の経験がないのであるが、第8章のサンプルを丁寧に実行することで、データ分析の実際を簡単に体験することができた。

第二部 SQLによるデータ分析の実践
 第8章 SQLで小さな分析を積み重ねる
  8.1 小さな分析を積み重ねるアドホック分析
  8.2 ファクトデータを活かす時系列分析
   時系列分析とは
   ウィンドウ関数で簡単、SQLで時系列分析
  8.3 グループ分けを組み合わせるクロス集計
   クロス集計とは
   データの確認
  8.4 実践アドホック分析1〜全体から部分へ分析を進める〜
   モデルのイメージ
   全体の把握
   GROUP BY句でグループを分ける
   ウィンドウ関数によるランク付け
   CASE式によるランク付け
   クロス集計で表を整える
  8.5 実践アドホック分析2〜集計と深掘り〜
   指標を追加し、3指標のランクを求める
   3指標でランクを求める
   ランク値ごとに集計する
   集計値を求める

「8.4 実践アドホック分析1」では、「直近購買日」と「購買頻度」という2つの軸(指標)によるクロス集計をゴールとしている。

GROUP BY句で分けられたグループにおけるランク付けを、ウィンドウ関数とCASE式の2つの方法でランク付けする実習を行うことでそれぞれの特徴を理解することができる。

「8.5 実践アドホック分析2」はさらに「購入金額」という指標を加えることで、最終的にRFM分析を体験することができる。

RFM分析というのは本書で初めて知ったのだが、顧客の購買行動をRecency(最新購買日)、Frequency(購買頻度)、Monetary(購買金額)の3指標で顧客動向を分析することである。

第一部から始まって第8章最後のRFM分析に至る流れを感じることができるので、なかなか練られた構成だと思った。

更なる実践Tips

第9章ではより本格的な分析を行う場合に必要なTipsが解説されている。

 
 第9章 長いSQLを読み解く
  9.1 データ分析でよくある長いSQLの読み方
   内側のSELECT文から読む
   SELECT文は句の処理順に読む
  9.2 統計量「四分位数」を求めるSQLを読み解く
   四分位数とSQL全体像
   SQL全体像と読み解き順序
   ランキングを算出するための相関サブクエリ
   ランキングを算出するクエリ
   ランキングをもとに四分位に振り分ける
  9.3 「バスケット分析」のSQLを読み解く
   バスケット分析について
   データとSQLの関係
   SQL全体像と読み解き順序
   1つめの文「商品の組み合わせと購入回数」
  9.4 「ユーザーの利用機能分析」のSQLを読み解く
  9.5 [番外編]既存のSQLをよりよく改善する

「長いSQLを読み解く」というテーマの章であるが、本ブログでも以前 SQLフォーマッターFor WEB というSQL整形ツールを紹介したことがある。

分析系、基幹系問わず長いSQLをいかに的確に読み解けるかが生産性に大きく寄与するが、この章には本当に必要なエッセンスが書いてある。

第10章はまとめであるが長くなりそうなので次回に続く…