6  代表値

前章では,グラフを使ってデータの特徴を調べた.本章では,データを一つの値で要約する方法を学ぶ.

データの中心や,よく現れる値を表す統計量を代表値という.代表値には,平均値,中央値,最頻値などがある.何を知りたいかによって,使う代表値を考えることが大切である.全国の市区町村の人口を使った分析は,チャプター 9 で扱う.

6.1 8 月の最高気温

東京の 8 月は,どのくらい暑かったのだろうか.セクション 5.3 で使った 2025 年の日ごとの最高気温を,一つの値で表すことを考えよう.まずは 8 月 1 日から 7 日までの 7 日分で計算方法を確かめ,その後,8 月全体の 31 日分を調べる.

tokyo_daily.csv をダウンロードし,前章と同じ手順で Colab にアップロードする.このファイルは,気象庁の観測データを加工したものである.本章では,最高気温の列 temp_max_c を使い,観測値の小数第 1 位をそのまま残して計算する.本章のコードは,上から順に実行する.

import pandas as pd

daily = pd.read_csv("tokyo_daily.csv")
august = daily[daily["month"] == 8]
august[["date", "temp_max_c"]].head(7)
date temp_max_c
212 2025-08-01 30.1
213 2025-08-02 35.1
214 2025-08-03 36.1
215 2025-08-04 36.1
216 2025-08-05 36.6
217 2025-08-06 37.0
218 2025-08-07 32.8

データは日付の順に並んでいる.最高気温の列を取り出し,最初の 7 日分に week_max という名前を付ける.取り出した列は,pandas の Series である.

week_max = august["temp_max_c"].head(7)

この 7 日間について,三つの問いを考えてみよう.

知りたいこと 使う代表値
日最高気温は,平均すると何℃か 平均値
最高気温を低い順に並べたとき,中央の値は何℃か 中央値
最も多く記録された最高気温は何℃か 最頻値

ここで求める「日最高気温の平均値」は,毎日の最高気温を平均した値である.一日の平均気温を平均した「月平均気温」とは異なる.

6.2 平均値

平均値(mean)は,データの合計をデータの個数で割った値である.

n 個のデータ x_1, x_2, \ldots, x_n の平均値を \bar{x} と書くと,次の式で表せる.\bar{x} は「エックスバー」と読む.

\bar{x} = \frac{x_1 + x_2 + \cdots + x_n}{n} = \frac{1}{n} \sum_{i=1}^{n} x_i

\sum_{i=1}^{n} x_i は,x_1 から x_n までを足すことを表す.

例 6.1 8 月 1 日から 7 日までの最高気温は,日付の順に 30.1,35.1,36.1,36.1,36.6,37.0,32.8℃ である.平均値は次のようになる.

\bar{x} = \frac{30.1 + 35.1 + 36.1 + 36.1 + 36.6 + 37.0 + 32.8}{7} = \frac{243.8}{7} \approx 34.8

この 7 日間の日最高気温は,平均すると約 34.8℃ だったことになる.これは,毎日の最高気温が 34.8℃ だったという意味ではない.

Python では,Series の .mean() を使って平均値を計算できる.

mean_week_max = week_max.mean()
print("7日間の平均値(℃):", round(mean_week_max, 1))
7日間の平均値(℃): 34.8

round(値, 1) は,結果を小数第 1 位までに丸めて表示するために使っている.計算に使った元の観測値は変更していない.

平均値は,すべてのデータの値を使って計算する.そのため,一つの値が変わるだけでも,平均値は変化する.

ノート母平均と標本平均

調べたい対象全体を母集団,そこから取り出した一部を標本という.母集団の平均値を母平均,標本の平均値を標本平均と呼び,一般に母平均には \mu,標本平均には \bar{x} を使う.どちらも,対象となるデータの合計を個数で割って計算する.ただし,母集団のデータをすべて集められることは少ないため,母平均は標本平均から推定することが多い.本章では,手元にあるデータを要約することに注目する.

6.3 中央値

中央値(median)は,データを小さい順に並べたとき,中央の位置にある値である.データの個数が奇数か偶数かによって,求め方が異なる.

6.3.1 データの個数が奇数の場合

最初の 7 日分の最高気温を小さい順に並べると,次のようになる.単位は℃である.

30.1,\ 32.8,\ 35.1,\ \boxed{36.1},\ 36.1,\ 36.6,\ 37.0

中央は 4 番目なので,中央値は 36.1℃ である.

Python では,Series の .median() を使う.

median_week_max = week_max.median()
print("7日間の中央値(℃):", median_week_max)
7日間の中央値(℃): 36.1

6.3.2 データの個数が偶数の場合

8 月 8 日の最高気温 35.0℃ を加え,最初の 8 日分を小さい順に並べてみよう.

30.1,\ 32.8,\ 35.0,\ \boxed{35.1},\ \boxed{36.1},\ 36.1,\ 36.6,\ 37.0

中央に位置する値が二つあるため,その平均を中央値とする.この場合は,(35.1 + 36.1) / 2 = 35.6℃ である.中央値が,元のデータに含まれるとは限らない.

.head(8) で最初の 8 日分を取り出して確かめよう.

eight_days_max = august["temp_max_c"].head(8)
print("8日間の中央値(℃):", eight_days_max.median())
8日間の中央値(℃): 35.6

6.4 最頻値

最頻値(mode)は,データの中で最も多く現れる値である.モードとも呼ばれる.

最初の 7 日分の最高気温では,36.1℃ が 2 回現れ,ほかの値はそれぞれ 1 回ずつ現れる.したがって,最頻値は 36.1℃ である.最も多く現れる値ではあるが,7 日間の大半がこの気温だったわけではない.

Python では,Series の .mode() を使う.

print("7日間の最頻値(℃):")
print(week_max.mode())
7日間の最頻値(℃):
0    36.1
Name: temp_max_c, dtype: float64

.mean() や .median() と異なり,.mode() は結果を Series で返す.最頻値が一つとは限らないためである.この例の出力では,左側の 0 はインデックスであり,右側の 36.1 が最頻値である.

6.4.1 最頻値が複数ある場合

例えば,架空の 5 日間の最高気温が,28.0,28.0,30.0,30.0,31.0℃ だったとする.28.0℃ と 30.0℃ がともに 2 回現れるので,どちらも最頻値である.pd.Series() を使うと,リストから直接 Series を作れる.

example_max = pd.Series([28.0, 28.0, 30.0, 30.0, 31.0])
print(example_max.mode())
0    28.0
1    30.0
dtype: float64

6.4.2 カテゴリの最頻値

最頻値は,天気のようなカテゴリのデータにも使える.例えば,架空の 5 日間の天気を次のように記録したとする.

weather = pd.Series(["晴れ", "曇り", "晴れ", "雨", "晴れ"])
print(weather.mode())
0    晴れ
dtype: object

最頻値は,3 回現れる「晴れ」である.天気の名前には数値としての大小や差がないため,平均値を計算することはできないが,最も多く現れる天気は答えられる.

6.5 8 月全体の代表値を調べる

ここまでは少数のデータで計算方法を確かめた.次に,8 月全体の 31 日分を使って,平均値,中央値,最頻値を求めよう.

august_max = august["temp_max_c"]
mean_august_max = august_max.mean()
median_august_max = august_max.median()

print("日数:", len(august_max))
print("平均値(℃):", round(mean_august_max, 1))
print("中央値(℃):", median_august_max)
print("最頻値(℃):")
print(august_max.mode())
日数: 31
平均値(℃): 34.4
中央値(℃): 35.1
最頻値(℃):
0    35.1
Name: temp_max_c, dtype: float64

平均値は約 34.4℃,中央値は 35.1℃,最頻値も 35.1℃ となる.35.1℃ が記録されたのは 3 日である.最頻値は,ここで使った小数第 1 位までの記録について求めた値であり,気温を整数に丸めるなど,値のまとめ方を変えると結果も変わることがある.

6.5.1 グラフで確かめる

日ごとの最高気温を折れ線グラフにし,平均値と中央値を水平線で示してみよう.前章で使った plt.axhline() で線を引ける.

import matplotlib.pyplot as plt

plt.figure(figsize=(7, 4))
plt.plot(range(1, 32), august_max, marker="o", color="steelblue")
plt.axhline(mean_august_max, color="black", linestyle="--", label="Mean: 34.4")
plt.axhline(median_august_max, color="black", linestyle=":", label="Median: 35.1")
plt.xlabel("Day in August")
plt.ylabel("Maximum temperature (°C)")
plt.xticks([1, 5, 10, 15, 20, 25, 31])
plt.ylim(25, 40)
plt.legend()
plt.tight_layout()
plt.show()
8月1日から31日までの最高気温の折れ線グラフ.値は27.7℃から38.5℃まで変動し,平均値約34.4℃を破線,中央値35.1℃を点線で示している.
図 6.1: 東京の 8 月の日最高気温と代表値(2025 年).平均値は約 34.4℃,中央値は 35.1℃ である.

図 6.1 では,最高気温が日によって変わり,27.7℃ の日も 38.5℃ の日もあったことがわかる.代表値で全体を要約するとともに,グラフで個々の値を確認することも大切である.

6.6 平均値と中央値の比較

6.6.1 一つの大きな値が変わったら

8 月全体の平均値と中央値の差は約 0.7℃ だった.ここでは,一つの大きな値の影響を確かめるため,昼食代の簡単な例を考えよう.次の値は,ある学生の 7 日間の昼食代を表す架空のデータであり,単位は円である.

最後の日の昼食代が 2100 円から 3500 円に変わったとすると,平均値と中央値はどう変わるだろうか.実行する前に予想してみよう.

lunch_cost = pd.Series([500, 700, 400, 600, 500, 800, 2100])
more_expensive_lunch = pd.Series([500, 700, 400, 600, 500, 800, 3500])

print("変更前の平均値(円):", lunch_cost.mean())
print("変更後の平均値(円):", more_expensive_lunch.mean())
print("変更前の中央値(円):", lunch_cost.median())
print("変更後の中央値(円):", more_expensive_lunch.median())
変更前の平均値(円): 800.0
変更後の平均値(円): 1000.0
変更前の中央値(円): 600.0
変更後の中央値(円): 600.0

最後の日の昼食代を 2100 円から 3500 円に変えると,合計は 1400 円増える.平均値は 1400 / 7 = 200 円増えて,800 円から 1000 円になる.一方,中央の値は変わらず,中央値は 600 円のままである.

このように,平均値は一部の非常に大きな値や小さな値の影響を受けやすい.中央値は値の順序と中央の位置に注目するため,少数の極端な値の影響を受けにくい.ただし,平均値にも用途がある.例えば,この 7 日間の昼食代の合計は,平均値に 7 を掛けると求められる.何を知りたいかに合わせて代表値を選ぼう.

6.6.2 ほかの統計では

平均値が一部の大きな値に引き上げられることは,ほかの統計でもよく起こる.

例 6.2 (世帯の貯蓄現在高) 総務省統計局の家計調査では,世帯が持つ預貯金や生命保険(払い込んだ掛金の総額),株式などの合計額を「貯蓄現在高」として調べている.2025 年の二人以上の世帯について,貯蓄現在高の平均値と中央値は次のとおりである.どちらも,貯蓄現在高が 0 の世帯を含めて計算した値である.

代表値 貯蓄現在高
平均値 2059 万円
中央値 1167 万円

平均値は中央値より約 900 万円大きい.貯蓄現在高の少ない世帯が多い一方で,非常に多くの貯蓄を持つ世帯が一部にあり,それらの値が平均値を引き上げているためである.実際,平均値を下回る世帯は 66.1% と,約 3 分の 2 を占める.平均値だけを見て,多くの世帯が 2000 万円ほどの貯蓄を持っていると考えるのは誤りである.

出典:総務省統計局,家計調査報告(貯蓄・負債編)2025 年平均結果の概要.中央値の 1167 万円は,資料に参考値として示されている値である.資料で主に示されている「貯蓄保有世帯の中央値」1264 万円は,貯蓄現在高が 0 の世帯を除いて計算した値である.

貯蓄や所得のように,一部に非常に大きな値を含むデータでは,平均値と中央値の両方を確認しよう.

6.7 練習問題

練習 6.1 (9 月の最高気温を調べる) 同じ daily から,9 月の最高気温を取り出す.

september = daily[daily["month"] == 9]
september_max = september["temp_max_c"]
  1. 日数を確認し,平均値,中央値,最頻値を求めよ.最頻値はすべて答えること.
  2. 最高気温を小さい順に並べたとき,中央値は何番目と何番目の値から求められるか.
  3. 平均値と中央値を使って,8 月と 9 月の日最高気温の違いを説明せよ.ここで求めた平均値は,月平均気温と同じものか.

練習 6.2 (中央値を自分で計算する(発展)) チャプター 2 で学んだ関数の定義と条件分岐を使い,中央値を返す関数 my_median() を定義せよ.引数には,少なくとも一つの数値を含むリストを渡すものとする.

  1. sorted() で小さい順に並べたリストを作る.
  2. データの個数が奇数の場合は,中央の値を返す.
  3. 偶数の場合は,中央の二つの値の平均を返す.

ヒント:データの個数を n = len(data_sorted) とすると,n % 2 で 2 で割った余りを,n // 2 で 2 で割った整数の商を求められる.リストの位置は 0 から数えることに注意する.

def my_median(data):
    data_sorted = sorted(data)
    # ここにコードを書く

8 月の最初の 7 日分と 8 日分の最高気温で結果を確かめよ.week_max.tolist(),eight_days_max.tolist() とすると,Series をリストに変換できる.pandas の .median() とも比較すること.

6.8 まとめ

  • 平均値は合計を個数で割った値であり,すべての値の影響を受ける.
  • 中央値は小さい順に並べたときの中央を表し,少数の極端な値の影響を受けにくい.
  • 最頻値は最も多く現れる値である.複数ある場合もあり,カテゴリのデータにも使える.
  • pandas の Series では,.mean(),.median(),.mode() で代表値を求められる.
  • 何を知りたいかに合わせて代表値を選び,グラフも使ってデータの分布を確認する.

8 月の日最高気温の中央値は 35.1℃ だったが,代表値だけでは,日ごとの値がどのくらい散らばっているかはわからない.次章では,同じ 31 日分の気温を使い,中央値から四分位数へと考え方を広げ,データのばらつきを学ぶ.

ヒントpandas の集計方法を調べる

pandas の公式ドキュメントには,mean(),median(),mode() の説明と使用例がある.