疑念は探究の動機であり、探究の唯一の目的は信念の確定である。

数学・論理学・哲学・語学のことを書きたいと思います。どんなことでも何かコメントいただけるとうれしいです。特に、勉学のことで間違いなどあったらご指摘いただけると幸いです。 よろしくお願いします。くりぃむのラジオを聴くこととパワポケ2が人生の唯一の楽しみです。

第2回: Pythonで中央値と平均値を求めるプログラムとグラフを作ってみた

 こんにちは。

どうも僕です。

今日はPythonで中央値と平均値を求めるプログラムを作ったのでそれをまとめます。さらにヒストグラムというグラフを図示する方法も書きたいと思います。ただ、こちらの方は不完全であることをはじめに言います。そして、ヒストグラムを通して中央値と平均値の性質を見ていきたいと思います。

f:id:yoheiwatanabe0606:20180720041227p:plain

中央値(median)を求めるプログラム 

 

 

f:id:yoheiwatanabe0606:20180730083711p:plain

平均値(mean)を求めるプログラム 

数学的知識:  中央値とは何か 

これから議論するのは中央値(median)と平均値(mean)です。平均値は馴染みのある概念ですので、説明は省略します。要は字義通り「平均の値」です。平均値を求めるためには全部の数を足して、それを数の個数で割れば求まります。

ここでは中央値を説明します。中央値とは与えられた数字のあつまりを小さい順に並べて、そのうちの真ん中の値のことです。

例えば、{X = ( 1, 4, 3 ) } という集まりがあったとします。この集まりの中にある数を小さい順に並べると、1, 3, 4となります。この列の中の真ん中の数字は3であるので、{X} の中央値は3となります。つまり、{\text{median}(X) = 3} です。

さらに、例えば、{Y = ( 1, 3, 5, 7, 9, 2, 4, 4, 4 )} という集まりがあるとします。このときもまず数字を小さい順に並べ替えます。すると、

1, 2, 3, 4, 4, 4, 5, 7, 9

となります。同じ数もそのまま並べます。この列の中の真ん中の数字は4であるので、{Y} の中央値は4となります。つまり、{\text{median}(Y) = 4} です。

 

ここで、Pythonの実装のため、0番目から数えることにします。すると、{X} の中央値は1番目にあり、{Y} の中央値は4番目にあります。これはそれぞれ {\frac{3-1}{2} = 1}{\frac{9-1}{2} = 4} で求まります。3は {X} の総数であり、9は {Y} の総数です。

一般に、奇数 {n} 個の集まりのとき、その中央値は {\frac{n - 1}{2}} 番目にあります。

 

 

さて、さきほどまで集まりの個数が奇数のときを考えていました。そのときはちょうど真ん中の数があります。ですが、集まりが偶数のときはそのような真ん中の数がありません。例えば、{Z = (1, 2, 3, 4)} という集まりを考えたとき、真ん中の数はありません。このときは、2と3を足して2で割ったものを中央値とします。2と3はそれぞれ1番目と2番目にあります。中央値として選ばれるのは1番目の数と2番目の数ですが、それらはそれぞれ {frac{4}{2} - 1 = 1} および {\frac{4}{2}} で求まります。ここで、4は {Z} の総数です。

以上より、{Z} の中央値は {2.5} となります。つまり、{\text{median}(Z) = \frac{2 + 3}{2} = 2.5} となります。

一般に、偶数 {n} 個の集まりのとき、その中央値は {\frac{n}{2} - 1} 番目と {\frac{n}{2}} 番目の数を足して2で割ったものです。

 

 

以上から、中央値の求める方法は次のようにおこなうことがわかります。

0) 数の集まり {X} が与えられている。

1) {X} を小さい順に並べ替える。それを {Y} とおく。

2) {X} の個数を調べる。それを {Z} とおく。ここで、並べ替えても個数は変わらないので {Y} の個数を調べてもよい。

3) もしも、{X} の個数が偶数ならば、つまり {Z} が2で割り切れるならば、{Y}{Z/2 - 1} 番目の数と {Z/2} 番目の数を取り出す。そしてそれらを足して、2で割ったものを求める。それが {X} の中央値である。

4) もしも、そうでないならば、つまり {X} の個数が奇数であるならば、{(Z - 1)/2} 番目の数を取り出す。それが {X} の中央値である。

 

 

あとはこのアルゴリズムをプログラム言語に書き換えればいいだけです。

 

 

 

中央値と平均値のプログラムに必要なPythonの知識

中央値を求めるプログラムに必要なPythonの知識 

中央値を求めるプログラムを理解するため、sortedとlenとリストの要素を抜き出す方法を説明します。

sorted

前節の1)からわかるように、まず、与えられたリストを並べ替えなければなりません。

リストを並べ替える操作はsortedというのを使います。次の例を見てください。

f:id:yoheiwatanabe0606:20180729181130p:plain

この例から分かるように、{\tt{x = (1, 3, 5, 2, 4, 9, 8, 1, 0)}} というリストに対して、{\tt{sorted(x)}} とすると、{\tt{(0, 1, 1, 2, 3, 4, 5, 8, 9)}} と小さい順に並べられた状態で返ってきます*1

 

len

次に前節の2)で示したように、リストの個数を調べます。それはlenという関数を使えばいいです。次の例を見てください。

f:id:yoheiwatanabe0606:20180730082100p:plain

これから分かるように、{\tt{len(x)}} は リスト {\tt{x}}の個数を数えて、それを表しています。

 

リストにある特定のもの(数字)を取り出す

最後にリストにある数字を取り出す方法を学びます。それはリスト {\tt{x}} にある {\tt{n}} 番目の数字を取り出すためには、{\tt{x}} [ {\tt{n}} ] とすればいいです。次を参照してください。

f:id:yoheiwatanabe0606:20180730082857p:plain

ただし、Pythonは0番目から始まるので注意してください。

 

 

以上で、中央値を求めるためのプログラムに必要なコマンドを説明しました。他のコマンドはすでに説明済みなので省略します。わからなかったらば、適宜Pythonに関する前記事を参照してください(まだ1つしかないけど)。

 

平均値を求めるプログラムに必要なPythonの知識

平均値を求めるのに必要なコマンドはsumだけです。 リストの要素を全て足すという関数です。以下を参照してください。

f:id:yoheiwatanabe0606:20180730083957p:plain

この {\tt{sum(x)}} をリストの個数 {\tt{len(x)}} で割れば、平均値は求まります。つまり、{\tt{mean(x) = sum(x)/len(x)}} です。

 

 

中央値と平均値のプログラム

以上より、中央値のプログラムは最初に示したようにできました。

f:id:yoheiwatanabe0606:20180730084820p:plain

解説すると、

1) {\tt{y}}{\tt{x}} の入れ替えたもの {\tt{sorted(x)}} を定義する。

2) {\tt{z}}{\tt{x}} の個数を定義する。

{\tt{w}}{\tt{x}} の個数を2で割ったうちの整数部分を定義する。例えば、{\tt{int(3.5) = 3}} であり、{\tt{int(3.0) = 3}} である。

3) もし、{\tt{x}} の個数が偶数ならば、{\tt{y}}{\tt{w-1}} 番目と {\tt{w}} 番目の数字を取り出す。つまり、{\tt{y}}[ {\tt{w-1}} ] と {\tt{y}}[ {\tt{w}} ] である。この数を足して2で割ったものを返せ。

4) もし、そうでないならば、つまり {\tt{x}} が奇数であるならば、{\tt{y}}{\tt{int}} [ {\tt{(z -1)/2}} ] 番目の数字を返せ。

ただし、{\tt{int}} [ {\tt{(z -1)/2}} ] となっているのは、リストにある特定の数を取り出すとき、取り出したい数は整数になっていなければならない。だから、{\tt{int}} を使っている。例えば、{\tt{z = 9}} のとき、{\tt{(z -1)/2 = (9-1)/2 = 8/2 = 4.0}} となる。したがって、もし {\tt{y}} [ {\tt{4.0}} ] とすると、エラーが表示される。次を参照。

f:id:yoheiwatanabe0606:20180730090936p:plain

これでプログラムは終了です。

 

 

中央値と平均値の関係

最後にオマケとして、中央値と平均値の関係を見ます。まず、中央値と平均値の差 {\tt{error(x)}} を定義します。 

f:id:yoheiwatanabe0606:20180720041344p:plain

 

 次の3つリストを定義します。個数はすべて20個です。

f:id:yoheiwatanabe0606:20180720041424p:plain

 

 それぞれのリストの中央値、平均値、差は次のようになります。

f:id:yoheiwatanabe0606:20180720041528p:plain

これだけではイメージできないのでヒストグラムにして図示化します。 本当はPythonによるヒストグラムの使い方も説明したかったのですが、省略します。

 

(1) まずは、{\tt{x1}}ヒストグラムです。

f:id:yoheiwatanabe0606:20180720042657p:plain

は中央値

は平均値

 

このとき、中央値と平均値が同じなので重なっています。{\tt{x1}} は対称的なデータの配置です。

 

(2) 次に、{\tt{x2}}ヒストグラムです。

f:id:yoheiwatanabe0606:20180720042732p:plain

は中央値

は平均値 

 

このとき、中央値 < 平均値です。{\tt{x2}} は小さなデータが集中しています。このようなデータの配置のとき、平均値は中央値より大きくなります。

 

(3) 最後に、{\tt{x3}}ヒストグラムです。

f:id:yoheiwatanabe0606:20180720042814p:plain

は中央値

は平均値 

このとき、平均値 < 中央値です。{\tt{x3}} は大きなデータが集中しています(偏っています)。このようなデータの配置のとき、平均値は中央値より小さくなります。

 

以上より、

(1) データが均等になっているときは、中央値と平均値はほとんど同じ

(2) データが小さい方に偏っているときは、中央値は平均値よりも小さい

(3) データが大きい方に偏っているときは、中央値は平均値よりも大きい

ということがわかります。

 

 

おわりに

これでおしまいです。

Pythonで中央値と平均値のプログラムとグラフを作りました。

平均値は簡単ですが中央値はリストの個数が偶数か奇数かで分ける必要がありました。しかし、それでも今回のプログラムは容易に書けます。ですが、かなり役に立つプログラムかと思います。

ヒストグラムの書き方を説明したかったですが、できなかったことが残念です。次回に書きたいと思います。

 

 

僕から以上

--------

plt. vlines(, xmax, xmin, colors = "", linestyle = "", label = "")

solid - 実線

dash -- 破線

dashdot -. 波点線

dotted : 点線

線の幅 linewidth, lw

floatで単位はpoint

*1:ここでリストの括弧を[ ]とせずに、( )としているのは便宜上です。はてなブログで[ ]をするとどういうわけだかちょっと誤作動が生じるためです。