見出し画像

SQLをすばやく解読できるかも - PythonからGraphvizを手軽に使ってみましょう -

こんにちは。コグラフ株式会社データアナリティクス事業部の塩見です。
Graphvizは点と点がどのようにつながっているか、構造を記述するだけで自動的にグラフ(頂点と辺からなるネットワーク図)を作成してくれるツールです。
この記事では、PythonからGraphvizを使う方法を簡単に説明します。そして、SQLの構造を把握するツールとしての使い方を紹介します。Google Colaboratoryを使って説明しますので、環境構築は不要です。


簡単な使い方

Google Colaboratoryを起動しましたら、コードセルに以下の4行を打ち込んで実行してください。すると、これだけでGraphvizがaからbへの矢印を描画してくれます。

簡単な使い方

1行目 importは graphvizの機能を使えるようにしています。
2行目 graphviz.Digraphで向きのあるグラフ (directed graph)を生成して、それを変数 gに入れています。
3行目 g.edge('a', 'b') は、グラフの頂点'a'から頂点'b'に向かう辺 (edge)があることを表しています。
4行目 変数gを出力します。

親子関係図を描いてみる

次の例では有名な家族の親子関係図を描いてみました。この図を見ると、タラオがカツオやワカメの弟ではないことがすぐにわかりますね。人物同士の親子関係を列挙するだけで、このような図を自動的に描いてくれるのです。便利だと思いませんか?

import graphviz
g = graphviz.Digraph()
g.edge('マスオ', 'タラオ')
g.edge('サザエ', 'タラオ')
g.edge('フネ', 'サザエ')
g.edge('フネ', 'カツオ')
g.edge('フネ', 'ワカメ')
g.edge('波平', 'サザエ')
g.edge('波平', 'カツオ')
g.edge('波平', 'ワカメ')
g
有名な家族の親子関係図

SQLの構造を把握する

データ分析の実務では長いSQLを読み解かなければならない場面があります。WITH句がいくつも並んでいるSQLを読んでいると、私はよく迷子になって、コードの全体像がどうなっているのか把握できなくなってしまいます。そんなときはGraphvizでSQLの構造を図解してみると、理解の助けになるのではないでしょうか。
例えばこのようなWITH句がいっぱい並んだSQLを考えます。

WITH 出荷実績 AS (SELECT ... FROM 売上)
,出荷予定 AS (SELECT ... FROM 受注)
,入荷実績 AS (SELECT ... FROM 入荷)
,入荷予定 AS (SELECT ... FROM 発注)
,現在在庫 AS (SELECT ... FROM 在庫)

,在庫予測 AS (
SELECT ... FROM 在庫
LEFT JOIN 出荷実績
LEFT JOIN 出荷予定
LEFT JOIN 入荷実績
LEFT JOIN 入荷予定
)

,発注計画 AS (
SELECT ... FROM 商品
LEFT JOIN カレンダー
LEFT JOIN 現在在庫
LEFT JOIN 在庫予測
)

これを以下のように、FROM句が参照するテーブルからWITH句で名付けられたテーブル名への関係に書き換えてしまうのです。

import graphviz
g = graphviz.Digraph()
g.edge('売上', '出荷実績')
g.edge('受注', '出荷予定')
g.edge('入荷', '入荷実績')
g.edge('発注', '入荷予定')
g.edge('在庫', '現在在庫')
g.edge('在庫', '在庫予測')
g.edge('出荷実績', '在庫予測')
g.edge('出荷予定', '在庫予測')
g.edge('入荷実績', '在庫予測')
g.edge('入荷予定', '在庫予測')
g.edge('商品', '発注計画')
g.edge('カレンダー', '発注計画')
g.edge('現在在庫', '発注計画')
g.edge('在庫予測', '発注計画')
g

するとGraphvizが自動的にグラフを描いてくれます。テーブル同士の関係が可視化されてSQLの全体構造が把握しやすくなったと思いませんか。


SQLの全体構造

物事の関係を整理して考えるツールとして

SQLの構造を把握するためのツールとしてGraphvizを紹介しましたが、もっと汎用的に、考えを整理するためのツールとしても使えます。例として統計学によく登場する確率分布を整理してみました。実線の矢印は試行回数を増やす拡張を、点線の矢印は共役の関係を表現しています。

import graphviz
g = graphviz.Digraph()
g.edge('ベルヌーイ分布', '二項分布')
g.edge('ベルヌーイ分布', 'ベータ分布', style='dashed')
g.edge('二項分布', 'ベータ分布', style='dashed')
g.edge('カテゴリカル分布', '多項分布')
g.edge('カテゴリカル分布', 'ディリクレ分布', style='dashed')
g.edge('多項分布', 'ディリクレ分布', style='dashed')
g
確率分布の関係

データ分析に興味のある方募集中!

コグラフ株式会社データアナリティクス事業部ではPythonやSQLの研修を行った後、実務に着手します。
研修内容の充実はもちろん、経験者に相談できる環境が備わっています。
このようにコグラフの研修には、実務を想定し着実にスキルアップを目指す環境があります。
興味がある方は、下記リンクよりお問い合わせください。

X(Twitter)もやってます!

コグラフデータ事業部ではX(Twitter)でも情報を発信しています。
データ分析に興味がある、データアナリストになりたい人など、ぜひフォローお願いします!

この記事が気に入ったらサポートをしてみませんか?