統計などでデータを分析するために、pythonで平均を計算したいことがありますよね。
今回はpyhtonで平均を計算する方法を4つ紹介します。
それどれの計算方法にメリット・デメリットがあり、状況に応じて使い分けることがベストですが、パッと計算したいのであればsum() / len()、それ以外はnumpy.mean()がおすすめです。
sum() / len() はライブラリーのインストールやインポートが不要なのですぐに使うことができます。numpy.mean()はインストールが必要ですが、グーグルコラボラトリーのようなサービスにはすでにインストールされてますし、オプション機能で詳しく計算できます。
pythonで平均を計算する方法4つ

表にそれぞれの計算方法の特徴をまとめました。どの計算方法にもメリットとデメリットがあるので、目的に合った計算方法を選びましょう。
sum() / len() | statistics.mean() | numpy.mean() | numpy.average() | |
---|---|---|---|---|
メリット | すぐ実行可能 | 平均の計算と一目でわかり、導入が簡単 | 行列の計算が可能 | 加重平均の計算が可能 |
デメリット | 高度な計算ができない | 行列などの計算はできない | ライブラリのインストールが必要 | ライブラリのインストールが必要 |
この記事で記載しているコードは全て、グーグルコラボラトリーで記述・動作の確認をしています。
関数を使用しないで平均を算出: sum() / len()

特に前準備が必要なく平均を計算する方法がsum() / len() です。pythonを起動したらすぐに使用できます。
4人のテストの平均点を計算してみましょう。
score = [51, 70, 35, 90]
ave = sum(score) / len(score)
print(ave)
出力: 61.5
この記述方法は算数の平均をそのままpython用に書き直した形になります。
python標準ライブラリで平均を計算: statistics.mean()

pythonに標準でインストールされているライブラリ、statisticsのstatics.mean()を用いることで平均を算出できます。statistics.mean()を使うためには、最初statisticsをインポートする必要があります。
先ほどと同様、4人のテストの平均点を算出します。
import statistics
score = [51, 70, 35, 90]
print(statistics.mean(score))
出力: 61.5
エクセルでいうAVERAGE関数のように一目見て平均を計算していることがわかります。
行列の平均を計算: numpy.mean()

サードパーティライブラリのnumpyをインストールして平均を計算することも可能です。
numpyは数値計算を効率的に行うために作られたもので、ベクトルや行列などの多次元配列の計算記述を簡単にしてくれます。そのためnumpy.mean()を用いれば、行列の平均を計算することが可能です。
numpy.mean()を使うためにはpythonにnumpyをインストール、インポートする必要があります。pythonの環境構築は初心者が挫折するポイントの1つです。
グーグルコラボラトリーはgoogleがデータ分析に必要な環境を構築してくれいるので使うことをオススメします。
4人の生徒が3教科のテストを受けて次のような点数になったとします。
科目 | Aさん | Bさん | Cさん | Dさん |
国語 | 51 | 70 | 35 | 90 |
数学 | 21 | 0 | 55 | 50 |
英語 | 14 | 74 | 23 | 67 |
教科や人ごとに区別せず、前テストの平均を求めたい場合、次のようになります。
# 事前準備:pythonにnumpyをインストールする
import numpy as np
score = np.array([[51, 70, 35, 90],
[21, 0, 55, 50],
[14, 74, 23, 67]])
mean_all = np.mean(score)
rm_all = round(mean_all, 1) # 小数点第二位を四捨五入
print(rm_all)
出力: 45.8
表の計算をする場合、行毎または列毎に平均を計算したいこともありますよね。そんな時はオプション機能を使いましょう。numpy.mean()にはオプション4つがあります。
オプション名 | 指定できる型 | 内容 |
---|---|---|
axis | None、intまたはintのタプル | 計算する行もしくは列を指定します。特に指定しない場合、全体の平均が計算されます。 |
dtype | データ型 | 計算に使用するデータの型を指定します。デフォルトでfloat64が設定されています。 |
out | ndarray | 結果の配列を指定します。基本は入力と同じ型で出力されます。 |
keepdims | bool(TrueかFalse) | これが True に設定されている場合、縮小された軸はサイズ 1 の次元として結果に残されます。 |
先ほどの表で、生徒ごとの平均点数をaxisオプションを使って計算してみます。
# 事前準備:pythonにnumpyをインストールする
import numpy as np
np.set_printoptions(precision=1, floatmode='fixed') # 小数点第二位で四捨五入, 必要なら0を表示する
score = np.array([[51, 70, 35, 90],
[21, 0, 55, 50],
[14, 74, 23, 67]])
mean_stu = np.mean(score, axis=0) # 生徒ごと(列ごと)に平均を計算
print(mean_stu)
出力: [28.7 48.0 37.7 69.0]
次は教科ごとの平均点数を計算してみましょう。
# 事前準備:pythonにnumpyをインストールする
import numpy as np
np.set_printoptions(precision=1, floatmode='fixed') # 小数点第二位で四捨五入, 0を表示する
score = np.array([[51, 70, 35, 90],
[21, 0, 55, 50],
[14, 74, 23, 67]])
mean_sub = np.mean(score, axis=1) # 教科ごと(行ごと)に平均を計算
print(mean_sub)
出力: [61.5 31.5 44.5]
このようにオプションを活用することで、計算を工夫することができます。
加重平均を計算できる: numpy.average()

numpy.average()の使い方はnumpy.mean()と同じになります。1点違う点はnumpy.average()はオプションで加重平均を計算できることです。
加重平均とは、各値の重要度を考慮して算出した平均のことを言います。
numpy.average()のオプションを表にまとめました。
オプション名 | 指定できる型 | 内容 |
---|---|---|
axis | None、intまたはintのタプル | 計算する行もしくは列を指定します。特に指定しない場合、全体の平均が計算されます。 |
weight | ndarray | 要素につける重み(重要度)を設定します。この割り当てられる値が大きいほどその要素の平均に対して及ぼす影響が大きくなります。 |
returned | bool(TrueかFalse) | 値を返す際に平均のみを返すか、平均と重みの合計をタプルの形で返すか指定できます。Trueでタプルの形になります。 |
keepdims | bool(TrueかFalse) | これが True に設定されている場合、縮小された軸はサイズ 1 の次元として結果に残されます。 |
numpy.mean()で教科ごとの平均を調べたところ、数学の平均点が一番低いことが分かりましたね。数学の点数がいい人に評価を加点して上げたいとします。
そこで数学に重みを置いて生徒の加重平均を出します。重みの指定は入力した配列と同様にする必要があります。
# 事前準備:pythonにnumpyをインストールする
import numpy as np
np.set_printoptions(precision=1, floatmode='fixed') # 小数点第二位で四捨五入, 0を表示する
score = np.array([[51, 70, 35, 90],
[21, 0, 55, 50],
[14, 74, 23, 67]])
# 数学に重みを持たせる準備
weights = np.array([[1, 1, 1, 1],
[5, 5, 5, 5],
[1, 1, 1, 1]])
print(np.average(score, axis=0, weights = weights)) #生徒ごとの平均と重みのオプション
出力: [24.3 20.6 47.6 58.1]
数学の点数が高かったCさんの平均点が上がり、他の3人の平均点が下がりました。これが加重平均になります。
まとめ
今回はpythonで平均を計算する方法を4つ紹介しました。
どれが一番いいというものはなく、状況に応じてそれぞれの計算方法を使い分ける必要があります。
軽い計算をパパッとしたい場合にはsum() / len()、それ以外の場合はnumpy.mean()がおすすめです。
よくある質問
- 平均と中央値は何が違うのですか?
-
平均は「値の総和をその個数で割ったもの」です。対して中央値は「すべての値を小さい順に並べて、その真ん中の値」になります。よく平均年収の問題が取り上げられます。
- numpyを使いたいけど、環境構築ができるか不安です…
-
グーグルコラボラトリーを活用しましょう。Googleアカウントがあれば、機械学習用に環境が構築されたpythonを無料で使用できます。
- pythonについてもっと勉強したいです!
-
pythonを勉強するには書籍・動画・プログラミングスクールなどがあります。特にUdemyは有料ですが、pythonを勉強できる動画がたくさんあるのでおすすめです。
コメント