ホーム テクノロジー 開発 非公開: Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?

Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?

平均、中央値、最頻値は統計の基本的なトピックです。外部ライブラリを使用してもしなくても、Python で簡単に計算できます。

これら 3 つが 中心傾向 の主な尺度です。中心傾向により、データセットの「正常」または「平均」値がわかります。データ サイエンスを始めたばかりの場合、これは最適なチュートリアルです。

平均値、中央値、最頻値の中心傾向の 3 つの測定値

このチュートリアルを終えると、次のことができるようになります。

  • 平均値、中央値、最頻値の概念を理解する
  • Python で独自の平均値、中央値、最頻値関数を作成できるようになります。
  • Python の 統計 モジュールを利用して、これらの測定値の使用をクイックスタートします。

次の演習のダウンロード可能なバージョンが必要な場合は、 GitHub リポジトリを自由にチェックしてください。

平均値、中央値、最頻値を計算するさまざまな方法を見てみましょう。

Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?
Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?

Python での平均の計算

平均 または算術平均は、中心傾向を示す尺度として最もよく使用されます。

中心傾向は一連のデータの典型的な値であることに注意してください。

データセットはデータのコレクションであるため、Python のデータセットは次の組み込みデータ構造のいずれかになります。

  • リスト、タプル、セット: オブジェクトのコレクション
  • 文字列: 文字のコレクション
  • ディクショナリ: キーと値のペアのコレクション

注: Python にはキューやスタックなどの他のデータ構造もありますが、ここでは組み込みのもののみを使用します。

データセットのすべての値を加算し、その結果を値の数で割ることで平均を計算できます。たとえば、次のような数値のリストがあるとします。

 [1, 2, 3, 4, 5, 6]

リストの合計は 21 で、長さは 6 であるため、平均は 3.5 になります。 21 を 6 で割った値は 3.5 です。この計算は、次の計算で実行できます。

 (1 + 2 + 3 + 4 + 5 + 6) / 6 = 21

このチュートリアルでは、バスケットボール チームの選手をサンプル データとして使用します。

カスタム平均関数の作成

まずはバスケットボールチームの選手の平均年齢を計算してみましょう。チーム名は「Pythonic Machines」となる。

 pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

def mean(dataset):
    return sum(dataset) / len(dataset)

print(mean(pythonic_machine_ages))

このコードを分解すると次のようになります。

  • 「pythonic_machine_ages」はバスケットボール選手の年齢のリストです。
  • 指定されたデータセットをその長さで割った合計を返す mean() 関数を定義します。
    • sum() 関数は、反復可能 (この場合はリスト) の値の (皮肉なことに) 合計を返します。データセットを引数として渡そうとすると、 211 が返されます。
    • len() 関数は反復可能の長さを返します。データセットを渡すと 8 が返されます。
  • バスケットボールチームの年齢を mean() 関数に渡し、結果を出力します。

出力を確認すると、次の結果が得られます。

 26.375
# Because 211 / 8 = 26.375

この出力は、バスケットボール チームの選手の平均年齢を表します。この数字はデータセットには表示されませんが、ほとんどのプレーヤーの年齢を正確に表していることに注目してください。

Python 統計モジュールからの means() の使用

中心傾向の尺度を計算することは、ほとんどの開発者にとって一般的な操作です。それは、 Python の統計 モジュールが、他の基本的な統計トピックとともに、統計を計算するためのさまざまな関数を提供しているためです。

これは Python 標準ライブラリ の一部であるため、PIP を使用して外部パッケージをインストールする必要はありません。

このモジュールの使用方法は次のとおりです。

 from statistics import mean

pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24]

print(mean(pythonic_machine_ages))

上記のコードでは、 統計 モジュールから mean() 関数をインポートし、データセットを引数として渡すだけです。これは、前のセクションで定義したカスタム関数と同じ結果を返します。

 26.375

これで、 平均の 概念が非常に明確になりました。 中央値の 測定を続けましょう。

Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?
Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?

Python で中央値を求める

中央 値は、並べ替えられたデータセットの 中央の値 です。これも、決定された 母集団 の「典型的な」値を提供するために使用されます。

プログラミングでは、シーケンスを 2 つの部分 (下位半分と上位半分) に分ける値として中央値を定義できます。

中央値を計算するには、まずデータセットを並べ替える必要があります。これは、ソートアルゴリズムまたは組み込み関数 sorted() を使用して行うことができます。 2 番目のステップは、データセットの長さが奇数か偶数かを判断することです。これに応じて、次のプロセスの一部が実行されます。

  • 奇数: 中央値はデータセットの中央値です
  • 偶数: 中央値は、中央の 2 つの値の合計を 2 で割ったものです。

バスケットボール チームのデータセットを続けて、選手の身長の中央値をセンチメートル単位で計算してみましょう。

 [181, 187, 196, 196, 198,  203, 207, 211, 215]
# Since the dataset is odd, we select the middle value
median = 198

ご覧のとおり、データセットの長さが奇数であるため、中央の値を中央値として取得できます。しかし、選手が引退したばかりの場合はどうなるのでしょうか?

データセットの中央の 2 つの値を使用して中央値を計算する必要があります。

 [181, 187, 196, 198, 203, 207, 211, 215] 
# We select the two middle values, and divide them by 2
median = (198 + 203) / 2
median = 200.5

カスタム中央値関数の作成

上記の概念を Python 関数に実装してみましょう。

データセットの中央値を取得するには、次の 3 つの手順に従う必要があることを思い出してください。

  • データセットを並べ替える: これは、 sorted() 関数で実行できます。
  • 奇数か偶数かを判断します。 これは、データセットの長さを取得し、モジュロ演算子 (%) を使用することで実行できます。
  • 各ケースに基づいて中央値を返します。
    • 奇数: 中間の値を返す
    • 偶数: 中央の 2 つの値の平均を返します。

その結果、次の関数が得られます。

 pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215]
after_retirement = [181, 187, 196, 198, 203, 207, 211, 215]

def median(dataset):
    data = sorted(dataset)
    index = len(data) // 2
    
    # If the dataset is odd  
    if len(dataset) % 2 != 0:
        return data[index]
    
    # If the dataset is even
    return (data[index - 1] + data[index]) / 2

データセットの結果を出力します。

 print(median(pythonic_machines_heights))
print(median(after_retirement))

出力:

 198
200.5

関数の開始時に、ソートされたデータベースを指す データ 変数を作成する方法に注目してください。上のリストはソートされていますが、再利用可能な関数を作成したいので、関数が呼び出されるたびにデータセットをソートします。

インデックス には、 整数除算 演算子を使用して、データセットの中央値 (または中央上部の値) が格納されます。たとえば、「pythonic_machine_heights」リストを渡す場合、その値は 4 になります。

Python のシーケンス インデックスは 0 から始まることに注意してください。これは、整数の除算を使用してリストの中央のインデックスを返すことができるためです。

次に、モジュロ演算の結果をゼロ以外の値と比較することで、データセットの長さが奇数かどうかを確認します。条件が true の場合、たとえば「pythonic_machine_heights」リストを含む中央の要素を返します。

 >>> pythonic_machine_heights[4]
# 198

一方、データセットが偶数の場合は、中央の値の合計を 2 で割った値を返します。 data[index -1] は データセットの下位中間点を提供し、 data[index] は 上位中間点を提供することに注意してください。

Python 統計モジュールからの median() の使用

この方法は、統計モジュールの既存の関数を使用しているため、はるかに簡単です。

個人的には、既に定義されているものがあれば、DRY (自分自身を繰り返さない) 原則 (この場合、他人のコードを繰り返さない) に基づいてそれを使用します。

次のコードを使用して、以前のデータセットの中央値を計算できます。

 from statistics import median

pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215]
after_retirement = [181, 187, 196, 198, 203, 207, 211, 215]

print(median(pythonic_machines_heights))
print(median(after_retirement))

出力:

 198
200.5
Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?
Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?

Python でのモードの計算

モードは、 データセット内で最も頻繁に使用される値です。これは学校の「人気のある」グループであり、すべての生徒の標準を表すものと考えることができます。

最頻値の例としては、テクノロジー ストアの毎日の売上が挙げられます。そのデータセットのモードは、特定の日に最も売れた製品になります。

 ['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']

ご覧のとおり、上記のデータセットのモードは「ラップトップ」です。これは、リスト内で最も頻繁に使用される値であるためです。

モードの優れた点は、データセットが数値であってはいけないことです。たとえば、文字列を操作できます。

別の日の売上を分析してみましょう。

 ['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']

上記のデータセットには、「マウス」と「ヘッドフォン」の 2 つのモードがあります。これは、どちらも周波数が 2 であるためです。これは、 マルチモーダル データセットであることを意味します。

以下のように、データセット内でモードが見つからない場合はどうすればよいでしょうか?

 ['usb', 'camera', 'smartphone', 'laptop', 'TV']

これは 一様分布 と呼ばれます。基本的に、データセットにモードが存在しないことを意味します。

これでモードの概念を簡単に理解できたので、Python で計算してみましょう。

カスタムモード関数の作成

値の頻度はキーと値のペア、つまり Python 辞書として考えることができます。

バスケットボールの例えを要約すると、1 試合あたりのポイントと一部のプレーヤーのスニーカー スポンサーシップという 2 つのデータセットを使用して作業できます。

モードを見つけるには、まずデータセットに存在する各値を使用して頻度辞書を作成し、次に最大頻度を取得して、その頻度を持つすべての要素を返す必要があります。

これをコードに変換してみましょう。

 points_per_game = [3, 15, 23, 42, 30, 10, 10, 12]
sponsorship = ['nike', 'adidas', 'nike', 'jordan',
               'jordan', 'rebook', 'under-armour', 'adidas']

def mode(dataset):
    frequency = {}

    for value in dataset:
        frequency[value] = frequency.get(value, 0) + 1

    most_frequent = max(frequency.values())

    modes = [key for key, value in frequency.items()
                      if value == most_frequent]

    return modes

2 つのリストを引数として渡して結果を確認します。

 print(mode(points_per_game))
print(mode(sponsorship))

出力:

 [10]
['nike', 'adidas', 'jordan']

ご覧のとおり、最初の print ステートメントは単一のモードを返しましたが、2 番目の print ステートメントは複数のモードを返しました。

上記のコードをさらに詳しく説明すると、次のようになります。

  • 周波数 辞書を宣言します
  • データセットを反復処理して、 ヒストグラム (一連のカウンター (または頻度) を表す統計用語) を作成します。
    • キーが辞書で見つかった場合は、値に 1 を追加します。
    • 見つからない場合は、値 1 のキーと値のペアを作成します。
  • most_frequent 変数には、皮肉なことに、頻度辞書の最大値 (キーではない) が格納されます。
  • 頻度 辞書内の最も頻度の高いすべてのキーで構成される モード 変数を返します。

読みやすいコードを書くために変数の名前付けがいかに重要であるかに注目してください。

Python 統計モジュールからの mode() と multimode() の使用

もう一度、統計モジュールは、基本的な統計操作を実行するための迅速な方法を提供します。

mode() multimode() という 2 つの関数を使用できます。

 from statistics import mode, multimode

points_per_game = [3, 15, 23, 42, 30, 10, 10, 12]
sponsorship = ['nike', 'adidas', 'nike', 'jordan',
               'jordan', 'rebook', 'under-armour', 'adidas']

上記のコードは両方の関数をインポートし、これまで扱ってきたデータセットを定義します。

ここに小さな違いがあります 。mode() 関数は最初に遭遇したモードを返しますが、 multimode() は データセット内で最も頻繁に使用される値のリストを返します。

したがって、定義したカスタム関数は実際には multimode() 関数であると言えます。
 print(mode(points_per_game))
print(mode(sponsorship))

出力:

 10
nike

注: Python 3.8 以降では、mode() 関数は最初に見つかったモードを返します。古いバージョンを使用している場合は、 StatisticsError が発生します。

multimode() 関数の使用:

 print(multimode(points_per_game))
print(multimode(sponsorship))

出力:

 [10]
['nike', 'adidas', 'jordan']

総括する

おめでとうございます !ここまで理解した場合は、主要な中心傾向の測定値である平均、中央値、最頻値を計算する方法を学習しました。

平均値、中央値、最頻値を求めるカスタム関数を定義できますが、統計モジュールは標準ライブラリの一部であり、使用を開始するために何もインストールする必要がないため、統計モジュールを使用することをお勧めします。

次に、Python によるデータ分析のわかりやすい入門書を読んでください。

「 Python で平均、中央値、最頻値を見つけるにはどうすればよいですか?」についてわかりやすく解説!絶対に観るべきベスト2動画

【こつこつPython】Pythonで配列の中央値を取得する方法|numpy.median
【毎日Python】Pythonで配列の平均を算出する方法|numpy.mean,nanmean