- マネジメント
カンバン方式のやり方 列の例とWIP制限の決め方・計算例
カンバン方式とは、作業をカードにして列(工程)の上を左から右へ流し、同時に進める枚数に上限(WIP制限)を付けて、流れの速さを計測しながら整えていくタスク管理のやり方です。 ボードを作るだけなら数分で済みますが、効果が出るかどうかは「上限をいくつにするか」と「何を測るか」で決まります。
この記事では、列の設計例、WIP制限の数値の決め方、上限つきボードの記入例を示し、カード履歴のCSVからリードタイム・サイクルタイム・スループットを計算するPythonコードを出力つきで載せます。題材は架空の備品予約システムの開発チームです。
この記事の結論
- WIP制限は、まず「作業中」の列を作業者数前後にして始めます。 4人なら4です。
- 1〜2週間ボードを見て、カードが溜まる列の手前の上限を1ずつ下げます。 一度に大きく変えず、1回に1か所だけ動かします。
- 測るのは3つです。 リードタイム(依頼から完了まで)、サイクルタイム(着手から完了まで)、スループット(期間あたりの完了枚数)。
- 平均WIP=スループット×平均リードタイム の関係があるので、同じ速さで完了できるなら、WIPを減らすほど1枚あたりの待ちが短くなります。
- 割り込みが多く、計画を一定期間で区切りにくい仕事ほどカンバンが合います。
確認環境:Ubuntu 24.04、Python 3.11.15(標準ライブラリのみ)。確認日 2026-10-05。掲載したコードはこの環境で動かし、出力をそのまま載せています。
カンバン方式の早見表
| 知りたいこと | 答え |
|---|---|
| 最初に用意するもの | 列を3〜6本、カード、列ごとの上限の数字 |
| 列の基本形 | 依頼 → 準備完了 → 作業中 → レビュー → 確認待ち → 完了 |
| WIP制限の初期値 | 「作業中」は作業者数前後、「レビュー」はその半分前後 |
| 上限を変える単位 | 1回に1か所、1ずつ。1〜2週間様子を見てから次を決める |
| 上限に達したとき | 新しいカードを入れず、下流(右側)の列のカードを手伝って先に終わらせる |
| リードタイム | 完了日 − 依頼日。依頼した人から見た待ち時間 |
| サイクルタイム | 完了日 − 着手日。チームが手を動かし始めてからの時間 |
| スループット | 完了枚数 ÷ 期間。1日あたり、または1週間あたりの枚数 |
| 納期の答え方 | 平均ではなく「85%のカードは何日以内」で答えると外れにくい |
| 見直しの頻度 | 週1回、15分ほど。数字とボードの溜まり方を見る |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「カンバン方式のやり方 列の例とWIP制限の決め方・計算例」
カンバン方式を始める5つの手順
- 今の流れをそのまま列にする。 理想の工程ではなく、今の仕事が通っている順番を書き出します。
- 仕事をカードにする。 1枚は「数日以内に終わる大きさ」を目安にし、依頼日を必ず書きます。
- 列に上限の数字を書く。 列名の横に「作業中(4)」のように書きます。
- 右から見る。 毎日の確認は完了に近い列から順に見て、「あと少しで終わるカード」を先に進めます。
- 日付を残して測る。 カードごとに依頼日・着手日・完了日の3つを記録します。これだけで後述の3指標が計算できます。
カードに書く項目は次のとおりです。
| 項目 | 例 | 使いみち |
|---|---|---|
| 番号 | K-04 | 記録と照合 |
| 件名 | 予約の重複チェック | ひと目で内容が分かる長さにする |
| 依頼日 | 2026-09-02 | リードタイムの起点 |
| 着手日 | 2026-09-04 | サイクルタイムの起点 |
| 完了日 | 2026-09-11 | 2つの終点 |
| 担当 | 佐藤 | 1人が抱える枚数の確認 |
| 種別 | 機能追加/不具合/調査 | 種別ごとの集計 |
| 止まっている理由 | 仕様の回答待ち | 待ちの原因の分類 |
列の設計例:開発・運用保守・問い合わせ対応・個人用
列は仕事の種類で変わります。4つの例を並べます。かっこ内は作業者4人(個人用は1人)の場合の上限の初期値の例です。
| 用途 | 列の並び(かっこ内は上限の例) | 設計のポイント |
|---|---|---|
| 開発 | 依頼(なし)→ 準備完了(6)→ 作業中(4)→ レビュー(2)→ 確認待ち(3)→ 完了 | 「準備完了」は内容が固まり、すぐ着手できるものだけ置く |
| 運用保守 | 受付(なし)→ 調査中(3)→ 対応中(3)→ 反映待ち(4)→ 完了 | 急ぎ用の横の段(レーン)を1本作り、上限を1にする |
| 問い合わせ対応 | 新着(なし)→ 対応中(4)→ 相手の回答待ち(8)→ 回答済み | 「相手の回答待ち」を分けると、自分たちの手持ちが見える |
| 個人用 | やること(なし)→ 今日やる(5)→ 作業中(2)→ 待ち(3)→ 済み | 「作業中」を2にすると、切り替えの回数が減る |
列を考えるときの判断基準です。
| 迷う点 | 決め方 |
|---|---|
| 列を分けるか | 担当が変わる、または待ちが発生する境目なら分ける |
| 「待ち」の列を作るか | 手を動かしていないカードが作業中の列に混ざるなら作る |
| 列の数 | 3〜6本から始める。7本以上は見直しのたびに統合を検討する |
| 完了の列 | 週ごとに片付ける。片付ける前に日付を記録に残す |
| 先頭の列の上限 | 付けない。入口を絞るのは2列目(準備完了)で行う |
WIP制限の決め方:作業者数から始めて1ずつ下げる
WIP(Work In Progress)は「着手して、まだ終わっていない仕事」の枚数です。WIP制限は列ごとに置ける枚数の上限です。
初期値の決め方
| 列 | 初期値の目安 | 4人チームの例 | 理由 |
|---|---|---|---|
| 準備完了 | 作業者数×1.5 | 6 | 着手できる在庫を1〜2日分だけ持つ |
| 作業中 | 作業者数前後 | 4 | 1人1枚を基本にする |
| レビュー | 作業者数の半分前後 | 2 | 溜めずにすぐ見る習慣にする |
| 確認待ち | 依頼者が週に見られる枚数 | 3 | 依頼側の確認の速さに合わせる |
初期値はあくまで出発点の例です。大切なのは次の「見て下げる」手順です。
上限つきボードの記入例
4人チームの、ある日のボードです(次章の計算例とは別の日の例です)。列名の右の「現在/上限」を見ます。
| 依頼(上限なし) | 準備完了(3/6) | 作業中(4/4) | レビュー(3/2) | 確認待ち(2/3) | 完了 |
|---|---|---|---|---|---|
| K-13 貸出履歴の検索 | K-10 管理者向け集計表 | K-06 返却忘れの通知メール | K-04 予約の重複チェック | K-02 備品マスタの項目追加 | K-01 |
| K-14 権限の追加 | K-11 備品写真の表示 | K-07 検索条件の保存 | K-05 CSV出力の文字コード指定 | K-03 ログイン画面の文言修正 | |
| K-15 帳票の見出し変更 | K-12 操作ログの出力 | K-08 利用者一覧のページ分割 | K-16 予約画面の入力補助 | ||
| K-09 予約取消の確認画面 |
「レビュー」が3/2で上限を超えています。 このとき作業中の4人は、新しいカードを引かずにレビューを先に片付けます。上限は「超えたら誰かを責める数字」ではなく、「手伝いに回る合図」として使います。
待ちが溜まる箇所を見て下げる手順
| 観察したこと | 次の一手 |
|---|---|
| ある列が毎日上限いっぱい、その右の列は空きがある | その列の上限を1下げ、上流の人が手伝う取り決めにする |
| どの列も上限に届かない日が続く | 「作業中」の上限を1下げる |
| 上限を下げたら手が空く人が出た | そのままにする。空いた人は右側の列を手伝う、または準備完了を整える |
| 手が空く状態が1週間続き、完了枚数も減った | 1つ戻す |
| 「止まっている理由」が同じカードが並ぶ | 上限ではなく、その原因(回答待ち、環境待ち)への対処を先にする |
下げる順番は、溜まっている列のひとつ手前からです。レビューが溜まるなら、レビューではなく「作業中」を4から3にします。流し込む量を絞ると、下流に手が回るようになります。
リードタイム・サイクルタイム・スループットをPythonで計算する
3つの指標は、カードの日付3つから計算できます。
| 指標 | 計算 | 見る人 |
|---|---|---|
| リードタイム | 完了日 − 依頼日 | 依頼した人 |
| サイクルタイム | 完了日 − 着手日 | チーム |
| 着手待ち | 着手日 − 依頼日 | 優先順位を決める人 |
| スループット | 完了枚数 ÷ 日数 | 計画を立てる人 |
入力データ(cards.csv)
架空の12枚のカード履歴です。ボードのツールから出力したCSVも、この3つの日付の列があれば同じコードで計算できます。
id,title,created,started,done
K-01,予約一覧の並び替え,2026-09-01,2026-09-01,2026-09-04
K-02,備品マスタの項目追加,2026-09-01,2026-09-02,2026-09-08
K-03,ログイン画面の文言修正,2026-09-02,2026-09-02,2026-09-03
K-04,予約の重複チェック,2026-09-02,2026-09-04,2026-09-11
K-05,CSV出力の文字コード指定,2026-09-03,2026-09-08,2026-09-10
K-06,返却忘れの通知メール,2026-09-04,2026-09-09,2026-09-16
K-07,検索条件の保存,2026-09-07,2026-09-10,2026-09-15
K-08,利用者一覧のページ分割,2026-09-08,2026-09-11,2026-09-17
K-09,予約取消の確認画面,2026-09-09,2026-09-15,2026-09-18
K-10,管理者向け集計表,2026-09-10,2026-09-16,2026-09-24
K-11,備品写真の表示,2026-09-14,2026-09-17,2026-09-22
K-12,操作ログの出力,2026-09-15,2026-09-18,2026-09-25
計算コード(flow.py)
import csv
import math
from datetime import date, timedelta
from statistics import mean, median
with open("cards.csv", encoding="utf-8", newline="") as f:
cards = list(csv.DictReader(f))
for c in cards:
for k in ("created", "started", "done"):
c[k] = date.fromisoformat(c[k])
c["lead"] = (c["done"] - c["created"]).days # 依頼から完了まで
c["cycle"] = (c["done"] - c["started"]).days # 着手から完了まで
c["wait"] = c["lead"] - c["cycle"] # 着手待ち
print("id lead cycle wait")
for c in cards:
print(f'{c["id"]} {c["lead"]:4d} {c["cycle"]:5d} {c["wait"]:4d}')
leads = [c["lead"] for c in cards]
cycles = [c["cycle"] for c in cards]
print()
print(f"リードタイム 平均 {mean(leads):.2f} 日 / 中央値 {median(leads)} 日 / 最大 {max(leads)} 日")
print(f"サイクルタイム 平均 {mean(cycles):.2f} 日 / 中央値 {median(cycles)} 日 / 最大 {max(cycles)} 日")
s = sorted(leads)
print(f"85%のカードが収まる日数 {s[math.ceil(len(s) * 0.85) - 1]} 日")
start = min(c["created"] for c in cards)
end = max(c["done"] for c in cards)
days = (end - start).days
throughput = len(cards) / days
print(f"期間 {start} から {end} の {days} 日間、完了 {len(cards)} 枚")
print(f"スループット {throughput:.3f} 枚/日(週あたり {throughput * 7:.2f} 枚)")
# 日ごとのWIP(その日の時点で依頼済みかつ未完了の枚数)
wip = []
for i in range(days):
d = start + timedelta(days=i)
wip.append(sum(1 for c in cards if c["created"] <= d < c["done"]))
print("日ごとのWIP", wip)
avg_wip = mean(wip)
print(f"平均WIP(数えた値) {avg_wip:.3f}")
print(f"スループット×平均リードタイム {throughput * mean(leads):.3f}")
# 着手後だけのWIP(作業中の枚数)
wip2 = []
for i in range(days):
d = start + timedelta(days=i)
wip2.append(sum(1 for c in cards if c["started"] <= d < c["done"]))
print("日ごとの作業中の枚数", wip2)
print(f"平均(数えた値) {mean(wip2):.3f}")
print(f"スループット×平均サイクルタイム {throughput * mean(cycles):.3f}")
# 期間を途中で切った場合(9/8〜9/18 の10日間)
a, b = date(2026, 9, 8), date(2026, 9, 18)
n = (b - a).days
done_in = [c for c in cards if a <= c["done"] < b]
w = [sum(1 for c in cards if c["created"] <= a + timedelta(days=i) < c["done"]) for i in range(n)]
print()
print(f"途中の {n} 日間: 完了 {len(done_in)} 枚、平均WIP {mean(w):.2f}")
print(f"スループット×平均リードタイム {len(done_in) / n * mean(c['lead'] for c in done_in):.2f}")
実行結果
$ python3 flow.py
id lead cycle wait
K-01 3 3 0
K-02 7 6 1
K-03 1 1 0
K-04 9 7 2
K-05 7 2 5
K-06 12 7 5
K-07 8 5 3
K-08 9 6 3
K-09 9 3 6
K-10 14 8 6
K-11 8 5 3
K-12 10 7 3
リードタイム 平均 8.08 日 / 中央値 8.5 日 / 最大 14 日
サイクルタイム 平均 5.00 日 / 中央値 5.5 日 / 最大 8 日
85%のカードが収まる日数 12 日
期間 2026-09-01 から 2026-09-25 の 24 日間、完了 12 枚
スループット 0.500 枚/日(週あたり 3.50 枚)
日ごとのWIP [2, 4, 4, 4, 4, 4, 5, 5, 6, 6, 5, 5, 5, 6, 6, 5, 4, 3, 3, 3, 3, 2, 2, 1]
平均WIP(数えた値) 4.042
スループット×平均リードタイム 4.042
日ごとの作業中の枚数 [1, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1]
平均(数えた値) 2.500
スループット×平均サイクルタイム 2.500
途中の 10 日間: 完了 6 枚、平均WIP 5.30
スループット×平均リードタイム 5.20
日数は土日を含む暦日で数えています。営業日で数えたい場合は、日付の差を取る箇所を営業日数の計算に置き換えます。
結果の読み方
| 出力 | 読み取れること |
|---|---|
| 平均リードタイム 8.08日、平均サイクルタイム 5.00日 | 差の約3日は着手待ち。依頼から着手までに全体の4割近くを使っている |
| K-05 はサイクルタイム2日、着手待ち5日 | 作業そのものは短い。順番待ちで時間がかかった |
| 85%のカードが収まる日数 12日 | 「新しい依頼はいつ終わるか」には「おおむね12日以内」と答えられる |
| スループット 週あたり3.50枚 | 準備完了に14枚あれば、消化に約4週間かかる見込みになる |
| 作業中の枚数は最大3 | 4人チームで上限4に対し、常に3以下。上限を3に下げる余地がある |
平均WIP=スループット×平均リードタイムを検算する
待ち行列の分野で知られる関係(リトルの法則)を、カンバンの言葉に置き換えると次の式になります。
平均WIP = スループット × 平均リードタイム
上の実行結果で確かめます。
| 範囲 | 数えた平均 | 掛け算で求めた値 | 式 |
|---|---|---|---|
| 依頼から完了まで | 4.042 | 4.042 | 0.500 枚/日 × 8.083 日 |
| 着手から完了まで | 2.500 | 2.500 | 0.500 枚/日 × 5.000 日 |
日ごとに数えた枚数の平均と、掛け算の結果が一致しました。どの範囲で数えるかをそろえれば、どちらの組でも成り立ちます(依頼からのWIPにはリードタイム、着手からのWIPにはサイクルタイムを使います)。
式を変形すると、平均リードタイム=平均WIP÷スループットです。スループットが同じ0.5枚/日のまま、依頼からのWIPを4枚から3枚にできれば、平均リードタイムは約8日から6日になります。WIP制限が待ち時間を短くする理由は、この割り算にあります。
ぴったり一致するのは、すべてのカードが期間内に始まり期間内に終わっている場合です。実行結果の最後の2行は、同じデータを9月8日から10日間で切って計算したもので、数えた平均WIPは5.30、掛け算は5.20と少しずれています。期間の前後にまたがるカードがあるためです。月次で見る場合は「おおよそ合う」と考え、ずれが大きい月は、月をまたいで長く残っているカードを確認します。
カンバンとスクラムの違いと選び方
どちらも仕事を小さく区切って見える形にする点は同じです。違いは「何を単位に計画するか」と「途中の追加をどう扱うか」です。
| 比べる点 | カンバン | スクラム |
|---|---|---|
| 計画の単位 | カード1枚ずつ。空きができたら次を引く | スプリント(一定期間)ごとにまとめて計画する |
| 量の制限 | 列ごとのWIP制限 | 1回のスプリントに入れる量 |
| 途中の追加 | 上限の範囲でいつでも入れられる | スプリントの途中では基本的に入れ替えを控える |
| 主な指標 | リードタイム、サイクルタイム、スループット | スプリントごとの完了量 |
| 役割 | 決まった役割の定めはない。今の体制のまま始められる | 役割と定例の場が決まっている |
| 見直しの場 | 週1回などの短い確認 | スプリントごとのふりかえり |
選ぶときの判断基準です。
| 条件 | 選ぶもの |
|---|---|
| 割り込みや急ぎの依頼が週に何度もある | カンバン |
| 依頼が1件ずつばらばらに届く(運用保守、問い合わせ対応) | カンバン |
| 1〜2週間先までの作業をまとめて決められる | スクラム |
| まとまった機能を一定間隔で見せて意見をもらいたい | スクラム |
| 体制や会議を大きく変えずに始めたい | カンバン |
| スクラムで進めていて、スプリント内の滞りを減らしたい | スクラムのボードにWIP制限を足す |
両方を組み合わせることもできます。スプリントで計画を立て、ボードの列にWIP制限を付け、リードタイムを測るという使い方です。
週1回の見直しで見る項目
| 見る項目 | 確認の問い | 動き |
|---|---|---|
| 溜まっている列 | 上限いっぱいの日が何日あったか | 手前の列の上限を1下げる |
| 長く動かないカード | 同じ列に5日以上あるカードはどれか | 分割するか、止まっている理由に対処する |
| リードタイムの85%値 | 先週より伸びたか | 伸びたら着手待ちとサイクルタイムのどちらが増えたか見る |
| スループット | 週の完了枚数は安定しているか | 大きく揺れるならカードの大きさをそろえる |
| 急ぎのカード | 何枚割り込んだか | 多い場合は急ぎ用の段の上限を見直す |
確かめて分かったこと
- 平均WIPとスループット×平均リードタイムは、期間内に始まり終わるカードだけなら小数第3位まで一致しました(4.042)。
- 期間を途中で切ると一致しなくなります(5.30と5.20)。月次の集計で数字が合わなくても、計算の誤りとは限りません。
- WIPを数える範囲と時間の範囲はそろえる必要があります。 着手後の枚数(2.500)にリードタイムを掛けると合わず、サイクルタイムを掛けると合いました。
- 平均と中央値は近くても、85%値は離れます。 今回は平均8.08日、中央値8.5日に対して85%値は12日でした。納期の目安には85%値が向きます。
- サイクルタイムが短いカードほど、着手待ちの割合が大きく見えます。 K-05は7日のうち5日が着手待ちでした。短い作業は先に流す取り決めが効きます。
- 上限4の「作業中」に、実際は最大3枚しか入っていませんでした。 数字を出すと、上限を下げられる列が分かります。
よくある質問
Q. WIP制限とは何ですか? A. 列ごとに同時に置けるカードの枚数の上限です。上限に達したら新しい仕事を始めず、進行中のものを先に終わらせます。
Q. WIP制限はいくつにすればよいですか? A. 「作業中」を作業者数前後にして始め、1〜2週間ごとに1ずつ見直します。4人なら4から始め、溜まる列があればその手前を3にします。
Q. リードタイムとサイクルタイムの違いは何ですか? A. 起点が違います。リードタイムは依頼日から、サイクルタイムは着手日から、どちらも完了日までを数えます。差が着手待ちの時間です。
Q. カンバンとスクラムはどちらを選べばよいですか? A. 割り込みが多く計画を期間で区切りにくいならカンバン、1〜2週間分をまとめて計画できるならスクラムが合います。併用もできます。
Q. 上限を守れないときはどうすればよいですか? A. 超えた列を全員で先に片付けます。毎日超えるようなら、その列の手前の上限を1下げるか、カードを小さく分けます。
まとめ
- カンバン方式は、列・カード・上限の3つで始められます。
- WIP制限は作業者数前後から始め、溜まる列の手前を1ずつ下げます。
- 依頼日・着手日・完了日の3つを記録すれば、リードタイム・サイクルタイム・スループットを計算できます。
- 平均WIP=スループット×平均リードタイム。WIPを減らすと待ちが短くなります。
- 納期の目安は平均ではなく85%値で答えます。
- 割り込みが多い仕事にはカンバン、期間でまとめて計画できる仕事にはスクラムが合います。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「カンバン方式のやり方 列の例とWIP制限の決め方・計算例」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。