『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

中央値 (メジアン)

【Python統計学】中央値(メジアン)

データを昇順(小さい順)あるいは降順(大きい順)に並べたときに真ん中にくる値を中央値(メジアン)と定義します。たとえば、昇順に並んだ 9 個のデータ
 
 1, 3, 7, 10, 13, 15, 19, 23, 28
 
の中央値は、左から(あるいは右から)数えて 5 番目にある 13 です。
 
データが偶数個のときは真ん中にある 2 数の平均値を中央値とします。たとえば、10 個のデータ
 
 5, 9, 13, 21, 40, 46, 55, 69, 71, 98
 
の真ん中には $40$ と $46$ の値があるので、その平均をとって中央値は $43$ となります。
 
 正規分布で近似できるような左右対称形データの中央値は平均値に近い値をとります。たとえば、大勢の人が受けた試験の得点を考えるとき、平均点をとった人は、おおよそ真ん中あたりの順位にいると判断できます。
 
30 人が受けた試験の得点分布が次のように与えられたとします。

# PYTHON_MEDIAN

# In[1]

# テストの得点分布
score = [91, 71, 79, 98, 93, 50, 79, 62, 63, 71,
         67, 86, 76, 66, 71, 70, 87, 61, 69, 52,
         26, 74, 77, 53, 99, 43, 65, 62, 87, 87]

NumPy と Matplotlib をインポートして、ヒストグラムを描き、分布の概観を確認します。

# In[2]

import numpy as np
import matplotlib.pyplot as plt

# FigureとAxes
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(111)
ax.set_xlabel("Score", fontsize = 15)
ax.set_ylabel("Frequency", fontsize = 15)
ax.set_xlim(0, 100)

# ヒストグラムを描画
ax.hist(score, range=(0,100), color = "red")

# グラフを描画
plt.show()

numpy.median(), statistics.median():中央値 (メジアン)
データ数が少ないので、正規分布からほど遠い粗い形とはなっていますが、このぐらいの対称性があれば、中央値と平均値は近い値をとります。numpy.median() と numpy.mean() で中央値と平均値を計算してみます。

# In[3]

# 得点の中央値
median_score = np.median(score)

# 得点の平均値
mean_score = np.mean(score)

print("得点の中央値: {:.1f}".format(median_score))
print("得点の平均値: {:.1f}".format(mean_score))

# 得点の中央値: 71.0
# 得点の平均値: 71.2

つまり、平均点をとった人はおおよそ 15 ~ 16 番目の順位にあると考えることができます。
 
左右非対称な分布においては、中央値と平均値の差は大きくなります。
たとえば、日本国民の世帯当たりの貯蓄額は非対称分布となっています。
貯蓄格差のやや極端なモデルとして、9 世帯の貯蓄が 100 万円、1 世帯の貯蓄が 5000 万円である分布を考えてみます。

# In[4]

x = np.full(9, 100)

# 貯蓄分布
savings = np.append(x, 5000)

print(savings)
# [100  100  100  100  100  100  100  100  100 5000]

貯蓄額の中央値と平均値を計算してみます。

# In[5]

# 貯蓄額の中央値と平均値
median_savings = np.median(savings)
mean_savings = np.mean(savings)

print("貯蓄の中央値: {:.1f}".format(median_savings))
print("貯蓄の平均値: {:.1f}".format(mean_savings))

# 貯蓄の中央値: 100.0
# 貯蓄の平均値: 590.0

世帯ごとの貯蓄の平均値が 590 万円と聞いても、実態と随分かけ離れた金額だと感じるはずです。しかし、中央値の 100 万円という数値であれば、この集団の性質をよく表しています。
 
あるデータにおいて、他の値から大きく外れた値を外れ値とよびます。貯蓄分布の 5000 万は savings における外れ値といえます。データの種類によっては、測定ミスなどで不正なデータが外れ値として混入することもあります。そのような場合、平均値は大きな影響を受けますが、中央値は外れ値にほとんど影響されません。中央値は平均値に比べて不正データに対して頑強な統計値といえます。

statistics.median()

statistics.median() はデータの中央値 (メジアン) を返します。

# PYTHON_STATISTICS_MEDIAN

# In[1]

import statistics

data = [17, 25, 32, 49, 52, 54, 58, 67, 80, 91]

# dataの中央値は52と54の平均値
m = statistics.median(data)

print(m)
# 53.0

statistics.median_low()

statistics.median_low(x) は x の要素が奇数個であるとき、小さい順に数えて中央にくる値を返します。x の要素が偶数個であるときには、中央にある 2 値の小さい方を返します。

# PYTHON_STATISTICS_MEDIAN_LOW

# In[1]

import statistics

data = [3, 8, 15, 20, 29, 36]

median_low = statistics.median_low(data)

print("データの中央値: {:.1f}".format(median_low))
# データの中央値: 15.0

statistics.median_high()

statistics.median_high(x) は x の要素が奇数個であるとき、小さい順に数えて中央にくる値を返します。x の要素が偶数個であるときは、中央にある 2 値の大きい方を返します。

# PYTHON_STATISTICS_MEDIAN_HIGH

# In[1]

import statistics

data = [3, 8, 15, 20, 29, 36]

median_high = statistics.median_high(data)

print("データの中央値: {:.1f}".format(median_high))
# データの中央値: 20.0

numpy.median()

numpy.median() は指定軸に沿った中央値 (メジアン) を返します。

np.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)

axis に 0 を指定する、あるいは axis を省略すると、列ごとの中央値を返します。axis=1 ならば、行ごとの中央値を返します。

# NUMPY_MEDIAN

# In[1]

import numpy as np

x = np.array([[52, 88,  7],
              [96, 50, 11],
              [40, 51, 84],
              [32, 87, 40]])

# 列ごとの中央値
mean_0 = np.median(x, axis=0)

# 行ごとの中央値
mean_1 = np.median(x, axis=1)

print("列ごとの中央値: {}".format(mean_0))
print("行ごとの中央値: {}".format(mean_1))

# 列ごとの中央値: [46.  69.  25.5]
# 行ごとの中央値: [52. 50. 51. 40.]

keepdims に True を渡せば次元を保持します。

# In[2]

# 列ごとの中央値
mean_0 = np.median(x, axis=0, keepdims=True)

# 行ごとの中央値
mean_1 = np.median(x, axis=1, keepdims=True)

print("列ごとの中央値\n{}\n".format(mean_0))
print("行ごとの中央値\n{}".format(mean_1))

'''列ごとの中央値
[[46.  69.  25.5]]

行ごとの中央値
[[52.]
 [50.]
 [51.]
 [40.]]'''

コメント

  1. あとりえこばと より:

    【プログラミング日記】ドコモオンラインショップで iPhone を買いました。オンラインだと身分証明書とか手数料いらないから気楽ですね。それにしても、車の運転免許証とかマイナンバーカードをもってないと、色々な場面で不便だなと感じることはあります。
     ところで、マイナンバーカードって全然普及していないみたいですね。私みたいに手続きを面倒くさがる人が多いのかな。車の免許証があれば事足りるってだけの話かもしれないけど。
     まあとにかく、これで、私の IT 機器は PC, iPhone, iPad, ガラケーの 4 機となりました。iPhone と iPad の連携はとってもスムーズです (←当たり前だ)。Wi-Fi なくても、Bluetooth だけで気軽にデータを交換できます。本当は PC も Mac に換えたいんだけど、貧乏だから無理ですね。今使ってる Windows PC が壊れたら考えます。