
毎週のレポート納品、朝にバタつきませんか?
コードや図表は作ったのに、PDF化や共有で崩れる…。その“揺らぎ”を今日で終わらせましょう。
分析の価値は、最後の“納品物”で決まります。本記事では、Jupyterで分析 → 図表生成 → PDF/HTML化 → バージョン管理 → 共有までを、毎週コピペで回せるテンプレートにまとめました。私(ふみと)が現場で100件以上回して安定した“台本+自動化”の型を、フォルダ構成・Notebook台本・nbconvert/papermill・CSS/LaTeX・GitHub Actionsまでセットで公開します。
この記事でできること
- 構成の再現性:フォルダ/命名/相関IDのルール化
- 図表の一貫性:スタイル・色・注釈・保存規約の統一
- 納品オペの自動化:papermill → nbconvert → PDF/HTML → 共有/アーカイブ
関連記事:
>>実案件型ポートフォリオ:要件→実装→レポートの型|“業務再現”で採用担当に刺さる作り方
>>“落ちない”社内自動化3選:再実行安全・ロック・JSONログで回す設計とテンプレ
>>データ可視化レポート納品の型:Tableau/Matplotlib|“図3点+結論1行+運用”で伝わる・続く・刺さる
>>もう事故らせない:PythonでCSV/JSON/Excelを安全に読み書きする実務レシピ
>>Python実務の型:例外処理と構造化ログでエラーに強いコードを書く
>>自動化:スケジューリングと業務改善の型|「再実行安全×観測可能×静かに動く」を仕組みにする
>>Docker超入門:学習環境を箱ごと保存する|“同じ環境が誰でも動く”を最小コストで実現
レポート納品が“揺らぐ”3つの理由
ありがちな失敗はこの3つに集約されます。テンプレ+自動化で未然に塞ぎましょう。
- 構成の揺らぎ:毎回フォルダ/命名が違い、差分が追えない。
- 図表の揺らぎ:チャート種や色が毎回変わり、比較できない。
- オペレーション破綻:手作業が多く、〆切当日の朝に壊れる。
ふみとの現場ノート
最初の頃、週報PDFを手で書き出していて、ページ番号のズレで差し戻しになったことがあります。以降は「台本(章立て)→ スタイル適用 → 一発ビルド」に切り替え、朝の事故ゼロにできました。本記事はその型をそのまま渡します。
テンプレの全体像:フォルダ → Notebook → ビルド → 共有
1) リポジトリ構成と命名規約(コピペOK)
report-kit/
README.md
data/
raw/ # 入手データ(触らない)
interim/ # 中間(Parquet/キャッシュ)
out/ # 図・表(PNG/CSV)
notebooks/
00_preamble.ipynb # 図表スタイル/関数の読み込み
10_eda.ipynb # 品質チェック・俯瞰
20_analysis.ipynb # 主要分析
30_report.ipynb # 図表貼り込み・文章生成
styles/
matplotlib.mplstyle
report.css
report.tpl # nbconvertテンプレ(Jinja)
build/
build.py # papermill→nbconvertの一発ビルド
dist/ # 出力(PDF/HTML/ZIP)
requirements.txt
Dockerfile(任意)
命名ルール:{YYYYMMDD}_週次レポート_v{rev}.pdf
、図はfig_{章番号}_{連番}_{短い説明}.png
。
2) Notebook台本(章立てテンプレ)
00_preamble:ライブラリ読み込み、matplotlib
スタイル適用、共通関数、SEED/REPORT_ID
発行。
10_eda:品質チェック表(行数/重複/日付欠落/NULL率)、主要指標の週次/カテゴリ別ヒートマップ。
20_analysis:KPI推移(移動平均/前年比)、寄与分解、仮説の検証。
30_report:章立てと文章、図表の貼り込み、注釈/制約/次アクションを明記。PDF/HTMLへ出力。
3) 図表スタイル(レポートの“顔”を統一)
styles/matplotlib.mplstyle(最小例)
figure.dpi: 150
savefig.dpi: 150
font.size: 10
axes.titlesize: 12
axes.labelsize: 10
axes.grid: True
grids.alpha: 0.2
legend.frameon: False
Notebook先頭:
import matplotlib.pyplot as plt
plt.style.use("styles/matplotlib.mplstyle")
注釈テンプレ:
ax = df.plot(x="date", y="sales")
ax.set_title("週次売上推移(移動平均7日)")
ax.set_xlabel("日付"); ax.set_ylabel("売上")
ax.annotate("キャンペーン", xy=(pd.Timestamp("2025-08-01"), 1200),
xytext=(+7, +200), textcoords="offset points",
arrowprops=dict(arrowstyle="->"))
plt.tight_layout()
plt.savefig("data/out/fig_20_01_sales.png", bbox_inches="tight")
可視化ポリシーの詳細は → [内部リンク:データ可視化レポート納品の型] を参照。
4) papermillでパラメータ化 → nbconvertでPDF/HTML
build/build.py(コピペ)
from pathlib import Path
import papermill as pm
import nbformat
from nbconvert import PDFExporter, HTMLExporter
from traitlets.config import Config
from datetime import date
ROOT = Path(**file**).resolve().parents\[1]
NB = ROOT/"notebooks"
DIST = ROOT/"dist"; DIST.mkdir(exist\_ok=True)
DATE = date.today().strftime("%Y%m%d")
# 1) パラメータ注入(週・フィルタ条件など)
pm.execute\_notebook(
NB/"30\_report.ipynb", # 入力
NB/"30\_report\_out.ipynb", # 出力(実行後)
parameters={"report\_date": DATE}
)
# 2) HTMLエクスポート(CSS適用)
html\_conf = Config()
html\_conf.TemplateExporter.exclude\_input = True # コード非表示
html = HTMLExporter(config=html\_conf)
html.exclude\_input = True
(body\_html, res) = html.from\_filename(NB/"30\_report\_out.ipynb")
(ROOT/"styles"/"report.css").write\_text((ROOT/"styles"/"report.css").read\_text(encoding="utf-8"), encoding="utf-8")
(DIST/f"{DATE}\_週次レポート.html").write\_text(body\_html, encoding="utf-8")
# 3) PDFエクスポート(LaTeX環境がある場合)
pdf\_conf = Config()
pdf\_conf.TemplateExporter.exclude\_input = True
pdf = PDFExporter(config=pdf\_conf)
(body\_pdf, res) = pdf.from\_filename(NB/"30\_report\_out.ipynb")
(DIST/f"{DATE}\_週次レポート.pdf").write\_bytes(body\_pdf)
補足:PDF出力は環境依存(LaTeXが必要)。代替としてHTML→印刷PDF、またはWeasyPrint/ wkhtmltopdf
のCLI利用も実務では有効です。
styles/report.css(ページ区切り/ヘッダフッタ)
@page { size: A4; margin: 18mm; }
h1, h2, h3 { page-break-after: avoid; }
.figure { page-break-inside: avoid; margin: 0 0 12px; }
.footer { color: #777; font-size: 10px; text-align: right; }
5) 文章ブロックの型(30_report.ipynb内で使う)
- 結論(1行):今週はKPIが前年比+5.2%、主因は新規獲得。
- 根拠(図表):図20-01/20-02。施策施行日に段差。
- 解釈(業務):A/B差から、同規模施策で+2〜3%再現見込み。
- 次アクション:①来週も同一条件で継続、②未実施セグメントへ拡張。
- リスク/制約:外れ値、季節性、在庫制約に注意。
6) Excel/PowerPointを“併産”(現場向け)
Excel(サマリ/明細)
import pandas as pd
with pd.ExcelWriter("dist/出力.xlsx", engine="xlsxwriter") as w:
summary.to_excel(w, sheet_name="サマリ", index=False)
detail.to_excel(w, sheet_name="明細", index=False)
PowerPoint(python-pptx、任意)
from pptx import Presentation
from pptx.util import Inches
prs = Presentation()
s = prs.slides.add_slide(prs.slide_layouts[5])
title = s.shapes.title or s.shapes.add_textbox(Inches(0.5), Inches(0.2), Inches(9), Inches(1)).text_frame
title.text = "週次レポート"
s.shapes.add_picture("data/out/fig_20_01_sales.png", Inches(0.5), Inches(1.2), width=Inches(8))
prs.save("dist/週次レポート.pptx")
媒体別テンプレを最初から用意しておくと、依頼側の満足度が上がります。
7) 共有とアーカイブ(配布→検索可能へ)
- 配布:共有フォルダ/Teams/Slackに
dist/*.pdf
を固定パスで上書き。 - アーカイブ:
dist/archive/{YYYY}/{YYYYMMDD}_report.pdf
で世代管理。 - 検索性:ファイル名とREADMEのCHANGELOGに要約。
- 相関ID:本文/ファイル名/ログに同一IDを刷り込み、追跡を1秒に。
8) ビルド自動化(ローカル/Actions/cron)
GitHub Actions(週次ビルド例)
name: weekly-report
on:
schedule:
- cron: "10 21 * * *" # JST 6:10(UTC+9)
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: pip install -r requirements.txt
- run: python build/build.py
- uses: actions/upload-artifact@v4
with: { name: report, path: dist/ }
ローカル(cron/Task Scheduler)の設定は → [内部リンク:自動化:スケジューリングと業務改善の型] を参照。
9) 品質チェックリスト(納品前の3分)
- 表紙:タイトル/日付/版数/担当/問い合わせ先。
- 要約:結論 → 根拠 → アクションの3行。
- 図表:凡例/軸ラベル/単位/注釈/出典。
- 再現:
requirements.txt
とbuild.py
で1コマンド。 - セキュリティ:PII/機微情報のマスキング。
- 法令/規約:外部データの出典表記と利用条件。
ユースケース別“第一手”
営業週報:KPI推移+上位顧客Top10+施策ハイライトをPDF+Excelで配布。
ECダッシュボード:価格/在庫の差分ハイライトをHTMLで社内ポータルに掲出。
広告運用レポート:チャネル別ROI+入札変更ログのタイムライン。PowerPoint併産が喜ばれます。
今日やること(60分の導入プラン)
- 本記事のリポジトリ構成を丸ごと作る。
matplotlib.mplstyle
とreport.css
を保存し、図1枚を出して保存規約で命名。build.py
を置き、HTML出力まで通す。- 余裕があればGitHub Actionsで夜間ビルドを設定。
まとめ:レポートは“台本と自動化”で安定化
構成・図表・オペの揺らぎは、台本(ノート構成)× スタイル(図表統一)× ビルド(自動化)で消せます。この記事のテンプレをベースに、フォルダ → スタイル → papermill/nbconvert → 配布/アーカイブまでを一気通貫で整えましょう。Excel/PowerPointの併産やActions/cron連携まで押さえれば、定例も副業納品も“静かに回る”はずです。
伴走のご案内:あなたのレポート運用を“1ボタン化”
無料カウンセリング/体験で、あなたのレポートを台本化 → スタイル統一 → 自動ビルドまで導入します。
TechAcademy データサイエンスコース(受講料:174,600円~ ※更に割引あり)

株式会社キカガク AI人材長期育成コース(受講料:237,600円~)

この記事から次に読むべきもの(内部リンク)
-
-
データ可視化レポート納品の型:Tableau/Matplotlib|“図3点+結論1行+運用”で伝わる・続く・刺さる
結論:レポートは「データ→図」ではなく「意思決定→図」の順で設計します。最短で伝わり、運用で続く“型”は、(1) 結論1行、(2) 図3点(推移・分解・構成)、(3) 打ち手(閾値/費用対効果)、(4 ...
-
-
“落ちない”社内自動化3選:再実行安全・ロック・JSONログで回す設計とテンプレ
社内の自動化、まず何から作ればいい? ちゃんと動き続けて、運用が楽になる設計が知りたい…! そんな悩みに対して、現場で短期に価値を出しやすい“3つの自動化”と、そのまま使える設計&コードの型をまとめま ...
-
-
実案件型ポートフォリオ:要件→実装→レポートの型|“業務再現”で採用担当に刺さる作り方
結論:採用担当が知りたいのは 「Kaggleのスコア」ではなく「現場で本当に回るか」。だからこそ、要件が言語化され、再現できる実装があり、最後は意思決定に直結するレポートで締める——この3点を1つの物 ...
-
-
もう事故らせない:PythonでCSV/JSON/Excelを安全に読み書きする実務レシピ
CSV/JSON/Excelの読み書き、どこから気をつければいい? 文字化け・先頭ゼロ欠落・壊れたExcel……もう事故らせたくない! 結論:データ仕事の9割はI/O(入出力)。ここを整えるだけで、桁 ...
-
-
Python実務の型:例外処理と構造化ログでエラーに強いコードを書く
例外処理って、結局どこまでやれば“実務で困らない”の? ログも整えるのって大変そう…最低限の型、ください! この記事は、pythonbunseki.comの実務トーンで「防ぐ→気づく→復旧する」をコー ...
最近のコメント