100本ノック / Python / データ分析のためのPython入門100本ノック

Pythonでできることを理解する

データ分析のための Python 入門 100本ノック

製造業の現場データを題材に、Python によるデータ分析スキルを 100本のノックで体系的に習得するシリーズです。
本シリーズは数理工房が製造業・DX 推進担当者向けに設計しています。

[!NOTE] 本資料は、数理工房 (もしくは代表である和山個人) が過去に企業研修において使用した notebook を企業様の許可を得て再構成・編集のうえ公開しています。
掲載データはすべて架空のものであり、実在する企業・工場・数値とは一切関係ありません。


シリーズの目的

製造現場には生産数・不良率・設備稼働率など膨大なデータが日々蓄積されています。
しかし「データはある。でも活かせていない」という状況は多くの現場に共通する課題です。

本シリーズでは 「Python をゼロから学びながら、現場のデータ分析課題を解決できる力を養う」 ことを目的としています。
各ノックは実務に即した具体的なテーマを扱い、読み終えたその日から現場で試せる内容を目指しています。


全10章の構成

タイトルノック主なトピック
第1章Python の準備と基本No.001〜010実行環境・print・エラー読み方・分析の流れ
第2章変数・型・演算No.011〜020数値・文字列・真偽値・四則演算・比較演算
第3章文字列・リスト・辞書No.021〜030文字列操作・リスト・辞書の基本
第4章条件分岐と繰り返しNo.031〜040if文・for文・while文・ランク判定
第5章関数・モジュール・例外処理No.041〜050関数定義・標準ライブラリ・try-except
第6章ファイル操作と CSVNo.051〜060ファイル読み書き・CSV 操作・月別集計
第7章NumPy 入門No.061〜070配列操作・統計計算・条件抽出
第8章Polars 入門No.071〜080Series・DataFrame・CSV 読み込み
第9章Polars によるデータ加工No.081〜090列操作・欠損値処理・並び替え・重複削除
第10章集計・可視化・ミニ分析No.091〜100group_by・Matplotlib・相関・分析レポート

このノートブックの位置づけ

本ノートブックは 第1章(No.001〜No.010) に対応しています。

  • テーマ:自動車部品工場 第3ライン 2024年Q1 生産実績(架空データ)
  • 目標:Python とはなにか・実行環境の整え方・基本構文の最初の一歩を体感する
  • 所要時間:約60分
  • 使用ライブラリ:NumPy、Matplotlib(外部データ不要)

製造ライン稼働データで学ぶ Python 入門

100本ノック 第1章(No.001〜No.010):Python の準備と基本

製造現場に溜まりつづける 生産数・不良率・設備稼働率 のデータ。
「データはある。でも活かせていない」——そんな現場の課題を解決するために、
Python を一から学ぶ 100本ノック第1章です。

本記事では以下の10本を取り上げます。

No.タイトル
001Python でできることを理解する
002データ分析で Python が使われる理由を整理する
003Python の実行環境を準備する
004Jupyter Notebook の基本操作を理解する
005Python スクリプトを実行する
006print 関数で文字を表示する
007コメントを書く
008エラー表示の読み方を理解する
009コードセルを分けて実行する
010データ分析の基本的な流れを理解する

対象読者: Python 未経験の製造業担当者・DX 推進担当
所要時間: 約60分
使用ライブラリ: NumPy、Matplotlib(外部データ不要)

はじめに:この記事で扱う製造業の実務課題

対象とする工場・課題の概要

本記事では、自動車部品を製造する中小製造業の第3ライン を舞台に話を進めます。

  • 工場規模: 従業員 200 名・自動車用金属部品の製造
  • 課題: 毎日 Excel に手入力している生産日報を分析できていない
  • データ: 日別の生産数・不良品数・設備稼働率(手入力 Excel データ)

現在は月末に担当者が Excel を集計してグラフを作成しますが、
「気づいたら月末になっていた」「傾向は見えるが対策の根拠にならない」という状態です。

現場でよくある状況

状況実際の問題
データは Excel で管理されているシートが多すぎて集計に1〜2時間かかる
月次レポートは手作業ヒューマンエラーが発生しやすい
不良率の変動に気づくのが遅い月末集計では翌月に対策が間に合わない
設備保全は「壊れてから修理」予防保全ができず機会損失が大きい
分析担当者が不在「Python を学ぶ人」がいないまま課題が蓄積

これらはどれも「データはある・やる気もある・でも手が動かない」という状態です。
Python の基礎を身につけるだけで、このような状況を変えることができます。

なぜこの問題は判断が難しいのか

「ツール選び」と「学習コスト」のジレンマ

Python を使い始めるときに多くの現場担当者がぶつかる壁があります。

  1. どの教材で学べばいいかわからない
    入門書は「Hello World」から始まりますが、製造現場のデータとの接続が見えません。

  2. 環境構築で詰まる
    Anaconda、pip、venv…… 用語が多すぎてスタート前に挫折しやすい。

  3. 「自分の業務に使えるか」が見えない
    抽象的なサンプルコードが多く、「製造業の自分には関係ない」と感じてしまう。

  4. 小さな成功体験が得にくい
    最初に完成形(機械学習・ダッシュボード)を目指すと挫折します。

本ノックでは 「製造現場のデータで動くコードをすぐに書く」 ことを最優先にしています。

今回扱うノックの全体像

第1章の位置づけ

第1章(今回): Python の準備と基本      ← ここ
第2章: 変数・型・演算
第3章: 文字列・リスト・辞書
第4章: 条件分岐と繰り返し
第5章: 関数・モジュール・例外処理
第6章: ファイル操作と CSV
第7章: NumPy 入門
第8章: Polars 入門
第9章: Polars によるデータ加工
第10章: 集計・可視化・ミニ分析

No.001〜010 の学習ロードマップ

[No.001-002]  Python の概要を知る

[No.003-004]  環境を整えて Jupyter を使い始める

[No.005-006]  最初のコードを書いて実行する

[No.007-008]  コードを正しく書く習慣をつける

[No.009-010]  コードを分割し、分析の全体像をつかむ

No.010 では、ここまでの学習を活かして 製造ラインの実際のデータ分析フロー を体験します。

Python 環境の準備

実行環境

本 notebook は以下の環境で動作確認しています。

!sw_vers
ProductName:		macOS
ProductVersion:		26.3
BuildVersion:		25D125
!python -V
Python 3.13.1

必要なライブラリをインポートし、バージョンを確認します。

%matplotlib inline
%config InlineBackend.figure_format = 'svg'

import random
import sys
import platform

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

# 乱数シードの固定(再現性の確保)
seed = 42
random.seed(seed)
np.random.seed(seed)

# 日本語フォントの設定
if platform.system() == 'Darwin':
    matplotlib.rcParams['font.family'] = 'Hiragino Maru Gothic Pro'
elif platform.system() == 'Linux':
    matplotlib.rcParams['font.family'] = 'IPAGothic'
matplotlib.rcParams['axes.unicode_minus'] = False

print(f"Python     : {sys.version.split()[0]}")
print(f"NumPy      : {np.__version__}")
print(f"Matplotlib : {matplotlib.__version__}")
print(f"OS         : {platform.system()} {platform.release()}")
Python     : 3.13.1
NumPy      : 2.5.1
Matplotlib : 3.11.0
OS         : Darwin 25.3.0

架空データの作成

データの背景

本記事では、自動車部品工場 第3ライン の 2024年Q1(1〜3月、90日間)の
生産実績データを使用します。データはすべて Python でその場で生成します(外部ファイル不要)。

変数名内容単位
production日別生産数
defects日別不良品数
defect_rate_pct日別不良率%
operation_rate日別設備稼働率%

このデータは No.009・No.010 で使用します。No.001〜008 は各ノック単独のコード例です。

# 架空データ:自動車部品工場 第3ライン 2024年Q1 生産実績
np.random.seed(42)

n_days = 90  # 2024年Q1(1月〜3月)
day_index = np.arange(1, n_days + 1)

# 日別生産数(目標 1,000台/日 ・ ±10% のランダム変動)
production = (1000 + np.random.normal(0, 80, n_days)).astype(int)
production = np.clip(production, 750, 1200)

# 不良率(月次サイクルのトレンド + ガウシアンノイズ)
true_defect_rate = 0.020 + 0.008 * np.sin(day_index * 2 * np.pi / 30)
defects = np.round(production * true_defect_rate + np.random.normal(0, 2, n_days)).astype(int)
defects = np.clip(defects, 0, production // 10)
defect_rate_pct = defects / production * 100

# 設備稼働率(%)
operation_rate = 94 - 2 * np.cos(day_index * 2 * np.pi / 30) + np.random.normal(0, 1.5, n_days)
operation_rate = np.clip(operation_rate, 82, 99)

print("架空データの概要")
print("=" * 45)
print(f"  期間       : 2024年Q1({n_days}日間)")
print(f"  総生産数   : {production.sum():>8,} 台")
print(f"  総不良品数 : {defects.sum():>8,} 個")
print(f"  平均不良率 : {defect_rate_pct.mean():>8.2f} %")
print(f"  平均稼働率 : {operation_rate.mean():>8.1f} %")
架空データの概要
=============================================
  期間       : 2024年Q1(90日間)
  総生産数   :   89,243 台
  総不良品数 :    1,799 個
  平均不良率 :     2.01 %
  平均稼働率 :     94.0 %

No.001:Python でできることを理解する

実務での意味

Python が「製造業の業務改善」にどう役立つかを具体的に把握することが、
学習を続けるうえで最も重要な動機づけになります。

「プログラミング」という言葉が難しく聞こえても、
Python でやっていることの本質は 「繰り返し作業を自動化する」
「データから傾向を読む」 の2点です。

分析・モデル化の考え方

製造業のデータ活用は、以下の4ステップで考えると整理しやすくなります。

  1. 収集: センサーや手入力データを Python で読み込む
  2. 整備: 欠損・外れ値・形式の不統一を修正する
  3. 分析: 集計・可視化・統計モデルで傾向を掴む
  4. 活用: KPI 監視・予測・最適化・自動レポートに落とす

この4ステップを自動化・高速化するためのツールが Python です。

Python で確認する

製造業で Python が解決できる課題を分類・一覧表示します。

# No.001: Python でできることを理解する

categories = {
    "データ収集・整備": [
        "CSV / Excel ファイルの読み込みと結合",
        "センサーデータのリアルタイム取得",
        "データベース(SQL)との接続・クエリ",
    ],
    "集計・統計分析": [
        "生産数・不良率の日次・月次集計",
        "工程間の相関分析",
        "管理図(Xbar-R 管理図)の自動作成",
    ],
    "予測・機械学習": [
        "不良品発生の予兆検知",
        "設備の予知保全(PdM)",
        "需要予測による生産計画の最適化",
    ],
    "自動化・レポート": [
        "日次レポートの自動生成・メール送信",
        "Web ダッシュボードの構築",
        "製造実行システム(MES)との API 連携",
    ],
}

print("Python で解決できる製造業の課題カテゴリ")
print("=" * 55)
total = 0
for category, items in categories.items():
    print(f"\n{category}")
    for item in items:
        print(f"   ・{item}")
        total += 1
print(f"\n合計: {total} の活用例")
Python で解決できる製造業の課題カテゴリ
=======================================================

▶ データ収集・整備
   ・CSV / Excel ファイルの読み込みと結合
   ・センサーデータのリアルタイム取得
   ・データベース(SQL)との接続・クエリ

▶ 集計・統計分析
   ・生産数・不良率の日次・月次集計
   ・工程間の相関分析
   ・管理図(Xbar-R 管理図)の自動作成

▶ 予測・機械学習
   ・不良品発生の予兆検知
   ・設備の予知保全(PdM)
   ・需要予測による生産計画の最適化

▶ 自動化・レポート
   ・日次レポートの自動生成・メール送信
   ・Web ダッシュボードの構築
   ・製造実行システム(MES)との API 連携

合計: 12 の活用例

結果の読み取り

出力を見ると、Python の活用領域が「データ収集」から「自動化」まで
横断的にカバーされていることがわかります。

特に製造業で即効性が高いのは 集計・統計分析 の領域です。
「今まで2時間かかっていた月次集計が5秒で終わる」という体験が、
Python 学習を継続する最大の動機になります。

DX 推進の観点から: まず「今ある Excel データを Python で集計する」という
小さなゴールを設定し、成功体験を積み重ねながら予測・自動化へと
ステップアップするアプローチが有効です。


No.002:データ分析で Python が使われる理由を整理する

実務での意味

「なぜ Excel ではなく Python を使うのか」を説明できないと、
上司や同僚を巻き込んでのツール導入は難しくなります。
他のツールとの比較を整理することは、社内での Python 導入提案の根拠になります。

分析・モデル化の考え方

製造業でよく使われるデータツールを比較すると、以下のような位置づけになります。

  • Excel: 少量データの集計・グラフ作成・共有には優れる。大量データや自動化は苦手。
  • SQL: データベースの集計・抽出に強力。Python から SQL を呼び出すことも多い。
  • R: 統計解析に特化。Python と双璧をなすが、エンジニアリング系ライブラリは Python が充実。
  • Python: 「データ分析からシステム開発まで」をカバーする汎用言語。学習コスト低め。

Python で確認する

各ツールの特性を比較表形式で表示します。

# No.002: データ分析で Python が使われる理由を整理する

tools = ["Excel", "SQL", "R", "Python"]
criteria = {
    "学習コスト": ["低", "中", "中", "低〜中"],
    "大規模データ": ["×", "◎", "○", "◎"],
    "統計・機械学習": ["△", "×", "◎", "◎"],
    "自動化・定期実行": ["△", "○", "○", "◎"],
    "可視化": ["○", "△", "◎", "◎"],
    "システム連携": ["×", "○", "△", "◎"],
    "無償利用": ["一部有償", "○", "○", "○"],
}

col_w = 14
print(f"{'評価軸':<14}", end="")
for t in tools:
    print(f"{t:^{col_w}}", end="")
print()
print("-" * (14 + col_w * len(tools)))
for crit, vals in criteria.items():
    print(f"{crit:<14}", end="")
    for v in vals:
        print(f"{v:^{col_w}}", end="")
    print()

print()
print("凡例: ◎ 非常に得意  ○ 得意  △ やや苦手  × 不得意")
評価軸               Excel          SQL            R           Python    
----------------------------------------------------------------------
学習コスト               低             中             中            低〜中      
大規模データ              ×             ◎             ○             ◎       
統計・機械学習             △             ×             ◎             ◎       
自動化・定期実行            △             ○             ○             ◎       
可視化                 ○             △             ◎             ◎       
システム連携              ×             ○             △             ◎       
無償利用               一部有償           ○             ○             ○       

凡例: ◎ 非常に得意  ○ 得意  △ やや苦手  × 不得意

結果の読み取り

比較表から読み取れる Python の強みは 「汎用性の高さ」 です。

  • Excel は使い慣れていても、データが数万行を超えると動作が重くなります。
  • SQL は集計に強いですが、機械学習や可視化には向きません。
  • Python は「データ収集 → 加工 → 分析 → 可視化 → システム連携」を
    一つのコードで完結できるため、製造現場のデータパイプライン構築に適しています。

意思決定の示唆: 既存の Excel 資産を壊さずに Python を重ね合わせる
「Excel + Python の二刀流」が、製造業での導入摩擦を最小化する現実的な戦略です。


No.003:Python の実行環境を準備する

実務での意味

「環境構築で詰まって学習を諦めた」という話は現場でよく聞きます。
Python の実行環境を正しく理解し、チームで環境を統一することが、
本番データ分析の再現性と引き継ぎ可能性を高めます。

分析・モデル化の考え方

製造業の IT 担当者が考えるべき Python 環境のポイントは3つです。

  1. バージョン管理: Python のバージョン違いでコードが動かないことがある。
    解決策: pyenvconda でバージョンを固定する。
  2. ライブラリ管理: requirements.txtpyproject.toml で依存ライブラリを記録する。
  3. 仮想環境: プロジェクトごとに venvconda env を作成し、競合を防ぐ。

Python で確認する

現在の Python 環境の情報を確認します。

# No.003: Python の実行環境を確認する

import sys
import platform
import importlib.metadata as meta

print("=== Python 実行環境の確認 ===")
print(f"Python バージョン  : {sys.version.split()[0]}")
print(f"OS                 : {platform.system()} {platform.release()}")
print(f"Python 実行パス    : {sys.executable}")
print()

# インストール済みライブラリのバージョン確認
key_libs = ["numpy", "matplotlib", "polars", "scipy"]
print("主要ライブラリのバージョン:")
for lib in key_libs:
    try:
        ver = meta.version(lib)
        print(f"  {lib:<15}: {ver}")
    except meta.PackageNotFoundError:
        print(f"  {lib:<15}: 未インストール")
=== Python 実行環境の確認 ===
Python バージョン  : 3.13.1
OS                 : Darwin 25.3.0
Python 実行パス    : /Users/hiroshi/private/kobo/notebook/.venv/bin/python

主要ライブラリのバージョン:
  numpy          : 2.5.1
  matplotlib     : 3.11.0
  polars         : 未インストール
  scipy          : 1.18.0

結果の読み取り

出力に表示される Python バージョンと実行パスは、
チームで共有する環境仕様書に必ず記載すべき情報です。

「同じコードなのに自分のマシンでは動かない」という問題の多くは
バージョン差異に起因します。プロジェクト開始時に requirements.txt を作成し、
pip install -r requirements.txt で環境を揃える習慣をつけましょう。

導入時の注意点: 製造現場の Windows PC に Python を入れる場合、
セキュリティポリシーで pip が使えないことがあります。
IT 部門と事前に調整し、オフライン環境での利用方法を確認してください。


No.004:Jupyter Notebook の基本操作を理解する

実務での意味

Jupyter Notebook は「コードと結果と説明文を一体化できる」分析ツールです。
製造業での活用シーンとしては以下が挙げられます。

  • 現場向け分析報告書: グラフと説明を一緒に出力・PDF 化できる
  • 分析の再現と引き継ぎ: 誰でも同じ手順で結果を再現できる
  • プロトタイプ開発: 機能を確認しながらコードを書ける

分析・モデル化の考え方

Jupyter Notebook は 分析の「ドラフト段階」 に最適です。
本番システムへの組み込みには Python スクリプト(.py)に変換しますが、
試行錯誤・可視化・レポート作成はノートブックが圧倒的に効率的です。

Python で確認する

よく使うショートカットとセルの種類を確認します。

# No.004: Jupyter Notebook の基本操作

# よく使うキーボードショートカット一覧
shortcuts = {
    "Shift + Enter": "セルを実行して次のセルへ移動",
    "Ctrl + Enter": "セルを実行して同じセルに留まる",
    "Esc → A": "現在のセルの上に新しいセルを追加",
    "Esc → B": "現在のセルの下に新しいセルを追加",
    "Esc → M": "コードセルを Markdown セルに変換",
    "Esc → Y": "Markdown セルをコードセルに変換",
    "Esc → DD": "セルを削除",
    "Esc → Z": "削除したセルを元に戻す",
    "Ctrl + Shift + -": "カーソル位置でセルを分割",
}

print("Jupyter Notebook よく使うショートカット")
print("=" * 58)
for key, desc in shortcuts.items():
    print(f"  {key:<24}{desc}")

print()
print("セルの種類")
print("-" * 45)
cell_types = {
    "Code セル": "Python コードを記述・実行する",
    "Markdown セル": "説明文・数式・表を記述する",
    "Raw セル": "変換時にそのまま出力するテキスト",
}
for t, desc in cell_types.items():
    print(f"  {t:<16}: {desc}")
Jupyter Notebook よく使うショートカット
==========================================================
  Shift + Enter            → セルを実行して次のセルへ移動
  Ctrl + Enter             → セルを実行して同じセルに留まる
  Esc → A                  → 現在のセルの上に新しいセルを追加
  Esc → B                  → 現在のセルの下に新しいセルを追加
  Esc → M                  → コードセルを Markdown セルに変換
  Esc → Y                  → Markdown セルをコードセルに変換
  Esc → DD                 → セルを削除
  Esc → Z                  → 削除したセルを元に戻す
  Ctrl + Shift + -         → カーソル位置でセルを分割

セルの種類
---------------------------------------------
  Code セル         : Python コードを記述・実行する
  Markdown セル     : 説明文・数式・表を記述する
  Raw セル          : 変換時にそのまま出力するテキスト

結果の読み取り

ショートカットを覚えると マウス操作が激減し、分析スピードが上がります
特に Shift + Enter(実行して次へ)は最も頻繁に使うショートカットです。

Jupyter Notebook はそのまま HTML や PDF に変換してレポートとして共有できます。
製造業の定期報告書を手作業で作っている場合、
Python + Jupyter での 自動レポート生成 に移行すると大きな工数削減になります。


No.005:Python スクリプトを実行する

実務での意味

Jupyter Notebook は対話的な分析に向いていますが、
定期的に自動実行したい処理 は Python スクリプト(.py ファイル)に書きます。

例えば「毎朝8時に前日の生産実績を集計して担当者にメールする」という処理は、
Python スクリプト + cron / タスクスケジューラで自動化できます。

分析・モデル化の考え方

Notebook と Script の使い分けを整理します。

用途適切なツール
試行錯誤・探索的分析Jupyter Notebook
定期実行・自動化Python スクリプト(.py)
レポート生成Jupyter → nbconvert で変換
本番システム組み込みPython スクリプト

Python で確認する

スクリプトの基本構造と生産実績の出力例を確認します。

# No.005: Python スクリプトを実行する

# ---- 本番スクリプト(daily_report.py)の想定構造 ----
# import ライブラリ
# → データ読み込み
# → データ加工
# → 集計・計算
# → 結果の出力・保存

# ---- ここでは同じ処理を直接実行 ----

# データの定義
line_name = "第3ライン"
date_str = "2024-03-31"
target_production = 1000
actual_production = 985
defects_count = 18

# 計算
achievement_rate = actual_production / target_production * 100
defect_rate = defects_count / actual_production * 100

# 結果の出力
print("=" * 42)
print("  日次生産実績レポート")
print(f"  日付       : {date_str}")
print(f"  ライン名   : {line_name}")
print("=" * 42)
print(f"  目標生産数 : {target_production:>6,} 台")
print(f"  実績生産数 : {actual_production:>6,} 台")
print(f"  達成率     : {achievement_rate:>6.1f} %")
print(f"  不良品数   : {defects_count:>6,} 個")
print(f"  不良率     : {defect_rate:>6.2f} %")
print("=" * 42)
==========================================
  日次生産実績レポート
  日付       : 2024-03-31
  ライン名   : 第3ライン
==========================================
  目標生産数 :  1,000 台
  実績生産数 :    985 台
  達成率     :   98.5 %
  不良品数   :     18 個
  不良率     :   1.83 %
==========================================

結果の読み取り

このような出力を自動生成するスクリプトを書けば、
毎朝手作業でレポートを作る必要がなくなります。

実務展開のポイント: スクリプトをサーバー上で定期実行するには、
Linux なら cron、Windows なら「タスクスケジューラ」を使います。
最終的には Slack や Teams への通知と連携することで、
「異常があったらすぐ通知される」体制を構築できます。


No.006:print 関数で文字を表示する

実務での意味

print 関数は Python で最初に学ぶ命令ですが、
製造現場での実用では ログ出力・状態確認・デバッグ に欠かせません。

センサーデータを処理するスクリプトでは、
print で処理の進捗を表示することで「どこまで動いたか」が確認でき、
障害発生時の原因特定が素早くなります。

分析・モデル化の考え方

print の使い方を押さえると、以下のような場面で役立ちます。

  • 処理の進捗確認: print("データ読み込み完了...")
  • 変数の中身確認(デバッグ): print(f"不良率={rate:.2f}%")
  • 警告・アラートのログ出力: 条件付きで警告メッセージを表示

Python で確認する

print 関数のさまざまな使い方を確認します。

# No.006: print 関数で文字を表示する

# 基本的な表示
print("生産ライン監視システム 起動")

# 変数と文字列の埋め込み(f-string)
equipment_id = "EQP-023"
status = "正常稼働中"
temperature = 74.5
print(f"設備ID: {equipment_id} | ステータス: {status} | 温度: {temperature}°C")

# 区切り文字(sep)と末尾文字(end)の指定
lines_list = ["切削ライン", "溶接ライン", "組立ライン", "検査ライン"]
print("稼働中のライン:", end=" ")
print(*lines_list, sep=" / ")

# 処理フローの進捗表示
for step in ["データ読込", "前処理", "集計", "グラフ出力"]:
    print(f"  [{step}]", end=" → ")
print("完了")

# 数値の書式化
print()
total = 952
bad = 15
rate = bad / total * 100
print(f"本日の生産数 : {total:,} 台")  # 3桁カンマ区切り
print(f"不良品数     : {bad} 個")
print(f"不良率       : {rate:.2f}%")  # 小数点2桁
生産ライン監視システム 起動
設備ID: EQP-023 | ステータス: 正常稼働中 | 温度: 74.5°C
稼働中のライン: 切削ライン / 溶接ライン / 組立ライン / 検査ライン
  [データ読込] →   [前処理] →   [集計] →   [グラフ出力] → 完了

本日の生産数 : 952 台
不良品数     : 15 個
不良率       : 1.58%

結果の読み取り

f-stringf"...")を使うと、変数を文字列に埋め込む際に
型変換や連結の手間が省け、コードが読みやすくなります。

特に {rate:.2f} のような 書式指定子 は、
レポート出力や数値の整形に頻出するので必ず覚えましょう。

書式指定子意味
:.2f小数点2桁3.14
:,3桁カンマ区切り1,000,000
:>10右揃え(幅10) 42
:<10左揃え(幅10)42

No.007:コメントを書く

実務での意味

製造業のコードは「書いた本人だけが理解できる」状態になりがちです。
しかし、分析担当者が異動・退職した場合、コードが引き継げなくなります。

**適切なコメントはコードの「取扱説明書」**です。
コメントがあると:

  • 後任者がコードを理解しやすい
  • 数ヶ月後の自分が読み返しやすい
  • レビューや修正の効率が上がる

分析・モデル化の考え方

コメントの品質は「何を書くか」より 「なぜそうするかを書く」 ことで決まります。

  • ❌ 悪い例: r = d / t * 100 # r を計算(コードを読めばわかる)
  • ✅ 良い例: r = d / t * 100 # 不良率(%) = 不良品数 / 総生産数 × 100(意図が明確)

Python で確認する

コメントの書き方の良い例・悪い例を比較します。

# No.007: コメントを書く

# ---- コメントなしのコード(理解しにくい)----
d = 15
t = 952
r = d / t * 100
print(f"[コメントなし] r = {r:.2f}")

print()

# ---- コメントありのコード(推奨)----

# 本日の不良品数(単位:個)※グローバル変数と区別するため接尾辞 _day を付ける
defects_day = 15

# 本日の総生産数(単位:台)
total_day = 952

# 不良率の計算(% 単位)
# 定義: 不良率 = 不良品数 / 総生産数 × 100
defect_rate_pct_val = defects_day / total_day * 100

# 警告判定
# - 不良率 5.0% 以上: ALERT(即時停止を検討)
# - 不良率 2.0% 以上: WARNING(管理者へ報告)
# - 不良率 2.0% 未満: OK(通常稼働)
if defect_rate_pct_val >= 5.0:
    label = "【ALERT】即時対応が必要です"
elif defect_rate_pct_val >= 2.0:
    label = "【WARNING】警告ラインを超えました"
else:
    label = "【OK】正常範囲内です"

print(f"{label}  不良率: {defect_rate_pct_val:.2f}%")
[コメントなし] r = 1.58

【OK】正常範囲内です  不良率: 1.58%

結果の読み取り

コメントなしのコード(変数名 d, t, r)は動作しますが、
数ヶ月後に読み返すと何を計算しているかわかりません。

コメントありのコードは読み手に 「なぜこの計算をするのか」 が伝わります。

チーム開発への示唆:
製造業の IT 活用では、コードを書ける人が少ないことが多く、
コードの引き継ぎが大きなリスクになります。
コメントを書く習慣を最初から身につけることが、組織のコード資産を守ります。


No.008:エラー表示の読み方を理解する

実務での意味

Python のエラーメッセージは最初は難解に見えますが、
読み方を知ると 「どこで何が起きたか」を正確に教えてくれる ガイドです。

製造業のデータ処理では以下のようなシーンでエラーが発生しやすいです。

  • CSV のある列に空白・文字列が混入していた
  • 生産数が 0 の日(休日)でゼロ除算が発生した
  • 日付の書式が月によって異なっていた

エラーを恐れずに「エラーは情報」と捉えると、デバッグが格段に速くなります。

分析・モデル化の考え方

製造業データでよく遭遇するエラーのパターンを3つ押さえましょう。

エラー種別原因の例対処法
NameError変数名の誤字・定義前に使用スペルを確認・定義順を見直す
TypeError文字列と数値の演算などint() / float() で型変換
ZeroDivisionError生産数 = 0 の日に不良率を計算if total > 0: で条件分岐

Python で確認する

よくあるエラーと、その対処コードを確認します。

# No.008: エラー表示の読み方を理解する

print("=== よくあるエラーと対処法 ===\n")

# エラー例1: NameError
print("【NameError の例】")
print("  >>> print(production_count)")
print("  NameError: name 'production_count' is not defined")
print("  → 変数名のスペルミス、または定義前に使用している\n")

# エラー例2: TypeError
print("【TypeError の例】")
print('  >>> "不良率: " + 1.57')
print("  TypeError: can only concatenate str (not 'float') to str")
print("  → str(1.57) で変換するか、f-string を使う\n")

# エラー例3: ZeroDivisionError
print("【ZeroDivisionError の例】")
print("  >>> 15 / 0")
print("  ZeroDivisionError: division by zero")
print("  → 生産数 = 0 の日(休日・設備停止)は条件分岐で除外\n")

# 対処済みコードの例
print("=== ZeroDivisionError の対処例 ===")
test_cases = [
    (952, 15),  # 通常日
    (0, 0),  # 休日(生産なし)
    (500, 25),  # 半稼働日
]
for total, def_cnt in test_cases:
    if total > 0:
        rate = def_cnt / total * 100
        print(f"  生産数 {total:>4} 台 → 不良率 {rate:.2f}%")
    else:
        print(f"  生産数 {total:>4} 台 → 生産なし(計算をスキップ)")
=== よくあるエラーと対処法 ===

【NameError の例】
  >>> print(production_count)
  NameError: name 'production_count' is not defined
  → 変数名のスペルミス、または定義前に使用している

【TypeError の例】
  >>> "不良率: " + 1.57
  TypeError: can only concatenate str (not 'float') to str
  → str(1.57) で変換するか、f-string を使う

【ZeroDivisionError の例】
  >>> 15 / 0
  ZeroDivisionError: division by zero
  → 生産数 = 0 の日(休日・設備停止)は条件分岐で除外

=== ZeroDivisionError の対処例 ===
  生産数  952 台 → 不良率 1.58%
  生産数    0 台 → 生産なし(計算をスキップ)
  生産数  500 台 → 不良率 5.00%

結果の読み取り

エラーメッセージは「行番号」「エラーの種類」「説明」の3点セットで読みます。
特に ZeroDivisionError は製造データでは頻出です。

  • 休日・設備停止日は生産数 = 0 になるため、事前の条件チェックが必須です。
  • 「エラーを潰してから次に進む」ではなく、
    「エラーが起きないようなデータ前処理を設計する」という発想が、
    本番データ処理の品質を大きく高めます。

No.009:コードセルを分けて実行する

実務での意味

データ分析では「全体をひとつのコードに書く」より
「役割ごとにセルを分ける」 方が、分析の見通しが良くなります。

特に製造データの分析では「データ読込 → 前処理 → 集計 → 可視化」という
4段階のフローがあり、各段階を分けることで:

  • どこで問題が起きたか追跡しやすい
  • 前処理だけ修正して再実行できる
  • 同僚とコードを共有しやすい

分析・モデル化の考え方

セルの役割分担の設計指針を示します。

[セル1] ライブラリのインポート(一度だけ実行)
[セル2] データの定義・読み込み
[セル3] 前処理(欠損除去・型変換・異常値除去)
[セル4] 集計・計算
[セル5] 可視化・グラフ作成
[セル6] 結果のまとめ・出力

Python で確認する

架空の1週間分の生産データを段階的に処理します。

# No.009 - セル1: データの定義(ライブラリは冒頭で読込済み)

# 1週間の生産データ(月〜土)
days_week = ["月曜", "火曜", "水曜", "木曜", "金曜", "土曜"]
productions_week = [980, 1020, 1005, 990, 1015, 850]
defects_week = [18, 22, 15, 19, 17, 12]

print("Step 1: データの定義 完了")
print(f"  期間: {len(days_week)} 日間")
print(f"  合計生産数: {sum(productions_week):,} 台")
Step 1: データの定義 完了
  期間: 6 日間
  合計生産数: 5,860 台
# No.009 - セル2: 集計・計算

# 不良率の計算
defect_rates_week = [d / p * 100 for d, p in zip(defects_week, productions_week)]

print("Step 2: 集計・計算 完了")
print()
print(f"{'曜日':<6} {'生産数':>8} {'不良品数':>8} {'不良率':>8}")
print("-" * 36)
for day, prod, bad, rate in zip(days_week, productions_week, defects_week, defect_rates_week):
    flag = " ←警告" if rate >= 2.0 else ""
    print(f"{day:<6} {prod:>8,} {bad:>8} {rate:>7.2f}%{flag}")
Step 2: 集計・計算 完了

曜日          生産数     不良品数      不良率
------------------------------------
月曜          980       18    1.84%
火曜        1,020       22    2.16% ←警告
水曜        1,005       15    1.49%
木曜          990       19    1.92%
金曜        1,015       17    1.67%
土曜          850       12    1.41%
# No.009 - セル3: 可視化

fig, ax = plt.subplots(figsize=(9, 4))
bars = ax.bar(days_week, defect_rates_week, color="steelblue", edgecolor="white", alpha=0.85)

# 警告ラインを超えたバーを色分け
for bar, rate in zip(bars, defect_rates_week):
    if rate >= 2.0:
        bar.set_color("tomato")

ax.axhline(y=2.0, color="orange", linestyle="--", linewidth=1.5, label="警告ライン 2.0%")
ax.set_title("1週間の不良率推移(第3ライン)", fontsize=13)
ax.set_xlabel("曜日")
ax.set_ylabel("不良率(%)")
ax.legend()
ax.grid(True, axis="y", alpha=0.3)
plt.tight_layout()
plt.show()

print("Step 3: グラフ出力 完了")

svg

Step 3: グラフ出力 完了

結果の読み取り

グラフから、火曜日(2.16%)が警告ライン(2.0%)を超えていることが
視覚的に確認できます(赤いバー)。
木曜日(1.92%)は警告ライン直下でありリスクを要注意として監視すべき日です。

「セルを分ける」ことのメリットは、このグラフを修正したいときに
セル3だけを書き直せばよい という点です。
データ定義(セル1)や集計(セル2)を触る必要がないため、修正が安全で速くなります。

組織的なメリット: セル分割は「コードを自然な手順書にする」効果があります。
Jupyter Notebook ごとそのまま引き継ぎ資料として活用できます。


No.010:データ分析の基本的な流れを理解する

実務での意味

「データ分析の流れ」を体で覚えることは、製造業 DX 推進の核心です。
「データはある → どう分析する?」という問いに答えられるようになると、
現場の課題を「データで解ける形」に変換できるようになります。

分析・モデル化の考え方

製造業のデータ分析は CRISP-DM に沿って考えると整理しやすくなります。

1. ビジネス理解  : 「何を解決したいか」を定義する

2. データ理解    : 手元のデータの量・質・構造を把握する

3. データ準備    : 欠損・外れ値・型変換・結合を行う

4. モデリング    : 集計・統計・機械学習モデルを適用する

5. 評価          : 結果が現場の課題に対して有用か確認する

6. 展開          : 定期レポート・ダッシュボード・自動通知に組み込む

今回は No.001〜009 で学んだ内容をすべて使い、
架空の第3ライン 2024年Q1 データを分析する ミニ分析レポート を作成します。

Python で確認する

# No.010 - Step 1: データの確認(架空データは冒頭で作成済み)

print("=== Step 1: データの確認 ===")
print(f"  期間       : 2024年Q1({n_days}日間)")
print(f"  総生産数   : {production.sum():>8,} 台")
print(f"  総不良品数 : {defects.sum():>8,} 個")
print(f"  平均不良率 : {defect_rate_pct.mean():>8.2f} %")
print(f"  平均稼働率 : {operation_rate.mean():>8.1f} %")
print()

# 基本統計量の確認
print(f"{'指標':<16} {'生産数(台)':>12} {'不良率(%)':>12} {'稼働率(%)':>12}")
print("-" * 55)
stats_rows = [
    ("最大値", production.max(), defect_rate_pct.max(), operation_rate.max()),
    ("最小値", production.min(), defect_rate_pct.min(), operation_rate.min()),
    ("平均値", production.mean(), defect_rate_pct.mean(), operation_rate.mean()),
    ("標準偏差", production.std(), defect_rate_pct.std(), operation_rate.std()),
]
for label, p, d, o in stats_rows:
    print(f"{label:<16} {p:>12.1f} {d:>12.2f} {o:>12.2f}")
=== Step 1: データの確認 ===
  期間       : 2024年Q1(90日間)
  総生産数   :   89,243 台
  総不良品数 :    1,799 個
  平均不良率 :     2.01 %
  平均稼働率 :     94.0 %

指標                     生産数(台)       不良率(%)       稼働率(%)
-------------------------------------------------------
最大値                    1148.0         3.22        99.00
最小値                     790.0         0.85        88.93
平均値                     991.6         2.01        93.98
標準偏差                     74.4         0.59         2.05
# No.010 - Step 2: 不良率・稼働率の月別集計

# 月別スライス(1月: 0-30, 2月: 31-58, 3月: 59-89)
monthly_splits = [(0, 31, "1月"), (31, 59, "2月"), (59, 90, "3月")]

# 警告ライン超過日数
high_defect_days = int((defect_rate_pct >= 2.0).sum())
alert_days = int((defect_rate_pct >= 3.0).sum())

print("=== Step 2: 不良率の集計 ===")
print(f"  警告ライン(2%以上)超過: {high_defect_days:>3} 日 / {n_days} 日中 ({high_defect_days/n_days*100:.1f}%)")
print(f"  アラートライン(3%以上): {alert_days:>3} 日 / {n_days} 日中 ({alert_days/n_days*100:.1f}%)")
print()

print(f"{'月':<6} {'生産数':>10} {'不良品数':>10} {'不良率':>10} {'稼働率':>10}")
print("-" * 50)
for s, e, label in monthly_splits:
    mp = production[s:e].sum()
    md_val = defects[s:e].sum()
    mr = md_val / mp * 100
    mo = operation_rate[s:e].mean()
    print(f"{label:<6} {mp:>10,} {md_val:>10,} {mr:>9.2f}% {mo:>9.1f}%")
=== Step 2: 不良率の集計 ===
  警告ライン(2%以上)超過:  49 日 / 90 日中 (54.4%)
  アラートライン(3%以上):   2 日 / 90 日中 (2.2%)

月             生産数       不良品数        不良率        稼働率
--------------------------------------------------
1月         30,484        617      2.02%      94.1%
2月         27,663        541      1.96%      94.1%
3月         31,096        641      2.06%      93.8%
# No.010 - Step 3: 時系列グラフ(3パネル)

fig, axes = plt.subplots(3, 1, figsize=(12, 11))

# ---- グラフ1: 日別生産数の推移 ----
axes[0].plot(day_index, production, color="steelblue", linewidth=1.5, alpha=0.85, label="実績生産数")
axes[0].axhline(y=1000, color="crimson", linestyle="--", linewidth=1.5, label="目標(1,000台)")
axes[0].fill_between(
    day_index, production, 1000, where=(production < 1000), alpha=0.15, color="crimson", label="目標未達ゾーン"
)
axes[0].set_title("日別生産数の推移(2024年Q1 / 第3ライン)", fontsize=13)
axes[0].set_xlabel("経過日数(日)")
axes[0].set_ylabel("生産数(台)")
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)

# ---- グラフ2: 不良率の推移 ----
axes[1].plot(day_index, defect_rate_pct, color="tomato", linewidth=1.5, alpha=0.85)
axes[1].axhline(y=2.0, color="orange", linestyle="--", linewidth=1.5, label="警告ライン 2.0%")
axes[1].axhline(y=3.0, color="crimson", linestyle="--", linewidth=1.5, label="アラートライン 3.0%")
axes[1].fill_between(
    day_index, defect_rate_pct, 3.0, where=(defect_rate_pct > 3.0), alpha=0.2, color="crimson", label="アラートゾーン"
)
axes[1].set_title("日別不良率の推移(2024年Q1 / 第3ライン)", fontsize=13)
axes[1].set_xlabel("経過日数(日)")
axes[1].set_ylabel("不良率(%)")
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)

# ---- グラフ3: 設備稼働率の分布(ヒストグラム)----
axes[2].hist(operation_rate, bins=20, color="seagreen", edgecolor="white", alpha=0.85)
axes[2].axvline(
    x=float(operation_rate.mean()),
    color="crimson",
    linestyle="--",
    linewidth=1.5,
    label=f"平均値: {operation_rate.mean():.1f}%",
)
axes[2].axvline(x=95.0, color="orange", linestyle=":", linewidth=1.5, label="目標稼働率: 95%")
axes[2].set_title("設備稼働率の分布(2024年Q1 / 第3ライン)", fontsize=13)
axes[2].set_xlabel("設備稼働率(%)")
axes[2].set_ylabel("日数(日)")
axes[2].legend(fontsize=10)
axes[2].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

svg

# No.010 - Step 4: 月別比較グラフ

months = ["1月", "2月", "3月"]
splits = [(0, 31), (31, 59), (59, 90)]
monthly_defect_rate_avg = [defect_rate_pct[s:e].mean() for s, e in splits]
monthly_op_rate_avg = [operation_rate[s:e].mean() for s, e in splits]
bar_colors = ["steelblue", "tomato", "seagreen"]

fig, axes = plt.subplots(1, 2, figsize=(11, 4))

# 月別平均不良率
axes[0].bar(months, monthly_defect_rate_avg, color=bar_colors, edgecolor="white", alpha=0.85)
axes[0].axhline(y=2.0, color="orange", linestyle="--", linewidth=1.5, label="警告ライン")
for i, v in enumerate(monthly_defect_rate_avg):
    axes[0].text(i, v + 0.03, f"{v:.2f}%", ha="center", fontsize=11, fontweight="bold")
axes[0].set_title("月別 平均不良率(2024年Q1)", fontsize=13)
axes[0].set_xlabel("月")
axes[0].set_ylabel("平均不良率(%)")
axes[0].legend()
axes[0].grid(True, axis="y", alpha=0.3)

# 月別平均設備稼働率
axes[1].bar(months, monthly_op_rate_avg, color=bar_colors, edgecolor="white", alpha=0.85)
axes[1].axhline(y=95.0, color="orange", linestyle="--", linewidth=1.5, label="目標稼働率 95%")
for i, v in enumerate(monthly_op_rate_avg):
    axes[1].text(i, v + 0.05, f"{v:.1f}%", ha="center", fontsize=11, fontweight="bold")
axes[1].set_title("月別 平均設備稼働率(2024年Q1)", fontsize=13)
axes[1].set_xlabel("月")
axes[1].set_ylabel("平均設備稼働率(%)")
axes[1].legend()
axes[1].grid(True, axis="y", alpha=0.3)

plt.tight_layout()
plt.show()
findfont: Failed to find font weight bold, now using 400.


svg

結果の読み取り

グラフから以下の知見が読み取れます。

① 生産数の変動(グラフ1)
目標の 1,000台を下回る日が全体の約40%に散在しています。
特定の期間への集中は確認されず、ライン全体に断続的な生産変動があることがわかります。
この変動要因(段取り替え・材料待ち・不具合停止)を記録と照合する必要があります。

② 不良率のトレンド(グラフ2・月別棒グラフ)
不良率は月内で周期的に変動しており(月初に低く、中旬に高くなるパターン)、
特定の工程条件(原材料ロット交換・工具の摩耗)の影響が疑われます。
月別では 3月(2.06%)と 1月(2.02%)が警告ラインを超えており、
2月(1.96%)は最も低くなっています。Q2以降も 3月レベルが続く場合は対策が必要です。

③ 設備稼働率の分布(グラフ3・月別棒グラフ)
設備稼働率の平均は 94.0% で目標(95%)に未達。
分布の裾が 88% 台まで広がっており、突発的な設備停止が散発しています。
月別では 3月(93.8%)が最も低く、Q1後半に稼働率が低下していることがわかります。
4月に向けた保全計画の見直しが求められます。


総合的な示唆:
このような分析を毎月自動で実行することで、問題の早期発見と
管理者への迅速な報告が可能になります。
Python を使えば、この一連の分析コードは一度書くだけで、
毎月「データだけ差し替えて実行」できます。


対象ノックを通して見える実務上の示唆

No.001〜No.010 を通じて、以下のことが実務的に示されました。

1. 「入門」は製造現場の課題と直結している

print 文やコメントといった基本的な知識でも、
「生産ステータスのログ出力」「コードの引き継ぎ資料作成」という
具体的な業務価値に変換できます。

2. エラーは「壁」ではなく「情報」

ZeroDivisionErrorNameError は、
製造データの「休日」「欠損値」「型の不一致」を教えてくれます。
エラーを読む習慣が、データ品質の改善に直結します。

3. セル分割は「分析フローの文書化」

コードをセルに分割することは、「分析の手順書を自動生成する」ことと同義です。
Jupyter Notebook はそのまま引き継ぎ資料・報告書として活用できます。

4. 10本で「分析の全体像」が見える

No.010 の分析フロー(収集 → 確認 → 集計 → 可視化)を
繰り返し体験することで、第2章以降の学習が格段に理解しやすくなります。

実務導入する場合に必要なこと

第1章の内容を実際の製造現場に導入するためには、以下のステップが必要です。

ステップ1: 環境の整備

作業内容
Python のインストールAnaconda または pyenv + venv
Jupyter の導入pip install jupyter または JupyterLab
ライブラリの統一requirements.txt でチーム環境を揃える
実行権限の確認社内セキュリティポリシーの確認(特に Windows 環境)

ステップ2: 既存データとの接続

  • Excel ファイルの読み込み: openpyxl(第6〜8章で解説)
  • CSV の読み込み: csv モジュール、polars
  • データベース接続: sqlalchemypyodbc

ステップ3: 分析サイクルの設計

「1回だけ分析する」ではなく、定期実行・定期レポートの仕組みを作ることが重要です。
最初はシンプルな集計と可視化から始め、
成果を実感してから予測・機械学習へステップアップするのが現実的なロードマップです。

ステップ4: 組織内の知識共有

  • 分析コードを Git(GitHub, GitLab)で管理する
  • Jupyter Notebook をチーム内で共有するルールを作る
  • 「誰かが書いたコードを誰でも動かせる」環境を維持する

まとめ

本記事では、Python 100本ノック 第1章(No.001〜No.010)として
製造ラインの稼働データを題材にした Python 入門 を解説しました。

学習した内容の振り返り

No.タイトル製造業での活用ポイント
001Python でできることを理解するDX 化の全体像を把握する
002データ分析で Python が使われる理由ツール選定の根拠を整理する
003実行環境を準備するチームで環境を統一する
004Jupyter Notebook の基本操作分析報告書の自動生成に活かす
005スクリプトを実行する定期実行・自動化の基盤を作る
006print 関数で文字を表示するログ出力・ステータス確認に使う
007コメントを書くコードの引き継ぎ資料を残す
008エラー表示の読み方データ品質の問題を早期発見する
009コードセルを分けて実行する分析フローを段階的に設計する
010データ分析の基本的な流れQ1 生産実績の全体分析を体験する

次のステップ

**第2章(No.011〜020)**では、製造現場の計算でよく使う
「変数・型・演算」を学びます。単価・数量・歩留まり率の計算など、
現場で必要な数値処理を Python でマスターしましょう。

法人向けのご相談


数理工房 では、製造業・DX 推進担当者向けの Python 研修・データ分析支援を提供しています。

こんなお悩みはありませんか?

  • 「本章の内容を自社の製造データで実践したい」
  • 「社内向けにカスタマイズした Python 研修を作ってほしい」
  • 「Excel 管理を Python に移行したい」
  • 「品質管理・生産管理のデータ分析基盤を整備したい」

提供サービス

サービス概要
製造業向け Python 研修現場データを使った実践的な研修(オンライン/対面)
データ分析基盤構築支援生産・品質・コストデータの一元管理システム設計
KPI ダッシュボード開発リアルタイム製造指標の可視化ツール開発
DX 推進コンサルティング課題整理から実装まで一貫支援

📩 お問い合わせ: surikobo.co.jp/contact
まずはお気軽にご相談ください。