PythonでExcelの数値の列の平均・中央値・ばらつきをまとめて確かめる手順|describeで分布を見る
Excelの売上などの数値の列の件数・平均・中央値・ばらつきを、pandasのdescribeで1つの表にまとめる手順を解説します。平均と中央値の差から打ち間違いを見つける読み方と、中央値の行が消えるなどのつまずきを、架空の明細で試して紹介します。
目次
この記事でわかること
- 数の列の件数・平均・中央値・ばらつきを、1つの表にまとめて見る方法
- 平均と中央値が大きく離れたときに、打ち間違いを疑う読み方
- 10%や90%など、見たい位置の値を変える方法と、そのときの注意
- 文字が混ざった列や、店舗の列も結果に入れる方法
売上の明細を集計して報告する前に、数字に打ち間違いや空欄がないかを確かめたいことがあります。列を1つずつ並べ替えて目で見ていくと、列や行が増えるほど手間がかかります。この記事では、pandasのdescribeで、数の列ごとの件数・平均・中央値・最小・最大を1つの表にまとめ、集計の前に分布を確かめる手順を紹介します。
よりどころは、pandas 3.1.0の公式の資料のうち、DataFrame.describeとpandas.to_numericのページです。どちらも2026年11月1日に原文を読みました。例に出てくる店舗・数量・売上・値引きは、試すために作った架空の明細です。
先に結論: describeで数の列をまとめ、平均と中央値の差を見る
読み込んだ表にdescribe()を付けると、数の列ごとに、件数・平均・標準偏差・最小・25%・50%・75%・最大が1つの表になります。 平均が中央値(50%)から大きく離れていたら、極端に大きい値や小さい値が混ざっていないかを確かめます。結果の表の行は、次の意味です。
| 行の名前 | 意味 | 試した表の売上 |
|---|---|---|
| count | 空欄を除いた件数 | 9 |
| mean | 平均 | 155,666.7 |
| std | 標準偏差(ばらつきの目安) | 309,365.1 |
| min・max | 最小・最大 | 31,000・980,000 |
| 25%・50%・75% | 小さい順に並べたときの位置の値 | 48,000・53,000・62,000 |
describeのしくみ
pandasの資料では、describeは列ごとの分布の中心・ばらつき・形をまとめるもので、NaN(空欄)の値は除いて計算するとしています。初期の設定では、数の列だけが対象になります。
数の列の結果には、count・mean・std・min・maxと、求めた位置の値が入ります。位置の値は、何も指定しなければ25%・50%・75%で、50%は中央値と同じです。ほかの位置を見たいときは、percentilesに0から1までの数のリストを渡します。
文字の列も見たいときは、include="all"を渡します。文字の列には、件数(count)・値の種類の数(unique)・いちばん多い値(top)・その回数(freq)が入ります。
手順: 売上の明細の分布をまとめて確かめる
次のコードは、架空の売上の明細 sales.xlsx(店舗・数量・売上・値引きの4列)を読み、数の列の分布をまとめた表を画面に出してから、sales_summary.xlsx に保存します。sales.xlsx は読むだけで、書き換えません。
import pandas as pd
detail = pd.read_excel("sales.xlsx") # 元の明細は読むだけ
summary = detail.describe() # 数の列ごとに、件数・平均・中央値などをまとめる
print(summary.round(1))
summary.to_excel("sales_summary.xlsx") # まとめた表を別のファイルに残す
pandasのほかに、xlsxを読み書きするopenpyxlを入れておきます。round(1)は画面に出すときだけ小数を1けたにそろえるもので、保存する表の値は丸めていません。
試した結果
架空の明細(10行)で動かしました。売上の列には、空欄を1つと、98000のつもりで1けた多く打った980000を入れています。値引きの列には、数のほかに「なし」という文字が1つ入っています。
- 売上のcountは9で、空欄の行は数えられませんでした
- 売上の平均は155,666.7、中央値(50%)は53,000で、平均が中央値の約3倍になりました。最大の980,000が平均を押し上げています
- 結果に出たのは数量と売上の2列だけで、店舗と値引きの列は入りませんでした
- sales_summary.xlsx には、A列にcountからmaxまでの行の名前が、B列とC列に数量と売上の値が入りました
- 元の sales.xlsx のハッシュ値は、実行の前後で同じでした
使ったのは、Mac の作業PCのPython 3.12.15と、pandas 3.1.0・openpyxl 3.1.5です。保存したファイルはopenpyxlで読み直して確かめ、Excelのアプリでは開いていません。
自分で直すか、相談するかの判断
目安は、「飛び抜けた値が、打ち間違いだと元の伝票や記録で確かめられるか」です。980000のように、元の記録と照らして正しい値が分かるなら、明細を直してからもう一度まとめます。
大口の注文のように、本当にあった値かもしれないときは、自分の判断で消したり直したりしません。平均ではなく中央値で報告するか、その行を分けて示すかを、表を使う人と相談して決めます。
つまずきやすいところ
- 数の列なのに結果に出ない: 値引きの列は、「なし」という文字が1つ混ざっていたため、文字の列として読み込まれ、結果に入りませんでした。pd.to_numericにerrors="coerce"を付けると、数に直せない値は空欄になります。試したときも「なし」が空欄になり、値引きはcountが9の列として結果に出ました
- percentilesを渡すと中央値の行が消える: 10%と90%を見ようとpercentiles=[0.1, 0.9]だけを渡すと、試した版では50%の行が出なくなりました。中央値も残すときは、percentiles=[0.1, 0.5, 0.9]のように0.5も入れます
- 店舗の列も結果に入れたい: include="all"を付けると、店舗の列にcount・unique・top・freqが入りました。数の列のuniqueの欄や、文字の列のmeanの欄は、空欄(NaN)になります
- topがいちばん多い店とは言い切れない: 試した表では、4つの店が2回ずつで並び、topには新宿店が出ました。資料では、いちばん多い値が複数あるときは、その中からどれかが選ばれるとしています。店ごとの回数を比べるときは、件数を数え直します
- 空欄がどの行にあるかを知りたい: countで空欄の数は分かっても、どの行かは分かりません。空欄の行と列を一覧にする方法は、PythonでExcelの表の空欄を見つけて一覧にする手順で紹介しています
- 分布を金額の範囲ごとの件数で見たい: 金額をいくつかの範囲に区切って数える方法は、PythonでExcelの数値を区切って範囲ごとの件数を数える手順にまとめています
- 飛び抜けた値が、どの店のものかを並べて見たい: 売上の大きい順に順位の列を付ける方法は、PythonでExcelの表に順位の列を付ける手順が参考になります
まとめ
- describe()で、数の列の件数・平均・中央値・最小・最大を1つの表にできます
- 平均と中央値が大きく離れたら、飛び抜けた値を元の記録と照らします
- percentilesを変えるときは、0.5も入れて中央値の行を残します
- 文字が混ざった列は数に直してから、店舗の列はinclude="all"で見ます
よくある質問
describeの結果は、元のExcelのファイルに書き込まれますか?
書き込まれません。記事のコードは元の明細を読むだけで、まとめた表は別のファイルの sales_summary.xlsx に保存します。試したときも、元の sales.xlsx のハッシュ値は実行の前後で変わりませんでした。
空欄のセルは、平均の計算に入りますか?
入りません。pandasの資料では、describeは空欄(NaN)の値を除いて列の分布をまとめるとしています。試した表でも、売上のcountは10行のうち9で、平均は空欄を除いた9件で計算されていました。
中央値だけを知りたいときは、どこを見ればよいですか?
結果の50%の行を見ます。pandasの資料では、50%の点は中央値と同じとしています。試した表の売上では、50%の行と、列のmedianで出した値は、どちらも53000でした。
標準偏差(std)は、どう読めばよいですか?
値が平均のまわりにどれくらい散らばっているかの目安として読みます。試した表では、売上の標準偏差(309,365.1)が平均(155,666.7)より大きく、飛び抜けた1つの値に引っ張られていました。
打ち間違いを直すと、結果はどう変わりますか?
試した表で980000を98000に直してまとめ直すと、平均は57,666.7になり、中央値の53,000に近づきました。標準偏差も19,422.9まで下がりました。直した後にもう一度describeを実行して、平均と中央値の差を見比べます。