集計のきほん
このレッスンでできるようになること。売上データの列に対して sum と mean と count を使い、総売上や平均単価といった代表値を出せるようになります。
3章まででマイショップ・チェーンの売上CSVは掃除が済みました。ここからは、掃除した表から数字を取り出す段階に入ります。集計のいちばん小さい単位は、1つの列を1つの数値に畳み込むことです。金額の列に sum を掛ければ総売上、mean を掛ければ平均単価、count を掛ければ売上の件数になります。
Python
total = df["金額"].sum()
average = df["金額"].mean()
count = df["金額"].count()ここで大事なのは、この3つが同じ列に対して別々の問いを投げているという点です。総売上は規模、平均単価は1件あたりの重さ、件数は取引の多さを表します。総売上が同じ2店舗でも、片方は高単価で少数、もう片方は低単価で多数、ということが起こります。だから最初の段階で3つとも見ておきます。
注意が1つあります。pandas が返す合計や件数は Python の素の int ではなく、numpy の int64 という型です。この型はそのままでは JSON に変換できないため、採点や外部への受け渡しでつまずきます。数値を返すときは int(...) で包む習慣を付けてください。平均は float64 で、こちらは素の float と同じように扱えますが、小数の細かいぶれを避けるために round(float(...), 1) のように丸めて返すと比較が安定します。
count と len の違いにも触れておきます。count は欠損を数えません。len(df) は行数をそのまま返します。掃除済みのデータなら一致しますが、欠損が残っているときは食い違うので、どちらの数字が欲しいのかを意識して選びます。
最後に、mean は外れ値に引っ張られる点を覚えておいてください。1件だけ極端に大きな売上があると平均は大きく動きます。median も併せて見ると、平均が引っ張られているかどうかが分かります。この感覚は7章の外れ値の回でもう一度使います。
要件
- CSVは StringIO を通して read_csv で読み込む
- 合計は sum、平均は mean、件数は count を使う
- int64 のまま返さず int() で包む
- average は round(float(...), 1) で丸める
入出力例
summarize_sales("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-06,横浜店,鉄のフライパン,調理器具,1,7800
2026-01-07,大宮店,積み重ね収納ボックス,収納,3,4500
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
") → {"average":8175,"count":4,"max_amount":16800,"total":32700}
summarize_sales("売上日,店舗,商品名,カテゴリ,数量,金額
2026-03-01,大宮店,白磁のマグカップ,食器,5,9000
2026-03-02,横浜店,布製収納バスケット,収納,2,3000
") → {"average":6000,"count":2,"max_amount":9000,"total":12000}
summarize_sales("売上日,店舗,商品名,カテゴリ,数量,金額
2026-04-01,渋谷店,木製カッティングボード,調理器具,1,4200
") → {"average":4200,"count":1,"max_amount":4200,"total":4200}