0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FMEAのRPNが変動する!?リスク優先度をシミュレーションで体感する

0
Posted at

▶ 今回のシミュレーター: FMEA RPN リスク優先度 シミュレーター (ブラウザで動作・登録不要)


「RPNが100超えたら危険」という都市伝説

「RPNが100を超えたら対策必須」。これを聞いたこと、ありませんか?

実は、そんなルールはどこにもありません。

AIAG(Automotive Industry Action Group)のFMEAハンドブックにも、ISO 26262の機能安全規格にも、「RPNのしきい値は◯◯」なんて絶対基準は書かれていないんです。

むしろ、S(深刻度)が10の「警告なしで人命に関わる故障」は、RPNがたとえ30でも最優先で対策すべき。一方、S=3でD=10(まったく検知できないけど大した影響じゃない)のRPN=300は、コスト対効果で対策を見送ることもある。

数字の大小より、中身を読め ── これがFMEAの本質です。

でも、じゃあどうやって「中身を読む」のか? その答えが、今回のシミュレーターが提供する3つの視点にあります。


ざっくり本質 ── 「壊れ方の3つの顔」を見える化する

FMEAでやっていることは、実はすごくシンプルです。

製品や工程の「壊れ方(故障モード)」に対して、3つの質問をするだけ。

  1. それが起きたら、どれだけヤバイか?(深刻度 S)
  2. どれくらいの頻度で起きるか?(発生頻度 O)
  3. 起きても気づけるか?(検知性 D)

この3つをそれぞれ1〜10で評価して、掛け算した値がRPN(リスク優先度)です。

「RPNはリスクの『総合点』ではなく、『3つの角度から見た立体地図』なんです」


数式で理解する

FMEAの根幹は、たった1つの式です。

RPN = S \times O \times D

ただし、各パラメータは以下の意味を持ちます。

  • S(Severity:深刻度):1〜10の整数。顧客や法規への影響度。10は「警告なしで安全上の危険」、1は「影響なし」。
  • O(Occurrence:発生頻度):1〜10の整数。故障が発生する確率や頻度。10は「ほぼ毎回発生」、1は「極めて稀」。
  • D(Detection:検知性):1〜10の整数。検知の難しさ。10は「検知できない」、1は「確実に検知できる」。

重要なのは、Dは「検知のしやすさ」ではなく「検知の難しさ」だということ。 ここを間違えると、RPNの解釈がガラリと変わってしまいます。

RPNの取りうる範囲は:

1 \leq RPN \leq 1000

なぜなら最小は $1 \times 1 \times 1 = 1$、最大は $10 \times 10 \times 10 = 1000$ だからです。


コードで実装する ★最重要★

さて、ここからが本番です。上記の計算ロジックを、実際に動くJavaScriptコードで再現してみましょう。

このコードは、シミュレーターの核となる機能 ── S, O, Dの入力からRPNを計算し、しきい値フィルタ、パレート図のデータ生成、対策前後比較まで ── をカバーしています。

/**
 * FMEA RPN シミュレーター コアエンジン
 * AIAG FMEA第5版に準拠
 */
class FMEACalculator {
  constructor() {
    this.failureModes = [];
  }

  /**
   * 故障モードを追加
   * @param {string} name - 故障モード名
   * @param {number} S - 深刻度 (1-10)
   * @param {number} O - 発生頻度 (1-10)
   * @param {number} D - 検知性 (1-10)
   * @param {object} countermeasure - 対策後評価(任意)
   */
  addFailureMode(name, S, O, D, countermeasure = null) {
    // 入力値のバリデーション
    if (![S, O, D].every(v => Number.isInteger(v) && v >= 1 && v <= 10)) {
      throw new Error('S, O, D は 1〜10 の整数で指定してください');
    }

    const mode = {
      name,
      S, O, D,
      RPN: S * O * D,
      // 対策後評価があれば計算
      after: countermeasure ? {
        S: countermeasure.S || S,
        O: countermeasure.O || O,
        D: countermeasure.D || D,
        RPN: (countermeasure.S || S) * (countermeasure.O || O) * (countermeasure.D || D)
      } : null
    };

    this.failureModes.push(mode);
    return mode;
  }

  /**
   * しきい値フィルタリング
   * @param {number} threshold - RPNしきい値
   * @returns {Array} フィルタリングされた故障モード一覧
   */
  filterByThreshold(threshold) {
    return this.failureModes.filter(m => m.RPN >= threshold);
  }

  /**
   * パレート図用データ生成(累積RPN割合計算)
   * @returns {Array} RPN降順にソートされたデータ
   */
  getParetoData() {
    // RPN降順にソート
    const sorted = [...this.failureModes].sort((a, b) => b.RPN - a.RPN);
    const totalRPN = sorted.reduce((sum, m) => sum + m.RPN, 0);

    let cumulative = 0;
    return sorted.map(m => {
      cumulative += m.RPN;
      return {
        name: m.name,
        RPN: m.RPN,
        cumulativeRatio: (cumulative / totalRPN) * 100  // 累積割合(%)
      };
    });
  }

  /**
   * リスクマトリックス用データ
   * @returns {Array} {S, O, RPN, name} の配列
   */
  getRiskMatrixData() {
    return this.failureModes.map(m => ({
      name: m.name,
      S: m.S,
      O: m.O,
      RPN: m.RPN
    }));
  }

  /**
   * 対策前後比較
   * @returns {Array} 対策前後のRPN比較データ
   */
  getComparisonData() {
    return this.failureModes
      .filter(m => m.after !== null)
      .map(m => ({
        name: m.name,
        beforeRPN: m.RPN,
        afterRPN: m.after.RPN,
        reduction: m.RPN - m.after.RPN,
        reductionRate: ((m.RPN - m.after.RPN) / m.RPN * 100).toFixed(1)
      }));
  }
}

// ===== 使用例 =====
const fmea = new FMEACalculator();

// 自動車のブレーキシステム故障モードを想定
fmea.addFailureMode(
  '制動力低下(パッド摩耗)', 
  8,  // S: ブレーキ効かない → 重大
  4,  // O: 年間数件報告あり
  3,  // D: 定期点検で発見可能
  { O: 2, D: 1 }  // 対策後:高性能パッド + 摩耗センサー
);

fmea.addFailureMode(
  'ブレーキフルード漏れ',
  9,  // S: ほぼ事故に直結
  2,  // O: 稀(過去3年で1件)
  6,  // D: 漏れに気づきにくい
  { D: 3 }  // 対策後:漏れ検知センサー追加
);

fmea.addFailureMode(
  'ABSモジュール故障',
  7,  // S: 制動距離増加
  3,  // O: 過去1年で1件
  5,  // D: 警告灯で気づく
  { O: 1, D: 2 }  // 対策後:信頼性向上 + 自己診断機能
);

// 結果の確認
console.log('=== 全故障モード ===');
fmea.failureModes.forEach(m => {
  console.log(`${m.name}: RPN=${m.RPN} (S=${m.S}, O=${m.O}, D=${m.D})`);
});

console.log('\n=== RPN 100以上フィルタ ===');
fmea.filterByThreshold(100).forEach(m => {
  console.log(`${m.name}: RPN=${m.RPN}`);
});

console.log('\n=== パレートデータ ===');
fmea.getParetoData().forEach(d => {
  console.log(`${d.name}: RPN=${d.RPN}, 累積割合=${d.cumulativeRatio.toFixed(1)}%`);
});

console.log('\n=== 対策前後比較 ===');
fmea.getComparisonData().forEach(d => {
  console.log(`${d.name}: ${d.beforeRPN}${d.afterRPN} (削減率${d.reductionRate}%)`);
});

このコードのポイント:

  • バリデーション:S, O, Dが1〜10の整数であることを確認
  • 対策後評価:対策によって変化したパラメータだけ上書き可能(Oだけ下げる、Dだけ下げるなど)
  • パレートデータ:累積RPN割合を自動計算 → 「上位20%の故障モード」を特定可能
  • リスクマトリックス:SとOの2軸でプロットするためのデータ生成

数値例で確かめる

実際に、ある電子機器の「電源ユニット過熱」という故障モードを評価してみましょう。

評価値

  • S(深刻度):7(機器停止、データ損失の可能性)
  • O(発生頻度):4(年に数回の報告あり)
  • D(検知性):6(温度センサーはあるが、異常に気づくまで時間がかかる)

計算

RPN = 7 \times 4 \times 6 = 168

このRPN=168、一見すると「まあまあ高い」ですが、ここで先ほどのコードを実行してみます。

const fmea2 = new FMEACalculator();
fmea2.addFailureMode('電源ユニット過熱', 7, 4, 6);
console.log(fmea2.failureModes[0].RPN); // 168

ここで重要なのは:S=7(深刻度が高い)にもかかわらず、D=6(検知が難しい)ためにRPNが高くなっています。つまり、「対策すべきは発生頻度Oを下げるか、検知性Dを上げる(Dの値を下げる)か」という判断が必要になります。

対策として、過熱防止回路を追加(Oを2に低減) かつ 温度監視をリアルタイム化(Dを2に改善) した場合:

fmea2.addFailureMode('電源ユニット過熱(対策後)', 7, 2, 2);
console.log(fmea2.failureModes[1].RPN); // 28

RPNが168 → 28に低減。削減率83.3% です。


シミュレーターで遊ぶ

実際のシミュレーターで、いくつか実験してみましょう。

実験1:「RPNが同じでも中身が違う」を体感

  • ケースA:S=5, O=5, D=5 → RPN=125
  • ケースB:S=9, O=3, D=5 → RPN=135

RPNはほぼ同じ(125 vs 135)ですが、リスクマトリックスで見ると、ケースBはS=9(「警告なしで危険」に近い)と高リスク領域にプロットされます。

何が起きるか:シミュレーターのリスクマトリックス上で、ケースBは右上(高S・高O)に表示され、視覚的に「優先度が高い」ことがわかります。RPNの数字だけ見ていると見落とすポイントです。

実験2:しきい値フィルタで「見るべきもの」を絞る

10個の故障モードを登録し、RPNしきい値を100に設定してみましょう。

何が起きるか:パレート図が自動更新され、RPN 100以上の故障モードだけが強調表示されます。累積RPN割合が80%に達するまでの主要モードが一目でわかります。

実験3:対策前後比較で「効果の可視化」

先ほどの「電源ユニット過熱」で、対策前後のRPNを比較してみます。

何が起きるか:対策前RPN=168、対策後RPN=28が横並びで表示され、差が「140」、削減率「83.3%」と数値化されます。これで「対策の効果」を客観的に示せます。


現場でハマるポイント

1. 「検知性D」の解釈を間違える

最も多いミスです。Dは**「検知の難しさ」**。つまり:

  • D=1:「確実に検知できる」← 良い状態
  • D=10:「まったく検知できない」← 悪い状態

「検査がしっかりしてるからD=10」と入力すると、RPNが跳ね上がります。逆です。検査がしっかりしているならD=1です。

2. 「主観評価のバラつき」を放置する

あるエンジニアは「年に1回くらい」をO=4と評価し、別のエンジニアはO=3と評価する。これではチーム内で一貫性が保てません。

対策:社内で評価基準を具体化する。例えば:

  • O=3:「過去3年間で1件の報告あり」
  • O=4:「過去1年間で1件の報告あり」

のように、客観的なデータ(故障報告書、CAE解析結果の確率など)に基づいて評価しましょう。

3. 「RPNが下がったからOK」と早合点する

対策後にRPNが下がったからといって、それで終わりではありません。

確認すべきこと

  • 対策によって新たな故障モードが生まれていないか(トレードオフの確認)
  • S(深刻度)が変わっていないか(対策によってSが上がるケースもある)
  • 対策の実効性は担保されているか(机上の空論になっていないか)

まとめ

  1. RPNは「絶対的なしきい値」ではなく「相対的な優先順位付けの道具」 ── 数字の大小より、S(深刻度)が高いものを最優先に
  2. 3つの視点(パレート図・リスクマトリックス・対策前後比較)を組み合わせて判断 ── 一つの指標に頼らない
  3. 評価基準はチームで統一し、客観データに基づく ── 主観のバラつきが最大のリスク

今回紹介したコードは、実際のシミュレーターのコアロジックを再現しています。ぜひブラウザ上で動かしながら、S, O, Dの値を変えて「数字のマジック」を体感してみてください。

FMEA RPN リスク優先度 シミュレーター — ブラウザで即動作、登録不要

NovaSolverでは700以上の工学シミュレーターを無料公開中 👉 一覧はこちら

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?