カンバン方式とは、作業をカードにして列(工程)の上を左から右へ流し、同時に進める枚数に上限(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. 今の流れをそのまま列にする。 理想の工程ではなく、今の仕事が通っている順番を書き出します。
  2. 仕事をカードにする。 1枚は「数日以内に終わる大きさ」を目安にし、依頼日を必ず書きます。
  3. 列に上限の数字を書く。 列名の横に「作業中(4)」のように書きます。
  4. 右から見る。 毎日の確認は完了に近い列から順に見て、「あと少しで終わるカード」を先に進めます。
  5. 日付を残して測る。 カードごとに依頼日・着手日・完了日の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期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?