前月比
このレッスンでできるようになること。pct_change で前月比を計算し、その数字から何が言えるかを1文で書けるようになります。
前回、数字は比較して初めて意味を持つと書きました。最も手近な比較の相手が、1つ前の月です。前月比は、規模の違う店舗を同じ土俵に乗せてくれます。売上100万円の店の5万円増と、売上20万円の店の5万円増では、後者のほうが起きていることは大きいはずです。
pandas には、前の行との変化率を出す関数があります。
Python
df["売上日"] = pd.to_datetime(df["売上日"])
df["月"] = df["売上日"].dt.month
monthly = df.groupby("月")["金額"].sum().sort_index()
growth = monthly.pct_change() * 100pct_change は、各要素が1つ前の要素からどれだけ変化したかを比率で返します。0.15 なら15パーセント増です。パーセント表記にしたいので100を掛けます。最初の月は比べる相手がいないので NaN になります。この NaN は欠損ではなく「計算できない」という意味なので、0で埋めてしまうと「増えていない」という誤った情報になります。素直に除いて扱ってください。
並び順が命綱である点も強調しておきます。pct_change は前の行としか比べません。月の並びが崩れていると、まったく無意味な数字が出ます。しかもエラーにはなりません。必ず sort_index() を掛けてから呼んでください。
さて、ここからが7章の本題です。前月比を出しただけでは分析ではありません。出た数字を言葉にします。たとえば全店の前月比が3ヶ月連続でプラスなら「回復基調にある」と言えます。1ヶ月だけ大きく跳ねて翌月に戻っているなら「一時的な要因があった」と読むべきで、伸びていると言ってはいけません。
前月比を読むときの注意も1つあります。前の月がたまたま小さいと、率は簡単に大きくなります。売上1万円が3万円になれば200パーセント増ですが、それは全体から見れば誤差かもしれません。率だけを見せると読み手を誤解させるので、必ず金額と一緒に並べます。率と実額の両方を出す、これが前月比を扱うときの作法です。
要件
- 売上日を日付型にしてから月を取り出す
- 月別に集計してから sort_index() で古い順に並べる
- 前月比は pct_change を使って求める
- 最初の月は計算できないので結果から除く
- rates は round(float(...), 1) で丸める
入出力例
monthly_growth("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,鋳物ホーロー鍋,調理器具,1,100000
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,120000
2026-03-01,横浜店,鉄のフライパン,調理器具,1,150000
") → {"months":[2,3],"rates":[20,25],"trend":"連続増加"}
monthly_growth("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,鋳物ホーロー鍋,調理器具,1,200000
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,100000
2026-03-01,大宮店,白磁のマグカップ,食器,1,150000
") → {"months":[2,3],"rates":[-50,50],"trend":"増減あり"}
monthly_growth("売上日,店舗,商品名,カテゴリ,数量,金額
2026-04-01,横浜店,鉄のフライパン,調理器具,1,80000
2026-05-01,横浜店,鉄のフライパン,調理器具,1,40000
") → {"months":[5],"rates":[-50],"trend":"連続減少"}