Pythonで平均値、中央値、最頻値を計算する

データのサンプルを説明し要約しようとするとき、私たちはおそらくデータの平均(または平均値)、中央値、最頻値を見つけることから始めるでしょう。

これらは中心的な傾向の測定であり、しばしばデータ集合を最初に見ることになります。

このチュートリアルでは、Pythonで平均値、中央値、最頻値を求める方法について学びます。

まず、それぞれの指標に対してPythonの関数をコーディングし、次にPythonの statistics モジュールを使って同じタスクを実行します。

この知識があれば、データセットをざっと見て、データの一般的な傾向を把握することができるようになります。

サンプルの平均を計算する

数値の標本がある場合,その平均または平均は,数値(またはオブザベーション)の合計を数値の数で割ったものである.

例えば,サンプル [4, 8, 6, 5, 3, 2, 8, 9, 2, 5] があるとする.その平均は、次のような操作を行うことで計算できます。

(4 + 8 + 6 + 5 + 3 + 2 + 8 + 9 + 2 + 5) / 10 = 5.2

平均(算術平均)は、データの一般的な記述です。

例えば、トマトを10ポンド買ったとします。

家でトマトを数えると、25個のトマトが出てきます。

この場合、トマト1個の平均的な重さは0.4ポンドと言うことができます。

これは、トマトの良い説明となります。

平均は、データのサンプルの悪い説明にもなり得ます。

例えば、犬のグループを分析するとします。

すべての犬の累積重量を取り、犬の数で割ると、犬の品種によって大きさや重量が大きく異なるため、それはおそらく個々の犬の重量を記述するのに適していないでしょう。

平均値の良し悪しは、データがどの程度広がっているかによって決まります。

トマトの場合、1個1個の重さはほとんど同じで、平均値はそれらをよく表しています。

犬の場合、トピックのある犬はいません。

小さなチワワから巨大なジャーマン・マスティフまで、さまざまな種類があります。

だから、この場合は平均値単体では良い表現にならない。

さて、そろそろ行動に移し、Pythonを使って平均を計算する方法を学びましょう。

Pythonで平均を計算する

数値データのサンプルの平均を計算するために、Pythonの組み込み関数のうち2つを使用します。

1つは値の総和を計算するもので、もう1つはサンプルの長さを計算するものです。

最初の関数は sum() です。

この組み込み関数は数値の反復表を受け取り、その総和を返します。

2つ目の関数は len() です。

このビルトイン関数はオブジェクトの長さを返します。

len()` はシーケンス (string, bytes, tuple, list, or range) やコレクション (dictionary, set, or frozen set) を引数として受け取ることができます。

以下は、平均を計算する方法である。

>>> def my_mean(sample):
...     return sum(sample) / len(sample)
...


>>> my_mean([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
5.2


まず、 sample の値を sum() で合計します。

次に、その合計を sample の長さで割って、結果として len(sample) という値が得られます。

Pythonのmean()を利用する。

平均値の計算は一般的な操作なので、Pythonはこの機能を statistics モジュールに含んでいます。

これはデータセットに対して基本的な統計量を計算するためのいくつかの関数を提供します。

統計.mean()`関数は数値データのサンプル(任意の反復記号)を受け取り、その平均を返します。

Python の mean() がどのように動作するかは以下の通りです。

>>> import statistics


>>> statistics.mean([4, 8, 6, 5, 3, 2, 8, 9, 2, 5])
5.2


まず statistics モジュールをインポートし、サンプルを引数として mean() を呼び出します。

これはサンプルの平均値を返します。

これはPythonを使った平均を求める簡単な方法です。

サンプルの中央値を求める

数値データのサンプルの中央値とは、データをソートしたときに中央に位置する値のことである。

データは昇順または降順に並べ替えられますが、中央値は変わりません。

中央値を求めるには、次のような方法があります。

  1. サンプルの並べ替え
    1. 並べ替えられたサンプルの真ん中にある数値を探す

並べ替えられたサンプルの真ん中にある数値を探す場合、2種類の状況に直面する可能性があります。

    1. 標本が奇数のオブザベーションを持つ場合,並べ替えられた標本の中央の値は中央値である.
    1. 標本が偶数のオブザベーションを持つ場合,並べ替えられた標本の中央の2つの値の平均を計算する必要がある.

サンプル [3, 5, 1, 4, 2] があり、その中央値を求めたい場合、まずサンプルを [1, 2, 3, 4, 5] に並べ替えます。

中央値は真ん中の値なので、3になります。

一方,[1, 2, 3, 4, 5, 6]というサンプルがあれば,中央値は (3 + 4) / 2 = 3.5 となります.

では、Pythonを使って中央値を計算する方法を見てみましょう。

Pythonで中央値を求める

中央値を求めるには、まずサンプルの値をソートする必要があります。

これは組み込みの sorted() 関数を使って実現できます。

sorted()はイテラブルを受け取り、元のイテラブルと同じ値を含むソートされたlist` を返します。

第二段階は、ソートされたサンプルの真ん中にある値を見つけることです。

奇数オブザベーションのサンプルでその値を見つけるには、オブザベーションの数を 2 で割ります。

その結果が、ソートされたサンプルの中央にある値のインデックスになります。

除算演算子(/)は浮動小数点数を返すので、整数を得るには階差演算子(//)を使う必要があります。

そこで、インデックス演算([])でインデックスとして利用することができます。

サンプルに偶数のオブザベーションがある場合、真ん中の2つの値を見つける必要があります。

例えば、サンプル [1, 2, 3, 4, 5, 6] があるとします。

その長さ(6)を階乗分割で2で割ると、3になります。

これが真ん中より上の値(4)のインデックスになります。

真ん中より下の値 (3) を求めるには、真ん中より上の値のインデックスを1` だけ減らせばよいのです。

これらをまとめて、サンプルの中央値を計算する関数にしてみましょう。

以下は、その実装例である。

>>> def my_median(sample):
...     n = len(sample)
...     index = n // 2
...     # Sample with an odd number of observations
...     if n % 2:
...         return sorted(sample)[index]
...     # Sample with an even number of observations
...     return sum(sorted(sample)[index - 1:index + 1]) / 2
...


>>> my_median([3, 5, 1, 4, 2])
3


>>> my_median([3, 5, 1, 4, 2, 6])
3.5


この関数は数値のサンプルを受け取り、その中央値を返します。

まず、サンプルの長さ n を求めます。

次に、n2` で割って、中央値 (または中央より上の値) のインデックスを計算する。

if文では、手元のサンプルの観測値が奇数であるかどうかをチェックします。

もしそうであれば、中央値はindex` にある値となります。

最後の return は、サンプルのオブザベーション数が偶数である場合に実行されます。

その場合、中央の2つの値の平均を計算することで、中央値を求めます。

スライス操作 [index - 1:index + 1] は、2つの値を取得することに注意してください。

index – 1の値とindexの値です。

なぜなら、スライス演算は最終インデックス(index + 1`)の値を除外するからです。

Pythonのmedian()を利用する。

Python の statistics.median() はデータのサンプルを取って、その中央値を返します。

以下は、このメソッドがどのように動作するかです。

>>> import statistics


>>> statistics.median([3, 5, 1, 4, 2])
3


>>> statistics.median([3, 5, 1, 4, 2, 6])
3.5


median()` は、オブザベーションの数が奇数または偶数であるサンプルの中央値の計算を自動的に処理することに注意してください。

標本の最頻値を求める

最頻値は,標本の中で最も頻度の高いオブザベーション(またはオブザベーション)である.サンプル [4, 1, 2, 3, 5] があるとすると、その最頻値は 2 です。

なぜなら、 2 はサンプル中に2回現れるのに対して、他の要素は1回しか現れないからです。

モードは一意である必要はありません。

サンプルによってはモードが2つ以上あるものもあります。

例えば、[4, 1, 2, 2, 3, 5, 4]というサンプルがあるとします。

このサンプルにはモードが2つあります – 24 なぜなら、これらはより頻繁に現れる値であり、両方とも同じ回数だけ現れるからです。

モードはカテゴリカルデータによく使われます。

一般的なカテゴリカルデータの型は以下の通りです。

  • boolean – truefalsemalefemale のように2つの値のみを取ることができます。
  • 名目値 – American - European - Asian - African のように、2つ以上の値を取ることができます。
  • ordinal – 2つ以上の値を取ることができるが、値は few - some - many のように論理的な順序を持っている

カテゴリデータのデータセットを分析するとき、モードを使って、どのカテゴリがデータで最も一般的であるかを知ることができます。

最頻値を持たないサンプルを見つけることができる.すべてのオブザベーションがユニークであれば(繰り返されるオブザベーションがなければ)、そのサンプルは最頻値を持ちません。

最頻値についての基本がわかったので、Pythonを使ってどのようにそれを見つけることができるかを見てみましょう。

Pythonでモードを見つける

Pythonで最頻値を求めるには、まず手元のサンプルに含まれる各値の出現回数を数えます。

そして、出現回数がより多い値を取得します。

オブジェクトの数を数えるのは一般的な操作なので、Pythonは collections.Counter クラスを提供しています。

このクラスはオブジェクトの数を数えるために特別に設計されています。

Counterクラスは、.most_common([n])というメソッドを提供します。

このメソッドは、2 項目のタプルのうち、より共通性の高い要素nとその個数をlistとして返します。

n が省略された場合、または None の場合は、 .most_common() がすべての要素を返します。

ここでは、 Counter.most_common() を使って、データのサンプルを取得してそのモードを返す関数をコーディングしてみましょう。

以下は、可能な実装です。

>>> from collections import Counter


>>> def my_mode(sample):
...     c = Counter(sample)
...     return [k for k, v in c.items() if v == c.most_common(1)[0][1]]
...


>>> my_mode(["male", "male", "female", "male"])
['male']


>>> my_mode(["few", "few", "many", "some", "many"])
['few', 'many']


>>> my_mode([4, 1, 2, 2, 3, 5])
[2]


>>> my_mode([4, 1, 2, 2, 3, 5, 4])
[4, 2]


まず、 Counter オブジェクト (c) を使って sample に含まれるオブザベーションを数えます。

次に、リスト内包を使用して、サンプル中に同じ回数だけ現れるオブザベーションを含む list を作成します。

.most_common(1)(observation, count)という形のタプルを1つ持つlistを返すので、listのインデックス0にあるオブザベーションを取得し、ネストしたtupleのインデックス1の項目を取得する必要があります。

これは、c.most_common(1)[0][1]` という式で行うことができます。

この値が今回のサンプルの最初のモードです。

内包の条件は、各オブザベーションのカウント(v)と最も一般的なオブザベーションのカウント(c.most_common(1)[0][1])を比較することに注意してください。

これにより、マルチモードサンプルの場合、同じカウントを持つ複数のオブザベーション(k)を取得することができます。

Pythonのmode()を利用する。

Python の statistics.mode() は、ある data を受け取り、その (最初の) モードを返します。

どのように使うか見てみましょう。

>>> import statistics


>>> statistics.mode([4, 1, 2, 2, 3, 5])
2


>>> statistics.mode([4, 1, 2, 2, 3, 5, 4])
4


>>> st.mode(["few", "few", "many", "some", "many"])
'few'


シングルモードのサンプルでは、Pythonの mode() は最も一般的な値である 2 を返します。

しかし、次の2つの例では、 4few が返されました。

これらのサンプルでは、同じ回数だけ他の要素が出現していましたが、それらは含まれていませんでした。

Python 3.8 以降では、イテラブルを受け取ってモードの リスト を返す statistics.multimode() も利用することができます。

以下は multimode() の使い方の例です。

>>> import statistics


>>> statistics.multimode([4, 1, 2, 2, 3, 5, 4])
[4, 2]


>>> statistics.multimode(["few", "few", "many", "some", "many"])
['few', 'many']


>>> st.multimode([4, 1, 2, 2, 3, 5])
[2]


注意: この関数は、シングルモードのサンプルを渡した場合でも、常に list を返します。

結論

平均、中央値、最頻値は、データの中心的な傾向を理解しようとするとき、一般的にデータのサンプルを最初に見ることになります。

このチュートリアルでは、Pythonを使用して平均値、中央値、最頻値を求める方法を学びました。

まず、それらを計算するための独自の関数を作成する方法をステップバイステップでカバーし、次に、これらの指標を見つける素早い方法としてPythonの statistics モジュールを使用する方法を説明しました。

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