第6回:Numpyによる統計処理
はじめに
本記事は「Pythonで数値計算を行うためのNumPy入門」シリーズの第6回です.
このシリーズでは, "NumPyのよく使われる機能を分野ごとに理解すること" を目標としています.
Pythonで数値計算を行う際に欠かせないライブラリ「NumPy」について,基礎から応用まで体系的に学べます.
シリーズ構成予定(全10記事)
- NumPyのインストール 〜 arrayの基本
- 配列の追加・挿入・コピー
- 配列の作成(
ones/zeros/arange/linspace/eye) - 配列の結合(
hstack/vstack/concatenate) - 条件抽出と検索(
where/clip/unique/isclose) - 統計処理(
mean/std/medianほか)(本記事) - 線形代数(
dot/inv/det/norm)(公開後にリンクを追加する予定) - 乱数生成(
rand/randint/normal)(公開後にリンクを追加する予定) - 三角関数と角度変換(
sin/arctan2ほか)(公開後にリンクを追加する予定) - ファイル入出力(
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