📉

【脱Excel・PPT】生成AI×Google Colabで、研修資料の図解作成を2時間→10分に短縮した話

に公開

😫 研修資料作り、「図解」で力尽きていませんか?

最近、社内の中途社員(ジュニア層)に向けた技術研修の資料を作っているのですが、
これだけは言わせてください。

「演習問題の『回答図』を作るのが、あまりにもしんどい…!!」

テキストで解説を書くのは良いんです。
でも、それを補足する「グラフ」や「構成図」を作成しようとすると、途端に時間が溶けていきます。

  • Excelでデータを入れて、グラフの書式を整えて…
  • パワポで四角と矢印をポチポチ並べて、整列機能で微調整して…
  • 「あ、数値間違えてた」→ 最初からやり直し

たった1枚の図を作るのに、気づけば 1〜2時間 経過していることもザラです。
「コンサルの本分はそこじゃないのに…」という徒労感、わかっていただけるでしょうか。

今回は、そんな私が 「生成AI」「Google Colab」 という武器を使って、
この作業時間を 数分 にまで短縮できた体験をシェアします。

Pythonに詳しくない私でもできたので、きっと誰でもできます!

🛠️ 今回の救世主:Google Colaboratory とは?

今回の主役の一つ、「Google Colaboratory(通称:Colab)」について解説します。
名前は聞いたことあるけど使ったことない、という方も多いのではないでしょうか?

1. ブラウザだけで動くPython環境

通常、Pythonで図を描こうとすると、PCにPythonをインストールして、ライブラリを入れて…という「環境構築」が必要です。これだけで挫折しますよね。
Colabは、Googleアカウントとブラウザ さえあれば、URLを開いた瞬間にPythonが書ける環境が手に入ります。

2. 面倒なライブラリが「全部入り」

グラフを描画する MatplotlibSeaborn、データ分析に使う Pandas など、
主要なライブラリが最初からインストールされています。
pip install って何?」という状態でも、すぐに走り出せます。

3. 無料でハイスペック

Googleのサーバー上で計算を行うため、自分のPCが低スペックでも関係ありません。
基本的な利用であれば 完全無料 です。

🔄 実践:AIに投げて、Colabで描く

では、実際に私がやったフローを紹介します。
今回は例として、研修の演習問題にある「あるシステムのガントチャート」の回答図を作成するシーンをそのままお届けします。

ステップ1: 生成AIに「やりたいこと」を投げる

Gemini(またはClaude, ChatGPTなど)に、日本語で指示を出します。
Pythonのコードを書く必要はありません。「どんな図が欲しいか」を伝えるだけです。

私からのプロンプト:
以下の演習問題のWBSとスケジュールを作成してください。
スケジュールは画像にしたいので画像を作成するためのPythonコードを出力してください。

===
【演習1】 泥沼プロジェクトのWBS構築とスケジューリング

演習の目的:
断片的な情報(メモ)から、やるべき作業を抜け漏れなく構造化(WBS化)する力を養う
タスク間の「依存関係(前後関係)」と「リードタイム(待ち時間)」を見極め、最短で進めるための並行作業を計画する。
記述されていない「管理タスク(会議準備等)」や「バッファ(予備日)」の必要性に気づき、不確実性に備える。

お題(シナリオ):
あなたは、ある「会員データ移行プロジェクト」のPMOとして途中参画しました。
クライアントは「来月末(営業日ベースで残り20日)までに絶対に移行を完了したい」と言っています。
次項の【PMのメモ(雑多な情報)】を元に、WBS(タスク一覧)を作成し、
スケジュール(ガントチャートの概形)を引いてください。
※もし20日に収まらない場合は、その根拠と対策(案)も提示してください。

インプット情報:【PMの乱雑なメモ】
・とりあえず既存システム(A)からCSVでデータを吐き出して、新システム(B)に入れる必要がある。データ量は10万件。
・新システム(B)のDB構築はこれから。インフラ担当の田中さんに依頼が必要。
・田中さん曰く「サーバーの申請から払い出しまで、社内ルールで最低5営業日はかかるよ」とのこと。
・データのマッピング定義(Aのどの項目をBのどこに入れるか)は、開発の佐藤さんが3日で考える。
・移行プログラムの実装は佐藤さんがやる。5日くらいかな。
・あ、そういえば前回、「外字(特殊文字)」が文字化けして大騒ぎになったから、今回は事前に調査しておいた方がいいかも。(調査にどれくらいかかるかは不明>だが、必須)
・移行のリハーサルは1回やりたい。本番移行は土日でやる。
・本番移行判定の会議(Go/NoGo判定)を、移行の3日前には経営層とやりたい。
・クライアントの確認(受入テスト)期間も取っておいて。「最低でも3日は見たい」と言っていた。

ステップ2: 出てきたコードをColabにコピペ

AIは一瞬でPythonコードを生成してくれます。
それをコピーして、Google Colabのセル(入力欄)に貼り付け、再生ボタン(▶)を押すだけ。

実際にGiminiが出力してくれたソース
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
from datetime import datetime, timedelta

# 日本語フォント対応(インストールされていない場合は英語になります)
try:
    import japanize_matplotlib
    FONT_FAMILY = 'IPAexGothic'
except ImportError:
    FONT_FAMILY = 'sans-serif'
    print("japanize_matplotlib not found. Using default font.")

def create_gantt_chart():
    # --- 1. タスクデータの定義 ---
    # 作業開始日を Day 1 (2025-04-01) と仮定して作成
    base_date = datetime(2025, 4, 1)

    tasks = [
        # Project Management
        {"Task": "キックオフ", "Start": 0, "Duration": 1, "Resource": "PMO"},
        
        # Infra (Tanaka)
        {"Task": "サーバー申請・待機(5日)", "Start": 1, "Duration": 5, "Resource": "田中(Infra)"},
        {"Task": "新DB構築", "Start": 6, "Duration": 2, "Resource": "田中(Infra)"},
        
        # Dev (Sato)
        {"Task": "外字調査(リスク対策)", "Start": 1, "Duration": 2, "Resource": "佐藤(Dev)"},
        {"Task": "マッピング定義", "Start": 3, "Duration": 3, "Resource": "佐藤(Dev)"},
        {"Task": "移行PG実装", "Start": 6, "Duration": 5, "Resource": "佐藤(Dev)"},
        
        # Test / Rehearsal
        {"Task": "移行リハーサル", "Start": 11, "Duration": 2, "Resource": "全員"},
        {"Task": "クライアントUAT(3日)", "Start": 13, "Duration": 3, "Resource": "顧客/全員"},
        {"Task": "予備日/修正バッファ", "Start": 16, "Duration": 1, "Resource": "佐藤(Dev)"},

        # Decision & Cutover
        {"Task": "Go/NoGo判定(3日前)", "Start": 17, "Duration": 1, "Resource": "経営層/PM"},
        {"Task": "最終準備待機", "Start": 18, "Duration": 1, "Resource": "全員"},
        {"Task": "本番移行(Day20)", "Start": 19, "Duration": 1, "Resource": "全員"},
    ]

    # DataFrame化
    df = pd.DataFrame(tasks)
    
    # 日付計算
    df['Start_Date'] = df['Start'].apply(lambda x: base_date + timedelta(days=x))
    df['End_Date'] = df.apply(lambda row: row['Start_Date'] + timedelta(days=row['Duration']), axis=1)

    # --- 2. グラフ描画設定 ---
    fig, ax = plt.subplots(figsize=(12, 8))

    # 色分け
    colors = {
        "PMO": "#7f8c8d",
        "田中(Infra)": "#2980b9",
        "佐藤(Dev)": "#e67e22",
        "全員": "#27ae60",
        "顧客/全員": "#8e44ad",
        "経営層/PM": "#c0392b"
    }

    # バーの描画
    for i, task in df.iterrows():
        start = mdates.date2num(task['Start_Date'])
        end = mdates.date2num(task['End_Date'])
        duration = end - start
        
        color = colors.get(task['Resource'], "#333333")
        
        # ガントバー
        ax.barh(task['Task'], duration, left=start, color=color, edgecolor='black', alpha=0.8)
        
        # 日数ラベル
        ax.text(start + duration/2, i, f"{task['Duration']}日", 
                ha='center', va='center', color='white', fontweight='bold', fontsize=9)

    # --- 3. フォーマット調整 ---
    # Y軸(タスク名)を逆順にする(上から順に時系列にするため)
    ax.invert_yaxis()

    # X軸(日付)の設定
    ax.xaxis_date()
    ax.xaxis.set_major_locator(mdates.DayLocator(interval=2)) # 2日おきに目盛り
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
    
    # 営業日ベースの目安線(土日考慮なしの単純日数グリッド)
    ax.grid(True, which='major', axis='x', linestyle='--', alpha=0.5)

    # タイトルとラベル
    plt.title("会員データ移行プロジェクト 概略スケジュール (20営業日プラン)", fontsize=16, fontweight='bold')
    plt.xlabel("日付 (Day 1 = 4/01)", fontsize=12)
    plt.ylabel("タスク", fontsize=12)

    # 凡例の作成
    handles = [plt.Rectangle((0,0),1,1, color=colors[label]) for label in colors]
    plt.legend(handles, colors.keys(), loc='lower right', title="担当者")

    plt.tight_layout()
    
    # 画像として保存する場合
    # plt.savefig("gantt_chart.png", dpi=300)
    
    plt.show()

if __name__ == "__main__":
    create_gantt_chart()

これだけで、一発でそれっぽいグラフが表示されました!
ExcelやPPTで作成しようとしていた時間は何だったのか…。

ステップ3: AIと「壁打ち」して修正

ここからが本番です。
一発で完璧な図が出るとは限りません。
「ちょっとイメージと違うな」と思ったら、またAIにお願いします。

  • : 「背景色を薄いグレーにして」
  • AI: 「修正しました。コードはこちらです」
    • → Colabで再実行
  • : 「日付はDay1、Day2のみの表記にして」
  • AI: 「了解です。こちらをどうぞ」
    • → Colabで再実行

この 「修正 → 実行 → 確認」のサイクルが爆速 なのです。
ExcelやPPTでオブジェクトを選択してカチカチやるより、言葉で指示してコードを書き換えてもらう方が圧倒的に早いし、レイアウトが崩れることもありません。

😲 結果:120分が5分になった

このフローを確立した結果は以下の通り。
時間はおおよその推定です。早い人はもっと早く終わると思いますが、、、

Before(Excel / PPT)

  • データの入力と整形:30分
  • グラフ作成とデザイン調整:60分
  • 微調整(フォントサイズ等):30分
  • 合計:約2時間 😱

After(AI × Colab)

  • AIへのプロンプト作成:1分
  • Colabでの実行・確認:30秒
  • AIとの壁打ち修正(3〜4回):8分
  • 画像を保存して資料に貼る:30秒
  • 合計:約10分 🚀

感じた可能性

正直、私はPythonで複雑なグラフを描くコードを自分では書けません。

でも、「描きたい図のイメージ」さえあれば、コードはAIが書いてくれる。実行環境はColabが用意してくれる。

この組み合わせのおかげで、
「自分が詳しくない領域(Python作図)」であっても、
プロレベルのアウトプットを短時間で出せることに感動しました。

📝 まとめ:非エンジニアこそ使うべき

  • Google Colab は、環境構築不要ですぐに使えるPython環境。
  • 生成AI にコードを書かせれば、Python知識ゼロでも作図できる。
  • 修正も「言葉」で指示するだけ。Excelやパワポの手作業より圧倒的に早い。

中途採用や新人研修の資料作りで消耗している皆さん。
「Pythonなんて無理」と食わず嫌いせず、ぜひ一度、生成AIに
「Google Colabでこの図を描くコード書いて!」
と投げてみてください。

きっと、そのあまりの手軽さに驚くはずです。

実際に資料に採用した際の最終的なソース
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
from datetime import datetime, timedelta

# 日本語フォント対応
try:
    import japanize_matplotlib
    FONT_FAMILY = 'IPAexGothic'
except ImportError:
    FONT_FAMILY = 'sans-serif'

def create_wbs_gantt_chart_final():
    # --- 1. カレンダー設定 ---
    # プロジェクト開始日:2025/4/1 (火)
    project_start_date = pd.Timestamp("2025-04-01")
    
    # 40日分のカレンダー生成
    calendar_range = pd.date_range(start=project_start_date, periods=40, freq='D')
    is_business_day = calendar_range.dayofweek < 5
    business_days = calendar_range[is_business_day]

    # 営業日計算関数
    def get_dates(start_biz_idx, duration_biz):
        if start_biz_idx >= len(business_days): return None, None
        start = business_days[start_biz_idx]
        end_idx = start_biz_idx + duration_biz - 1
        end = business_days[end_idx] if end_idx < len(business_days) else business_days[-1]
        # 表示用に終了日時は翌0:00とする
        return start, end + timedelta(days=1)

    # --- 2. タスク定義 (1.3を追加) ---
    # 営業日インデックス: 0=4/1(火), 4=4/7(月), 9=4/14(月), 14=4/21(月), 16=4/23(水)
    
    tasks_data = [
        # --- 1. プロジェクト管理(初期) ---
        {"Task": "1.1 キックオフ/全体計画", "Start_Biz": 0, "Duration_Biz": 1, "Resource": "PMO"},
        
        # --- 3. 移行設計・準備 (先行着手) ---
        {"Task": "3.0 旧データ(CSV)受領", "Start_Biz": 0, "Duration_Biz": 1, "Resource": "クライアント"},
        
        # --- 2. インフラ・環境 ---
        {"Task": "2.1-2.2 サーバー申請・待機", "Start_Biz": 0, "Duration_Biz": 5, "Resource": "田中(Infra)"},
        {"Task": "2.3 新DB構築・接続確認", "Start_Biz": 5, "Duration_Biz": 2, "Resource": "田中(Infra)"},
        
        # --- 3. 移行設計 (続き) ---
        {"Task": "3.1 外字(特殊文字)影響調査", "Start_Biz": 0, "Duration_Biz": 2, "Resource": "佐藤(Dev)"},
        {"Task": "3.2-3.3 マッピング定義・承認", "Start_Biz": 2, "Duration_Biz": 3, "Resource": "佐藤(Dev)"},
        
        # --- 4. 実装・単体テスト ---
        {"Task": "4.1-4.2 移行PG実装・単体テスト", "Start_Biz": 5, "Duration_Biz": 5, "Resource": "佐藤(Dev)"},
        
        # --- 5. テスト・リハーサル ---
        {"Task": "5.2 移行リハーサル実施", "Start_Biz": 10, "Duration_Biz": 1, "Resource": "全員"},
        {"Task": "5.4 UAT(受入テスト)", "Start_Biz": 11, "Duration_Biz": 3, "Resource": "顧客/全員"},
        {"Task": "5.5 最終修正・凍結", "Start_Biz": 14, "Duration_Biz": 2, "Resource": "佐藤(Dev)"},

        # --- 6. 本番移行準備 & 判定 ---
        # 手順書作成: 修正期間と並行
        {"Task": "6.1 移行手順書作成", "Start_Biz": 14, "Duration_Biz": 3, "Resource": "PMO"},
        
        # --- [追加] 判定資料作成 ---
        # UAT結果(Day13終了)を受けて作成。Day15(月)-16(火)で実施
        {"Task": "1.3 Go/NoGo判定資料作成", "Start_Biz": 14, "Duration_Biz": 2, "Resource": "PMO"},
        
        # 判定会議: Day17(水)
        {"Task": "1.4 Go/NoGo判定会議", "Start_Biz": 16, "Duration_Biz": 1, "Resource": "経営層/PM"},
    ]

    df = pd.DataFrame(tasks_data)
    df['Start_Date'], df['End_Date'] = zip(*df.apply(
        lambda row: get_dates(row['Start_Biz'], row['Duration_Biz']), axis=1
    ))

    # 土日移行タスク
    cutoff_start = pd.Timestamp("2025-04-26")
    cutoff_end = pd.Timestamp("2025-04-28")
    cutoff_row = {
        "Task": "6.2 本番移行実施(土日)", "Start_Biz": -1, "Duration_Biz": 0, 
        "Resource": "全員", "Start_Date": cutoff_start, "End_Date": cutoff_end
    }
    df = pd.concat([df, pd.DataFrame([cutoff_row])], ignore_index=True)

    # --- 3. 描画 ---
    fig, ax = plt.subplots(figsize=(14, 11)) # 少し縦長に調整
    
    colors = {
        "PMO": "#95a5a6", "田中(Infra)": "#3498db", "佐藤(Dev)": "#e67e22",
        "全員": "#2ecc71", "顧客/全員": "#9b59b6", "経営層/PM": "#e74c3c", "クライアント": "#8e44ad"
    }

    # 土日塗りつぶし
    plot_start = df['Start_Date'].min() - timedelta(days=1)
    plot_end = df['End_Date'].max() + timedelta(days=1)
    current = plot_start
    while current <= plot_end:
        if current.weekday() >= 5:
            ax.axvspan(mdates.date2num(current), mdates.date2num(current+timedelta(days=1)), facecolor='gray', alpha=0.15)
        current += timedelta(days=1)

    # バー描画
    for i, task in df.iterrows():
        start = mdates.date2num(task['Start_Date'])
        end = mdates.date2num(task['End_Date'])
        duration = end - start
        c = colors.get(task['Resource'], "#333")
        
        ax.barh(task['Task'], duration, left=start, color=c, edgecolor='black', alpha=0.9)
        
        # ラベル
        if task['Duration_Biz'] > 0:
            label = f"{task['Duration_Biz']}日"
        else:
            label = "土日"
        ax.text(start + duration/2, i, label, ha='center', va='center', color='white', fontweight='bold', fontsize=9)

        # Go/NoGoの強調
        if "Go/NoGo" in task['Task'] and "会議" in task['Task']:
            ax.axvline(x=start+0.5, color='red', linestyle='--', linewidth=2, alpha=0.7)
            ax.text(start, i-0.6, "3日前判定(Day17)", color='red', fontweight='bold', fontsize=10)

    # --- 4. 軸設定 ---
    ax.invert_yaxis()
    ax.set_xlim(plot_start, plot_end)
    ax.xaxis_date()
    ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
    
    # Day X 表記のみ
    def day_formatter(x, pos):
        d = mdates.num2date(x).replace(tzinfo=None)
        diff = (d - project_start_date).days + 1
        return f"Day {diff}"
    
    ax.xaxis.set_major_formatter(plt.FuncFormatter(day_formatter))
    plt.xticks(rotation=45, fontsize=8)
    ax.grid(True, which='major', axis='x', linestyle=':', alpha=0.6)

    plt.title("会員データ移行プロジェクト スケジュール", fontsize=16, fontweight='bold')
    plt.xlabel("プロジェクト経過日数", fontsize=12)
    plt.tight_layout()
    plt.show()

if __name__ == "__main__":
    create_wbs_gantt_chart_final()

作成された画像

📚 参考出典

Discussion