📊 ステップ12: 平均値を計算しよう
データの代表値を理解しよう!
ステップ11では、Python基礎の総復習をしました。今回からは、いよいよデータ分析の世界に入ります。まずは最も基本的な統計量である「平均値」について学びましょう。
📖 このステップで学ぶこと
・平均値とは何か
・Pythonで平均値を計算する方法
・sum()関数とlen()関数の使い方
・実際のデータで平均を計算する方法
・平均値を使うときの注意点
学習時間の目安: 2〜2.5時間
🎯 1. 平均値とは何か?
まず、「平均値」という言葉の意味を確認しましょう。
🔰 平均値の基本的な意味
平均値(へいきんち)とは、たくさんあるデータを、1つの値で代表させたものです。英語では「mean(ミーン)」または「average(アベレージ)」と言います。
📌 平均値を使う理由
例えば、10人分のテストの点数があったとします:
85点、92点、78点、95点、88点、76点、90点、84点、89点、91点
10個の数字を全部見るのは大変ですよね。
でも「平均点は86.8点」と言えば、クラス全体の成績が一目でわかります。
これが平均値の便利なところです!
📝 平均値の計算方法
平均値の計算方法は、とてもシンプルです。
📝 平均値の計算式
平均値 = データの合計 ÷ データの個数
つまり、「全部足して、個数で割る」だけです。
具体的な例で見てみましょう。
💡 計算例:5人のテストの平均点
データ: 80点、90点、70点、85点、75点(5人分)
ステップ1:全部足す
80 + 90 + 70 + 85 + 75 = 400
ステップ2:個数で割る
400 ÷ 5 = 80
答え: 平均点は 80点
📘 日常生活での平均値
平均値は、日常のあちこちで使われています。
📌 身近な平均値の例
| 場面 | 何の平均? | 何がわかる? |
| テストの平均点 | クラス全員の点数 | クラス全体の成績レベル |
| 平均気温 | 1日・1ヶ月の気温 | その期間の暑さ・寒さ |
| 平均年収 | 働く人の収入 | 収入水準の目安 |
| 平均売上 | 毎日の売上 | お店の業績 |
🔢 2. Pythonで平均値を計算する
手計算で平均を求めるのは大変です。Pythonを使えば、どんなに多いデータでも一瞬で計算できます。
🔰 平均計算に使う2つの関数
Pythonで平均値を計算するには、2つの便利な関数を組み合わせます。
📌 覚えておきたい2つの関数
| 関数 | 役割 | 使い方 |
| sum() | リストの中身を全部足す | sum([1, 2, 3]) → 6 |
| len() | リストの要素数を数える | len([1, 2, 3]) → 3 |
📝 ステップ1:sum()で合計を計算する
sum()関数は、リストの中の数字を全部足し算してくれます。
コード:sum()で合計を計算
# 数字のリストを作成
numbers = [10, 20, 30, 40, 50]
# sum()関数で合計を計算
total = sum(numbers)
# 結果を表示
print(f"リスト: {numbers}")
print(f"合計: {total}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
リスト: [10, 20, 30, 40, 50] 合計: 150
💡 コードの解説
numbers = [10, 20, 30, 40, 50]
・数字が入ったリストを作成しています
total = sum(numbers)
・sum()関数にリストを渡すと、中身を全部足します
・10 + 20 + 30 + 40 + 50 = 150
・結果の150がtotalに入ります
📝 ステップ2:len()でデータの個数を数える
len()関数は、リストに何個のデータが入っているかを教えてくれます。
コード:len()で個数を数える
# 数字のリストを作成
numbers = [10, 20, 30, 40, 50]
# len()関数で個数を数える
count = len(numbers)
# 結果を表示
print(f"リスト: {numbers}")
print(f"個数: {count}個")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
リスト: [10, 20, 30, 40, 50] 個数: 5個
💡 コードの解説
count = len(numbers)
・len()関数にリストを渡すと、要素の数を返します
・numbersには5個の数字が入っているので、5が返ります
・lenは「length(長さ)」の略です
📝 ステップ3:平均値を計算する
合計と個数がわかったら、割り算するだけで平均値が出ます!
コード:平均値を計算(ステップごと)
# 数字のリストを作成
numbers = [10, 20, 30, 40, 50]
# ステップ1:合計を計算
total = sum(numbers)
print(f"合計: {total}")
# ステップ2:個数を数える
count = len(numbers)
print(f"個数: {count}")
# ステップ3:平均を計算(合計 ÷ 個数)
average = total / count
print(f"平均: {average}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
合計: 150 個数: 5 平均: 30.0
💡 コードの解説
average = total / count
・total(合計150)をcount(個数5)で割ります
・150 ÷ 5 = 30.0
・Pythonの割り算は結果が小数になります(30ではなく30.0)
📘 1行でシンプルに書く
慣れてきたら、1行でまとめて書くこともできます。
コード:1行で平均を計算
# 数字のリスト
numbers = [10, 20, 30, 40, 50]
# 1行で平均を計算
average = sum(numbers) / len(numbers)
print(f"平均: {average}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
平均: 30.0
📝 平均値の書き方まとめ
average = sum(リスト) / len(リスト)
この1行を覚えておけば、どんなリストでも平均が計算できます!
📈 3. 実際のデータで平均を計算してみよう
ここからは、より実践的な例で平均値を計算してみましょう。
📘 例1:テストの平均点を計算する
10人分のテストの点数から、平均点を計算してみます。
コード:テストの平均点
# 10人分のテストの点数
scores = [85, 92, 78, 95, 88, 76, 90, 84, 89, 91]
# 平均点を計算
average = sum(scores) / len(scores)
# 結果を表示
print(f"テストの点数: {scores}")
print(f"人数: {len(scores)}人")
print(f"合計点: {sum(scores)}点")
print(f"平均点: {average}点")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
テストの点数: [85, 92, 78, 95, 88, 76, 90, 84, 89, 91] 人数: 10人 合計点: 868点 平均点: 86.8点
💡 ポイント
10個の点数を1つ1つ見るより、「平均86.8点」と言った方が、
クラス全体の成績がすぐに理解できます。
これが平均値の便利なところです!
📘 例2:月別売上の平均を計算する
お店の1年間の売上データから、月平均を計算してみましょう。
コード:月別売上の平均
# 1月〜12月の売上(万円)
monthly_sales = [120, 135, 142, 158, 165, 172,
180, 175, 168, 162, 155, 190]
# 平均売上を計算
average_sales = sum(monthly_sales) / len(monthly_sales)
# 結果を表示
print(f"年間合計: {sum(monthly_sales)}万円")
print(f"月数: {len(monthly_sales)}ヶ月")
print(f"月平均売上: {average_sales:.1f}万円")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
年間合計: 1922万円 月数: 12ヶ月 月平均売上: 160.2万円
💡 {average_sales:.1f} の意味
:.1f は「小数点以下1桁まで表示」という指定です。
・160.166666… → 160.2 のように見やすく表示されます
・:.2f なら小数点以下2桁まで表示されます
📘 例3:目標と比較する
平均値を計算したら、目標と比較することで評価ができます。
コード:目標との比較
# 月別売上データ(万円)
monthly_sales = [120, 135, 142, 158, 165, 172,
180, 175, 168, 162, 155, 190]
# 平均売上を計算
average_sales = sum(monthly_sales) / len(monthly_sales)
# 目標を設定
target = 160
# 結果を表示
print(f"月平均売上: {average_sales:.1f}万円")
print(f"目標: {target}万円")
print()
# if文で判定
if average_sales >= target:
print("✅ 目標達成!おめでとうございます!")
else:
diff = target - average_sales
print(f"❌ 目標未達成(あと{diff:.1f}万円)")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
月平均売上: 160.2万円 目標: 160万円 ✅ 目標達成!おめでとうございます!
📘 例4:辞書データから平均を計算する
辞書(dictionary)に入っているデータから平均を計算することもできます。
コード:辞書から平均を計算
# 生徒と点数の辞書
scores = {
"太郎": 85,
"花子": 92,
"次郎": 78,
"三郎": 88
}
# 辞書の値(点数)だけを取り出して平均を計算
average = sum(scores.values()) / len(scores)
# 結果を表示
print("【成績一覧】")
for name, score in scores.items():
print(f"{name}: {score}点")
print(f"\n平均点: {average:.1f}点")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【成績一覧】 太郎: 85点 花子: 92点 次郎: 78点 三郎: 88点 平均点: 85.8点
💡 scores.values() の意味
辞書.values()は、辞書の値だけを取り出します。
・scores.values() → [85, 92, 78, 88] を返す
・キー(名前)は含まれません
・sum()やlen()と組み合わせて平均が計算できます
🔧 4. 平均を計算する関数を作ろう
何度も平均を計算する場合は、関数にしておくと便利です。
🔰 基本の平均関数
コード:平均値を計算する関数
def calculate_average(data):
"""
リストの平均値を計算して返す関数
引数:
data: 数値のリスト
戻り値:
平均値(データがない場合は0)
"""
# データがない場合のチェック
if len(data) == 0:
return 0
# 平均を計算して返す
return sum(data) / len(data)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 各部分の解説
def calculate_average(data):
・calculate_averageという名前の関数を定義
・dataという引数でリストを受け取ります
if len(data) == 0:
・データが空の場合をチェック
・空のリストで割り算するとエラーになるため
return sum(data) / len(data)
・平均値を計算して、呼び出し元に返します
📘 関数を使ってみよう
コード:関数を使って平均を計算
# 平均値を計算する関数
def calculate_average(data):
if len(data) == 0:
return 0
return sum(data) / len(data)
# --- ここから関数を使う ---
# テストの点数
test_scores = [85, 92, 78, 95, 88]
avg = calculate_average(test_scores)
print(f"テストの平均点: {avg}点")
# 売上データ
sales = [120000, 150000, 98000, 135000, 142000]
avg_sales = calculate_average(sales)
print(f"平均売上: {avg_sales:,.0f}円")
# 体温データ
temps = [36.5, 36.3, 36.7, 36.4, 36.6]
avg_temp = calculate_average(temps)
print(f"平均体温: {avg_temp:.2f}℃")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
テストの平均点: 87.6点 平均売上: 129,000円 平均体温: 36.50℃
💡 関数を作るメリット
・同じコードを何度も書かなくて済む
・コードが読みやすくなる
・エラーチェック(空のリスト対策)を毎回書かなくて済む
⚠️ 5. 平均値の注意点
平均値はとても便利ですが、使うときに気をつけることがあります。
🔰 注意点1:外れ値の影響
外れ値(はずれち)とは、他のデータから極端に離れた値のことです。
平均値は、外れ値の影響を受けやすいという特徴があります。
コード:外れ値の影響を確認
# 通常のデータ
normal_data = [20, 22, 21, 23, 22, 21, 20]
avg_normal = sum(normal_data) / len(normal_data)
print(f"通常データ: {normal_data}")
print(f"平均: {avg_normal:.1f}")
print()
# 外れ値が含まれるデータ(100が外れ値)
with_outlier = [20, 22, 21, 23, 22, 21, 100]
avg_outlier = sum(with_outlier) / len(with_outlier)
print(f"外れ値あり: {with_outlier}")
print(f"平均: {avg_outlier:.1f}")
print()
print(f"平均の差: {avg_outlier - avg_normal:.1f}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
通常データ: [20, 22, 21, 23, 22, 21, 20] 平均: 21.3 外れ値あり: [20, 22, 21, 23, 22, 21, 100] 平均: 32.7 平均の差: 11.4
⚠️ 外れ値の影響
1つの値が100に変わっただけで、平均が21.3 → 32.7と大きく変化しました!
外れ値の例:
・年収:1人の大富豪が平均を引き上げる
・気温:異常気象の日が含まれる
・売上:特別なイベントの日が含まれる
外れ値がある場合は、中央値も一緒に見ると良いです(次のステップで学習)。
🔰 注意点2:0で割るエラー
空のリストで平均を計算しようとすると、エラーが発生します。
⚠️ エラーが発生するケース
# 空のリスト
empty_list = []
# これはエラーになる!
average = sum(empty_list) / len(empty_list) # ZeroDivisionError!
エラー内容:
ZeroDivisionError: division by zero(0で割ることはできません)
sum([]) は 0、len([]) も 0 なので、0 ÷ 0 になってしまいます。
このエラーを防ぐには、事前にチェックする必要があります。
コード:安全に平均を計算する関数
def safe_average(data):
"""安全に平均を計算する関数"""
# データがない場合のチェック
if len(data) == 0:
print("データがありません")
return None
return sum(data) / len(data)
# テスト1:空のリスト
empty_list = []
result = safe_average(empty_list)
print(f"結果: {result}")
print()
# テスト2:データがある場合
numbers = [10, 20, 30]
result = safe_average(numbers)
print(f"結果: {result}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
データがありません 結果: None 結果: 20.0
📊 6. グループ別の平均を比較する
データ分析では、複数のグループの平均を比較することがよくあります。
📘 例1:店舗別の平均売上
コード:店舗別平均売上の比較
# 店舗別売上データ(万円)
stores = {
"東京店": [150, 165, 142, 158, 172],
"大阪店": [120, 135, 128, 142, 138],
"名古屋店": [98, 105, 112, 108, 115]
}
print("【店舗別平均売上】")
# 各店舗の平均を計算して表示
for store, sales in stores.items():
avg = sum(sales) / len(sales)
print(f"{store}: {avg:.1f}万円")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【店舗別平均売上】 東京店: 157.4万円 大阪店: 132.6万円 名古屋店: 107.6万円
📘 例2:最優秀店舗を見つける
コード:最も平均が高い店舗を見つける
# 店舗別売上データ(万円)
stores = {
"東京店": [150, 165, 142, 158, 172],
"大阪店": [120, 135, 128, 142, 138],
"名古屋店": [98, 105, 112, 108, 115]
}
# 各店舗の平均を計算して辞書に格納
store_averages = {}
for store, sales in stores.items():
store_averages[store] = sum(sales) / len(sales)
print("【店舗別平均売上】")
for store, avg in store_averages.items():
print(f"{store}: {avg:.1f}万円")
# 最も平均が高い店舗を見つける
best_store = max(store_averages, key=store_averages.get)
print(f"\n🏆 最優秀店舗: {best_store} ({store_averages[best_store]:.1f}万円)")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【店舗別平均売上】 東京店: 157.4万円 大阪店: 132.6万円 名古屋店: 107.6万円 🏆 最優秀店舗: 東京店 (157.4万円)
💡 max()関数の使い方
max(store_averages, key=store_averages.get)
・辞書の中で最大の値を持つキーを返します
・key=store_averages.get は「値を基準に比較する」という指定
・これにより、最も平均売上が高い店舗名が取得できます
📝 練習問題
ここまで学んだことを、実際に手を動かして確認しましょう。
問題1:基本の平均計算(初級)
📋 問題
リスト [12, 18, 15, 20, 16, 14, 19] の平均値を計算してください。
解答例を見る
コード
numbers = [12, 18, 15, 20, 16, 14, 19]
average = sum(numbers) / len(numbers)
print(f"データ: {numbers}")
print(f"平均値: {average:.1f}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
データ: [12, 18, 15, 20, 16, 14, 19] 平均値: 16.3
問題2:平均との差を計算する(初級)
📋 問題
リスト [80, 85, 90, 75, 95] の平均を計算し、各要素が平均からどれだけ離れているかを表示してください。
解答例を見る
コード
scores = [80, 85, 90, 75, 95]
# 平均を計算
average = sum(scores) / len(scores)
print(f"平均点: {average}点")
print()
# 各点数と平均の差を計算
for score in scores:
diff = score - average
print(f"{score}点: 平均との差 {diff:+.0f}点")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
平均点: 85.0点 80点: 平均との差 -5点 85点: 平均との差 +0点 90点: 平均との差 +5点 75点: 平均との差 -10点 95点: 平均との差 +10点
💡 {:+.0f} の意味
・+ はプラス記号を表示する指定です
・正の数には + が、負の数には – が表示されます
問題3:辞書から平均を計算(中級)
📋 問題
辞書 {“1月”: 18.5, “2月”: 19.2, “3月”: 22.1} から、平均気温を計算してください。
解答例を見る
コード
temperatures = {"1月": 18.5, "2月": 19.2, "3月": 22.1}
# 辞書の値だけを取り出して平均を計算
avg_temp = sum(temperatures.values()) / len(temperatures)
print("【月別気温】")
for month, temp in temperatures.items():
print(f"{month}: {temp}℃")
print(f"\n平均気温: {avg_temp:.1f}℃")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【月別気温】 1月: 18.5℃ 2月: 19.2℃ 3月: 22.1℃ 平均気温: 19.9℃
問題4:合格判定(中級)
📋 問題
生徒の3科目の点数が辞書で与えられています。平均が60点以上なら「合格」、未満なら「不合格」と表示する関数を作成してください。
例:{“数学”: 70, “英語”: 55, “国語”: 65}
解答例を見る
コード
def judge_pass(scores):
"""合格判定を行う関数"""
# 平均を計算
avg = sum(scores.values()) / len(scores)
# 成績を表示
print("【成績】")
for subject, score in scores.items():
print(f"{subject}: {score}点")
print(f"\n平均点: {avg:.1f}点")
# 判定
if avg >= 60:
print("判定: ✅ 合格")
else:
print("判定: ❌ 不合格")
# テスト1
student1 = {"数学": 70, "英語": 55, "国語": 65}
judge_pass(student1)
print("\n" + "="*30 + "\n")
# テスト2
student2 = {"数学": 55, "英語": 50, "国語": 58}
judge_pass(student2)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【成績】 数学: 70点 英語: 55点 国語: 65点 平均点: 63.3点 判定: ✅ 合格 ============================== 【成績】 数学: 55点 英語: 50点 国語: 58点 平均点: 54.3点 判定: ❌ 不合格
問題5:カテゴリ別平均(上級)
📋 問題
商品データのリストから、カテゴリ別の平均価格を計算してください。
データ例:[{“category”: “食品”, “price”: 300}, {“category”: “電子機器”, “price”: 15000}, …]
解答例を見る
コード
products = [
{"category": "食品", "price": 300},
{"category": "電子機器", "price": 15000},
{"category": "食品", "price": 500},
{"category": "衣類", "price": 3000},
{"category": "電子機器", "price": 25000},
{"category": "食品", "price": 400},
{"category": "衣類", "price": 5000}
]
# カテゴリ別に価格を集める
category_prices = {}
for product in products:
category = product["category"]
price = product["price"]
if category not in category_prices:
category_prices[category] = []
category_prices[category].append(price)
# カテゴリ別平均を計算
print("【カテゴリ別平均価格】")
for category, prices in category_prices.items():
avg = sum(prices) / len(prices)
print(f"{category}: {avg:,.0f}円 (商品数: {len(prices)})")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【カテゴリ別平均価格】 食品: 400円 (商品数: 3) 電子機器: 20,000円 (商品数: 2) 衣類: 4,000円 (商品数: 2)
🎯 このステップのまとめ
✅ 学んだこと
✓ 平均値はデータの代表値を表す
✓ 平均値 = 合計 ÷ 個数
✓ sum()関数でリストの合計を計算
✓ len()関数でリストの要素数を取得
✓ average = sum(リスト) / len(リスト) で平均が計算できる
✓ 平均値は外れ値の影響を受けやすい
✓ 空のリストではエラーチェックが必要
✓ グループ別の平均を比較できる
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ 平均値の意味を説明できる
□ sum()とlen()を使って平均を計算できる
□ 辞書のデータから平均を計算できる
□ 外れ値の影響を理解している
□ グループ別の平均を計算できる
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: 平均値と中央値の違いは何ですか?
A: 平均値は全ての値を足して個数で割ったもの。中央値はデータを並べたときの真ん中の値です。中央値は次のステップで学習します。外れ値がある場合は、中央値の方が適切なこともあります。
Q2: 小数点以下の桁数はどう決めますか?
A: データの種類によります。点数なら小数第1位まで、金額なら整数、温度なら小数第1〜2位が一般的です。f-stringの:.1f(1桁)や:.2f(2桁)で調整できます。
Q3: データ数が0の場合はどうしますか?
A: 0で割るとエラーになるので、必ずデータ数をチェックしましょう。if len(data) == 0: でチェックし、Noneを返すか、エラーメッセージを表示します。
Q4: 統計ライブラリを使った方が良いですか?
A: NumPyやPandasなどのライブラリにはmean()メソッドがあり便利です。このコースの後半で学習します。今は基本を理解するために、sum()とlen()で計算しています。
Q5: 重み付き平均とは何ですか?
A: 各データに重み(重要度)をつけた平均です。例えば、中間テスト30%、期末テスト70%のように重みをつける場合に使います。通常の平均とは計算方法が異なり、より高度な内容なので、このコースでは基本の平均に集中しましょう。
学習メモ
Pythonデータ分析入門 - Step 12