見出し画像

SQLはプロジェクト管理で大活躍 - 直積演算の力を知ってほしい -

こんにちは。コグラフ株式会社データアナリティクス事業部の塩見です。今回は、データ分析が得意な方がプロジェクト管理でも活躍できる理由についてお話しします。

プロジェクト管理では、膨大なタスクを適切に管理する必要があります。各タスクに担当者や開始日、終了日を設定し、工数も管理しなければなりません。特に大規模なプロジェクトでは、タスクが何千行にも及ぶことがあります。この膨大なタスク一覧を見ただけでは、プロジェクト全体がうまく計画されているかを簡単に判断するのは困難です。

そこで、タスク管理データをSQLで処理する方法を提案します。通常、タスク管理データは扱いにくい構造になっているため、まずその構造を変換する必要があります。この変換に役立つのがSQLの「直積」演算です。直積演算を活用することで、データの力を感じていただけると思います。


タスク管理の課題とExcelの限界

プロジェクトの進行において、タスク管理は重要な業務の一つです。しかし、タスク管理データをどう扱うかによって、その管理のしやすさは大きく変わります。今回は、具体的なタスク状況をもとに、どのような課題が発生しやすいか、そしてExcelでの管理の限界について考えてみます。

典型的なタスク管理データの例を下図に示します。このデータはタスクごとに一意となっています。複数人で一つのタスクを担当する場合はこの記事では考慮しません。

タスク管理データの例

タスク管理データからわかること

  • タスクA: 担当は秋田さんで、10月1日から10月4日までの予定です。工数は32時間なので、1日8時間の作業で完了できます。

  • タスクF: 担当は福井さんで、10月1日から10月8日までの予定です。工数は64時間ですが、期間中に土日が含まれるため、実際の稼働日は6日しかありません。そのため、1日あたりの必要工数は10時間を超え、福井さんには残業が必要となりそうです。

次に、10月11日の秋田さんに注目します。この日はタスクBタスクCを担当する予定ですが、それぞれ1日あたりの工数が8時間で、合計16時間となってしまいます。このため、計画の見直しが必要です。

また、福井さんの計画を詳しく見ると、工数の偏りが見られます。例えば、10月9日と10月10日は工数がゼロで、10月17日以降は1日4時間程度の余裕があります。このような不均一な工数配分も見直しが必要です。

タスクの目視確認は困難

タスクの数が少ない場合は、上記のような問題も目視で確認できます。しかし、プロジェクトが大規模になり、タスクが100件、さらには1000件を超えるようになると、全体を把握することは非常に困難です。目視での確認だけでは、見落としやミスが増えてしまうでしょう。

Excelでのタスク管理の限界

「Excelで自動的に確認できればいいのでは?」と考える人もいるかもしれません。しかし、Excelでタスク管理を行うのは意外と難しいのです。複雑な関数を駆使すれば、特定の問題は解決できるかもしれませんが、別の問題が発生した場合、さらに複雑な対応が必要になります。

例えば、月単位で集計していたデータを週単位で集計し直すといった場合、シート全体を大幅に変更する必要があります。こうした柔軟性の欠如は、Excelでのタスク管理の大きな制約です。

データ粒度の問題

Excelでタスク管理データを扱いにくい理由の一つは、このデータの「粒度」が粗いからです。現在のタスク管理データでは、各タスクは開始日と終了日だけで1行にまとめられています。しかし、より適切な管理方法としては、タスクと日付の組み合わせを一意にし、各日付ごとに1行ずつ登録する形式が望ましいです。

例えば、タスクAが10月1日から10月4日までの4日間に渡るなら、下図のように各日付(10月1日、2日、3日、4日)に対して1行ずつデータを記載します。このように日付単位でデータを細かく管理することで、柔軟に集計・分析ができ、タスク管理が一層効率的になります。

タスク管理データ(日付単位)

SQLの力 - 直積演算でタスクデータを変換

では、SQLを使ってこの問題をどう解決するか、具体的に見ていきましょう。特に有効なのが「直積演算」(CROSS JOIN)です。この演算は、2つのテーブルをすべての組み合わせで結合し、新しいデータセットを作成する操作です。これを利用して、日付ごとのタスク管理データを生成することができます。

例えば、タスクAは10月1日から10月4日までの期間に割り当てられていますが、これを1行にまとめてしまうと、日ごとの状況を分析するのが困難です。そこで、タスクの日付範囲と、それに対応する日付リストを直積演算で結合することで、日ごとのデータを生成します。

直積演算の例

まず、タスク管理データのように、開始日と終了日が指定されたデータセットを準備します。そして、プロジェクト期間中の全日付をリストとして用意します。この2つのセットに対して直積演算を行うことで、各タスクがプロジェクト期間中のどの日にどれだけの工数を消費するかを、日別に展開することができます。

-- 説明用の簡易コード

SELECT 
    tasks.task_name, 
    dates.date, 
    tasks.assignee, 
    tasks.daily_hours
FROM 
    tasks
CROSS JOIN -- ←これが直積演算
    dates
WHERE 
    dates.date BETWEEN tasks.start_date AND tasks.end_date;

このSQL文では、tasksテーブルとdatesテーブルの直積を作り、各タスクの開始日から終了日までの日付に対応する行を生成します。これにより、日別のタスク割り当てデータが得られ、どの日にどれだけの作業が必要かを一目で把握できるようになります。

SQLを活用したタスク管理の効果

この方法を採用すると、以下のような効果が期待できます。

  1. 柔軟な集計が可能: 日付ごとにデータを持つことで、日次、週次、月次の集計を容易に行えるようになります。Excelのように大規模なシート改修を行わなくても、クエリ一つで集計範囲や視点を変えられます。

  2. 負荷の平準化が容易: 各担当者の工数を日別に把握できるため、特定の日に工数が集中していないか、計画の不均一性を視覚的に確認できます。たとえば、福井さんが10月1日から8日までの間で64時間の作業が割り当てられている場合、SQLを使って稼働時間が過剰な日や余裕のある日をすぐに見つけられます。

  3. 自動化のしやすさ: SQLはスクリプト化や自動化が容易なため、プロジェクトの進行に合わせてタスク管理データを自動的に更新・集計することが可能です。これにより、大規模プロジェクトでもタスク管理が効率的に行えます。

Excelを超えるデータ管理の柔軟性

Excelでは、手動でシートを編集しながら工数を管理していた場合、特定の条件が変わった際には大幅な修正作業が必要でした。しかし、SQLを使ったデータ管理では、クエリを変更するだけで新たな条件に対応できるため、プロジェクトの状況に応じた素早い対応が可能になります。

たとえば、月単位での集計から週単位での集計に変更したい場合でも、SQLを1行変えるだけで済みます。こうした柔軟性こそが、SQLを使ったタスク管理の大きな魅力です。

実用的なコード

上記のコードは説明のために簡略化したものでした。参考までに、実用レベルのコードを以下に示します。SQLite3で動作しますが、使用環境に合わせて適宜修正してご利用ください。

-- テーブル定義

-- タスク管理データ
CREATE TABLE tasks (
    task_name,
    assignee,
    start_date,
    end_date,
    work_hours
);

-- 稼働日カレンダー
CREATE TABLE dates (
    date,
    is_working_day -- 0:休日, 1:稼働日
);

-- プロジェクトメンバーの名簿
CREATE TABLE member (
    member_name
);
-- この部分はsqlite3のコマンド

-- CSV読み取りモードにしてテーブルにCSVをインポート
-- インポートする時にCSVの1行目(ヘッダー)はスキップする
-- SELECTで表示する時はヘッダーをon(表示する)
.mode csv
.import tasks.csv tasks --skip 1
.import dates.csv dates --skip 1
.import member.csv member --skip 1
.header on
-- 分析コード

-- タスクごとの稼働日数(working_days)を数える
WITH summary AS (
    SELECT
        task_name,
        COUNT(*) AS working_days
    FROM tasks
    CROSS JOIN dates
    WHERE
        dates.date BETWEEN tasks.start_date AND tasks.end_date
        AND is_working_day is true -- 稼働日だけに絞る
    GROUP BY
        task_name
)

-- 日別タスク別に、1日あたり工数(daily_hours)を計算する
,daily_tasks AS (
    SELECT
        tasks.task_name,
        tasks.assignee,
        dates.date,
        tasks.work_hours / summary.working_days AS daily_hours
    FROM tasks
    CROSS JOIN dates
    INNER JOIN summary
    ON tasks.task_name=summary.task_name
    WHERE
        dates.date BETWEEN tasks.start_date AND tasks.end_date
        AND is_working_day is true
)

-- プロジェクトメンバーごとの稼働日カレンダーを作成する
,member_dates AS (
    SELECT *
    FROM dates
    CROSS JOIN member
)

-- 担当別日別工数集計
SELECT
    member_dates.member_name,
    member_dates.date,
    SUM(daily_tasks.daily_hours) AS daily_hours
FROM member_dates
LEFT JOIN daily_tasks
ON member_dates.date=daily_tasks.date AND member_dates.member_name=daily_tasks.assignee
WHERE
    member_dates.is_working_day is true
GROUP BY
    member_dates.member_name,
    member_dates.date;

まとめ

データ分析のスキルを活かしてプロジェクト管理を行うことで、タスクの負荷を平準化し、無駄や非効率を削減することができます。SQLの直積演算はタスクと日付の関係を簡潔に把握し、日別の工数配分や負荷の集中を防ぐためのツールとして有効に活用できます。

Excelに限界を感じている方や、複雑なプロジェクトを効率よく管理したい方は、ぜひSQLを活用したタスク管理に挑戦してみてください。プロジェクトの成功に向けた新たな一歩となるはずです。

データ分析に興味のある方募集中!

コグラフ株式会社データアナリティクス事業部ではPythonやSQLの研修を行った後、実務に着手します。
研修内容の充実はもちろん、経験者に相談できる環境が備わっています。
このようにコグラフの研修には、実務を想定し着実にスキルアップを目指す環境があります。
興味がある方は、下記リンクよりお問い合わせください。

Twitterもやってます!

コグラフデータ事業部ではTwitterでも情報を発信しています。
データ分析に興味がある、データアナリストになりたい人など、ぜひフォローお願いします!

この記事が気に入ったらサポートをしてみませんか?