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

【理解】データの散らばりの数学的解説

散布度について

$s_x^2 \displaystyle = \frac{(x_1 - \bar{x})^2+\cdots + (x_n - \bar{x})^2}{n}$(分散)

定義(分散)

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

$s^2_{x}$

$\displaystyle = \frac{(x_1 - \bar{x})^2+\cdots + (x_n - \bar{x})^2}{n}$

$\displaystyle = \frac{1}{n}\sum_{k=1}^n (x_k - \bar{x})^2$

分散という. ここで, $\bar{x}$ は $x$ の平均値である.

たとえば,

$x=[1, 2, 3]$

のとき, 分散は $\frac{2}{3}$ です。

$y=[2,4,6]$ のとき, 分散は $\frac{8}{3}$ です。

$s_x^2 = \overline{x^2} - \bar{x}^2$

分散 $s_x^2$ が期待値を使って $\overline{x^2}-\bar{x}^2$ で表されることを証明してみよう。

公式

データ $x$ の分散 $s_x^2$ について,

$s_x^2=\overline{x^2}-\bar{x}^2$

が成り立つ. ただし, データ $x$ と $x^2$ の平均値を $\bar{x}$ と $\overline{x^2}$ とする.

証明.

分散の定義式を計算する.

$\displaystyle s_x^2=\frac{(x_1 - \bar{x})^2+\cdots + (x_n - \bar{x})^2}{n}$

$s_x^2$ $\displaystyle =\frac{x_1^2+\cdots + x_n^2}{n}$ $\displaystyle -\frac{2\bar{x}(x_1+\cdots + x_n)}{n}$ $\displaystyle +\frac{\bar{x}^2+\cdots + \bar{x}^2}{n}$

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

$s_x^2$ $\displaystyle =\frac{x_1^2+\cdots + x_n^2}{n}$ $\displaystyle -2\bar{x}^2$ $\displaystyle +\bar{x}^2$ $\displaystyle =\frac{x_1^2+\cdots + x_n^2}{n}$ $\displaystyle -\bar{x}^2$

$\displaystyle \overline{x^2}=\frac{x_1^2 +\cdots + x_n^2}{n}$

$s_x^2$ $=\overline{x^2}$ $-\bar{x}^2$

となる.

ゆえに, $s_x^2$ $=\overline{x^2}$ $-\bar{x}^2$ が成り立つ.

たとえば,

$x=[1, 2, 3]$

のとき,

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

であり,

$\bar{x}=2$,
$\displaystyle \overline{x^2}=\frac{14}{3}$

なので,

$s_x^2$ $\displaystyle =\frac{14}{3}-2^2$ $\displaystyle =\frac{2}{3}$

となります。

$s_x \displaystyle = \sqrt{\frac{(x_1 - \bar{x})^2+\cdots + (x_n - \bar{x})^2}{n}}$(標準偏差)

定義(標準偏差)

データ $x=[x_1, \ldots , x_n]$ について, 分散を $v_x$ としたとき,

$s_x=\sqrt{v_x}$

標準偏差という. 具体的に記述すれば,

$s_{x}$

$\displaystyle = \sqrt{\frac{(x_1 - \bar{x})^2+\cdots + (x_n - \bar{x})^2}{n}}$

$\displaystyle = \sqrt{\frac{1}{n}\sum_{k=1}^n (x_k - \bar{x})^2}$

である. ここで, $\bar{x}$ は $x$ の平均値である.

たとえば,

$x=[1, 2, 3]$

のとき, 標準偏差は $\sqrt{\frac{2}{3}}$ です。

$y=[2,4,6]$ のとき, 標準偏差は $2\sqrt{\frac{2}{3}}$ です。

$\displaystyle CV=\frac{s_x}{\bar{x}}$(変動係数)

定義(変動係数)

データの標準偏差を平均値で割った値を変動係数という.

データ $x$ の標準偏差を $s_x$, 平均値を $\bar{x}$ とすると, 変動係数 $CV$ は

$\displaystyle CV = \frac{s_x}{\bar{x}}$

である.

たとえば,

$[10,12,8,11,9]$

については,

平均値 $10.0$,
標準偏差 $1.41$

です。また,

$[50,60,40,55,45]$

については,

平均値 $50.0$,
標準偏差 $7.07$

です。

いずれも変動係数は $0.14$ になります。

ヒストグラムの形状による分布の比較

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

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

$s_y^2 = a^2s_x^2$(分散)
$s_y = |a|s_x$(標準偏差)
※一次変換 $y=ax+b$ による変化

データ $x$ の各値を $y=ax+b$ によって変換したあとのデータの分散 $s_{y}^2$ が $s_{y}^2 = a^2s_{x}^2$ であることを示してみよう。

性質

データ $x=[x_1, x_2, \cdots, x_n]$ について, 分散を $s_{x}^2$ とする.

データ $x$ の各値 $x_k$ $(1 \leq k \leq n)$ を $y_k=ax_k + b$ と変換したあとのデータを $y$ とする. データ $y$ の分散を $s_y^2$ とする.

このとき, $s_y^2 = a^2s_x^2$ が成り立つ.

証明.

$x$ と $y$ の平均値を $\bar{x}$ と $\bar{y}$ とする.

$\bar{y} = a\bar{x} + b$

データ $y$ の分散の定義式を計算するために $y_k$ の偏差を求めると,

$y_k-\bar{y}$ $=(ax_k+b)-(a\bar{x}+b)$ $=a(x_k-\bar{x})$

である.

$s_y^2$

$\displaystyle =\frac{(y_1-\bar{y})^2 + \cdots + (y_n-\bar{y})^2}{n}$
$\displaystyle =\frac{a^2(x_1-\bar{x})^2 + \cdots + a^2(x_n-\bar{x})^2}{n}$
$\displaystyle =a^2\frac{(x_1-\bar{x})^2 + \cdots + (x_n-\bar{x})^2}{n}$
$=a^2s_x^2$.

ゆえに, $s_y^2 = a^2s_x^2$ が得られた.

たとえば,

$x=[1, 2, 3]$

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

$y=[3, 5, 7]$

になります。

$\displaystyle s_x^2=\frac{2}{3}$,
$\displaystyle s_y^2=\frac{8}{3}$

なので,

$s_y^2=2^2 \times s_x^2$

が成り立っています。

データ $x$ の各値を $y=ax+b$ によって変換したあとのデータの標準偏差 $s_{y}$ が $s_{y} = |a|s_{x}$ であることを示してみよう。

性質

データ $x=[x_1, x_2, \cdots, x_n]$ について, 標準偏差を $s_{x}$ とする.

データ $x$ の各値 $x_k$ $(1 \leq k \leq n)$ を $y_k=ax_k + b$ と変換したあとのデータを $y$ とする. データ $y$ の標準偏差を $s_y$ とする.

このとき, $s_y = |a|s_x$ が成り立つ.

証明.

一次変換 $y=ax+b$ による分散の値の変化は

$s_y^2 = a^2s_x^2$

である. ゆえに, $s_y = |a|s_x$ が成り立つ.

たとえば,

$x=[1, 2, 3]$

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

$y=[-1, -3, -5]$

になります。

$\displaystyle s_x=\frac{\sqrt{6}}{3}$,
$\displaystyle s_y=\frac{2\sqrt{6}}{3}$

なので,

$s_y=|-2| s_x$

が成り立っています。

$\displaystyle z = \frac{x-\bar{x}}{s_x}$(標準化)

データ $x$ の各値を $y=ax+b$ によって変換したあとのデータの分散 $s_{y}^2$ が $s_{y}^2 = a^2s_{x}^2$ であることを示してみよう。

定義

データ $x$ について, 平均値を $0$, 標準偏差を $1$ になるように変換することをデータの標準化という.

命題

データ $x$ について, 変換

$\displaystyle z = \frac{x-\bar{x}}{s_x}$

は標準化である. ただし, データ $x$ の平均値を $\bar{x}$, 標準偏差を $s_x$ とする.

証明.

データ $x$ の一次変換 $ax+b$ による平均値と標準偏差の変化は

$a\bar{x} + b$

$|a|s_x$

であった. 今回の変換については

$\displaystyle z = \frac{x-\bar{x}}{s_x}$ $\displaystyle = \frac{1}{s_x}x + \frac{-\bar{x}}{s_x}$

であるから, 平均値と標準偏差は次のようになる.

$\displaystyle \bar{z}= \frac{1}{s_x}\bar{x} + \frac{-\bar{x}}{s_x}$ $=0$

$\displaystyle s_{z}= \frac{1}{s_x} \cdot s_{x}$ $=1$

ゆえに, $\displaystyle z = \frac{x-\bar{x}}{s_x}$ は標準化である.

たとえば,

$x=[0, 0, 2,2]$

のとき,

$\bar{x} = 1$,
$s_x = 1$

です。変換

$\displaystyle z=x-1$

と変形すると,

$z=[-1, -1, 1,1]$

になります。

この平均値は $0$ で, 標準偏差は $1$ のままです。

$\displaystyle \frac{x_k - \bar{x}}{s_x}\times 10 +50$(偏差値)

定義(偏差値)

データ $x=[x_1, \ldots , x_n]$ の $x_k$ $(1\leq k \leq n)$ について,

$\displaystyle \frac{x_k - \bar{x}}{s_x}\times 10 +50$

偏差値という. ここで, $\bar{x}$ は $x$ の平均値, $s_x$ は $x$ の標準偏差である.

たとえば,

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

のとき,

$-5$ の偏差値は $36$,

$1$ の偏差値は $48$,

$3$ の偏差値は $52$,

$9$ の偏差値は $64$

となります。

$M-m$(データの範囲)

定義(データの範囲)

データの最大値と最小値の差をデータの範囲という.

最大値を $M$, 最小値を $m$ とすると, データの範囲は $M-m$ である.

たとえば,

$x=[1, 2, 3, 5, 5, 7]$

のとき, データの範囲は $7-1=6$ です。

$Q_3-Q_1$(四分位範囲)

定義(四分位範囲)

第3四分位数 $Q_3$ と第1四分位数 $Q_1$ の差を四分位範囲 $Q_3 - Q_1$ という.

たとえば,

$x=[1, 2, 3, 5, 5, 7]$

のとき, 四分位範囲は $5-2=3$ です。

$\displaystyle \frac{Q_3-Q_1}{2}$(四分位偏差)

定義(四分位偏差)

四分位範囲を2で割った値を四分位偏差という.

第1四分位数と第3四分位数を $Q_1$, $Q_3$ とすれば, 四分位偏差は

$\displaystyle \frac{Q_3 - Q_1}{2}$

である.

たとえば,

$x=[1, 2, 3, 5, 5, 7]$

のとき, 四分位偏差は $\frac{5-2}{3}=\frac{3}{2}$ です。

【表計算】Excel・スプレッドシートで散らばりの計算

四分位数 QUARTILE.INC()

MEDIAN関数

表計算シートでデータの四分位数を計算する場合、
QUARTILE.INC(データ範囲, 戻り値)
を利用する。

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

・戻り値…最小値:0,第1四分位数:1, 第2四分位数:2, 第3四分位数:3, 最大値:4

例えば、[A1]:4, [A2] :1, [A3]:1, [A3]:1, [A4]:2, [A5]:3の場合、

=QUARTILE.INC(A1:A5, 2)」と入力すると第2四分位数1.5,

=QUARTILE.INC(A1:A5, 3)」と入力すると第3四分位数3

が出力されます。

分散 VAR.P()

VAR.P関数

データの分散を表計算で計算する場合、
VAR.P(データ範囲)
を利用する。

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

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

標準偏差STDEV.P()

STDEV.P関数

データの標準偏差を表計算で計算する場合、
STDEV.P(データ範囲)
を利用する。

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

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

ヒストグラムの作成

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

作業手順

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

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

★完成イメージ

手順.

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

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

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

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

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

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

箱ひげ図の作成

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

作業手順

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

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

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

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

★完成イメージ

手順.

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

(1) 縦(列)に各項目, 横(行)に最小値・第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) 【設定】【ローソク足チャート】を選択します。

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

【コード】Pythonで散らばりの計算

四分位数(パーセンタイル) percentile()

Pythonコード

numpyモジュールのpercentile()関数を利用し, パーセンタイル・四分位数を出力する。

percentile(データ, 引数2)として, 引数2には小さい値から数えて全体の何%に位置するものかを設定する。

第1四分位数の場合は引数2には25, 第2四分位数の場合は引数2には50, 第3四分位数の場合は引数2には75を入力する。

入力例. [20, 10, 40, 20, 40, 50, 30]の第1四分位数, 第2四分位数, 第3四分位数を出力する。

import numpy as np

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

print(np.percentile(data, [25, 50, 75]))

[20. 30. 40.]

分散 pvarinace() variance() var()

Pythonコード

statisticsモジュールのpvariance()関数で(母)分散, variance()関数で標本分散を出力する。

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

import statistics as st

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

print(st.pvariance(data))
print(st.variance(data))

171.42857142857142
200

Pythonコード

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

var(データ, 引数2)として, 引数2には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))

171.42857142857142
200.0

標準偏差pstdev() stdev() std()

Pythonコード

statisticsモジュールのpstdev()関数で(母)標準偏差, stdev()関数で標本標準偏差を出力する。

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

import statistics as st

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

print(st.pstdev(data))
print(st.stdev(data))

13.093073414159543
14.142135623730951

Pythonコード

numpyモジュールのstd()関数を利用し, 標準偏差を出力する。

std(データ, 引数2)として, 引数2には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.std(data, ddof=0))
print(np.std(data, ddof=1))

13.093073414159543
14.142135623730951

ヒストグラムの作成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

ヒストグラムの複数表示(Pandasの利用)

【CSV/Pandas初めて使う人】PythonでCSVファイルを利用して「あっすごい」って思わせるまで

PythonでCSVファイルを利用する基本的な内容を解説します。 Pythonを使うと任意のデータを利用することも容易になります。 初歩的なことしか知らないと、 「Excelの方が便…

箱ひげ図の作成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

コメントを残す