【Python入門】平均の求め方を初心者向けにわかりやすく解説
はじめに
皆さんは、Pythonで数値データを扱う際に「平均値」を求める場面が多々あるのではないでしょうか。
たとえば業務で売上データを扱ったり、プログラミング学習の一環でリストの合計や平均を計算したりする機会が出てくるかもしれません。
数字を分析するときは、単純な合計値や最大値・最小値だけでは見えてこない全体の傾向を知りたい場合があります。
こうしたときにまず検討されるのが平均値であり、Pythonでも簡単に計算することができます。
初心者の方にとっては「平均を求めるにはどうすればいいんだろう?」と感じることもあるかもしれません。
そこでこの記事では、Pythonで平均値を算出する方法を具体的なコード例とともにわかりやすく解説します。
リストの合計値と要素数から計算する基礎的な方法から、組み込みライブラリの statistics
、さらにはNumPyやPandasなどを活用する方法まで順番に説明していきます。
実務での活用シーンをイメージしながら、実際に使う上でのポイントもまじえますので、初心者の方でも安心して学べるでしょう。
この記事を読むとわかること
- 平均値の基本的な考え方
- Pythonで平均を求める複数の方法
- 組み込みライブラリやNumPy、Pandasを使った応用的な手法
- 実務との関連例や注意点
これらのポイントを一通り理解することで、Pythonでの数値データを扱う際に困りにくくなります。
それでは順番に見ていきましょう。
平均とは何か?
平均は、複数の数値があるときにそれらを総合的に評価する目安として用いられます。
代表的には「合計を値の個数で割る」という計算方法で求められますが、実際の現場では、単純平均だけではなく、加重平均や中央値などを組み合わせて検討するケースも多いです。
しかし、まずはシンプルな平均を正しく計算できるようになることが大切ですね。
たとえば売上データを扱う場合、1日ごとの売上金額がリストで与えられているとします。
月間で30日分の売上があれば、その合計金額を30で割ることで1日あたりの平均売上を求められます。
あるいは、アクセスログのデータを扱うときに「一定期間のアクセス数の平均」を求めることもよくあります。
いずれも平均の概念を正しく理解し、Pythonで適切な方法で計算すれば、データの傾向をつかみやすくなるでしょう。
実務においては、平均値を出したあとに「どの程度ばらつきがあるのか」を見るために分散や標準偏差を計算することもよくあります。
それらを計算するときの第一歩として、平均の求め方をしっかりマスターしておくとスムーズに応用できるようになります。
Pythonで平均を求める基本的な方法
Pythonで平均を計算する最も基本的な方法は、リストの合計値を求め、その合計値を要素数で割るやり方です。
たとえば numbers = [10, 20, 30, 40, 50]
といったリストがある場合、 sum(numbers)
で合計を取得し、 len(numbers)
で要素数を取得し、その結果を割り算すると平均が求まります。
numbers = [10, 20, 30, 40, 50] average = sum(numbers) / len(numbers) print(average) # 30.0
ここで sum(numbers)
は 150 となり、要素数は 5 です。
よって 150 / 5 = 30.0 という結果が得られます。
Pythonでは割り算をするときに「/」演算子を使うため、整数同士の割り算であっても結果は浮動小数点になります。
この性質をうまく利用すると、わざわざ小数点を付与するための変換を気にしなくていいので便利です。
業務でいきなり膨大なリストを扱うケースもあるかもしれません。
しかし、基本的な考え方は同じです。
例えば売上金額を表すリストがあれば sum()
と len()
を使えば問題なく平均値を算出できます。
ただし、リストの中に文字列が混じっているなどデータが不正確な場合はエラーになり得るので、事前にデータの型をチェックしておく必要があります。
Pythonのリストに数値以外のデータ型が混ざっているとエラーの原因になります。
作業前にデータが正しく数値型でそろっているか確認してから処理を行いましょう。
statisticsモジュールで平均を求める方法
標準ライブラリの中にあるstatisticsモジュールを使うと、もう少し簡潔に平均値を求めることができます。
「毎回 sum()
と len()
を書くのが少し面倒」「分散や標準偏差なども計算したい」という場合には便利です。
statistics.meanの使い方
statisticsモジュールには mean()
という関数が用意されています。
これを使えば、リストを渡すだけで平均値が取得できます。
import statistics numbers = [10, 20, 30, 40, 50] average = statistics.mean(numbers) print(average) # 30
単純な平均値を求めたいだけであれば、実際には sum(numbers) / len(numbers)
と大きく違うわけではありませんが、分散や中央値を求める variance()
, median()
などもまとめて扱えるのがメリットです。
初心者の方にも扱いやすいため、統計系の処理が増えてきたら積極的に活用してもよいでしょう。
実務シーンとの関連
実務シーンでは、ログデータやセンサー情報の平均値・標準偏差を同時に分析するケースがあります。
ログデータの大きさが1万件、10万件と膨らむことも考えられますが、それでもまずは平均値を確認し、大きな異常がないかをざっくりと把握する流れが一般的です。
平均値の後に標準偏差や分散を計算することで、全体的にばらつきが激しいのか、比較的まとまっているのかを判断できるでしょう。
そうしたフローを1つのモジュールで完結できるのは分かりやすさにもつながります。
NumPyを使った平均の求め方
NumPyは、数値計算を効率的に行うためのライブラリで、大規模な配列や行列を取り扱いやすい機能が豊富に用意されています。
もしデータ量が大きく、速度やメモリ面で少しでも効率を上げたいなら、NumPyを検討するのも良い選択肢です。
NumPyの基本的な書き方
NumPyには、配列を扱うためのndarrayという型が用意されています。
PythonのリストをNumPyの配列として読み込むには numpy.array()
を使い、平均を求めるときは numpy.mean()
を使うことが多いです。
import numpy as np numbers = [10, 20, 30, 40, 50] arr = np.array(numbers) average = np.mean(arr) print(average) # 30.0
このようにリストを np.array()
でNumPy配列に変換した上で np.mean()
を呼び出すだけでOKです。
mean()
の引数で軸(axis)を指定することで、多次元データの平均を行や列ごとに計算する、といった柔軟な処理が可能になります。
大量のデータを扱うときのポイント
NumPyはC言語などで実装されたルーチンを内部的に活用しているため、純粋なPythonのリスト操作より高速に処理できることが多いです。
大量の数値データを扱うプロジェクトで平均値を計算する場合には、NumPyの恩恵を受けやすいでしょう。
ただし、NumPyを導入するには追加でライブラリをインストールする必要がありますので、そこはプロジェクトの要件を確認してから進めてください。
Pandasを使った平均の求め方
Pandasは、表形式のデータを扱いやすいライブラリです。
CSVファイルやExcelファイルなどからデータを読み込み、そのデータをDataFrameという形式で処理します。
「ある列の値だけ抽出して平均を求めたい」「グループごとに分けて平均を出したい」など、より実務的なシーンで役立ちます。
基本的な例
たとえばCSVファイルから読み込んだDataFrameがある場合、特定の列に対して平均を計算するには mean()
メソッドを使います。
import pandas as pd # 簡単な例としてリストをDataFrameに変換 data = { "id": [1, 2, 3, 4, 5], "score": [10, 20, 30, 40, 50] } df = pd.DataFrame(data) average_score = df["score"].mean() print(average_score) # 30.0
DataFrameの列に対して df["score"]
のようにアクセスし、それに対して mean()
を呼び出しています。
この書き方はとてもシンプルで、列名が分かりやすいので実務でも重宝されます。
表形式の大きなデータを扱う場合でも、一度DataFrameにしてしまえば列単位での集計が簡単になるでしょう。
グループごとの平均
Pandasでは groupby()
を活用することで、グループごとの平均を求めることができます。
たとえば部署ごとに集計したい、製品カテゴリごとに売上の平均を算出したい場合などが典型的です。
import pandas as pd data = { "department": ["A", "A", "B", "B", "B"], "sales": [100, 200, 150, 120, 180] } df = pd.DataFrame(data) grouped_df = df.groupby("department")["sales"].mean() print(grouped_df)
ここでは、department列をキーとしてグループ化し、それぞれのsales列の平均を求めています。
結果は、AグループとBグループそれぞれの平均売上が表示されます。
このように、Pandasは表形式の操作に特化しており、平均以外にも合計や最大値、最小値を簡単に求めることができるのが強みです。
リストや辞書などのデータ構造の活用例
平均を求めるにあたって、基本はリスト(配列)を使うことが多いですが、辞書型を活用するシーンもあるかもしれません。
辞書型は {キー: 値}
のペアを保持するデータ構造なので、いくつか工夫をすることで必要な情報の平均を計算できます。
リスト以外の活用例
以下のように辞書型に複数の数値を保持している場合、values() で値をリストのように取り出し、それに対して合計と要素数を取得すれば平均を出せます。
scores = { "person1": 70, "person2": 80, "person3": 90 } values = scores.values() # [70, 80, 90] average = sum(values) / len(values) print(average) # 80.0
この例ではキーが個人名(person1など)で、値が各個人の得点になっています。
こうした辞書型の構造になっていても、いったん値のリストを取り出してしまえば平均の計算ロジックは変わりません。
企業の管理画面で「ユーザーごとの売上合計」をまとめた辞書から平均を出したい場合などでも活用できるでしょう。
加重平均や条件付き平均などの発展例
単純な平均だけではなく、重み付けを行う「加重平均」や、特定の条件を満たすデータだけを抽出した平均をとる「条件付き平均」が求められるケースもあります。
実務では「商品カテゴリごとの売上を合算しつつ、そのカテゴリの比率を考慮した平均を取りたい」といった要望が出ることもあるでしょう。
加重平均の例
加重平均は、たとえば科目ごとの単位数に応じて成績を重み付けして平均点を出すケースなどが分かりやすいかもしれません。
import numpy as np scores = np.array([70, 80, 90]) weights = np.array([2, 1, 3]) # 科目ごとの重み weighted_average = np.average(scores, weights=weights) print(weighted_average)
ここでは np.average()
を使うと、第二引数に重みを指定できるため、加重平均を求めることができます。
加重平均は、各値に対して違う影響度を割り当てる場合に便利です。
条件付き平均の例
条件付き平均は、その名のとおり「特定の条件に合致するデータだけに絞って平均を計算する」やり方です。
Pandasであれば、条件に合った行だけフィルタリングしてから mean()
を呼び出すのが自然です。
import pandas as pd data = { "product": ["A", "B", "C", "A", "C"], "price": [100, 200, 300, 150, 350] } df = pd.DataFrame(data) # 商品がAの行だけ抽出して平均を求める filtered_df = df[df["product"] == "A"] average_price = filtered_df["price"].mean() print(average_price)
このように、DataFrameならシンプルに条件式を使ってフィルタリングができ、対象となる行が限定されます。
実務上、複数の条件を組み合わせることも多いですが、それも df[(df["product"] == "A") & (df["price"] > 120)]
のように書けばOKです。
あとは、抽出した結果に対して mean()
を使うだけなので、Pythonでの条件付き平均を素直に表現できます。
さまざまなシーンでの平均の使い分け
平均値を計算するメソッドは、ここまで紹介したように数多く存在します。
「リストの合計 / len()」で十分な場合もあれば、statisticsモジュールで統計関連の計算をまとめたいケース、NumPyやPandasなど大型ライブラリを駆使して大規模データをサクサク処理したいケースなど、使い分けのポイントはいろいろです。
規模の小さいデータ
小規模なデータで、単純に平均を出したいだけなら sum()
と len()
で十分なことが多いです。
特にプログラミング初心者の方は、この基本ロジックで計算の仕組みをしっかり身につけることが大切です。
統計処理をまとめて行いたい場合
平均だけでなく、標準偏差や中央値を合わせて扱うのであれば、統計処理に特化したライブラリを検討しましょう。
標準ライブラリの statistics
はインポートするだけですぐ使えます。
また統計学習や研究寄りのプロジェクトなら、NumPyやPandas以外にもScipyなどのライブラリを視野に入れても良いかもしれません。
ただし、この記事では詳細には触れません。
大規模データの分析
大量のデータを扱うプロジェクトで平均を計算する場合は、NumPyやPandasのようなライブラリの活用が一般的です。
配列の操作や集計関数が最適化されているため、単純なPythonリストで for
ループを回す方法よりも高いパフォーマンスを得られる場合が多いです。
実務で気をつけたいポイント
ここでは、Pythonを使って平均を求める際によくある落とし穴や注意点を挙げてみます。
実際に開発や分析の現場で遭遇する可能性があるので、チェックしておくと良いでしょう。
データの欠損値
データの中に欠損値(NaN)が含まれていると、単純な合計や statistics.mean()
ではエラーや意図しない結果になることがあります。
PandasやNumPyでは、欠損値を除外して平均を求める機能もあるので、欠損値の処理方法をあらかじめ決めておくのがおすすめです。
型が混在している
リストの中に文字列やNoneなど、数値以外の型が含まれていると計算ができません。
事前にデータの型をそろえておくか、フィルタリングをしてから平均を求めるのが基本的な対策です。
0除算
もし何らかの理由で要素数が0になってしまうと、合計を割る段階でエラーが発生します。
たとえばデータをフィルタリングして0件になってしまう場合などが考えられます。
平均を計算する前に要素数が0でないことをチェックするようにすると安全です。
外れ値や異常値に対する対処
平均値は1つの極端な数値(外れ値)によって大きく影響を受ける性質があります。
すべての値をまるごと平均に含めるのか、それとも外れ値を除外するのかをケースバイケースで検討する必要があります。
たとえば売上データに1億円という極端に大きい値が混ざっていると、本来の平均がわかりにくくなるでしょう。
実務での利用例:売上分析
ここで、架空の売上データを使った簡単な分析例を考えてみましょう。
下記のように、sales_data.csv
というファイルに日ごとの売上金額が記録されているとします。
date,sales 2023-01-01,100 2023-01-02,150 2023-01-03,130 2023-01-04,200 2023-01-05,0 2023-01-06,180 2023-01-07,160
このデータをPandasで読み込み、平均を求める場合は以下のようになります。
import pandas as pd df = pd.read_csv("sales_data.csv") average_sales = df["sales"].mean() print(average_sales)
このように、列名を指定して mean()
を使うだけで一日の平均売上を簡単に算出できます。
もしデータ量が増えて数万行あっても、プログラム自体は同じコードで処理できる点は非常に助かるところです。
また、月ごとに集計した平均を出したいときは、日付列を月単位にグループ化して mean()
をかけることも可能です。
実務での利用例:センサー情報の分析
製造業やIoTの分野ではセンサーデータを扱うことがあります。
気温や湿度、圧力などが時系列で記録されていれば、それらの平均を見て日ごとのトレンドを把握するケースが多いです。
センサー計測でノイズが多いときは、単純平均でなく中央値を検討することもありますが、まずは平均を確認して全体像を把握するのが基本的な流れでしょう。
NumPyを使えば、センサー値の大規模な配列に対して np.mean()
を呼び出すだけで結果を得られます。
また、欠損が混じっている場合には np.isnan()
を活用してフィルタリングするなど、データの前処理との組み合わせが大切です。
Pythonで平均をとる際のパフォーマンスについて
「単なる平均計算」であればPythonそのものの速度で十分なケースがほとんどです。
ただし、リストが数千万件におよぶようなスケールになれば、何らかの高速化手段や分散処理の導入を検討しなければならないでしょう。
NumPyやPandasは内部でC/C++の実装を利用しており、同じPythonコードでも高速に動くことが多いです。
一方で、もっと大規模なデータをリアルタイムで集計するような状況では、分散処理フレームワークを導入したり、部分的にCythonやPyPy、さらにはマルチプロセス化などの選択が検討されることもあります。
しかしながら、多くの初学者の方や中規模データの現場においては、NumPyとPandasをしっかり押さえておけば過不足なく運用できる場合が多いでしょう。
まとめ
Pythonで平均を求める方法は、多種多様です。
小規模なら sum()
と len()
のシンプルな手法でOKですし、標準ライブラリの statistics.mean()
もわかりやすい選択肢でしょう。
さらに大規模なデータや高度な分析を行う場合は、NumPyやPandasといったライブラリを活用すると便利です。
それぞれの特徴を理解し、実務で扱うデータ量や分析内容に応じて使い分けると良いですね。
たくさんの数値を扱うプロジェクトでは、まず平均を求めてデータの概況をつかむことが多いです。
そこから分散や標準偏差、さらに条件付き平均や加重平均などに発展させることで、より深い理解や異常検知につなげられるでしょう。
今回の記事が、皆さんがPythonで平均値を扱う際の入門として少しでも参考になれば幸いです。
以上がPythonで平均を求める際の基本的な考え方と活用例になります。
初心者の方でも使いやすい方法から始めて、必要に応じて高度なライブラリを使いこなしていきましょう。
ぜひ実際のコードを書きながら、リストやDataFrameに対していろいろ試してみてください。