データ分析解説コラム「線形代数(分散共分散行列)」

こんにちは、小澤です。

今回も、『Pythonによるあたらしいデータ分析の教科書(第2版)』からトピックを取り上げて解説します。今回は、「数学の基礎」セクションから「3.2 線形代数」(61ページ〜68ページ)に焦点を当て、NumPyを使用して線形代数に関連する計算を行ってみましょう。データ値のばらつきと相関関係を表す分散共分散を求めてみます。

なお、今回の内容は、数学的なアプローチを中心に話題を展開していきますが、まずは、数学の厳密な手法に深くこだわる必要はありません。数学的な追求も重要で、興味がある方はさらに深堀りすることもできますが、ここでは、背景に数学的な要素があることを理解していただくことが目的です。

ちなみに、NumPyの使い方は、教科書の「4.1 NumPy」(92ページから134ページ)に詳しく説明されています。

目次

 線形代数と統計学

線形代数は、数学の分野の一つで、ベクトル、ベクトル空間、行列などの数学的な概念を扱う理論と手法です。機械学習やコンピュータグラフィックスなどで重要な役割を果たしていますが、最近では統計学においても線形代数の概念や技術が不可欠です。線形代数と統計学が関連する項目について、いくつか解説しましょう。数学的な話をしますが、その背景にある概念などをある程度理解していただくことが目的ですので、難しく考えずに進めていきましょう。

  1. データ表現
     統計学では、データを行列として表現することが一般的です。観測値(データポイント)は行として、異なる変数や属性は列として表現されます。このデータ行列を操作し、統計的分析を行うために線形代数の知識が必要となります。

  2. 固有値と固有ベクトル
     固有値と固有ベクトルは、行列(通常は正方行列)の特性や変換に関する情報を提供するものです。固有ベクトルは線形変換で向きが変わらない特別なベクトルであり、固有値はそのベクトルの大きさの変化率を表します。固有値と固有ベクトルはセットで、ある行列に対して複数のセットが存在することが一般的です。
     固有値は、一般的に、λ(ラムダ)で表され、実数または複素数の値を持つことがあります。行列Aが正方行列であり、λがAの固有値である場合、次の式が成り立ちます。

     ここで、vは固有ベクトル、A * vは、Aとvの行列積です。
     固有ベクトルは長さ(ノルム)が1であり、その方向に関する情報を提供します。つまり、固有ベクトルは行列Aがどのように変換を適用するかを示す「変換の軸」と考えることができます。固有ベクトルの方向は変換によって変わらず、固有値はそのスケールを示します。

  3. 分散共分散行列
     統計学では、多変量データの特徴を捉えるために分散共分散行列が使用されます。分散はデータの値のばらつきを表し、共分散はデータ同士の相関関係を表します。分散共分散行列は、主成分分析、線形回帰分析、多変量統計などの統計的データ解析手法で利用されます。
     分散共分散行列における固有値と固有ベクトルは、データの主要な変動方向とその大きさを示し、データの主成分を見つけるために使用されます。つまり、固有ベクトルはデータが最も広がっている方向を示し、固有値はその広がり(相関関係)の大きさを示します。
     参考までに、分散共分散行列Cは、次のように定義されます。

     ここで、Xはデータ行列で各行が異なるサンプル、各列が異なる変数、μは各変数の平均ベクトル、Eは期待値演算子でデータセット内のすべてのサンプルにわたる期待値、Tは行列の転置を表します。

  4. 主成分分析(教科書68ページ)
     主成分分析(Principal Component Analysis;PCA)は、多変量データを効果的に扱うための統計的分析手法です。第3章「数学の基礎」では68ページに、サンプルの次元を削減して可視化する方法として紹介されていますが、その実践的な方法は、教科書の249ページに記載されています。ここでは、そこに記載されている具体的な方法を説明するのではありませんので、雰囲気をつかんでいただければと思います。

主成分分析では、データの情報を保持しながらデータの次元を削減するために使用され、高い分散を持つ主成分を見つけ出します。高い分散を持つ主成分は、データ内で大きな情報を持っています。主成分は固有値と固有ベクトルを用いて計算され、分散共分散行列に基づいて決定されます。
 例えば、

  • 次元削減…多次元データセット内の特徴量(次元)を削減し、データをより扱いやすくすることができます。これによって、データの可視化や解釈が容易になります。
    • ノイズの削除… 高い分散を持つ主成分は、信号(有用な情報)を表し、低い分散を持つ主成分はノイズを表すことが多いため、データ内のノイズや冗長性を取り除くために使用できます。
    • 特徴抽出…データセットから有用な特徴を抽出するために利用できます。たとえば、主成分分析を使用して顔の特徴を抽出することができ、それを顔認識に利用することができます。

なお、PCAは以下のステップで実行されます。

  1. データの標準化:各特徴量を平均が0、標準偏差が1になるように標準化します。
  2. 共分散行列の計算:標準化されたデータから共分散行列を計算します。
  3. 固有値と固有ベクトルの計算:共分散行列の固有値と固有ベクトルを計算します。
  4. 主成分の選択:固有値が高い順に主成分を選択します。これにより、データの情報を最もよく捉える主成分が得られます。
  5. データの射影:選択した主成分にデータを射影し、新しい主成分を得ます。

 Pythonで分散共分散行列を取得する

それでは、Pythonで分散共分散行列を取得してみましょう。使用するのは、NumPyライブラリのcov関数です。

まず、NumPyをインポートします。

import numpy as np

相関のあるデータセットを用意します。ここでは、数学、英語、国語の試験結果を示すデータセットを考えてみましょう。以下のようなデータセットがあるとします。

数学英語国語
1006565
456095
706540
708080
759070

まず、数学と英語の分散共分散行列を取得しましょう。array関数を使って、2次元配列のデータとして定義します。

a = np.array([[100, 45, 70, 70, 75],
              [65,  60, 65, 80, 90]])

そして、cov関数を使って、分散共分散行列を取得します。

np.cov(a)

以下のような結果が得られます。

array([[382.5,  45. ],
       [ 45. , 157.5]])

得られた2次元配列は、1行1列に「数学の分散」、2行2列に「英語の分散」、1行2列(非対角)に「共分散」の値が入っています。つまり、

  • 1行1列:数学の分散…382.5
  • 2行2列:英語の分散…157.5
  • 1行2列:数学と英語の共分散…45.0

さらに、ここに国語の得点を追加してみます。国語の得点だけの配列を定義し、cov関数の第2引数に渡します。

b = np.array([65, 95, 40, 80, 70])
np.cov(a, b)

以下のような結果が得られます。

array([[ 382.5 ,   45.  , -193.75],
       [  45.  ,  157.5 ,    6.25],
       [-193.75,    6.25,  412.5 ]])

得られた2次元配列は、

  • 1行1列:数学の分散…382.5
  • 2行2列:英語の分散…157.5
  • 3行3列:国語の分散…412.5
  • 1行2列:数学と英語の共分散…45.0
  • 1行3列:数学と国語の共分散…-193.75
  • 2行3列:英語と国語の共分散…6.25

数学と国語の共分散がマイナスとなっていることで、負の相関を示しています。これは、一方が増加すると他方が減少する傾向にあることを表し、数学の得点が上がると国語が下がるという状況を表しています。(あくまでサンプルデータでの相関です)

さて、cov関数はデフォルトで不偏分散を取得します。不偏分散は、偏差の積和をn−1で割ったものです。標本の属する母集団全体について推定値を表すものと考えてください。

標本に対する分散(標本分散)を取得するには、cov関数に「bias=True」を渡します。

np.cov(a, b, bias=True)

この結果は以下のようになります。不偏分散とは若干の違いがあります。

array([[ 306.,   36., -155.],
       [  36.,  126.,    5.],
       [-155.,    5.,  330.]])

まとめ

今回は、NumPyライブラリのcov関数を使用して、分散共分散行列を取得しました。分散共分散行列は、多変量データの特徴を捉えるために使用でき、例えば、身長と体重、気温とアイスクリームの売上、勉強時間と試験の成績、打率とエラーなど、さまざまな相関関係を見ることができます。

次回もNumPyライブラリを使用して、今回少し紹介した主成分分析を行なってみましょう。ぜひ引き続きご覧ください。

お知らせ

今回のコラムはいかがでしたでしょうか? 少しでも皆様の学習のお役に立てると嬉しいです。
インターネットアカデミーでは Python 講座が充実しています。
Python 認定スクールにもなっているため、質の良い知識を得ることができます。
基礎を習得した先に新たな目標を設定し、目指していくために大変良い場所となります。

「プログラミングは独学でもなんとかなる」という情報もありますが、新しいことを学んでいく際の近道は「プロに教えてもらうこと」かと思います。
インターネットアカデミーはキャリアサポートも充実しており、一人ひとりに専任のキャリアプロデューサーがサポートしてくれるため中途半端になることがありません。
ご興味ある方は各講座のページを覗いてみてください。無料カウンセリングもできます。

https://www.internetacademy.jp/course/programming/chair_py.html

良い記事だなって思ったら、是非シェアをお願いします!
  • URLをコピーしました!
  • URLをコピーしました!
目次