つくる:月次集計表
このレッスンでできるようになること。この章で覚えた集計だけを組み合わせて、マイショップ・チェーンの月次集計表を1つの関数で作れるようになります。新しい文法は出てきません。
月次集計表に必要なものは、たいてい次の4つです。全体の総売上、店舗別の合計、店舗×月のマトリクス、そして売れ筋カテゴリのランキングです。総売上は規模を伝え、店舗別は比較を作り、マトリクスは推移を見せ、ランキングは中身を説明します。この4点が揃って初めて、報告を受けた人が状況を理解できます。
作るときの順番は、粗いものから細かいものへ進めるのが安全です。まず全体の合計を出し、それが想像どおりの桁かを確かめます。次に店舗別に分け、合計が全体と一致するかを見ます。ここが合わないなら、掃除の段階に取りこぼしがあります。集計は必ず足し算が閉じているかを確認しながら進めてください。
Python
total = int(df["金額"].sum())
by_store = df.groupby("店舗")["金額"].sum()組み立てるうえでの約束を3つ確認します。1つめは、同じ表から何度も集計してよいということです。groupby は元の df を変えないので、軸を変えて何度でも掛けられます。2つめは、pivot_table には aggfunc="sum" と fill_value=0 を必ず渡すことです。片方でも忘れると、平均になったり NaN が残ったりします。3つめは、返す直前にすべての数値を素の型へ直すことです。int64 が1つでも混ざると、正しい数字を出していても受け渡しの段階で落ちます。
表が完成したら、必ず声に出して読んでみてください。「渋谷店が全体の半分を占めていて、2月に落ちている」というように、表から1文が出てくるかどうかが完成の基準です。数字が並んでいるだけで何も言えないなら、軸の選び方を見直す余地があります。この読む練習が、7章の示唆出しにそのままつながります。
要件
- total は 金額 の合計を int にしたもの
- by_store は groupby("店舗") の合計を辞書にしたもの
- matrix は pivot_table で作り、aggfunc="sum" と fill_value=0 を渡す
- top_category は value_counts の先頭のカテゴリ名
- すべての数値は int に直してから返す
入出力例
build_monthly_report("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-08,渋谷店,木製カッティングボード,調理器具,1,4200
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-02-06,横浜店,鉄のフライパン,調理器具,1,7800
") → {"by_store":{"横浜店":7800,"渋谷店":24600},"matrix":{"横浜店":{"1":0,"2":7800},"渋谷店":{"1":7800,"2":16800}},"top_category":"調理器具","total":32400}
build_monthly_report("売上日,店舗,商品名,カテゴリ,数量,金額
2026-03-01,大宮店,積み重ね収納ボックス,収納,3,4500
2026-03-02,大宮店,布製収納バスケット,収納,2,3000
2026-04-01,横浜店,白磁のマグカップ,食器,4,7200
") → {"by_store":{"大宮店":7500,"横浜店":7200},"matrix":{"大宮店":{"3":7500,"4":0},"横浜店":{"3":0,"4":7200}},"top_category":"収納","total":14700}