在庫回転率・在庫回転日数の計算方法【Pythonで月次データから算出】

在庫回転率・在庫回転日数の計算方法【Pythonで月次データから算出】のアイキャッチ画像 PythonでSCM

在庫回転率と在庫回転日数の計算式を、Python のコードで確認します。売上原価と平均在庫から算出する手順と、月次データで見る際の注意点も解説します。

在庫回転率は「在庫が何回入れ替わったか」

在庫回転率は、一定期間の売上原価を平均在庫で割ることで算出される指標です。この数値は、在庫が期間中に何回入れ替わったかを示します。回転率が高いほど、在庫が素早く売上原価として消えていくことを意味します。

一方、在庫回転日数は、在庫が何日分あるかを示す指標です。回転率の逆数に相当し、在庫が何日分手元にあるかを日数で表します。これらの指標は、在庫の効率的な管理や資金繰りの状況を把握するために用いられます。

計算式と「売上原価」か「売上高」か

在庫回転率は、一定期間に在庫が何回入れ替わったかを示す指標です。基本的な計算式は「売上原価 ÷ 平均在庫」です。平均在庫は、期首と期末の在庫の平均を簡便に使う方法が一般的です。一方、在庫回転日数は「365 ÷ 在庫回転率」で求められます。これは、在庫が1回入れ替わるのに必要な日数を表します。

分子の選び方によって、算出される値は変わります。基本は売上原価ですが、売上高を使う流儀もあります。在庫は原価で評価されているため、売上高を使うと値が大きくなります。例えば、架空のサンプルデータでは、売上原価ベースで7.6回、売上高ベースで10.9回と算出されました(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))。このように、定義が異なると数値に差が出ます。したがって、他社や過去のデータと比較する際は、必ず同じ定義(売上原価か売上高か)でそろえる必要があります。なお、本節の数値は乱数で生成した架空のサンプルデータによるものです。

Pythonで月次データから計算する

在庫回転率を Python で算出する場合、まず計算ロジックを関数として定義します。

在庫回転率と在庫回転日数を計算する関数

def inventory_turnover(cogs, inventory_begin, inventory_end):
    """在庫回転率(回)= 期間の売上原価 ÷ 平均在庫(期首と期末の平均)。"""
    return cogs / ((inventory_begin + inventory_end) / 2)


def days_in_inventory(turnover, days=365):
    """在庫回転日数(日)= 期間の日数 ÷ 回転率。在庫が何日分あるかを表す。"""
    return days / turnover
は、売上原価と平均在庫を入力とし、回転率と在庫回転日数(DIO)を出力する処理を行います。この関数は、入力された数値に基づいて式を適用し、結果を返す役割を担っています。

次に、具体的な数値を用いて実行例を確認します。

架空の 12 か月の売上原価と月末在庫から、年間の回転率と回転日数を求める

import numpy as np
import pandas as pd

rng = np.random.default_rng(21)                                     # 固定シード(毎回同じ架空データ)
months = pd.period_range("2025-01", periods=12, freq="M")
df = pd.DataFrame({
    "month": months.astype(str),
    "cogs": (80 + 25 * np.sin(np.arange(12) / 12 * 2 * np.pi) + rng.normal(0, 5, 12)).round(1),   # 売上原価(百万円)
    "inventory_end": (120 + 20 * np.cos(np.arange(12) / 12 * 2 * np.pi) + rng.normal(0, 6, 12)).round(1),  # 月末在庫(百万円)
})
inventory_begin = 115.0                                             # 期首(前期末)の在庫(百万円)

cogs_year = df["cogs"].sum()
turnover = inventory_turnover(cogs_year, inventory_begin, df["inventory_end"].iloc[-1])
print(f"年間売上原価 {cogs_year:.0f}百万円  回転率 {turnover:.1f}回  回転日数 {days_in_inventory(turnover):.0f}日")
は、架空のサンプルデータを用いた計算例です。ここで使う数値は、乱数で生成したものであり、実際の企業データではありません。条件として、期間(n_months)は 12か月、年間の売上原価(cogs_year)は 964百万円、期首在庫(inv_begin)は 115百万円、期末在庫(inv_end)は 137百万円、平均在庫(avg_inv)は 126百万円を設定しています(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))。

この条件で実行すると、得られる結果は以下の通りです。在庫回転率は 7.6回、在庫回転日数(DIO)は 48日となります(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))。このように、Python を使うことで、手計算に比べミスを減らし、迅速に指標を算出できます。

月ごとの推移を見る

月別の売上原価・月末在庫・年換算回転率(架空データ)

月 売上原価 月末在庫 回転率(年換算)
1月 82百万円 130百万円 8.0回
2月 100百万円 128百万円 9.3回
3月 93百万円 139百万円 8.3回
4月 113百万円 126百万円 10.3回
5月 101百万円 123百万円 9.8回
6月 88百万円 110百万円 9.1回
7月 76百万円 94百万円 8.9回
8月 62百万円 110百万円 7.3回
9月 57百万円 114百万円 6.1回
10月 59百万円 121百万円 6.0回
11月 61百万円 125百万円 6.0回
12月 71百万円 137百万円 6.5回
12か月の月末在庫の棒グラフに、年換算した在庫回転率の折れ線を重ねたグラフ
月末在庫(棒)と年換算の在庫回転率(折れ線)の推移

上記の表と図は、乱数で生成した架空のサンプルデータによるものです。このデータでは、月末在庫が最も高かったのは3月の139百万円です。一方、年換算の在庫回転率は、4月に10.3回と最も高く、11月に6.0回と最も低くなっています(出典:本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード))。

表と図を見ると、売上原価が多い4月や5月に回転率が高く、売上原価が少なく在庫が積み上がっている9月から11月にかけて回転率が低くなっています。このように月ごとの推移を可視化することで、在庫の増減と回転効率の変化を同時に把握できます。

回転率をどう評価するか

在庫回転率の数値そのものだけで良し悪しを判断することはできません。回転率は業種やビジネスモデルによって大きく異なるため、評価の基準を慎重に選ぶ必要があります。

まず、比較の対象を明確にすることが重要です。同業他社の公開データ(有価証券報告書など)や、自社の過去の値と比較することで、相対的な位置づけがわかります。単に「高い」から良い、という単純な話ではありません。

また、回転率が高ければ必ずしも良いとは限りません。欠品が増えたり、小口発注が頻繁になったりすることで回転率が上がっている場合、サービスレベルの低下や発注費用の増加を招いている可能性があります。そのため、回転率だけでなく、サービスレベルや発注費用といった指標と併せて確認する必要があります。

さらに、全社平均の値だけでなく、品目や倉庫ごとに分けて見ると、特定の品目や拠点に滞留在庫が溜まっていることが見つかることがあります。全体像を把握した上で、細粒度のデータに目を向けることで、改善の余地がある箇所を特定しやすくなります。

実務で使うときの注意点

実務で在庫回転率を計算する際は、平均在庫の取り方に注意が必要です。期首と期末の平均を使う方法は簡便ですが、季節変動が大きい業種では偏りが生じます。その場合は、月末在庫の 12 か月平均を使う方法も検討できます。

また、在庫の評価単価が標準原価か実際原価かによって、回転率の数値が変わります。比較対象となるデータと評価基準を揃えることが重要です。

さらに、回転率が高ければ必ずしも良いとは限りません。欠品や小口発注の増加によって回転率が上がっている場合は、サービスレベルや発注費用と併せて評価する必要があります。全社の値だけでなく、品目や倉庫ごとに分けて見ると、滞留在庫が見つかりやすくなります。

まとめ

在庫回転率は、売上原価を平均在庫で割って求めます。Python で月次データから算出し、月ごとの変動を確認できます。評価は同業の公開データや過去の値と比較し、欠品や発注費用も併せて見ることが重要です。

計算方法と注意

  • 回転率の分子は売上原価が基本(在庫は原価で評価されているため)。売上高を使う流儀もあり、その場合は値が大きくなるので比較時は定義をそろえる
  • 平均在庫は期首と期末の平均が簡便だが、季節性があると偏るため、月末在庫の 12 か月平均を使う方法もある
  • 回転率は業種やビジネスモデルで大きく異なる。評価は同業の公開データ(有価証券報告書など)や自社の過去の値と比べて行う
  • 回転率が高ければよいとは限らない。欠品や小口発注の増加で回転率が上がっている場合は、サービスレベルや発注費用と併せて見る
  • 全社の値だけでなく、品目や倉庫ごとに分けて見ると滞留在庫が見つかる
  • 在庫の評価単価(標準原価か実際原価か)が変わると回転率も変わる
  • 計算例の数値は乱数で生成した架空のサンプルデータによるもの(売上高は原価率 70% を仮定して算出)

出典

  • 本記事の Python コードによる計算(乱数で生成した架空のサンプルデータ、固定シード)

関連記事

本記事のコードと数値は、乱数で生成した架空のサンプルデータによる再現可能な計算例です。

タイトルとURLをコピーしました