前月比
このレッスンでできるようになること。pct_change で前月比を計算し、その数字から何が言えるかを1文で書けるようになります。
前回、数字は比較して初めて意味を持つと書きました。最も手近な比較の相手が、1つ前の月です。前月比は、規模の違う店舗を同じ土俵に乗せてくれます。売上100万円の店の5万円増と、売上20万円の店の5万円増では、後者のほうが起きていることは大きいはずです。
pandas には、前の行との変化率を出す関数があります。
たとえば図書館の来館者数も、月別合計を並べて前月と比較できます。売上でも同じ順序で計算します。
Python
visits["利用日"] = pd.to_datetime(visits["利用日"])
visits["月"] = visits["利用日"].dt.month
monthly_visits = visits.groupby("月")["来館者数"].sum().sort_index()
change = monthly_visits.pct_change() * 100pct_change は、各要素が1つ前の要素からどれだけ変化したかを比率で返します。0.15 なら15パーセント増です。パーセント表記にしたいので100を掛けます。最初の月は比べる相手がいないので NaN になります。この NaN は欠損ではなく「計算できない」という意味なので、0で埋めてしまうと「増えていない」という誤った情報になります。素直に除いて扱ってください。
並び順が命綱である点も強調しておきます。pct_change は前の行としか比べません。月の並びが崩れていると、まったく無意味な数字が出ます。しかもエラーにはなりません。必ず sort_index() を掛けてから呼んでください。
さて、ここからが7章の本題です。前月比を出しただけでは分析ではありません。出た数字を言葉にします。たとえば全店の前月比が3ヶ月連続でプラスなら「回復基調にある」と言えます。1ヶ月だけ大きく跳ねて翌月に戻っているなら「一時的な要因があった」と読むべきで、伸びていると言ってはいけません。
前月比を読むときの注意も1つあります。前の月がたまたま小さいと、率は簡単に大きくなります。売上1万円が3万円になれば200パーセント増ですが、それは全体から見れば誤差かもしれません。率だけを見せると読み手を誤解させるので、必ず金額と一緒に並べます。率と実額の両方を出す、これが前月比を扱うときの作法です。
dropna() は Series にも使えます。比較できない最初の値を除き、計算できた値だけ残します。たとえば水の使用量が前週からどう変わったかを調べるなら、次の形です。
Python
usage = pd.Series([40, 44, 42], index=[1, 2, 3])
ratios = usage.pct_change().dropna()
percentages = ratios * 100演習では同一年の連続する月を使い、各月の合計は正の数とします。月の準備、率の丸めとリスト化、傾向判定は補助コードにあります。_growth_result は丸めた率がすべて正なら「連続増加」、すべて負なら「連続減少」、0や正負の混在なら「増減あり」を返します。この名前だけで回復基調と断定せず、金額や理由も確認します。
要件
- 月列は準備済み。月別の金額合計を作り sort_index() で古い順に並べる
- pct_change() で前月比を計算し、dropna() で最初の NaN を除く
- 比率に100を掛け、百分率の Series を growth に入れる
- 小数第1位の丸め、リスト化、trend 判定は _growth_result に任せる
- 入力は同一年の連続する月で、各月の売上合計は正の数とする