第8章 8-8 / データエンジニアリング

分析プログラミングとSQL

このページで学ぶこと

前のレッスンで学んだプログラミングの基礎を、実際のデータ分析の現場でどう使うかを見ていきます。データサイエンティストが日常的に使う外部ライブラリ対話型の開発環境(Notebook)APIを使ったデータの受け渡し、そしてデータベースを操作するための世界共通言語であるSQLという4つのテーマを扱います。

SQLはDS検定でも頻出の分野です。丸暗記ではなく、「何をしたいときに、どの構文を使うか」という対応関係を意識しながら読み進めてください。

1. 外部ライブラリを使いこなす

プログラムをゼロから書くのではなく、他の人がすでに作ってくれた便利な機能の部品を取り込んで使うことができます。この部品の集まりを外部ライブラリ※6と呼びます。料理で言えば、出汁を昆布から取るのではなく、市販の「顆粒だし」を使うようなイメージです。データ分析の世界では、表計算のような処理をしてくれるライブラリや、グラフを描くライブラリ、機械学習のアルゴリズムをまとめたライブラリなどがよく使われます。

外部ライブラリを使うときに大切なのは、その関数(機能のまとまり)にどんな引数(入力)を渡す必要があり、どんな戻り値(出力)が返ってくるのかを、公式ドキュメントなどで確認してから呼び出すことです。仕様を確認せずに使うと、思わぬエラーや誤った結果につながります。

import pandas as pd

df = pd.read_csv("sales.csv")   # 引数: ファイルパス/戻り値: 表形式データ
print(df.mean())                # 各列の平均を計算して返す
EXAMPLE
  • 売上データの平均・合計を求めるとき、自分で計算式を書かずに表計算系ライブラリの集計関数を呼び出す
  • グラフを描くとき、色や軸ラベルを指定する引数の仕様を公式ドキュメントで確認してから使う
POINT

「動いたからOK」ではなく、引数と戻り値の型(数値なのか文字列なのか、一覧なのか単一の値なのか)を確認する習慣をつけると、意図しないバグを未然に防げます。

さえちゃん
さえ

外部ライブラリは「先人が作ってくれた便利な道具箱」だよ。使い方(引数と戻り値)さえ分かれば、中身の仕組みを全部理解してなくても活用できるのが強み!

2. Notebook環境で分析する ― Jupyter・Colabなど

データ分析では、コードを1行ずつ実行しながら結果をすぐに確認できる対話型の開発環境(Notebook)※1がよく使われます。代表的なものに、PythonのJupyter Notebook※7や、R言語のRStudio※8があります。コードとその実行結果、グラフ、説明の文章を1つのファイルにまとめられるため、分析過程を記録しながらレポートを作成するのに向いています。

さらに近年は、自分のパソコンに環境を構築しなくても、Webブラウザだけで使えるクラウド上のNotebookサービスが充実しています。代表的なものにGoogle Colab※9、AWS SageMaker Studio Lab、Azure Data Studio、IBM watsonx.ai Studioなどがあります。これらを使えば、環境構築の手間をかけずにPythonやRのコードをすぐに実行できます。

EXAMPLE
  • 会社のパソコンに開発環境を入れられない場合でも、Google Colabならブラウザだけで分析を始められる
  • Notebookに「なぜこの前処理をしたか」をメモしながらコードを書くことで、後から見返しても分析の意図がわかる
POINT

Notebook環境の利点は「コード」「実行結果」「説明文」を1つの画面にまとめられることです。試行錯誤しながら進める探索的なデータ分析と特に相性がよい環境です。

3. APIでデータをやり取りする

異なるシステム同士が情報をやり取りするための窓口をAPI※2と呼びます。レストランの厨房とホールをつなぐウェイターのような役割で、「こういう形式でお願いします」という決まった手順に従って注文(リクエスト)を出すと、決まった形式で料理(データ)が返ってくるイメージです。データの受け渡しには、JSON※10XML※11といった標準的なフォーマットがよく使われます。

{
  "customer_id": 1023,
  "name": "山田太郎",
  "purchase_total": 15800
}

このようなJSON形式のデータを受け渡しするプログラムを設計・実装できることは、DS検定でも問われるポイントです。APIを使ったプログラムを組む際は、「どんなURLに」「どんな形式のデータを送ると」「どんな形式のデータが返ってくるか」という仕様(APIドキュメント)を確認することが出発点になります。

EXAMPLE
  • 天気情報を提供するAPIに、地域名を送ると、その地域の気温や降水確率がJSON形式で返ってくる
  • 社内の在庫管理システムのAPIから、商品コードを指定して在庫数をXML形式で取得する
さえちゃん
さえ

APIは「決まった注文の仕方をすれば、決まった形でデータをくれる窓口」ってイメージ。JSONはその「決まった形」の代表例だよ。

4. SQLの基本構文 ― データベースを操作する共通言語

表形式のデータを大量に保存・管理するデータベースを操作するための言語がSQL※3です。SQLはデータの操作を行うDML※4(データ操作言語。SELECT・INSERT・UPDATE・DELETEなど)と、テーブルの構造を作るDDL※5(データ定義言語。CREATE TABLEなど)に大別されます。DS検定では、SELECT文を中心に一通りの構文を理解していることが求められます。

SELECT customer_name, SUM(amount) AS total
FROM orders
GROUP BY customer_name
HAVING SUM(amount) > 10000;

上の例は、注文テーブルから顧客ごとに購入金額を合計し(GROUP BY※12と集計関数SUM)、合計額が1万円を超える顧客だけを抽出する処理です。複数のテーブルを結び付けたいときはJOIN※13を使います。JOINには、両方のテーブルに一致するデータだけを残す内部結合(INNER JOIN)と、一致しないデータも残す外部結合(OUTER JOIN)があります。外部結合はさらに、左側のテーブルの行をすべて残すLEFT JOIN、右側のテーブルの行をすべて残すRIGHT JOIN、両方のテーブルの行をすべて残すFULL OUTER JOINに分かれ、「どちらのテーブルを主役にして、一致しない行も残すか」によって使い分けます。

-- 顧客テーブルを主役にして、注文がない顧客も含めて一覧を作る
SELECT c.customer_name, o.amount
FROM customers AS c
LEFT JOIN orders AS o ON c.customer_id = o.customer_id;
構文・機能 できること
SELECT / WHERE 条件に合う行・列を取り出す
INNER JOIN / OUTER JOIN 複数テーブルを結合する(一致行のみ/不一致行も含む)
GROUP BY / 集計関数 グループごとに合計・平均・件数などを求める
CASE文 条件による縦横変換・値の分類
副問合せ(サブクエリ) / EXISTS SQL文の中に別のSQL文を組み込み、複雑な条件で絞り込む
EXAMPLE ― CASE文による縦横変換
  • 「性別」列の値(男・女)を、CASE文で「男性会員数」「女性会員数」という2つの列に振り分けて集計する
  • 月ごとに縦に並んでいた売上データを、CASE文とSUMを組み合わせて月別の列に変換(横持ち)する
SELECT
  SUM(CASE WHEN gender = '男' THEN 1 ELSE 0 END) AS male_count,
  SUM(CASE WHEN gender = '女' THEN 1 ELSE 0 END) AS female_count
FROM members;

CASE文※14は「もし~ならA、そうでなければB」という条件分岐をSELECT文の中で行う構文です。上の例では、性別ごとに1・0の値を作り、それをSUMで合計することで、行方向(縦)に並んでいたデータを列方向(横)に組み替えています。この操作はピボット(縦横変換)と呼ばれ、Excelのピボットテーブルで行う集計をSQLだけで再現するイメージです。

POINT

副問合せ(サブクエリ)は「SQL文の中にもう1つSQL文を書く」テクニックです。「平均購入額より多く買っている顧客だけ抽出したい」のように、先に計算した結果を条件として使いたい場面で活躍します。

-- 平均購入額より多く買っている顧客だけを抽出する(副問合せの例)
SELECT customer_name
FROM orders
WHERE amount > (SELECT AVG(amount) FROM orders);

-- 一度でも注文したことがある顧客だけを抽出する(EXISTSの例)
SELECT c.customer_name
FROM customers AS c
WHERE EXISTS (
  SELECT 1 FROM orders AS o WHERE o.customer_id = c.customer_id
);

EXISTS※15は、副問合せの結果が1件でも存在すれば条件を満たすとみなす書き方です。「該当する行があるかどうか」だけを判定したいときに使い、副問合せ側の列の中身そのものは使わないのが特徴です(上の例のようにSELECT 1と書くことが多いです)。反対に、一度も注文したことがない顧客を探したいときはNOT EXISTSを使います。

さえちゃん
さえ

SQLはDS検定で必ず得点したい分野! JOINの種類、GROUP BYと集計関数の組み合わせ、CASE文の使い方は特に頻出だから、実際に手を動かして書いてみるのが一番の近道だよ。

まとめ

このページでは、分析の現場で実際に使うプログラミングとSQLの基本を見てきました。最後に振り返っておきましょう。

  1. 外部ライブラリ ― 引数と戻り値の仕様を確認しながら、既存の便利な機能を活用する
  2. Notebook環境 ― Jupyter NotebookやGoogle Colabなど、コード・結果・説明を1画面にまとめられる対話型環境を使う
  3. APIとデータ形式 ― JSON・XMLなど標準的な形式でデータをやり取りするプログラムを設計する
  4. SQLの基本構文 ― DML/DDLの理解、JOINの使い分け、GROUP BYと集計関数、CASE文、副問合せ・EXISTSを一通り扱えるようにする

次のレッスンでは、近年急速に普及しているAIサービスやコーディング支援ツールを、データエンジニアリングの現場でどう活用するかを扱います。

脚注 ─ 用語解説
  1. 対話型の開発環境(Notebook) … コードを1行ずつ実行し、その場で結果を確認しながら分析を進められる開発環境。Jupyter NotebookやRStudioが代表例。
  2. API … Application Programming Interfaceの略。異なるシステム・サービス同士が情報をやり取りするための窓口(決まった手順・形式)。
  3. SQL … Structured Query Languageの略。データベースに対してデータの検索・追加・更新・削除や、テーブル定義の作成・変更を行うための言語。
  4. DML(データ操作言語) … Data Manipulation Languageの略。SELECT・INSERT・UPDATE・DELETEなど、テーブルの中身のデータを操作するためのSQL文の総称。
  5. DDL(データ定義言語) … Data Definition Languageの略。CREATE TABLEなど、テーブルそのものの構造(定義)を作成・変更・削除するためのSQL文の総称。
  6. 外部ライブラリ … 他の人や組織があらかじめ作成し、誰でも呼び出して使えるように公開しているプログラムの部品集。自分でゼロからコードを書かずに済むのが利点。
  7. Jupyter Notebook … Pythonなどのコードと実行結果、説明文を1つのファイル(ノートブック)にまとめて記録・共有できる対話型の開発環境。
  8. RStudio … 統計解析言語Rのための代表的な対話型の開発環境。コードの実行、グラフの表示、パッケージ管理などを1つの画面で行える。
  9. Google Colab(Google Colaboratory) … Googleが提供する、Webブラウザだけで使えるクラウド上のJupyter Notebook環境。環境構築なしでPythonコードを実行できる。
  10. JSON … JavaScript Object Notationの略。「キー」と「値」の組み合わせでデータを表す軽量なテキスト形式で、API通信などでよく使われる。
  11. XML … Extensible Markup Languageの略。タグ(<タグ名>)でデータの構造を表すテキスト形式。JSONと並んでデータ交換によく使われる。
  12. GROUP BY … 指定した列の値が同じ行どうしをひとつのグループにまとめるSQL構文。SUMやAVGなどの集計関数と組み合わせて使う。
  13. JOIN … 複数のテーブルを、共通する列の値をキーにして1つの表として結合するSQL構文。
  14. CASE文 … 「条件Aを満たせば値X、そうでなければ値Y」という条件分岐をSQL文の中で行う構文。集計関数と組み合わせると縦横変換(ピボット)にも使える。
  15. EXISTS … 副問合せの結果が1件でも存在するかどうかを判定するSQL構文。「該当データの有無」だけを条件にしたいときに使う。