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〜040 | if文・for文・while文・ランク判定 |
| 第5章 | 関数・モジュール・例外処理 | No.041〜050 | 関数定義・標準ライブラリ・try-except |
| 第6章 | ファイル操作と CSV | No.051〜060 | ファイル読み書き・CSV 操作・月別集計 |
| 第7章 | NumPy 入門 | No.061〜070 | 配列操作・統計計算・条件抽出 |
| 第8章 | Polars 入門 | No.071〜080 | Series・DataFrame・CSV 読み込み |
| 第9章 | Polars によるデータ加工 | No.081〜090 | 列操作・欠損値処理・並び替え・重複削除 |
| 第10章 | 集計・可視化・ミニ分析 | No.091〜100 | group_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. | タイトル |
|---|---|
| 001 | Python でできることを理解する |
| 002 | データ分析で Python が使われる理由を整理する |
| 003 | Python の実行環境を準備する |
| 004 | Jupyter Notebook の基本操作を理解する |
| 005 | Python スクリプトを実行する |
| 006 | print 関数で文字を表示する |
| 007 | コメントを書く |
| 008 | エラー表示の読み方を理解する |
| 009 | コードセルを分けて実行する |
| 010 | データ分析の基本的な流れを理解する |
対象読者: Python 未経験の製造業担当者・DX 推進担当
所要時間: 約60分
使用ライブラリ: NumPy、Matplotlib(外部データ不要)
はじめに:この記事で扱う製造業の実務課題
対象とする工場・課題の概要
本記事では、自動車部品を製造する中小製造業の第3ライン を舞台に話を進めます。
- 工場規模: 従業員 200 名・自動車用金属部品の製造
- 課題: 毎日 Excel に手入力している生産日報を分析できていない
- データ: 日別の生産数・不良品数・設備稼働率(手入力 Excel データ)
現在は月末に担当者が Excel を集計してグラフを作成しますが、
「気づいたら月末になっていた」「傾向は見えるが対策の根拠にならない」という状態です。
現場でよくある状況
| 状況 | 実際の問題 |
|---|---|
| データは Excel で管理されている | シートが多すぎて集計に1〜2時間かかる |
| 月次レポートは手作業 | ヒューマンエラーが発生しやすい |
| 不良率の変動に気づくのが遅い | 月末集計では翌月に対策が間に合わない |
| 設備保全は「壊れてから修理」 | 予防保全ができず機会損失が大きい |
| 分析担当者が不在 | 「Python を学ぶ人」がいないまま課題が蓄積 |
これらはどれも「データはある・やる気もある・でも手が動かない」という状態です。
Python の基礎を身につけるだけで、このような状況を変えることができます。
なぜこの問題は判断が難しいのか
「ツール選び」と「学習コスト」のジレンマ
Python を使い始めるときに多くの現場担当者がぶつかる壁があります。
-
どの教材で学べばいいかわからない
入門書は「Hello World」から始まりますが、製造現場のデータとの接続が見えません。 -
環境構築で詰まる
Anaconda、pip、venv…… 用語が多すぎてスタート前に挫折しやすい。 -
「自分の業務に使えるか」が見えない
抽象的なサンプルコードが多く、「製造業の自分には関係ない」と感じてしまう。 -
小さな成功体験が得にくい
最初に完成形(機械学習・ダッシュボード)を目指すと挫折します。
本ノックでは 「製造現場のデータで動くコードをすぐに書く」 ことを最優先にしています。
今回扱うノックの全体像
第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ステップで考えると整理しやすくなります。
- 収集: センサーや手入力データを Python で読み込む
- 整備: 欠損・外れ値・形式の不統一を修正する
- 分析: 集計・可視化・統計モデルで傾向を掴む
- 活用: 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つです。
- バージョン管理: Python のバージョン違いでコードが動かないことがある。
解決策:pyenvやcondaでバージョンを固定する。 - ライブラリ管理:
requirements.txtやpyproject.tomlで依存ライブラリを記録する。 - 仮想環境: プロジェクトごとに
venvやconda 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-string(f"...")を使うと、変数を文字列に埋め込む際に
型変換や連結の手間が省け、コードが読みやすくなります。
特に {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: グラフ出力 完了")
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()
# 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.
結果の読み取り
グラフから以下の知見が読み取れます。
① 生産数の変動(グラフ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. エラーは「壁」ではなく「情報」
ZeroDivisionError や NameError は、
製造データの「休日」「欠損値」「型の不一致」を教えてくれます。
エラーを読む習慣が、データ品質の改善に直結します。
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 - データベース接続:
sqlalchemy、pyodbc
ステップ3: 分析サイクルの設計
「1回だけ分析する」ではなく、定期実行・定期レポートの仕組みを作ることが重要です。
最初はシンプルな集計と可視化から始め、
成果を実感してから予測・機械学習へステップアップするのが現実的なロードマップです。
ステップ4: 組織内の知識共有
- 分析コードを Git(GitHub, GitLab)で管理する
- Jupyter Notebook をチーム内で共有するルールを作る
- 「誰かが書いたコードを誰でも動かせる」環境を維持する
まとめ
本記事では、Python 100本ノック 第1章(No.001〜No.010)として
製造ラインの稼働データを題材にした Python 入門 を解説しました。
学習した内容の振り返り
| No. | タイトル | 製造業での活用ポイント |
|---|---|---|
| 001 | Python でできることを理解する | DX 化の全体像を把握する |
| 002 | データ分析で Python が使われる理由 | ツール選定の根拠を整理する |
| 003 | 実行環境を準備する | チームで環境を統一する |
| 004 | Jupyter Notebook の基本操作 | 分析報告書の自動生成に活かす |
| 005 | スクリプトを実行する | 定期実行・自動化の基盤を作る |
| 006 | print 関数で文字を表示する | ログ出力・ステータス確認に使う |
| 007 | コメントを書く | コードの引き継ぎ資料を残す |
| 008 | エラー表示の読み方 | データ品質の問題を早期発見する |
| 009 | コードセルを分けて実行する | 分析フローを段階的に設計する |
| 010 | データ分析の基本的な流れ | Q1 生産実績の全体分析を体験する |
次のステップ
**第2章(No.011〜020)**では、製造現場の計算でよく使う
「変数・型・演算」を学びます。単価・数量・歩留まり率の計算など、
現場で必要な数値処理を Python でマスターしましょう。
法人向けのご相談
数理工房 では、製造業・DX 推進担当者向けの Python 研修・データ分析支援を提供しています。
こんなお悩みはありませんか?
- 「本章の内容を自社の製造データで実践したい」
- 「社内向けにカスタマイズした Python 研修を作ってほしい」
- 「Excel 管理を Python に移行したい」
- 「品質管理・生産管理のデータ分析基盤を整備したい」
提供サービス
| サービス | 概要 |
|---|---|
| 製造業向け Python 研修 | 現場データを使った実践的な研修(オンライン/対面) |
| データ分析基盤構築支援 | 生産・品質・コストデータの一元管理システム設計 |
| KPI ダッシュボード開発 | リアルタイム製造指標の可視化ツール開発 |
| DX 推進コンサルティング | 課題整理から実装まで一貫支援 |
📩 お問い合わせ: surikobo.co.jp/contact
まずはお気軽にご相談ください。