🙌

BigQueryを用いた主成分分析

2023/11/07に公開

はじめに

こんにちは、クラウドエース Data/ML ディビジョン所属の谷口です。
今回は、BigQuery を使った主成分分析のやり方を紹介したいと思います。

この記事では、Google の BigQuery を使用して主成分分析を行う方法を詳しく解説します。
BigQuery を使ったデータ分析に興味がある方、またはその方法を探している方向けに、
この記事を通じてその概念と実装方法を理解できるようになることを目指しています。

この記事の内容は以下の流れで進行します。
まずは、主成分分析の基本的な理念とその使用目的について説明します。
次に、検証に利用するデータの説明をします。
その後、Google の BigQuery を活用して分析モデルの作成を行います。
このモデルを使用してデータ分析を進め、最終的にはその分析結果の評価と解釈を行います。
主成分分析の全体像を把握し、実際に手を動かして学ぶことで、理論だけでなく実践的な理解も深めていきましょう。

主成分分析について

主成分分析は、分析手法の一つで、情報量を削減することでデータの解釈を容易にするものです。

例えば、クラスのテスト結果を考えてみましょう。国語、数学、理科、社会の 4 科目のテスト結果があります。
ここで主成分分析を適用すると、「全体的な学力」や「各科目のバランス」など、
少数の新しい指標(主成分)を用いて、元のテストの点数を表現することができます。
これにより、そのデータが持つ全体的な傾向や特徴を把握することが可能になります。

主成分とは元のデータの情報を最もよく表現する新しい指標のことを指します。
これは、データが持つ重要な特徴やパターンを見つけ出し、それをより簡単な形で表現するために用います。

主成分がどのように計算されるか以下に示します。
国語のテストスコアを x1、数学のテストスコアを x2、理科のテストスコアを x3、社会のテストスコアを x4 と表すと、
これら 4 つの科目を考慮した全体的なテストパフォーマンス(主成分スコア)は
z=a1*x1+a2*x2+a3*x3+a4*x4
という形で表すことができます。

この式における a1,a2,a3,a4 は、重み付けを示す係数で、
各科目のスコアをどのように調整して全体的なテストパフォーマンスを表現するかを示しています。

検証概要

検証の流れは、まず BigQuery を使用してモデルを作成します。
次にそのモデルを用いてデータ分析を行い、最後に分析結果の評価をします。

検証詳細

今回使うデータについて


mydataset というデータセットに、以下のような testscore テーブルを作成しました。
国語、数学、理科、社会の点数が 30 人分記載されています。
また今回は主成分分析の説明として分かりやすい結果をだすため、
文系教科ができて理系教科ができる生徒、理系教科ができて文系教科ができない生徒、
両方の教科が得意な生徒、両方の教科が苦手な生徒、それらのどれにも当てはまらない生徒をデータとして用意しています。

PCA モデルの作成

まずはじめに、分析に使うモデルを作成します。
以下のようなクエリを実行します。

CREATE OR REPLACE MODEL `[プロジェクト名].mydataset.testscore_pca_example`
OPTIONS(
  MODEL_TYPE='PCA'
 ,NUM_PRINCIPAL_COMPONENTS=2
--,PCA_EXPLAINED_VARIANCE_RATIO=0.99
 ,SCALE_FEATURES = FALSE
 ,PCA_SOLVER = 'FULL'  
)AS
  (
  SELECT
     japanese
    ,math
    ,science
    ,social
  FROM `[プロジェクト名].mydataset.testscore`
  );

CREATE OR REPLACE MODEL でモデルの作成を行なっています。
[プロジェクト名]は伏せているので、実際のプロジェクト名で置き換えてください。
この後に出てくるクエリでも同様とします。

主成分の数は、以下いずれかのパラメータにより決められます。

  1. NUM_PRINCIPAL_COMPONENTS (今回はこちらを採用)
    主成分の数を指定します。
  2. PCA_EXPLAINED_VARIANCE_RATIO
    主成分の寄与率合計の閾値を指定します。
    このパラメータで指定した閾値を超えるまで主成分を取ります。
    寄与率については後述します。

AS 以降では、SELECT で主成分に変換したいデータを指定します。
今回の場合、国語、数学、理科、社会のテストのスコアを指定します。

モデルの評価

クエリが実行できたら、データセット配下にモデルという項目が追加されます。
モデルをクリックして、自分が作った名前のモデルをクリックします。
評価をクリックすると、各主成分の分散比の合計を確認できます。

分散比は寄与率とも呼ばれ、元データ全体をどれだけ説明できているか示しており、1 に近いほど元データを表現できています。
今回だと 0.8272 となっているので、約 82 %のデータが第二主成分までで表現できていることになります。

寄与率について

ある主成分の寄与率(分散比)は、その主成分の分散を元のデータ全体の分散で割った値です。

「分散」とは、データが平均値からどれだけばらついているかを示す数値です。つまり、分散が大きいほどデータは平均値から大きく離れてばらついていることを示し、分散が小さいほどデータは平均値の近くに集まっていることを示します。

したがって主成分の寄与率はその主成分がどの程度元データのばらつき具合を表現できるか、つまりどの程度元データを表現できているかの指標になります。

SELECT *
  --[プロジェクト名] は伏せてるので、実際のプロジェクト名で置き換えてください。
FROM ML.PRINCIPAL_COMPONENT_INFO(MODEL `[プロジェクト名].mydataset.testscore_pca_example`)

このクエリを実行すると、各主成分の寄与率 (exprained_variance_ratio) を見ることができます。

今回だと第一主成分が 0.53... となり、第二主成分が 0.28... となっているので
第一主成分で元データの情報を約 53 %、第二主成分で約 28 %表現できていることになります。

モデルを用いて分析

今度は、このモデルを用いて主成分分析を行います。
そこで、以下のようなクエリを実行します。

SELECT 
  *
FROM ML.PREDICT(
    MODEL `[プロジェクト名].mydataset.testscore_pca_example`,
    (
        SELECT
            japanese
           ,math
           ,science
           ,social
        FROM `[プロジェクト名].mydataset.testscore` 
    ),  
    --元データのカラムを表示する (必要なければ削除してもよい)
    STRUCT(true as keep_original_columns)
)

実行するとクエリ結果が表示されます。
このクエリで作成したテーブルのカラムには、各主成分と元データの数値が含まれます。

分析結果の解釈

この結果を解釈するため、Looker Studio を用います。
主成分の値が近い組で、元データを見ることで傾向を把握します。

(1)第一主成分が大きい場合


第一主成分が正の値となっている場合、国語と社会の点数が高い傾向にあります。

(2)第一主成分が小さい場合


第一主成分が負の値となっている場合、数学と理科が高い傾向にあります。

(3)第二主成分が大きい場合


第二主成分が正の値となっている場合、全ての得点が高い傾向があります。

(4)第二主成分が小さい場合


第二主成分が負の値となっている場合、全ての得点が低い傾向があります。

(5)そのどれにもあてはまらない場合


国語の点数が高いが、社会の点数は低い人も含みましたが、少し原点に近い状態でした。

以上の考察により、
第一主成分は文系教科ができて理系教科ができない人が正の値をとり、
理系教科ができて文系教科ができない人が負の値をとる軸、という解釈ができます。
(文系と理系バランスよく取る人が 0 に近づくともいえる)
第二主成分は総合得点の高い人が正の値をとり、
総合得点の低い人が負の値をとる軸、という解釈ができます。
この散布図を使うことで、似た傾向の点数を取った生徒をグループ分けすることが出来ました。

まとめ

この記事を通じて、以下のポイントを説明しました。

  1. 主成分分析の基本概念と利用目的
  2. BigQuery を用いた分析モデルの作成方法
  3. モデルを用いたデータ分析と分析結果の解釈

これらの知識は、理論と実践の両方で主成分分析の理解を深めるのに役立ててもらえればと思います。
これからのデータ分析に活用していきましょう。

Discussion