【脱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. 面倒なライブラリが「全部入り」
グラフを描画する Matplotlib や Seaborn、データ分析に使う 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