線形代数学 I - 第7回講義ノート
1. 講義情報と予習ガイド
講義回: 第7回
テーマ: 1次元データとベクトルの和と積
関連項目: データの平均、偏差、分散、ベクトルを用いたデータ表現
予習内容:
- ベクトルの基本演算(内積、ノルム)
- 統計学における基本的な概念(平均、分散)
2. 学習目標
本講義の終了時には、以下のことができるようになります:
- 1次元データをベクトルとして表現できる
- ベクトルの演算を用いてデータの平均値を計算できる
- ベクトルの演算を用いてデータの偏差を計算できる
- ベクトルの演算を用いてデータの分散を計算できる
- Google Colabを用いてこれらの計算を実装できる
3. 基本概念
3.1 データとベクトル表現
現実世界のデータ分析では、多数の観測値を処理する必要があります。例えば、学生の試験の点数や、患者の血圧測定値などです。このようなデータを効率的に扱うために、ベクトルとして表現します。
定義:データベクトル
\(n\)個の観測値 \(x_1, x_2, \ldots, x_n\) を持つ1次元データセットは、\(n\)次元ベクトル \(\mathbf{x} = \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{pmatrix}\) として表現できます。
例えば、5人の学生の体温データ[36.5, 36.8, 37.2, 36.4, 36.9]℃は、以下のベクトルとして表現できます:
3.2 ベクトル \(\mathbf{1}\) の定義
データの平均や分散を計算する際に重要となる特別なベクトルとして、すべての要素が1であるベクトル \(\mathbf{1}\) を定義します。
定義:全ての要素が1のベクトル
\(n\)次元の「1ベクトル」\(\mathbf{1}_n\)は以下のように定義されます:\[\mathbf{1}_n = \begin{pmatrix} 1 \\ 1 \\ \vdots \\ 1 \end{pmatrix}\]
例えば、3次元の場合は \(\mathbf{1}_3 = \begin{pmatrix} 1 \\ 1 \\ 1 \end{pmatrix}\) となります。
このベクトルは、データの平均や分散を計算する際に重要な役割を果たします。
4. 理論と手法
4.1 データの平均
データの平均値は、すべての観測値の和をデータ数で割った値です。
定義:データの平均値
データベクトル \(\mathbf{x} = \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{pmatrix}\) の平均値 \(\bar{x}\) は以下のように定義されます:\[\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i\]
これをベクトルの表記で表現すると、以下のようになります:
ここで、\(\mathbf{1}_n^T\) は全ての要素が1のベクトルの転置であり、\(\mathbf{1}_n^T \mathbf{x}\) はベクトル \(\mathbf{1}_n\) と \(\mathbf{x}\) の内積を表します。
例題4.1.1:
5人の学生の体温データ \(\mathbf{x} = \begin{pmatrix} 36.5 \\ 36.8 \\ 37.2 \\ 36.4 \\ 36.9 \end{pmatrix}\) の平均値を計算してみましょう。
解答: \(\(\bar{x} = \frac{1}{5} \mathbf{1}_5^T \mathbf{x} = \frac{1}{5} \begin{pmatrix} 1 & 1 & 1 & 1 & 1 \end{pmatrix} \begin{pmatrix} 36.5 \\ 36.8 \\ 37.2 \\ 36.4 \\ 36.9 \end{pmatrix} = \frac{1}{5}(36.5 + 36.8 + 37.2 + 36.4 + 36.9) = \frac{183.8}{5} = 36.76\)\)
したがって、この5人の学生の平均体温は36.76℃です。
4.2 データの偏差
データの偏差は、各データ点と平均値との差を表します。
定義:データの偏差
データ \(x_i\) の偏差 \(d_i\) は以下のように定義されます:\[d_i = x_i - \bar{x}\]ベクトル表記では、データベクトル \(\mathbf{x}\) の偏差ベクトル \(\mathbf{d}\) は以下のようになります:
\[\mathbf{d} = \mathbf{x} - \bar{x}\mathbf{1}_n\]
ここで注意すべき点は、偏差の和は常に0になるということです:
ベクトル表記では:
例題4.2.1:
5人の学生の体温データ \(\mathbf{x} = \begin{pmatrix} 36.5 \\ 36.8 \\ 37.2 \\ 36.4 \\ 36.9 \end{pmatrix}\) の偏差ベクトルを計算してみましょう。
解答:
先ほど計算した平均値 \(\bar{x} = 36.76\) を用いて:
偏差の和を確認すると:
(少数計算の誤差を無視すると)偏差の和は0になることが確認できます。
4.3 データの分散
分散は、データの散らばり具合を表す指標です。
定義:データの分散
データベクトル \(\mathbf{x}\) の分散 \(\sigma^2\) は、偏差の二乗和をデータ数で割った値です:\[\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} d_i^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^2\]ベクトル表記では:
\[\sigma^2 = \frac{1}{n} \mathbf{d}^T \mathbf{d} = \frac{1}{n} (\mathbf{x} - \bar{x}\mathbf{1}_n)^T (\mathbf{x} - \bar{x}\mathbf{1}_n)\]
例題4.3.1:
5人の学生の体温データの分散を計算してみましょう。
解答:
先ほど計算した偏差ベクトル \(\mathbf{d} = \begin{pmatrix} -0.26 \\ 0.04 \\ 0.44 \\ -0.36 \\ 0.14 \end{pmatrix}\) を用いて:
したがって、この5人の学生の体温データの分散は0.0824(℃²)です。
4.4 データの標準偏差
標準偏差は、分散の平方根であり、データのばらつきを元のデータと同じ単位で表します。
定義:データの標準偏差
データの標準偏差 \(\sigma\) は、分散の平方根として定義されます:\[\sigma = \sqrt{\sigma^2} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^2}\]ベクトル表記では:
\[\sigma = \sqrt{\frac{1}{n} \mathbf{d}^T \mathbf{d}}\]
例題4.4.1:
5人の学生の体温データの標準偏差を計算してみましょう。
解答:
先ほど計算した分散 \(\sigma^2 = 0.0824\) を用いて:
したがって、この5人の学生の体温データの標準偏差は約0.287℃です。
4.5 分散の別公式
分散を計算するための別の公式として、以下のものがあります:
定理:分散の計算公式
データの分散は以下の式でも計算できます:\[\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} x_i^2 - \bar{x}^2 = \frac{1}{n} \mathbf{x}^T \mathbf{x} - \bar{x}^2\]
証明:
例題4.5.1:
5人の学生の体温データの分散を別公式を用いて計算してみましょう。
解答:
\(\mathbf{x} = \begin{pmatrix} 36.5 \\ 36.8 \\ 37.2 \\ 36.4 \\ 36.9 \end{pmatrix}\)、\(\bar{x} = 36.76\) を用いて:
(少数計算の誤差を考慮すると)先ほどの計算結果とほぼ一致しています。
5. Pythonによる実装と可視化
ここでは、Google Colaboratory環境でベクトルを用いたデータ分析を実装します。
import numpy as np
import matplotlib.pyplot as plt
# 学生の体温データ
temperature_data = np.array([36.5, 36.8, 37.2, 36.4, 36.9])
# データをベクトルとして表示
print("データベクトル:")
print(temperature_data.reshape(-1, 1)) # column vectorとして表示
# 平均の計算
n = len(temperature_data)
one_vector = np.ones(n)
mean = (1/n) * np.dot(one_vector, temperature_data)
print(f"\n平均値(ベクトル計算): {mean:.4f}℃")
print(f"平均値(numpy関数): {np.mean(temperature_data):.4f}℃")
# 偏差ベクトルの計算
deviation = temperature_data - mean
print("\n偏差ベクトル:")
print(deviation.reshape(-1, 1))
# 偏差の和を確認
print(f"\n偏差の和: {np.sum(deviation):.10f}") # 0に非常に近い値(浮動小数点誤差)
# 分散の計算(偏差を使用)
variance1 = (1/n) * np.dot(deviation, deviation)
print(f"\n分散(偏差から計算): {variance1:.4f}(℃²)")
# 分散の計算(別公式)
variance2 = (1/n) * np.dot(temperature_data, temperature_data) - mean**2
print(f"分散(別公式): {variance2:.4f}(℃²)")
print(f"分散(numpy関数): {np.var(temperature_data, ddof=0):.4f}(℃²)")
# 標準偏差の計算
std_dev = np.sqrt(variance1)
print(f"\n標準偏差: {std_dev:.4f}℃")
print(f"標準偏差(numpy関数): {np.std(temperature_data, ddof=0):.4f}℃")
# 体温データと平均値、標準偏差の可視化
plt.figure(figsize=(10, 6))
plt.bar(range(1, n+1), temperature_data, color='skyblue', alpha=0.7)
plt.axhline(y=mean, color='red', linestyle='-', label=f'平均: {mean:.2f}℃')
plt.axhline(y=mean+std_dev, color='green', linestyle='--', label=f'平均+標準偏差: {mean+std_dev:.2f}℃')
plt.axhline(y=mean-std_dev, color='green', linestyle='--', label=f'平均-標準偏差: {mean-std_dev:.2f}℃')
plt.xlabel('学生')
plt.ylabel('体温 (℃)')
plt.title('5人の学生の体温データ')
plt.grid(True, alpha=0.3)
plt.legend()
plt.tight_layout()
plt.show()
# 偏差の可視化
plt.figure(figsize=(10, 6))
plt.bar(range(1, n+1), deviation, color='lightgreen', alpha=0.7)
plt.axhline(y=0, color='black', linestyle='-')
plt.xlabel('学生')
plt.ylabel('偏差 (℃)')
plt.title('体温データの偏差')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
5.1 実行結果の例
上記のコードを実行すると、以下のような出力が得られます:
データベクトル:
[[36.5]
[36.8]
[37.2]
[36.4]
[36.9]]
平均値(ベクトル計算): 36.7600℃
平均値(numpy関数): 36.7600℃
偏差ベクトル:
[[-0.26]
[ 0.04]
[ 0.44]
[-0.36]
[ 0.14]]
偏差の和: 0.0000000000
分散(偏差から計算): 0.0824(℃²)
分散(別公式): 0.0824(℃²)
分散(numpy関数): 0.0824(℃²)
標準偏差: 0.2870℃
標準偏差(numpy関数): 0.2870℃
また、以下のような可視化グラフが生成されます: 1. 体温データのグラフ(平均と標準偏差の範囲を示す) 2. 偏差のグラフ(0を中心としたばらつきを示す)
6. 演習問題
6.1 基本問題
問題1
以下の7人の患者の収縮期血圧データ(単位:mmHg)をベクトルとして考え、平均、偏差、分散、標準偏差を計算せよ。
\(\mathbf{x} = \begin{pmatrix} 120 \\ 135 \\ 115 \\ 122 \\ 128 \\ 130 \\ 118 \end{pmatrix}\)
問題2
ベクトル \(\mathbf{a} = \begin{pmatrix} 2 \\ 4 \\ 6 \\ 8 \end{pmatrix}\) と \(\mathbf{b} = \begin{pmatrix} 1 \\ 1 \\ 1 \\ 1 \end{pmatrix}\) について、以下を計算せよ。
a) \(\mathbf{a}\) の平均
b) \(\mathbf{a}\) の偏差ベクトル
c) \(\mathbf{a}\) の分散
問題3
分散の公式 \(\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} x_i^2 - \bar{x}^2\) を用いて、データ \(\{3, 5, 7, 9, 11\}\) の分散を計算せよ。
6.2 応用問題
問題4
あるクラスの10人の学生の身長データ(単位:cm)が以下のように与えられている。
\(\mathbf{h} = \begin{pmatrix} 168 \\ 172 \\ 165 \\ 170 \\ 175 \\ 167 \\ 169 \\ 173 \\ 168 \\ 171 \end{pmatrix}\)
a) 平均身長を計算せよ。 b) 偏差ベクトルを求めよ。 c) 分散と標準偏差を計算せよ。 d) 各学生の身長を標準化(\(z\)スコア化)せよ。標準化された値 \(z_i\) は以下の式で定義される: \(z_i = \frac{x_i - \bar{x}}{\sigma}\) e) 標準化されたデータの平均と分散を計算し、それぞれ0と1になることを確認せよ。
問題5(Health Data Science関連)
ある健康調査で、10人の参加者の安静時心拍数(bpm)と1日の歩数(千歩単位)が以下のように測定された:
心拍数: \(\mathbf{hr} = \begin{pmatrix} 68 \\ 72 \\ 65 \\ 70 \\ 75 \\ 62 \\ 69 \\ 73 \\ 67 \\ 71 \end{pmatrix}\)
歩数: \(\mathbf{steps} = \begin{pmatrix} 8.2 \\ 6.5 \\ 7.8 \\ 9.3 \\ 5.9 \\ 10.2 \\ 7.5 \\ 6.8 \\ 8.9 \\ 7.2 \end{pmatrix}\)
a) 両方のデータセットについて、平均、分散、標準偏差を計算せよ。 b) 歩数データを平均0、分散1になるように標準化せよ。 c) Python(NumPy)を用いて、心拍数と歩数の間の共分散を計算せよ。共分散の公式は以下のとおり: \(\text{cov}(\mathbf{hr}, \mathbf{steps}) = \frac{1}{n} \sum_{i=1}^{n} (hr_i - \overline{hr})(steps_i - \overline{steps})\) d) 心拍数と歩数の間に何か関係性が見られるか考察せよ。
7. よくある質問と解答
Q1: データの平均と分散は何を表していますか?
A1: データの平均は、データセットの「中心的な値」や「代表値」を表します。一方、分散はデータの散らばり具合を表す指標で、値が大きいほどデータが平均から離れて広がっていることを意味します。標準偏差は分散の平方根で、元のデータと同じ単位で散らばりを表します。
Q2: なぜデータの偏差の和は常に0になるのですか?
A2: これは平均の定義から導かれる性質です。平均は \(\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i\) と定義されます。したがって、\(n\bar{x} = \sum_{i=1}^{n} x_i\) です。偏差の和を計算すると:
\(\sum_{i=1}^{n} (x_i - \bar{x}) = \sum_{i=1}^{n} x_i - \sum_{i=1}^{n} \bar{x} = \sum_{i=1}^{n} x_i - n\bar{x} = \sum_{i=1}^{n} x_i - \sum_{i=1}^{n} x_i = 0\)
Q3: データサイエンスにおいて、なぜベクトルとして1次元データを扱うことが重要なのですか?
A3: ベクトルとしてデータを扱うことで、線形代数の強力なツールを活用できます。これにより、複雑なデータ分析手法(主成分分析、線形回帰など)を統一的な枠組みで理解・実装できます。また、大量のデータを効率的に処理することも可能になります。
Q4: 偏差と標準偏差の違いは何ですか?
A4: 偏差は各データ点と平均値の差を表し、正負の値を取ります。標準偏差は偏差の二乗の平均の平方根で、データセット全体のばらつきを表す正の値です。偏差は各データ点に対する値ですが、標準偏差はデータセット全体に対する単一の値です。
Q5: 分散の計算に別公式 \(\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} x_i^2 - \bar{x}^2\) を使うメリットは何ですか?
A5: この公式は、特に大規模なデータセットに対して計算効率が良い場合があります。データの合計と二乗の合計だけを保持すれば分散を計算できるため、メモリ使用量が少なくて済みます。また、オンラインアルゴリズム(データを一度に全部読み込まずに逐次処理する方法)にも適しています。
8. まとめ
本講義では、1次元データをベクトルとして表現し、ベクトルの演算を用いてデータの平均、偏差、分散を計算する方法を学びました。主なポイントは以下の通りです:
- 1次元データは \(n\) 次元ベクトルとして表現できる
- 平均値は \(\bar{x} = \frac{1}{n} \mathbf{1}_n^T \mathbf{x}\) で計算できる
- 偏差ベクトルは \(\mathbf{d} = \mathbf{x} - \bar{x}\mathbf{1}_n\) で計算でき、その和は常に0になる
- 分散は \(\sigma^2 = \frac{1}{n} \mathbf{d}^T \mathbf{d}\) または \(\sigma^2 = \frac{1}{n} \mathbf{x}^T \mathbf{x} - \bar{x}^2\) で計算できる
- 標準偏差は分散の平方根 \(\sigma = \sqrt{\sigma^2}\) である
これらの概念は、より複雑なデータ分析手法(多変量データ分析、線形回帰モデル、主成分分析など)の基礎となります。次回の講義では、これらの概念を2次元データに拡張し、行列を用いたデータ表現を学びます。