Pythonで統計学1 データの数値的尺度 〜中心の尺度〜

Python

このシリーズでは、統計学を学びつつ、それをプログラミング言語「Python」を使って実装する方法を説明していきます。なお、統計学については考え方を説明し、計算自体はPythonで行っていきます。

まずは数回に分けて、データの分布を表す様々な数値的尺度と、それらからどのようにデータの特徴を見出すかについて説明します。また、データの特徴を理解しやすくするために、Pythonを使ってグラフで可視化する方法についても説明します。

そして今回は、様々な数値的尺度の中から、データの中心を表す尺度について説明します。

流れとしては、初めてなのでまずPythonで統計学を扱うために使用するPythonライブラリの中で基本的なものを3点ほど紹介します。次に統計学の観点からデータの中心を表す数値的尺度の考え方を説明し、Pythonのコードで実装します。

使用するPythonライブラリ

今回は数値計算ライブラリであるNumPy、科学技術計算ライブラリであるSciPy、グラフ描画ライブラリであるmatplotlibを使用します。それぞれのライブラリを利用するには、事前にインストールしておく必要がありますが、本記事では既にインストールされているものとして説明を進めます。

NumPy: 数値計算ライブラリ

NumPyは、数値計算を行うためのライブラリです。多次元配列をサポートしており、効率的に計算を行うことができるため、機械学習やAIの開発で頻繁に使われます。以下は、NumPyを使って多次元配列オブジェクトであるndarrayを取得するコードです。

import numpy as np

# ndarrayオブジェクトを取得する
a = np.array([[0, 1, 2, 3], [4, 5, 6, 7]])

# インスタンスのクラス名を確認する
print(a.__class__)

# 配列の形状を確認する
print(a.shape)

# 配列の次元数を確認する
print(a.ndim)

上記のファイルを作成し、実行すると下記のように表示されます。

<class 'numpy.ndarray'>
(2, 4)
2

クラス名が「numpy.ndarray」、形状が2 × 2の行列、次元数が2であることがわかります。

SciPy: 科学技術計算ライブラリ

SciPyは、NumPyと同様に多次元配列を扱うことができる科学技術計算ライブラリです。統計学に関する様々な機能を備えています。以下は、SciPyを使って平均50、標準偏差20の正規分布データ配列を取得するコードです。※今回は正規分布については詳しく触れません。

from scipy.stats import norm
import numpy as np

# NumPyで等差数列を取得する
x = np.arange(0, 100, 0.01)

# データ配列と平均、標準偏差を渡して確率分布を取得する
y = norm.pdf(x, 50, 20)
print(y)

scipyは様々な分野の科学技術計算モジュールを持っていますが、scipy.statsが統計学関連のモジュールであり、normが正規分布を扱う関数群です。上記のコードを実行すると、下記の結果が表示されます。

[0.00087642 0.00087751 0.00087861 ... 0.00087971 0.00087861 0.00087751]

matplotlib: グラフ描画ライブラリ

matplotlibは、簡単にグラフを描画してくれるライブラリです。以下は、二次関数のグラフを描画するコードです。

import matplotlib.pyplot as plt
import numpy as np

# NumPyで等差数列を取得する
x = np.arange(-10, 9, 1)
y = (x * x) + (2 * x) + 1

# X軸がx、Y軸がyのグラフを描画する
plt.plot(x, y)
plt.show()

matplotlibでは様々な種類のグラフを描画できます。上記のファイルを実行すると、線グラフが描画されたウィンドウが開きます。

統計データの数値的尺度

続いて、統計学における統計データの数値的尺度について説明します。膨大なデータを1つ1つ意識することなく、データの特徴を分析できることに大きな意義があります。いくつかの数値的尺度に着目するだけで、統計データのおおまかな特徴を見出すことができます。

中心を表す数値的尺度

平均

最も代表的な中心の尺度でしょう。統計学では、以下の計算式で求めることができます。

[mathjax]$$ \bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i$$

なお、平均はエックスバーで表します。数式にすると少しややこしく見えますが、要はデータの合計値を要素の数で割った値ということですね。

そして、Pythonで平均を計算する時は、numpyに平均を返す関数「mean」が用意されているので数式を意識する必要はありません。

import numpy as np

a = np.array([1, 2, 3, 4, 5])

# 配列の平均を取得する
m = a.mean()

print(m)

# 実行結果
# 3.0

中央値(中位数)

中央値は、データを大きさの順に並べて、真ん中にくる値です。データ分布に歪みがある場合、平均よりも適切な中心を表す尺度として用いられます。

データの個数が奇数の場合は、真ん中の値が中央値になります。例えば1, 2, 3, 4, 5 の中央値は

[mathjax]$$ \tilde{x}= 3 $$

となります。中央値は、エックスチルダで表します。

そして、データの個数が偶数の場合は、真ん中の2つの値の平均となります。例えば1, 2, 3, 4の中央値は

[mathjax]$$ \tilde{x}= \frac{1}{2}(2 + 3) = 2.5$$

となります。平均と同様、NumPyには中央値を返す関数が用意されています。ただし、ndarrayオブジェクトが持っている関数ではないので、呼び出し方に気をつけてください。

import numpy as np

a = np.array([1, 2, 3, 4])

# 配列の中央値を取得する
m = np.median(a)

print(m)

# 実行結果
# 2.5

最頻値

最頻値は、データ分布の中で、最も多数を占める値です。例えば、1, 2, 3, 4, 4, 5という集合がある場合、4のみ2つ存在し、最も多いため、最頻値となります。

最頻値をPythonで求める場合は、SciPy.statsのmode関数を使います。

import numpy as np
import scipy.stats as stats

a = np.array([1, 2, 3, 4, 4, 5])

# 配列の最頻値を取得する
m = stats.mode(a)

# 最頻値を表示する
print(m[0])

# 最頻値の個数を表示する
print(m.count[0])

# 実行結果
# [4]
# 2

ただし、最頻値が複数ある場合、mode関数は最も小さい値を返すことに注意してください。

import numpy as np
import scipy.stats as stats

a = np.array([1, 2, 3, 4, 4, 5, 5])
m = stats.mode(a)
print(m[0])
print(m.count[0])

# 実行結果
# [4]
# 2

今回のまとめ

データの中心と一言で言っても、どのような観点から中心を考えるかによって、いくつかの尺度があることがわかりました。

次回は、今回説明した中心の尺度を用いて、どのようにデータ分布の特徴を見出すかについて説明します。今回はmatplotlibはほとんど使いませんでしたが、次回はデータの特徴を確認するためにグラフの表示も行いたいと思います。

コメント

タイトルとURLをコピーしました