100本ノック / 線形代数 / 線形代数100本ノック
製造業で学ぶ線形代数入門|工程KPIをベクトルで比較する10本ノック
多指標の工程データを「比較できる形」にする線形代数:製造KPIで学ぶベクトル入門10本ノック
製造現場では、不良率、停止時間、電力原単位、生産量など、単位も重要度も異なる指標を同時に見て意思決定します。本記事では、架空の8工程のデータを使い、工程の状態をベクトルとして表し、似た工程を探し、改善優先度を定量化するまでを扱います。
この「線形代数100本ノック」は、ベクトル・行列・固有値・行列分解・応用へ段階的に進み、数式を業務上の判断に翻訳するシリーズです。最初の10本では、後続の回帰、PCA、最適化、推薦・検索などの土台となるベクトルの見方を身につけます。
[!NOTE] 本資料は、数理工房 (もしくは代表である和山個人) が過去に企業研修において使用した notebook を企業様の許可を得て再構成・編集のうえ公開しています。
掲載データはすべて架空のものであり、実在する企業・工場・数値とは一切関係ありません。
はじめに:この記事で扱う製造業の実務課題
月次会議で「どの工程から改善するか」を決める場面を考えます。不良率だけなら順位は簡単ですが、停止時間、エネルギー、生産量も含めると結論は変わり得ます。本記事のゴールは、複数KPIを一つの点数に乱暴に押し込むのではなく、多指標の構造を保ったまま比較し、判断根拠を説明できる状態にすることです。
現場でよくある状況
- KPIごとに単位と「良い向き」が異なる
- ベテランの総合判断は速いが、判断根拠を引き継ぎにくい
- 平均値との差は見ても、工程全体の似方までは確認していない
- 指標を追加するほど、同じ情報の重複や計算の不安定性が増える
なぜこの問題は判断が難しいのか
不良率1ポイントと停止時間1時間は、そのまま加算できません。また、生産量の大きい工程は絶対量でも大きく見えやすく、規模と効率を混同します。線形代数は、KPIを座標として扱い、大きさ、向き、近さ、情報の重複を分けて考える共通言語を提供します。
今回扱うノックの全体像
| No. | テーマ | 製造業での問い |
|---|---|---|
| 001 | ベクトル | 工程の状態をどう表すか |
| 002 | 内積 | KPIの重要度をどう反映するか |
| 003 | ノルム | 基準からの総合的な乖離はどれほどか |
| 004 | 距離 | どの工程同士が近いか |
| 005 | コサイン類似度 | 規模を除いた課題構成は似ているか |
| 006 | 正規化 | 単位や尺度の差をどう揃えるか |
| 007 | 基底 | KPIの座標軸をどう理解するか |
| 008 | 次元 | 指標数と情報量は同じか |
| 009 | 線形結合 | 総合スコアをどう作るか |
| 010 | 一次独立 | 重複したKPIがないか |
Python 環境の準備
外部データには依存せず、NumPy、pandas、Matplotlibだけを使います。乱数シードを固定し、再実行しても同じ結果になるようにします。日本語フォントは japanize_matplotlib で設定します。
import sys
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
from IPython.display import display
SEED = 42
rng = np.random.default_rng(SEED)
pd.set_option("display.precision", 3)
print(f"Python: {sys.version.split()[0]}")
print(f"NumPy: {np.__version__}, pandas: {pd.__version__}")
Python: 3.11.9
NumPy: 1.26.4, pandas: 2.2.2
架空データの作成
8工程の月次KPIを生成します。ここでは、不良率・停止時間・電力原単位は小さいほど良く、生産量は大きいほど良い指標です。後の計算で使うため、生産量だけ符号を反転した「課題方向」の値も作ります。
processes = [f"工程{c}" for c in "ABCDEFGH"]
latent_load = rng.normal(0, 1, len(processes))
latent_age = rng.normal(0, 1, len(processes))
df = pd.DataFrame({
"不良率_pct": np.clip(2.5 + 0.65*latent_age + rng.normal(0, .25, 8), .5, None),
"停止時間_h": np.clip(18 + 4.5*latent_age + 2*latent_load + rng.normal(0, 1.5, 8), 3, None),
"電力原単位_kWh": np.clip(42 + 3*latent_age + 2.5*latent_load + rng.normal(0, 1.2, 8), 20, None),
"生産量_千個": np.clip(105 + 12*latent_load - 4*latent_age + rng.normal(0, 4, 8), 50, None),
}, index=processes).round(2)
df.index.name = "工程"
display(df)
ax = df.plot(kind="bar", subplots=True, layout=(2, 2), figsize=(11, 7), legend=False)
titles = ["不良率", "停止時間", "電力原単位", "生産量"]
ylabels = ["%", "時間", "kWh/千個", "千個"]
for a, title, ylabel in zip(np.ravel(ax), titles, ylabels):
a.set_title(title); a.set_xlabel("工程"); a.set_ylabel(ylabel); a.grid(axis="y", alpha=.3)
plt.tight_layout()
plt.show()
| 不良率_pct | 停止時間_h | 電力原単位_kWh | 生産量_千個 | |
|---|---|---|---|---|
| 工程 | ||||
| 工程A | 2.58 | 17.89 | 42.10 | 111.70 |
| 工程B | 1.71 | 11.55 | 35.86 | 98.10 |
| 工程C | 3.29 | 24.26 | 47.25 | 107.83 |
| 工程D | 2.99 | 23.93 | 48.04 | 114.10 |
| 工程E | 2.50 | 15.01 | 37.18 | 81.79 |
| 工程F | 3.06 | 21.11 | 41.12 | 85.74 |
| 工程G | 3.11 | 23.57 | 42.73 | 108.15 |
| 工程H | 1.90 | 12.89 | 39.41 | 105.54 |

No.001:ベクトルとは何か
実務での意味
工程Aの状態を「不良率だけ」でなく複数KPIの並びとして表したものがベクトルです。工程を同じ順序のKPIで表せば、工程間比較やスコアリングを共通の計算で扱えます。
分析・モデル化の考え方
工程 のKPIベクトルを
とします。重要なのは、値だけでなく「第1成分は不良率」のように成分の意味と順序を固定することです。ベクトルは単なる配列ではなく、業務定義を伴う観測単位です。
Pythonで確認する
kpi_cols = ["不良率_pct", "停止時間_h", "電力原単位_kWh", "生産量_千個"]
X = df[kpi_cols].to_numpy()
x_a = X[0]
print("工程AのKPIベクトル:", x_a)
print("形状:", x_a.shape, "(4成分のベクトル)")
display(pd.Series(x_a, index=kpi_cols, name="工程A"))
工程AのKPIベクトル: [ 2.58 17.89 42.1 111.7 ]
形状: (4,) (4成分のベクトル)
不良率_pct 2.58
停止時間_h 17.89
電力原単位_kWh 42.10
生産量_千個 111.70
Name: 工程A, dtype: float64
結果の読み取り
工程Aを4つの独立した帳票値ではなく、4次元空間上の1点として扱えるようになりました。ただし、この段階では単位が混在しているため、成分の単純な大小や合計には意味がありません。次のノック以降で比較規則を定義します。
No.002:内積とは何か
実務での意味
改善方針には重点があります。品質重視、安定稼働重視、省エネ重視などの重みをKPIベクトルに掛け合わせる内積は、方針に沿った評価点を作る基本操作です。
分析・モデル化の考え方
標準化後の課題ベクトル と重み の内積
を改善優先度とします。正の値が大きいほど「重点方針に照らした課題が大きい」と定義します。重みは経営判断そのものであり、感度分析と合意形成が必要です。
Pythonで確認する
issue = df.copy()
issue["生産量_千個"] *= -1 # 大きいほど課題が大きい向きに統一
Z = (issue - issue.mean()) / issue.std(ddof=0)
weights = pd.Series([0.40, 0.30, 0.20, 0.10], index=kpi_cols, name="重み")
priority = Z.to_numpy() @ weights.to_numpy()
score_table = pd.DataFrame({"内積による改善優先度": priority}, index=df.index).sort_values(
"内積による改善優先度", ascending=False)
display(weights.to_frame())
display(score_table)
| 重み | |
|---|---|
| 不良率_pct | 0.4 |
| 停止時間_h | 0.3 |
| 電力原単位_kWh | 0.2 |
| 生産量_千個 | 0.1 |
| 内積による改善優先度 | |
|---|---|
| 工程 | |
| 工程C | 1.033 |
| 工程D | 0.775 |
| 工程G | 0.633 |
| 工程F | 0.563 |
| 工程A | -0.171 |
| 工程E | -0.385 |
| 工程H | -1.058 |
| 工程B | -1.389 |
結果の読み取り
スコア上位は、品質40%、停止30%という今回の方針に対して改善効果が期待される工程です。これは普遍的な「悪さ」ではありません。省エネの重みを上げれば順位が変わる可能性があるため、会議では重みと順位をセットで提示します。
No.003:ノルムとは何か
実務での意味
工程が標準的な状態から総合的にどれだけ離れているかを一つの大きさで測ると、要注意工程の一次スクリーニングができます。
分析・モデル化の考え方
ユークリッドノルム(ノルム)は
です。標準化した値を使うことで、単位差を除いた平均像からの乖離を測ります。符号は消えるため、良い方向の突出と悪い方向の突出を区別しない点に注意します。
Pythonで確認する
norms = np.linalg.norm(Z.to_numpy(), axis=1)
norm_table = pd.DataFrame({"平均像からのL2ノルム": norms}, index=df.index).sort_values(
"平均像からのL2ノルム", ascending=False)
display(norm_table)
plt.figure(figsize=(8, 4))
plt.bar(norm_table.index, norm_table.iloc[:, 0], color="#4472C4")
plt.title("工程ごとの平均像からの総合的な乖離")
plt.xlabel("工程"); plt.ylabel("L2ノルム"); plt.grid(axis="y", alpha=.3); plt.tight_layout(); plt.show()
| 平均像からのL2ノルム | |
|---|---|
| 工程 | |
| 工程B | 2.707 |
| 工程D | 2.280 |
| 工程E | 2.242 |
| 工程C | 2.204 |
| 工程H | 1.944 |
| 工程F | 1.684 |
| 工程G | 1.456 |
| 工程A | 0.927 |

結果の読み取り
ノルムが大きい工程は「平均的でない」工程です。ただし高生産量など好ましい突出も含みます。したがって、ノルムで候補を抽出した後、元の標準化成分を見て、どのKPIが乖離を生んだか確認する二段階運用が適切です。
No.004:距離とは何か
実務での意味
似た工程の改善事例を横展開したいとき、KPI構成が最も近い工程を探せます。設備形式や製品群が同じという分類に加え、実績データ上の近さを判断材料にできます。
分析・モデル化の考え方
工程 間のユークリッド距離は
です。距離は対称で、自分自身との距離は0です。ここでも標準化を先に行い、単位の大きいKPIだけが距離を支配しないようにします。
Pythonで確認する
Z_np = Z.to_numpy()
distance_matrix = np.linalg.norm(Z_np[:, None, :] - Z_np[None, :, :], axis=2)
dist_df = pd.DataFrame(distance_matrix, index=df.index, columns=df.index)
display(dist_df.round(2))
masked = distance_matrix.copy()
np.fill_diagonal(masked, np.inf)
i, j = np.unravel_index(np.argmin(masked), masked.shape)
print(f"最も近い組み合わせ: {df.index[i]} と {df.index[j]}(距離 {masked[i, j]:.3f})")
| 工程 | 工程A | 工程B | 工程C | 工程D | 工程E | 工程F | 工程G | 工程H |
|---|---|---|---|---|---|---|---|---|
| 工程 | ||||||||
| 工程A | 0.00 | 2.84 | 2.27 | 2.08 | 2.99 | 2.57 | 1.57 | 1.83 |
| 工程B | 2.84 | 0.00 | 4.89 | 4.80 | 2.20 | 3.59 | 4.05 | 1.18 |
| 工程C | 2.27 | 4.89 | 0.00 | 0.81 | 4.15 | 2.59 | 1.17 | 3.97 |
| 工程D | 2.08 | 4.80 | 0.81 | 0.00 | 4.43 | 3.10 | 1.43 | 3.78 |
| 工程E | 2.99 | 2.20 | 4.15 | 4.43 | 0.00 | 1.93 | 3.43 | 2.48 |
| 工程F | 2.57 | 3.59 | 2.59 | 3.10 | 1.93 | 0.00 | 2.10 | 3.27 |
| 工程G | 1.57 | 4.05 | 1.17 | 1.43 | 3.43 | 2.10 | 0.00 | 3.24 |
| 工程H | 1.83 | 1.18 | 3.97 | 3.78 | 2.48 | 3.27 | 3.24 | 0.00 |
最も近い組み合わせ: 工程C と 工程D(距離 0.810)
結果の読み取り
最短距離の工程ペアは、4指標を総合すると状態が近い組み合わせです。一方、設備仕様などデータに含めていない条件までは保証しません。横展開先の候補抽出に使い、現場条件の確認を経て最終決定します。
No.005:コサイン類似度
実務での意味
課題の絶対的な大きさではなく、「不良と停止が中心」など課題構成の似方を比べたい場合があります。コサイン類似度は、規模をある程度切り離して方向の近さを測ります。
分析・モデル化の考え方
値は から で、1に近いほど同じ方向、0付近は直交、-1に近いほど逆方向です。平均中心化した標準化ベクトルでは、逆方向は「一方の課題が大きいKPIで、他方は平均より良い」という関係を表します。
Pythonで確認する
unit_Z = Z_np / np.linalg.norm(Z_np, axis=1, keepdims=True)
cosine = unit_Z @ unit_Z.T
cos_df = pd.DataFrame(cosine, index=df.index, columns=df.index)
display(cos_df.round(2))
cos_masked = cosine.copy()
np.fill_diagonal(cos_masked, -np.inf)
i, j = np.unravel_index(np.argmax(cos_masked), cos_masked.shape)
print(f"課題構成が最も似る組み合わせ: {df.index[i]} と {df.index[j]}(類似度 {cosine[i, j]:.3f})")
| 工程 | 工程A | 工程B | 工程C | 工程D | 工程E | 工程F | 工程G | 工程H |
|---|---|---|---|---|---|---|---|---|
| 工程 | ||||||||
| 工程A | 1.00 | 0.02 | 0.14 | 0.41 | -0.73 | -0.93 | 0.20 | 0.35 |
| 工程B | 0.02 | 1.00 | -0.98 | -0.85 | 0.62 | -0.30 | -0.89 | 0.92 |
| 工程C | 0.14 | -0.98 | 1.00 | 0.94 | -0.75 | 0.13 | 0.87 | -0.83 |
| 工程D | 0.41 | -0.85 | 0.94 | 1.00 | -0.92 | -0.21 | 0.80 | -0.60 |
| 工程E | -0.73 | 0.62 | -0.75 | -0.92 | 1.00 | 0.55 | -0.70 | 0.30 |
| 工程F | -0.93 | -0.30 | 0.13 | -0.21 | 0.55 | 1.00 | 0.11 | -0.62 |
| 工程G | 0.20 | -0.89 | 0.87 | 0.80 | -0.70 | 0.11 | 1.00 | -0.82 |
| 工程H | 0.35 | 0.92 | -0.83 | -0.60 | 0.30 | -0.62 | -0.82 | 1.00 |
課題構成が最も似る組み合わせ: 工程C と 工程D(類似度 0.935)
結果の読み取り
コサイン類似度が高い工程同士では、改善テーマの構成が似ている可能性があります。距離が「水準の近さ」、コサイン類似度が「方向の近さ」を見るため、両者を併記すると、横展開の妥当性をより丁寧に説明できます。
No.006:正規化
実務での意味
不良率と生産量では数値の桁が違います。そのまま計算すると生産量が支配的になるため、比較目的に応じた尺度調整が必要です。
分析・モデル化の考え方
代表的な方法は、各列を平均0・標準偏差1にする標準化
と、各行を長さ1にする単位ベクトル化 です。前者はKPI間の尺度調整、後者は工程ごとの方向比較に向きます。「正規化」という語がどちらを指すかを仕様に明記します。
Pythonで確認する
check = pd.DataFrame({
"標準化後の平均": Z.mean(),
"標準化後の標準偏差": Z.std(ddof=0),
})
display(check.round(10))
display(pd.DataFrame(unit_Z, index=df.index, columns=kpi_cols).round(3).head())
print("行ノルム:", np.linalg.norm(unit_Z, axis=1).round(6))
| 標準化後の平均 | 標準化後の標準偏差 | |
|---|---|---|
| 不良率_pct | -0.0 | 1.0 |
| 停止時間_h | 0.0 | 1.0 |
| 電力原単位_kWh | -0.0 | 1.0 |
| 生産量_千個 | 0.0 | 1.0 |
| 不良率_pct | 停止時間_h | 電力原単位_kWh | 生産量_千個 | |
|---|---|---|---|---|
| 工程 | ||||
| 工程A | -0.124 | -0.198 | 0.103 | -0.967 |
| 工程B | -0.632 | -0.552 | -0.531 | 0.116 |
| 工程C | 0.539 | 0.515 | 0.618 | -0.251 |
| 工程D | 0.280 | 0.468 | 0.683 | -0.487 |
| 工程E | -0.117 | -0.348 | -0.497 | 0.787 |
行ノルム: [1. 1. 1. 1. 1. 1. 1. 1.]
結果の読み取り
列標準化後は各KPIの平均がほぼ0、標準偏差が1となり、行の単位ベクトル化後は各工程の長さが1となりました。標準化パラメータは毎月別々に作ると基準が動くため、実運用では基準期間の平均・標準偏差を保存して適用します。
No.007:基底とは何か
実務での意味
同じ工程状態でも、「元のKPI」で見るか、「品質・安定性・環境・能力」という別の観点で見るかにより説明の仕方が変わります。基底は、状態を記述する座標軸の選び方です。
分析・モデル化の考え方
4次元空間の標準基底は です。直交行列 の列を新しい正規直交基底にすると、新座標は
で変換・復元できます。基底を変えても情報は失われず、表現だけが変わります。
Pythonで確認する
Q = np.array([
[1, 1, 0, 0],
[1,-1, 0, 0],
[0, 0, 1, 1],
[0, 0, 1,-1],
], dtype=float) / np.sqrt(2)
z_a = Z_np[0]
coords = Q.T @ z_a
restored = Q @ coords
result = pd.DataFrame({"元の座標": z_a, "復元値": restored}, index=kpi_cols)
display(result.round(4))
print("新基底での座標:", coords.round(4))
print("復元誤差:", np.linalg.norm(z_a - restored))
| 元の座標 | 復元値 | |
|---|---|---|
| 不良率_pct | -0.115 | -0.115 |
| 停止時間_h | -0.183 | -0.183 |
| 電力原単位_kWh | 0.096 | 0.096 |
| 生産量_千個 | -0.896 | -0.896 |
新基底での座標: [-0.2107 0.0486 -0.5663 0.7015]
復元誤差: 2.3469468764647177e-16
結果の読み取り
新基底の座標から元のベクトルをほぼ誤差なく復元できました。基底変換は「データを変える」のではなく「見る軸を変える」操作です。実務では新しい軸の意味を現場用語で説明できることが、数学的な妥当性と同じくらい重要です。
No.008:次元とは何か
実務での意味
KPIが4列あれば形式上は4次元ですが、似た動きをする指標ばかりなら実質的な情報量は少なくなります。ダッシュボードの項目数と、意思決定に必要な独立情報の数は一致しません。
分析・モデル化の考え方
データ行列の特異値 は、各方向に含まれる変動の大きさを示します。累積寄与率
により、変動の多くを保つのに必要な実効次元を確認できます。今回は概念確認のためSVDを使いますが、PCAは後続ノックで詳しく扱います。
Pythonで確認する
_, singular_values, _ = np.linalg.svd(Z_np, full_matrices=False)
ratio = singular_values**2 / np.sum(singular_values**2)
cum_ratio = np.cumsum(ratio)
dim_table = pd.DataFrame({
"特異値": singular_values,
"寄与率": ratio,
"累積寄与率": cum_ratio,
}, index=[f"方向{i}" for i in range(1, 5)])
display(dim_table.round(3))
plt.figure(figsize=(7, 4))
plt.plot(range(1, 5), cum_ratio, marker="o")
plt.axhline(.9, color="red", linestyle="--", label="90%")
plt.title("利用する方向数と累積寄与率")
plt.xlabel("方向数"); plt.ylabel("累積寄与率"); plt.xticks(range(1, 5)); plt.ylim(0, 1.05)
plt.grid(alpha=.3); plt.legend(); plt.tight_layout(); plt.show()
| 特異値 | 寄与率 | 累積寄与率 | |
|---|---|---|---|
| 方向1 | 4.882 | 0.745 | 0.745 |
| 方向2 | 2.738 | 0.234 | 0.979 |
| 方向3 | 0.750 | 0.018 | 0.997 |
| 方向4 | 0.317 | 0.003 | 1.000 |

結果の読み取り
累積寄与率を見ると、4列すべてを使わなくても主要な変動を説明できる可能性が分かります。ただし、寄与率が小さい方向に重大事故の予兆が含まれることもあります。次元削減は可視化や監視負荷を軽くしますが、品質保証上必須のKPIを機械的に削除してはいけません。
No.009:線形結合
実務での意味
複数KPIから品質リスクや操業負荷などの合成指標を作る操作は、ベクトルの線形結合です。現場で広く使われる加重平均の数学的な姿でもあります。
分析・モデル化の考え方
ベクトル と係数 に対し、
を線形結合と呼びます。各KPI列ベクトルを重み付きで足すと、全工程分の総合スコアベクトルが得られます。係数の符号、尺度、合計制約の設計がスコアの意味を決めます。
Pythonで確認する
quality_score = 0.7 * Z["不良率_pct"] + 0.3 * Z["停止時間_h"]
resource_score = 0.6 * Z["電力原単位_kWh"] + 0.4 * Z["生産量_千個"]
combined = pd.DataFrame({
"品質・安定性スコア": quality_score,
"資源・能力スコア": resource_score,
}, index=df.index)
display(combined.sort_values("品質・安定性スコア", ascending=False))
plt.figure(figsize=(7, 5))
plt.scatter(combined.iloc[:, 0], combined.iloc[:, 1], s=70)
for name, row in combined.iterrows():
plt.annotate(name, (row.iloc[0], row.iloc[1]), xytext=(5, 4), textcoords="offset points")
plt.axhline(0, color="gray", lw=.8); plt.axvline(0, color="gray", lw=.8)
plt.title("二つの線形結合で見る工程ポートフォリオ")
plt.xlabel("品質・安定性スコア(高いほど課題)")
plt.ylabel("資源・能力スコア(高いほど課題)")
plt.grid(alpha=.3); plt.tight_layout(); plt.show()
| 品質・安定性スコア | 資源・能力スコア | |
|---|---|---|
| 工程 | ||
| 工程C | 1.172 | 0.596 |
| 工程G | 0.898 | -0.082 |
| 工程D | 0.766 | 0.490 |
| 工程F | 0.681 | 0.478 |
| 工程A | -0.135 | -0.301 |
| 工程E | -0.417 | 0.037 |
| 工程H | -1.319 | -0.479 |
| 工程B | -1.646 | -0.738 |

結果の読み取り
二つの合成軸により、品質・安定性と資源・能力の両面で工程を分類できます。右上の工程は総合改善、右下は品質中心など、施策を分ける材料になります。係数を変えた場合の配置変化も確認し、単一の重み設定に依存しすぎない意思決定にします。
No.010:一次独立
実務での意味
停止時間から定義した「稼働損失率」など、既存KPIの定数倍や足し合わせで完全に再現できる列を追加しても、新しい情報は増えません。重複指標はモデルの推定を不安定にし、会議資料も冗長にします。
分析・モデル化の考え方
ベクトル集合が一次独立であるとは、
を満たす係数がすべて0に限られることです。データ行列のランクが列数より小さければ、少なくとも1列は他列の線形結合です。ただし、実データでは完全一致より「ほぼ従属」が多いため、特異値や条件数も確認します。
Pythonで確認する
independent_matrix = Z_np
duplicate_col = 2 * Z_np[:, 0] + 0.5 * Z_np[:, 1]
dependent_matrix = np.column_stack([Z_np, duplicate_col])
print("元の列数 / ランク:", independent_matrix.shape[1], "/", np.linalg.matrix_rank(independent_matrix))
print("派生KPI追加後の列数 / ランク:", dependent_matrix.shape[1], "/", np.linalg.matrix_rank(dependent_matrix))
print("追加列の再現誤差:", np.linalg.norm(duplicate_col - (2*Z_np[:, 0] + .5*Z_np[:, 1])))
print("追加後の特異値:", np.linalg.svd(dependent_matrix, compute_uv=False).round(6))
元の列数 / ランク: 4 / 4
派生KPI追加後の列数 / ランク: 5 / 4
追加列の再現誤差: 0.0
追加後の特異値: [8.430206 3.088074 0.80626 0.347143 0. ]
結果の読み取り
派生KPIを1列追加して列数は増えましたが、ランクは増えません。つまり表示項目は増えても独立な情報は増えていません。KPI台帳には計算式と原典を記録し、分析モデルでは目的に応じて元指標か派生指標のどちらかを採用します。
対象ノックを通して見える実務上の示唆
- 工程をベクトル化すると比較規則を明文化できる:経験的な総合判断を、成分・尺度・重みとして議論できます。
- 大きさと向きを分ける:ノルムや距離は乖離水準、コサイン類似度は課題構成を表し、用途が異なります。
- 尺度調整は前処理ではなく業務定義:基準期間、外れ値、良否方向を誰が承認するかまで決める必要があります。
- 指標数と情報量は同じではない:次元と一次独立を確認すると、重複KPIや不安定なモデルを避けられます。
- 総合点には方針が埋め込まれる:内積や線形結合の重みは透明化し、複数シナリオで順位の頑健性を検証します。
実務導入する場合に必要なこと
- KPIの定義、単位、集計周期、良い方向、欠損処理をデータ辞書にする
- 設備・製品・シフト構成など、比較可能性を左右する条件を揃える
- 標準化に使う基準期間を固定し、工程変更時の更新ルールを決める
- 重みを品質保証・製造・経営で合意し、感度分析を残す
- スコアを自動処分に直結させず、現場確認を含む意思決定フローに組み込む
- 月次で分布変化、欠損、外れ値、重複指標を監視する
まとめ
No.001〜No.010では、多指標の工程状態をベクトルとして表し、内積・ノルム・距離・類似度で比較し、正規化・基底・次元・線形結合・一次独立でデータ設計を点検しました。線形代数は計算技法というより、複数KPIによる意思決定を再現可能にする設計言語です。次の段階では、ベクトルが張る空間や直交、射影へ進むことで、予測・異常検知・最適化の理解につながります。
法人向けのご相談
数理工房では、製造KPIの設計、工程比較、異常検知、需要予測、最適化、研修用Notebookの整備など、現場の課題とデータの成熟度に合わせた支援をご相談いただけます。「どの指標から整えるべきか」という構想段階からでも対応可能です。
📩 お問い合わせ: surikobo.co.jp/contact
まずはお気軽にご相談ください。