第6回:Numpyによる統計処理

に公開

はじめに

本記事は「Pythonで数値計算を行うためのNumPy入門」シリーズの第6回です.
このシリーズでは, "NumPyのよく使われる機能を分野ごとに理解すること" を目標としています.

Pythonで数値計算を行う際に欠かせないライブラリ「NumPy」について,基礎から応用まで体系的に学べます.

シリーズ構成予定(全10記事)

  1. NumPyのインストール 〜 arrayの基本
  2. 配列の追加・挿入・コピー
  3. 配列の作成(ones / zeros / arange / linspace / eye
  4. 配列の結合(hstack / vstack / concatenate
  5. 条件抽出と検索(where / clip / unique / isclose
  6. 統計処理(mean / std / median ほか)(本記事)
  7. 線形代数(dot / inv / det / norm)(公開後にリンクを追加する予定)
  8. 乱数生成(rand / randint / normal)(公開後にリンクを追加する予定)
  9. 三角関数と角度変換(sin / arctan2 ほか)(公開後にリンクを追加する予定)
  10. ファイル入出力(savetxt / loadtxt)(公開後にリンクを追加する予定)

私のNumpyライブラリのバージョンは "1.26.4" です.

本記事のゴール

本記事では, Numpyによる統計処理 を学んでいきます.Numpyによる統計処理に関する方法を説明します.

今回扱う関数は以下の5つです.

関数 内容
np.mean() 配列内のデータの平均値を計算
np.sum() 配列内のデータの合計値を計算
np.var() 配列内のデータの分散を計算
np.std() 配列内のデータの標準偏差を計算
np.median() 配列内のデータの中央値を計算

上記の関数を理解することで,Numpyによる統計処理 を実行することができるようになります.

NumPyライブラリの読み込み

NumPyを使うためには,まずライブラリの読み込みから始めます.

import numpy as np

numpyライブラリを "np" という名前として,扱えるようにライブラリを読み込んでいます.
以降では "np" という名前を使っていきます.

np.mean() (配列内のデータの平均値を計算)

配列内のデータの平均値を計算する np.mean() 関数に関して説明します.

# 適当なベクトルを作成
vec1 = np.array([1, 2, 3, 4, 5, 6])

# 適当な行列を作成
mat1 = np.array([[1, 9, 2],
                 [8, 3, 7],
                 [4, 6, 5]])


# np.mean() で平均値の計算 (ベクトルに対して実施)
vec1_mean = np.mean(vec1)
print(f"vec1_meane = {vec1_mean}")
# 出力:vec1_mean = 3.5


# np.mean() で平均値の計算 (行列に対して実施)
mat1_mean = np.mean(mat1)
print(f"mat1_mean = {mat1_mean}")
# 出力:mat1_mean = 5.0


# np.mean() で平均値の計算 (行列に対して実施)
# 各列の平均値を計算
mat1_mean_row = np.mean(mat1, axis=0)
print(f"mat1_mean_row = {mat1_mean_row}")
# 出力:mat1_mean_row = [4.33333333 6. 4.66666667]

# 各行の平均値を計算
mat1_mean_col = np.mean(mat1, axis=1)
print(f"mat1_mean_col = {mat1_mean_col}")
# 出力:mat1_mean_col = [4. 6. 5.]

np.mean() の引数に関して,下表にまとめました.

| 引数番号 | 引数名 | 内容 | 備考 |
| 1 | a | 配列データ | ベクトルでも行列でも可能 |
| 2 | axis | 平均値を計算する軸を指定 | 0は各列の平均.1は各行の平均 |

np.mean() は配列内のデータの平均値を計算することができます.
また,行列に関しては配列内の全データの平均値を計算するか,各行や各列の平均値を計算することができます(引数 axis を設定することで可能).

np.sum() (配列内のデータの合計値を計算)

配列内のデータの合計値を計算する np.sum() 関数に関して説明します.

# 適当なベクトルを作成
vec1 = np.array([1, 2, 3, 4, 5, 6])

# 適当な行列を作成
mat1 = np.array([[1, 9, 2],
                 [8, 3, 7],
                 [4, 6, 5]])


# np.sum() で合計値を計算 (ベクトルに対して実施)
vec1_sum = np.sum(vec1)
print(f"vec1_sum = {vec1_sum}")
# 出力:vec1_sum = 21


# np.sum() で合計値を計算 (行列に対して実施)
mat1_sum = np.sum(mat1)
print(f"mat1_sum = {mat1_sum}")
# 出力:mat1_sum = 45


# np.sum() で合計値の計算 (行列に対して実施)
# 各行の合計値を計算
mat1_sum_row = np.sum(mat1, axis=0)
print(f"mat1_sum_row = {mat1_sum_row}")
# 出力:mat1_sum_row = [13 18 14]

# 各列の合計値を計算
mat1_sum_col = np.sum(mat1, axis=1)
print(f"mat1_sum_col = {mat1_sum_col}")
# 出力:mat1_sum_col = [12 18 15]

np.sum() の引数に関して,下表にまとめました.

| 引数番号 | 引数名 | 内容 | 備考 |
| 1 | a | 配列データ | ベクトルでも行列でも可能 |
| 2 | axis | 合計値を計算する軸を指定 | 0は各列の合計.1は各行の合計 |

np.sum() は配列内のデータの合計値を計算することができます.
また,行列に関しては配列内の全データの合計値を計算するか,各行や各列の合計値を計算することができます(引数 axis を設定することで可能).

np.var() (配列内のデータの分散を計算)

配列内のデータの分散を計算する np.var() 関数に関して説明する.

# 適当なベクトルを作成
vec1 = np.array([1, 2, 3, 4, 5, 6])

# 適当な行列を作成
mat1 = np.array([[1, 9, 2],
                 [8, 3, 7],
                 [4, 6, 5]])


# np.var() で分散を計算 (ベクトルに対して実施)
# 母分散を計算
vec1_var = np.var(vec1)
print(f"vec1_var = {vec1_var}")
# 出力:vec1_var = 2.9166666666666665

# 標本分散を計算
vec1_var_sample = np.var(vec1, ddof=1)
print(f"vec1_var_sample = {vec1_var_sample}")
# 出力:vec1_var_sample = 3.5


# np.var() で分散を計算 (行列に対して実施)
# 母分散を計算
mat1_var = np.var(mat1)
print(f"mat1_var = {mat1_var}")
# 出力:mat1_var = 6.666666666666667

# 標本分散を計算
mat1_var_sample = np.var(mat1, ddof=1)
print(f"mat1_var_sample = {mat1_var_sample}")
# 出力:mat1_var_sample = 7.5

# np.var() で分散を計算 (行列に対して実施)
# 各行の(母)分散を計算
mat1_var_row = np.var(mat1, axis=0)
print(f"mat1_var_row = {mat1_var_row}")
# 出力:mat1_var_row = [8.22222222 6. 4.22222222]

# 各列の(標本)分散を計算
mat1_var_col_sample = np.var(mat1, axis=1, ddof=1)
print(f"mat1_var_col_sample = {mat1_var_col_sample}")
# 出力:mat1_var_col_sample = [19. 7. 1.]

np.var() の引数に関して,下表にまとめました.

| 引数番号 | 引数名 | 内容 | 備考 |
| 1 | a | 配列データ | ベクトルでも行列でも可能 |
| 2 | axis | 分散を計算する軸を指定 | 0は行指定.1は列指定 |
| 3 | ddof | 分散算出時の自由度 | 0は母分散.1は標本分散.デフォルト値は0 |

np.var() は配列内のデータの分散を計算することができます.
また,行列に関しては配列内の全データの分散を計算するか,各行や各列の分散を計算することができます(引数 axis を設定することで可能).
また,分散の種類を設定することができます(引数 ddof を指定することで可能).

np.std() (配列内のデータの標準偏差を計算)

配列内のデータの標準偏差を計算する np.std() 関数に関して説明します.

# 適当なベクトルを作成
vec1 = np.array([1, 2, 3, 4, 5, 6])

# 適当な行列を作成
mat1 = np.array([[1, 9, 2],
                 [8, 3, 7],
                 [4, 6, 5]])


# np.std() で標準偏差を計算 (ベクトルに対して実施)
# 母標準偏差を計算
vec1_std = np.std(vec1)
print(f"vec1_std = {vec1_std}")
# 出力:vec1_std = 1.707825127659933

# 標本標準偏差を計算
vec1_std_sample = np.std(vec1, ddof=1)
print(f"vec1_std_sample = {vec1_std_sample}")
# 出力:vec1_std_sample = 1.8708286933869707


# np.std() で標準偏差を計算 (行列に対して実施)
# 母標準偏差を計算
mat1_std = np.std(mat1)
print(f"mat1_std = {mat1_std}")
# 出力:mat1_std = 2.581988897471611

# 標本標準偏差を計算
mat1_std_sample = np.std(mat1, ddof=1)
print(f"mat1_std_sample = {mat1_std_sample}")
# 出力:mat1_std_sample = 2.7386127875258306

# np.std() で標準偏差を計算 (行列に対して実施)
# 各行の(母)標準偏差を計算
mat1_std_row = np.std(mat1, axis=0)
print(f"mat1_std_row = {mat1_std_row}")
# 出力:mat1_std_row = [2.86744176 2.44948974 2.05480467]

# 各列の(標本)標準偏差を計算
mat1_std_col_sample = np.std(mat1, axis=1, ddof=1)
print(f"mat1_std_col_sample = {mat1_std_col_sample}")
# 出力:mat1_std_col_sample = [4.35889894 2.64575131 1.]

np.std() の引数に関して,下表にまとめました.

| 引数番号 | 引数名 | 内容 | 備考 |
| 1 | a | 配列データ | ベクトルでも行列でも可能 |
| 2 | axis | 標準偏差を計算する軸を指定 | 0は行指定.1は列指定 |
| 3 | ddof | 標準偏差算出時の自由度 | 0は母標準偏差.1は標本標準偏差.デフォルト値は0 |

np.std() は配列内のデータの標準偏差を計算することができます.
また,行列に関しては配列内の全データの合計値を計算するか,各行や各列の合計値を計算することができます(引数 axis を設定することで可能).
また,標準偏差の種類を設定することができます(引数 ddof を指定することで可能).

np.median() (配列内のデータの中央値を計算)

配列内のデータの中央値を計算する np.median() 関数に関して説明する.

# 適当なベクトルを作成
vec1 = np.array([1, 2, 3, 4, 5, 6])

# 適当な行列を作成
mat1 = np.array([[1, 9, 2],
                 [8, 3, 7],
                 [4, 6, 5]])


# np.median() で中央値を計算 (ベクトルに対して実施)
vec1_median = np.median(vec1)
print(f"vec1_median = {vec1_median}")
# 出力:vec1_median = 3.5


# np.median() で中央値を計算 (行列に対して実施)
mat1_median = np.median(mat1)
print(f"mat1_median = {mat1_median}")
# 出力:mat1_median = 5.0

# np.median() で分散を計算 (行列に対して実施)
# 各行の中央値を計算
mat1_median_row = np.median(mat1, axis=0)
print(f"mat1_median_row = {mat1_median_row}")
# 出力:mat1_median_row = [4. 6. 5.]

# 各列の中央値を計算
mat1_median_col = np.var(mat1, axis=1)
print(f"mat1_median_col = {mat1_median_col}")
# 出力:mat1_median_col = [12.66666667 4.66666667 0.66666667]

np.median() の引数に関して,下表にまとめました.

| 引数番号 | 引数名 | 内容 | 備考 |
| 1 | a | 配列データ | ベクトルでも行列でも可能 |
| 2 | axis | 中央値を計算する軸を指定 | 0は各列の中央値.1は各行の中央値 |

np.median() は配列内のデータの中央値を計算することができます.
また,行列に関しては配列内の全データの中央値を計算するか,各行や各列の中央値を計算することができます(引数 axis を設定することで可能).

まとめ

NumPyライブラリの mean / mean / var / std / median を比較します.

操作 関数 備考
配列内のデータの平均値を計算 np.mean() -
配列内のデータの合計値を計算 np.sum() -
配列内のデータの分散を計算 np.var() 母分散か標本分散かを選択する
配列内のデータの標準偏差を計算 np.std() 母分散か標本分散かを選択する
配列内のデータの中央値を計算 np.median() -

統計処理を理解することで,データの特徴 を知ることができるようになります.
また,統計を勉強することで,他技術の基礎を理解することができるようになります.

次回予告

第7回:「線形代数入門( dot / inv / det / norm ほか)」

  • np.dot() (内積の計算)
  • np.inv() (逆行列の計算)
  • np.det() (行列式の計算)
  • np.norm() (配列の大きさ(ノルム)の計算)

「線形代数」を説明します.

参考文献

本記事を作成するに当たって参考にしたサイトをまとめました.

Discussion