Pythonで平均、中央値、最頻値を見つける方法は?

公開: 2021-06-22

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

これらの3つは、中心傾向の主な指標です。 中心傾向により、データセットの「通常」または「平均」値を知ることができます。 データサイエンスを始めたばかりの場合、これはあなたにぴったりのチュートリアルです。

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

このチュートリアルの終わりまでに、次のようになります。

  • 平均、中央値、最頻値の概念を理解する
  • Pythonで独自の平均、中央値、最頻値関数を作成できる
  • Pythonの統計モジュールを利用して、これらの測定値の使用をすばやく開始します

次の演習のダウンロード可能なバージョンが必要な場合は、GitHubリポジトリを確認してください。

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

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

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

カスタム平均関数の作成

バスケットボールチームの選手の平均(平均)年齢を計算することから始めましょう。 チームの名前は「PythonicMachines」になります。

 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統計モジュールのmean()を使用する

中心傾向の測定値を計算することは、ほとんどの開発者にとって一般的な操作です。 これは、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で中央値を見つける

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

プログラミングでは、中央値を、シーケンスを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のシーケンスでは、インデックスはゼロから始まることに注意してください。これは、整数除算でリストの中央のインデックスを返すことができるためです。

次に、モジュロ演算の結果をゼロ以外の値と比較することにより、データセットの長さが奇数かどうかを確認します。 条件が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でモードを計算する

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

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

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

ご存知のように、上記のデータセットのモードは、リストで最も頻繁に使用される値であるため、「ラップトップ」です。

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

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

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

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

以下のようなデータセットでモードが見つからない場合はどうなりますか?

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

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

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

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

値の頻度は、キーと値のペア、つまりPythonディクショナリと考えることができます。

バスケットボールの例えを要約すると、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番目のステートメントは複数のモードを返しました。

上記のコードをより深く説明します:

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

読み取り可能なコードを書くために変数の命名がいかに重要であるかに注意してください。

Python Statistic Moduleの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でのデータ分析のわかりやすい紹介を読んでください。