実案件/ポートフォリオ

コピペで回るレポート納品|Jupyter→PDF/HTML→共有の自動化テンプレ

毎週のレポート納品、朝にバタつきませんか?

コードや図表は作ったのに、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.txtbuild.py1コマンド
  • セキュリティ:PII/機微情報のマスキング。
  • 法令/規約:外部データの出典表記と利用条件。

ユースケース別“第一手”

営業週報:KPI推移+上位顧客Top10+施策ハイライトをPDF+Excelで配布。
ECダッシュボード:価格/在庫の差分ハイライトをHTMLで社内ポータルに掲出。
広告運用レポート:チャネル別ROI+入札変更ログのタイムライン。PowerPoint併産が喜ばれます。

今日やること(60分の導入プラン)

  1. 本記事のリポジトリ構成を丸ごと作る。
  2. matplotlib.mplstylereport.cssを保存し、図1枚を出して保存規約で命名。
  3. build.pyを置き、HTML出力まで通す。
  4. 余裕があればGitHub Actions夜間ビルドを設定。

まとめ:レポートは“台本と自動化”で安定化

構成・図表・オペの揺らぎは、台本(ノート構成)× スタイル(図表統一)× ビルド(自動化)で消せます。この記事のテンプレをベースに、フォルダ → スタイル → papermill/nbconvert → 配布/アーカイブまでを一気通貫で整えましょう。Excel/PowerPointの併産やActions/cron連携まで押さえれば、定例も副業納品も“静かに回る”はずです。

伴走のご案内:あなたのレポート運用を“1ボタン化”

無料カウンセリング/体験で、あなたのレポートを台本化 → スタイル統一 → 自動ビルドまで導入します。

TechAcademy データサイエンスコース(受講料:174,600円~ ※更に割引あり)

TechAcademy 無料相談

株式会社キカガク 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の実務トーンで「防ぐ→気づく→復旧する」をコー ...

最近のコメント

    • この記事を書いた人
    • 最新記事

    ふみと

    このブログでは、データサイエンティストとして市場価値を上げる方法を独自にまとめて発信しています。

    【プロフィール】
    ・大手企業データサイエンティスト/マーケティングサイエンティスト(10年、年収900万円台)/案件100件以上
    ・資格:JDLA E資格(日本ディープラーニング協会主催)/JDLA Community(CDLE会員)/Advanced Marketer/ビジネス統計スペシャリスト/統計検定2級/TOEIC 805
    ・スキル:Python/Tableau/SQL/機械学習/Deep Learning/RPA

    -実案件/ポートフォリオ