ABC分析は、在庫のSKUを年間金額の累積構成比でA・B・Cに分類する手法です。Pythonとpandasを用いることで、50品目のデータでも瞬時に区分が算出できます。本記事では、パレートの法則に基づく分類の仕組みと、区分ごとの管理方針を解説します。
ABC分析とは
ABC分析は、在庫にあるSKUを年間金額や出荷量の大きい順に並べ、累積構成比に基づいてA・B・Cの3区分に分類する手法です。この分類の根拠には、少数の品目が全体の金額の大半を占めるというパレートの法則があります。
具体的には、上位の品目が金額の大部分を占める傾向を利用し、管理の優先順位を明確にします。A区分は金額の割合が大きい品目、B区分は中間、C区分は金額の割合が小さい品目として扱います。これにより、限られたリソースを最も効果的な品目に集中させることが可能になります。
この手法は、在庫管理の効率化や発注戦略の最適化に広く用いられています。品目の重要度を定量的に把握することで、過剰在庫の削減や欠品リスクの低減といった課題への対応がしやすくなります。
区分の決め方と閾値
ABC分析では、年間金額の大きい順に並べた品目の累積構成比に基づいて区分を決定します。一般的には、累積構成比が80%までの品目をA、80%を超えて95%までの品目をB、95%を超える残りをCとします(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))。
この80%と95%という閾値は固定のものではなく、企業の目的に応じて調整可能です。例えば、管理の手間をさらに減らしたい場合は70%と90%に設定するといった使い方もあります。
また、分析の基準として「金額ベース」と「数量ベース」があります。金額ベースは資金効率や利益への影響を重視する際に適しています。一方、数量ベースは発注回数や作業負荷を把握したい場合に有効です。在庫管理では通常、金額ベースが中心ですが、業務の特性に合わせて使い分けることが重要です。
なお、本記事の計算例で使用している50品目のデータは、乱数で生成した架空のサンプルデータです。実際の業務では、自社の実績データを用いて分析を行ってください(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))。
Pythonで ABC 分析を実行する
Python では、pandas を用いて ABC 分析の計算を自動化できます。ここでは、区分を計算する関数と、その実行例の処理の流れを説明します。
まず、関数は入力された SKU 別の年間金額データを受け取ります。処理は以下の 4 ステップで進みます。
- 並べ替え: 年間金額の大きい順に SKU をソートします。
- 構成比の計算: 各 SKU の年間金額が全体に占める割合(構成比)を算出します。
- 累積構成比の計算: 上位から順に構成比を足し合わせ、累積構成比を求めます。
- 区分の判定: 累積構成比が 80% 以下を A、80% 超 95% 以下を B、95% 超を C と判定します。
年間金額の大きい順に累積構成比を計算して A・B・C に分ける関数
import numpy as np
import pandas as pd
def abc_classify(df: pd.DataFrame, value_col: str = "annual_value", a_cut: float = 0.80, b_cut: float = 0.95) -> pd.DataFrame:
"""年間金額の大きい順に並べ、累積構成比が a_cut までを A、b_cut までを B、残りを C に分ける。"""
d = df.sort_values(value_col, ascending=False).reset_index(drop=True)
d["share"] = d[value_col] / d[value_col].sum() # 構成比
d["cum_share"] = d["share"].cumsum() # 累積構成比
d["class"] = np.where(d["cum_share"] <= a_cut, "A", np.where(d["cum_share"] <= b_cut, "B", "C"))
return d
次に、実行例で結果を確認します。この例では、乱数で生成した架空の 50 品目を使用しています。実行結果は以下の通りです。
- A 区分: 26 品目(全体の 52%)、金額構成比 78.7%
- B 区分: 14 品目(全体の 28%)、金額構成比 16.0%
- C 区分: 10 品目(全体の 20%)、金額構成比 5.2%
架空の 50 品目で ABC 分析を実行し、区分ごとの品目数と金額構成比を集計する
rng = np.random.default_rng(42) # 固定シード(毎回同じ架空データ)
items = pd.DataFrame({
"sku": [f"SKU-{i:03d}" for i in range(1, 51)], # 50品目
"annual_value": rng.lognormal(mean=12, sigma=1.0, size=50).round(-3), # 年間金額(円、対数正規分布)
})
result = abc_classify(items)
summary = result.groupby("class").agg(items=("sku", "count"), value_share=("share", "sum"))
print(summary)
この結果から、品目数の 52% を占める A 区分が、年間金額の 78.7% を占めていることがわかります。この例では A 区分が品目数の半数を超えており、ごく少数の SKU に金額が極端に集中しているとまでは言えませんが、上位の品目ほど金額の寄与が大きい傾向は読み取れます。一方、C 区分は品目数の 20% に対して、金額構成比は 5.2% と小さいことが確認できます。(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))
パレート図で全体像をつかむ
ABC分析の結果を視覚的に確認するため、パレート図を作成します。これは、品目別の年間金額を棒グラフで示し、累積構成比を折れ線で重ねた図です。

この図から、上位の品目に金額が偏っていることがわかります。具体的には、上位26品目(全体の52%)で、年間金額の78.7%を占めています(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))。
特に上位1品目が11.7%、上位5品目が28.4%と、上位には金額が突出して大きい品目が存在します(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))。このように、品目数に対して金額の偏りが大きい場合、管理の重点を置くべき品目が明確になります。
区分ごとの在庫管理方針
ABC分析の結果に基づき、区分ごとに異なる在庫管理方針を適用することが一般的です。A区分は年間金額の構成比が78.7%と高く、品目数は全体の52%を占めています。この区分では、在庫水準を細かく監視し、発注頻度を高める管理が基本となります。B区分は品目数の28%、金額構成比16.0%です。標準的な管理手法を適用し、定期的なレビューで在庫の健全性を保ちます。C区分は品目数の20%、金額構成比5.2%と少額です。管理コストを抑制するため、簡易的な管理やまとめ発注が用いられます。
ただし、金額が小さくても生産停止につながる重要部品は、別途の基準で管理する必要があります。また、新製品や季節品は年間金額が実力を表さないため、区分の対象から外すか、期間を区切ることが推奨されます。区分は固定ではなく、半年から1年ごとに見直すことで、変化に対応した在庫管理を実現できます。(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))
実務で使うときの注意点
ABC分析は年間金額に基づいて行いますが、金額が小さくても欠品すると生産が止まる部品が存在します。こうした重要度の高い品目は、金額の大小とは別に基準を設けて扱う必要があります。
また、新製品や季節品は年間金額が実力を表さない場合があります。そのため、区分の対象から外すか、期間を区切って分析するのが適切です。
さらに、区分は固定のものではありません。市場環境や需要の変化に合わせて、半年から1年ごとに見直すことが推奨されます。これにより、在庫管理の精度を維持できます。(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))
まとめ
ABC分析は、年間金額の累積構成比でSKUをA・B・Cに分類する手法です。Pythonとpandasを使えば、50品目でも瞬時に区分が算出できます。A区分は金額の78.7%を占めるため、在庫監視を強化する重点管理が有効です。
(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))
計算方法と注意
- 区分の閾値は累積構成比 80%(A)と 95%(B)を使用。目的に応じて 70/90% などに変えてよい
- 一般的な管理方針: A は在庫を細かく監視し発注頻度を高める、B は標準的な管理、C は簡易な管理やまとめ発注
- 注意: 金額が小さくても欠品すると生産が止まる部品(重要度)は別途の基準で扱う
- 注意: 新製品や季節品は年間金額が実力を表さないため、区分の対象から外すか期間を区切る
- 注意: 区分は固定ではなく、半年〜1 年ごとに見直す
- 計算例のデータは乱数で生成した架空の 50 品目
出典
- 本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード)
本記事のコードと数値は、乱数で生成した架空のサンプルデータによる再現可能な計算例です。

