• 目次
  • 理解
  • 表計算
  • コード

【理解】データの中心化傾向の数学的解説

平均値について

平均値 $\bar{x}$(Mean)

定義(平均値)

データ $x=[x_1, \ldots , x_n]$ について,

$\displaystyle \bar{x}=\frac{x_1 + \cdots + x_n}{n}$

$\displaystyle =\frac{1}{n} \sum_{k=1}^nx_k$

平均値という.

たとえば,

$x=[-5, 1, 3, 9]$

のとき, 平均値は $2$ である。

平均値(度数分布)

定義(平均値)

度数分布から平均値を定める場合は, 各階級にあるデータをすべて階級値と等しいとみなす.

階級階級値度数
$(1)$$x_1$$n_1$
$(2)$$x_2$$n_2$
$\vdots$$\vdots$$\vdots$
$(r)$$x_r$$n_r$
-$n$

上記の度数分布表の場合, 平均値 $\bar{x}$ は

$\displaystyle \bar{x}=\frac{n_1x_1 + \cdots + n_rx_r}{n}$

である.

階級階級値度数
$5 \sim 15$$10$$5$
$15 \sim 25$$20$$15$
$25 \sim 35$$30$$10$
-$30$

この度数分布の場合,

$(10\times 5$ $+ 20 \times 15$ $+ 30 \times 10)$ $\div 30$ $=650 \div 30$ $\fallingdotseq 21.7$

が平均値になります。

データの平均値に平均を加える
$\displaystyle \frac{x_1 + \cdots + x_n + \bar{x}}{n+1} = \bar{x}$

データ $x$ に平均値 $\bar{x}$ を追加したデータ $x'$ の平均値が $\bar{x}$ であることを示してみよう。

性質

データ $x=[x_1, x_2, \cdots, x_n]$ について, 平均値を $\bar{x}$ とする.

データ $x'=[x_1, x_2, \cdots, x_n, \bar{x}]$ の平均値 $\overline{x'}$ は $\bar{x}$ と一致する.

証明.

平均値の定義を踏まえ, $\overline{x'}$ を計算し $\bar{x}$ と一致することを示す.

平均値の定義式

$\displaystyle \bar{x}=\frac{x_1 + \cdots + x_n}{n}$

より,

$x_1 + \cdots + x_n = n \bar{x}$

が成り立つ.

$\overline{x'}$
$\displaystyle =\frac{x_1 + \cdots + x_n+\bar{x}}{n+1}$
$\displaystyle =\frac{n \bar{x}+\bar{x}}{n+1}$
$\displaystyle =\frac{(n+1) \bar{x}}{n+1}$
$=\bar{x}$.

ゆえに, $\overline{x'}=\bar{x}$ が得られた.

たとえば,

$x=[1, 2, 3]$

のとき,

$\bar{x}=2$

を加えたデータ

$[1, 2, 3, 2]$

の平均も $2$ です。

$\bar{y} = a\bar{x}+b$
(一次変換による平均値の変化)

データ $x$ の各値を $y=ax+b$ によって変換したあとのデータの平均値 $\bar{y}$ が $\bar{y} = a\bar{x}+b$ であることを示してみよう。

性質

データ $x=[x_1, x_2, \cdots, x_n]$ について, 平均値を $\bar{x}$ とする.

データ $x$ の各値 $x_k$ $(1 \leq k \leq n)$ を $y_k=ax_k + b$ と変換したあとのデータを $y$ とする. データ $y$ の平均値を $\bar{y}$ とする.

このとき, $\bar{y} = a\bar{x}+b$ が成り立つ.

証明.

$\bar{y}$ の平均値の定義式を計算する.

$\bar{y}$
$\displaystyle =\frac{(ax_1+b) + \cdots + (ax_n+b)}{n}$
$\displaystyle =\frac{a(x_1 + \cdots + x_n) + nb}{n}$
$\displaystyle =a\frac{x_1+\cdots + x_n}{n}+b$
$=a\bar{x}+b$.

ゆえに, $\bar{y} = a\bar{x}+b$ が得られた.

たとえば,

$x=[1, 2, 3]$

のとき, $y=2x+1$ と変形すると,

$y=[3, 5, 7]$

になります。

$\bar{x}=2$,
$\bar{y}=5$

なので,

$\bar{y}=2\bar{x}+1$

が成り立っています。

外れ値の設定 $\bar{x} \pm 3\sigma$

定義(外れ値)

他のデータから大きく離れていて, 全体の分布のパターンから見て異常に見える観測値のことを外れ値という.

たとえば, データ

$[-1, 0, 2, 3, 99]$

について, $99$ を外れ値と捉えることができます。

統計的観点(外れ値)

平均値を基準とする統計分析において, 平均値から標準偏差が3つ分以上離れているデータの値を外れ値と定める.

データの平均値を $\bar{x}$, 標準偏差を $\sigma$ としたとき, $\bar{x} \pm 3\sigma$ よりも離れているといった表現をすることがある.

$\displaystyle \frac{x_t + \cdots +x_{t-(m-1)}}{m}$(移動平均)

定義(単純移動平均)

時系列データ $[x_1, \ldots, x_n]$ について, $m$ 項の移動平均とは, $t \geq m$ について,

$\displaystyle \frac{x_t + x_{t-1} + \cdots + x_{t-(m-1)}}{m}$

移動平均と言う.

別の定義(単純移動平均)

時系列データ $[x_1, \ldots, x_n]$ について, 次を $m$ 項の移動平均という.

$m$ が奇数のとき,

$\displaystyle \frac{1}{m}(x_{t+(m-1)/2}$ $+ \cdots$ $+ x_t$ $+ \cdots$ $+ x_{t-(m-1)/2})$

$m$ が偶数のとき,

$\displaystyle \frac{1}{m}(x_{t+(m/2-1)} \times 0.5$ $+ x_{t+(m/2-2)}$ $+ \cdots$ $+ x_t$ $+ \cdots$ $+ x_{t-(m/2-2)}$ $+ x_{t-(m/2-1)} \times 0.5)$

$m$ が偶数のとき, $t$ を中心にした奇数 $m-1$ のデータに合わせて, $x_{t+(m/2-1)}$ と $x_{t-(m/2-1)}$ にそれぞれ $0.5$ の重みをつけて平均をとっている.

★移動平均の例示

$\displaystyle \frac{x_{n-(m-1)} + \cdots +x_{m+1}}{n-2m}$(トリム平均)

定義(トリム平均)

$m$ 個ずつを取り除くトリム平均とは, データから大きい方の値と小さい方の値をそれぞれ $m$ 個ずつ取り除いたデータの平均値のことである.

小さいものから順番に並べたデータ $[x_1, \ldots, x_n]$ について, $m$ 個ずつを取り除いたトリム平均とは,

$\displaystyle \frac{x_{n-(m-1)}+ \cdots + x_{m+1}}{n-2m}$

である.

たとえば, データ

$[2, 2, 4, 6, 10]$

について,平均値は $4.8$ です。

$m=1$ としたトリム平均は

$\displaystyle \frac{2+4+6}{3}$ $=4$

です。

中央値について

中央値 $\tilde{x}$(Median)

定義(中央値)

データの数値が小さい順に並べ変えたときに真ん中にくる数を中央値という.

データの個数が偶数であるときは, 真ん中の2つの数の平均値を中央値とする.

たとえば,

$x=[2, 1, 3, 9, 1]$

のとき小さい順に並べ変えると $1$, $1$, $2$, $3$, $9$ であるので, 中央値は $2$ である。

また, $y=[-5, 1, 3, 9]$ の中央値は $\frac{1+3}{2}$ なので $2$ である。

中央値(度数分布)

定義(中央値)

度数分布から中央値を定める場合は, 各階級にあるデータをすべて階級値と等しいとみなす.

階級階級値度数
$(1)$$x_1$$n_1$
$(2)$$x_2$$n_2$
$\vdots$$\vdots$$\vdots$
$(r)$$x_r$$n_r$
-$n$

上記の度数分布表の場合, $n$ の偶奇で場合分けする.

$n$ が奇数の場合は 小さい方から $(n+1)/2$ 番目のデータがある階級の階級値を中央値とする.

$n$ が偶数の場合は 小さい方から $n/2$ 番目と $n/2 +1$ 番目のデータがあるそれぞれの階級の階級値の平均値を中央値とする.

階級階級値度数
$5 \sim 15$$10$$5$
$15 \sim 25$$20$$15$
$25 \sim 35$$30$$10$
-$30$

この度数分布の場合, $20$ が中央値になります。

外れ値の設定 $\tilde{x} \pm 1.5 \times (Q_3-Q_1)$

定義(外れ値)

他のデータから大きく離れていて, 全体の分布のパターンから見て異常に見える観測値のことを外れ値という.

たとえば, データ

$[-1, 0, 2, 3, 99]$

について, $99$ を外れ値と捉えることができます。

統計的観点(外れ値)

中央値を基準とする統計分析において, 中央値から四分位範囲が1.5つ分以上離れているデータの値を外れ値と定める.

データの中央値を $\tilde{x}$, 四分位範囲を $\mathrm{IQR}$ としたとき, $\tilde{x} \pm 1.5 \times \mathrm{IQR}$ よりも離れているといった表現をすることがある.

最頻値について

最頻値(Mode)

定義(最頻値)

データの中で, 個数が最も多い数値を最頻値という.

個数が最も多い数値が複数ある場合, 最頻値は定まらないか, 複数定めるかのいずれかとする.

たとえば,

$x=[2, 1, 3, 9, 1]$

のとき最頻値は $1$ である。

最頻値(度数分布)

定義(最頻値)

度数分布の最頻値は, 最も度数が多い階級の階級値である.

階級階級値度数
$(1)$$x_1$$n_1$
$(2)$$x_2$$n_2$
$\vdots$$\vdots$$\vdots$
$(r)$$x_r$$n_r$
-$n$

上記の度数分布表の場合, $n_s=\max\{n_1, \ldots , n_r\}$ とすると, $x_s$ が最頻値である.

階級階級値度数
$5 \sim 15$$10$$5$
$15 \sim 25$$20$$15$
$25 \sim 35$$30$$10$
-$30$

この度数分布の場合, $20$ が最頻値になります。

中心化傾向を表す代表値の選定について

ピアソンの経験則(マミムメモの法則)

No content available

尺度水準と代表値の選択

外れ値の代表値への影響

尺度水準適切な代表値備考
名義尺度(Nominal)最頻値平均値・中央値は意味を持たない。
順序尺度(Ordinal)中央値、最頻値平均値は間隔が等しい場合のみ参考程度に用いる。
間隔尺度(Interval)平均値、中央値、最頻値比率は意味を持たない。
比率尺度(Ratio)平均値、中央値、最頻値比率を計算できる。

※平均値はデータ全体の特性を表し, かつ数学的に扱いやすい. 可能な場合は平均値を利用することが好ましい.

外れ値が及ぼす代表値への影響

外れ値の代表値への影響

項目平均値への影響中央値への影響その他の代表値備考
外れ値なし平均も中央値もほぼ同じ値になる平均とほぼ一致最頻値なども代表値として安定データが対称分布に近い場合は差が小さい
外れ値が1つ高い/低い平均値は大きく変動する(外れ値方向に引っ張られる)中央値はほとんど変化しない最頻値には影響なし平均は外れ値に敏感
外れ値が複数ある場合平均は非常に大きく影響を受ける中央値は外れ値の数が半数未満ならほぼ影響なし四分位点やトリム平均などで調整可能外れ値の方向・数によって影響度が異なる
極端な外れ値平均が実態を反映しにくくなる中央値はロバスト(頑健)中央値やトリム平均が推奨データ分布の把握には中央値が優位

ヒストグラムの形状による代表値の選定

ヒストグラムの形状と特徴

名称意味特徴歪度(傾き)尖度(山の鋭さ)選ぶ代表値選定理由
正規分布(ベル型)平均付近が最も多く、左右対称の典型的な分布。自然現象や測定値など、多くの現象で現れる。≈0(対称)≈0(標準的)平均値外れ値が少なく、平均・中央値・最頻値がほぼ一致するため平均値が適切。
一様分布(矩形型)全ての範囲でほぼ同じ頻度を持つ。乱数や等確率事象のモデルとして使用。≈0(対称)負(平坦)平均値または中央値平均と中央値が一致しやすく、どちらを選んでも範囲の中央を表せる。
右偏分布小さい値が多く、大きい値がまれに現れる。所得や寿命などに見られる。高(裾長い)中央値外れ値が平均を引き上げるため、中央値の方が典型的な値を表す。
左偏分布大きい値が多く、小さい値がまれに現れる。簡単すぎる試験の点数分布などに見られる。高(裾長い)中央値外れ値が平均を引き下げるため、中央値が実態を反映しやすい。
二峰型2つのピークを持つ。異なる集団が混ざった分布。季節性や男女差など複数の要因の混合を示す。ほぼ0(対称的な場合)負(平坦)最頻値(複数)平均や中央値だと谷間を示してしまうため、各山の最頻値が適切。
高尖度平均付近に強く集中し、裾が短い分布。外れ値が少なく、測定精度の高い場合に見られる。≈0(対称)正(尖っている)平均値中心集中度が高く、平均値が安定して分布の中心を示す。
低尖度平均付近の集中度が低く、裾が長い分布。外れ値が多く、変動が激しいデータに見られる。≈0(対称)負(平坦)中央値外れ値が多く、分布の値が広く散らばっているため、中央値が適切。
U字型中央が少なく、両端に多い分布。評価が極端に分かれるアンケート結果などに見られる。≈0(対称)負(平坦)最頻値(両端)中央はほぼデータがないため、両端のピーク(最頻値)を代表値とする。

【表計算】Excel・スプレッドシートで中心化傾向の計算

平均値 AVERAGE()

AVERAGE関数

データの平均値を表計算で計算する場合、
AVERAGE(データ範囲)
を利用する。

・データ範囲…データのセル範囲を指定。

例えば、[A1]:4, [A2] :1, [A3]:1の場合、「=AVERAGE(A1:A3)」と入力すると2が出力されます。

中央値MEDIAN()

MEDIAN関数

表計算シートでデータの中央値を計算する場合、
MEDIAN(データ範囲)
を利用する。

・データ範囲…データのセル範囲を指定。

例えば、[A1]:4, [A2] :1, [A3]:1の場合、「=MEDIAN(A1:A3)」と入力すると1が出力されます。

最頻値MODE()

MODE関数

表計算シートでデータの最頻値を計算する場合、
MODE(データ範囲)
を利用する。

・データ範囲…データのセル範囲を指定。

※最頻値が一意的に定まらないときはエラーを返す。

例えば、[A1]:4, [A2] :1, [A3]:1の場合、「=MODE(A1:A3)」と入力すると1が出力されます。

ヒストグラムの作成

表計算ソフト(Excelなど)でヒストグラムを作ってみよう。
※作業環境はGoogleスプレッドシートです。

作業手順

次のステップでヒストグラムを作成する。

(1) データの範囲を指定する。
(2)【挿入】から【グラフ】を選択する。
(3)【設定】【ヒストグラム】を選択する。
(4)【カスタマイズ】【横軸】で横軸の最小値と最大値を設定する。【カスタマイズ】【ヒストグラム】【バケットサイズ】でヒストグラムの階級の幅を設定する。
(5)【カスタマイズ】でグラフを調整する。

★完成イメージ

手順.

(1) 次のデータを利用します。このデータの範囲を指定します。今回は、A列とB列全体を指定しました。

(2) 【挿入】から【グラフ】を選択します。

(3) 【設定】【ヒストグラム グラフ】を選択します。

(4)【カスタマイズ】【横軸】で横軸の最小値と最大値を設定します。

【カスタマイズ】【ヒストグラム】【バケットサイズ】でヒストグラムの階級の幅を設定します。

(5) その他, 必要に応じて【カスタマイズ】でグラフを調整すると「★完成イメージ」のヒストグラムができます。

箱ひげ図の作成

表計算ソフト(Excelなど)で箱ひげ図を作ってみよう。
※作業環境はGoogleスプレッドシートです。

作業手順

次のステップで箱ひげ図を作成する。

(1) 縦(列)に各項目, 横(行)に最小値・第1四分位数・第3四分位数・最大値を並べた表をつくる。QUARTILE.INC()関数を使う。
(2) (1)で作成した表の範囲を指定し, 【挿入】から【グラフ】を選択する。
(3)【設定】【ローソク足チャート】を選択する。
(3)【カスタマイズ】でグラフを調整する。

Excelでは(1)の操作を行わずに, 元のデータを選択することから箱ひげ図を作成できる。

Googleスプレッドシートでは箱ひげ図を作成する機能がなく, ローソク足チャートで代用しているため(1)の作業が必要となっている。

★完成イメージ

手順.

(0) 次のデータを利用します。

(2) 縦(列)に各項目, 横(行)に最小値・第1四分位数・第3四分位数・最大値を並べた表をつくります。

これらの値は

QUARTILE.INC(データ範囲, 戻り値)

で計算します。戻り値0から4の値を指定することで四分位数を出力することができます。例えば, クラスAでは

最小値:=QUARTILE(A:A, 0),
第1四分位数:=QUARTILE(A:A, 1),
第3四分位数:=QUARTILE(A:A, 3),
最大値:=QUARTILE(A:A, 4)

と入力します。

(2) (1)で作成した表の範囲を指定して【挿入】から【グラフ】を選択します。

(3) 【設定】【ローソク足チャート】を選択します。

(5) 必要に応じて【カスタマイズ】でグラフを調整すると「★完成イメージ」の箱ひげ図ができます。

【コード】Pythonで中心化傾向の計算

平均値 sum()/len() mean()

Pythonのリストの要素の平均値を計算し出力する方法を習得しよう。

Pythonコード

sum()関数で取得した合計値を, len()関数で取得したデータの大きさで割ることでリストの要素の平均値を出力する。

入力例. [2, 7, 5, 3]の平均値を出力する。

lst = [2, 7, 5, 3]

print(sum(lst)/len(lst))

4.25

Pythonコード

statisticsモジュールのmean()関数を利用し, 平均値を出力する。

入力例. [20, 10, 40, 20, 40, 50, 30]の平均値を出力する。

import statistics as st

data = [20, 10, 40, 20, 40, 50, 30]

print(st.mean(data))

30

Pythonコード

numpyモジュールのvar()関数を利用し, 分散を出力する。

var(データ, ddof=)として, ddof=0とすると(母)分散, ddof=1とすると標本分散を出力できる。

入力例. [20, 10, 40, 20, 40, 50, 30]の母分散と標本分散を出力する。

import numpy as np

data = [20, 10, 40, 20, 40, 50, 30]

print(np.var(data, ddof=0))
print(np.var(data, ddof=1))

30

中央値median()

Pythonコード

statisticsモジュールのmedian()関数を利用し, 中央値を出力する。

入力例. [20, 10, 40, 20, 40, 50, 30]の中央値を出力する。

import statistics as st

data = [20, 10, 40, 20, 40, 50, 30]

print(st.median(data))

30

Pythonコード

numpyモジュールのmedian()関数を利用し, 中央値を出力する。

入力例. [20, 10, 40, 20, 40, 50, 30]の平均値を出力する。

import numpy as np

data = [20, 10, 40, 20, 40, 50, 30]

print(np.median(data))

30

最頻値mode() multimode()

Pythonコード

statisticsモジュールのmode()もしくはmultimode()関数を利用し, 最頻値を出力する。

multimodeでは最頻値が複数ある場合, すべての値を出力することができる。

入力例. [20, 10, 40, 20, 40, 50, 30]の最頻値を出力する。

import statistics as st

data = [20, 10, 40, 20, 40, 50, 30]

print(st.mode(data))
print(st.multimode(data))

20
[20, 40]

ヒストグラムの作成hist()

データからヒストグラムをPythonで出力してみよう。

Pythonコード

matplotlib.pyplothist()関数を利用して, ヒストグラムを出力する。

hist()の引数には, ヒストグラムにするデータを入力する。階級の個数binsを指定する。

入力例. scoresのデータからヒストグラムを表示する。100点満点のうち10点ずつ区切るために, ヒストグラムの棒は10本にする。

import matplotlib.pyplot as plt
import japanize_matplotlib

# データ
scores = [87, 74, 79, 92, 88, 60, 79, 68, 68, 74, 71, 84,
          77, 71, 74, 73, 84, 67, 73, 61, 44, 76, 78, 62,
          92, 55, 70, 68, 85, 84, 71, 73, 61, 50, 66, 71,
          82, 82, 66, 66, 59, 55, 52, 89, 64, 65, 57, 77,
          53, 67]

# ヒストグラムの描画
plt.hist(scores, bins=10, color="skyblue", edgecolor="black")
plt.title("テスト点数の分布")
plt.xlabel("点数")
plt.ylabel("人数")
plt.grid(axis='y')
plt.show()

matplotlibで日本語を利用する場合japanize_matplotlibを使う。必要であれば、次を行い事前にインストールしておく。

pip install japanize-matplotlib

箱ひげ図の作成boxplot()

データから箱ひげ図をPythonで出力してみよう。

Pythonコード

matplotlib.pyplotboxplot()関数を利用して, 箱ひげ図を出力する。

boxplot()の引数には, 箱ひげ図にするデータを入力する。

labelsで各箱ひげのラベルを付けることが可能。
vert=Falseを指定すると, 横方向の箱ひげ図を作成可能。(縦方向の場合は入力不要。)
showmeans=Trueを指定すると, 平均値を表示可能。meanpropsで平均値の表示形式を指定可能。不要である場合は入力不要。

入力例. class_A class_B class_C のデータから箱ひげ図を表示する。

import matplotlib.pyplot as plt
import japanize_matplotlib

# データ
class_A = [78, 82, 85, 90, 87, 92, 88, 84, 79, 81, 86, 91, 83, 85, 89, 87, 90, 88, 84, 82, 86, 88, 90, 92, 85, 87, 89, 91, 83, 84]
class_B = [65, 68, 70, 72, 74, 71, 69, 66, 75, 73, 72, 70, 68, 71, 69, 74, 73, 75, 72, 68, 70, 71, 69, 67, 74, 72, 73, 75, 68, 70]
class_C = [55, 60, 65, 50, 70, 75, 40, 85, 60, 55, 50, 80, 75, 45, 65, 70, 55, 60, 85, 40, 75, 70, 50, 55, 60, 65, 45, 80, 75, 50]

# 箱ひげ図
plt.boxplot(
    [class_A, class_B, class_C], labels=["クラスA", "クラスB", "クラスC"],
    vert=False,
    showmeans=True,  # 平均値を表示
    meanprops={"marker":"x", "markerfacecolor":"black", "markeredgecolor":"black", "markersize":8}
)
plt.title("数学テスト点数の分布")
plt.xlabel("点数") # plt.ylabel("点数")
plt.grid(True)
plt.show()

縦向きの場合は, vertTrueにするか消去する。この場合, xlabely.lableが替わるので変更する。

import matplotlib.pyplot as plt
import japanize_matplotlib

# データ
class_A = [78, 82, 85, 90, 87, 92, 88, 84, 79, 81, 86, 91, 83, 85, 89, 87, 90, 88, 84, 82, 86, 88, 90, 92, 85, 87, 89, 91, 83, 84]
class_B = [65, 68, 70, 72, 74, 71, 69, 66, 75, 73, 72, 70, 68, 71, 69, 74, 73, 75, 72, 68, 70, 71, 69, 67, 74, 72, 73, 75, 68, 70]
class_C = [55, 60, 65, 50, 70, 75, 40, 85, 60, 55, 50, 80, 75, 45, 65, 70, 55, 60, 85, 40, 75, 70, 50, 55, 60, 65, 45, 80, 75, 50]

# 箱ひげ図
plt.boxplot(
    [class_A, class_B, class_C], labels=["クラスA", "クラスB", "クラスC"],
    showmeans=True,  # 平均値を表示
    meanprops={"marker":"x", "markerfacecolor":"black", "markeredgecolor":"black", "markersize":8}
)
plt.title("数学テスト点数の分布")
plt.ylabel("点数")
plt.grid(True)
plt.show()

matplotlibで日本語を利用する場合japanize_matplotlibを使う。必要であれば、次を行い事前にインストールしておく。

pip install japanize-matplotlib

コメントを残す