構成比
このレッスンでできるようになること。カテゴリ別の構成比を出し、その変化から何が起きているかを読めるようになります。
売上が伸びたとき、次に知りたいのは「何が伸びたのか」です。全体の金額だけを見ていても、中身の入れ替わりは見えません。構成比は、全体を100として各カテゴリが何パーセントを占めるかを表した数字です。規模の違う月どうし、店舗どうしを、同じ土俵で比べられるようになります。
計算そのものは割り算です。
Python
by_category = df.groupby("カテゴリ")["金額"].sum()
share = by_category / by_category.sum() * 100pandas では、Series を1つの数値で割ると全要素が割られます。for 文で1つずつ割る必要はありません。この一括計算の考え方はベクトル演算と呼ばれ、pandas の速さの正体でもあります。
丸め方には注意が要ります。小数第1位で丸めると、合計が100.0にならないことがあります。33.3が3つで99.9になるような場合です。報告書で「合計が合わない」と指摘されるのは、この丸め誤差がほとんどです。表に「四捨五入のため合計が100にならないことがあります」と一言添えるのが実務の作法です。
ここからが本題です。構成比は、1時点だけ見てもあまり語れません。「食器が40パーセント」と言われても、それが多いのか少ないのか分かりません。意味が出るのは、時点を並べて変化を見たときです。
食器の構成比が1月の30パーセントから6月の45パーセントに上がったとします。ここで慌てて「食器が伸びた」と言ってはいけません。構成比は割合なので、分母が縮んでも上がります。他のカテゴリが落ち込んだ結果、食器の割合だけが相対的に上がった可能性があります。だから構成比を見せるときは、必ず実額も一緒に出します。実額も構成比も上がっていれば本当に伸びており、構成比だけが上がっているなら周りが落ちたということです。この2つは打ち手がまったく違います。前者は成功事例として横展開でき、後者は落ちたカテゴリの手当てが先です。数字を言葉にするとは、こういう区別を付けることです。
要件
- 売上日を日付型にしてから月を取り出す
- 月ごとにカテゴリ別の売上合計を求める
- 構成比はその月の合計で割って100を掛ける
- 構成比の上昇幅が最大のカテゴリを選ぶ
- そのカテゴリの実額を2つの月で比べて verdict を決める
入出力例
compare_composition("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,10,30000
2026-01-06,横浜店,積み重ね収納ボックス,収納,20,70000
2026-06-05,渋谷店,白磁のマグカップ,食器,15,45000
2026-06-06,横浜店,積み重ね収納ボックス,収納,15,55000
", 1, 6) → {"after_share":{"収納":55,"食器":45},"before_share":{"収納":70,"食器":30},"verdict":"実額とも増加"}
compare_composition("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,10,30000
2026-01-06,横浜店,積み重ね収納ボックス,収納,20,70000
2026-06-05,渋谷店,白磁のマグカップ,食器,7,20000
2026-06-06,横浜店,積み重ね収納ボックス,収納,6,20000
", 1, 6) → {"after_share":{"収納":50,"食器":50},"before_share":{"収納":70,"食器":30},"verdict":"相対的な上昇"}