チャレンジ AI×100業務(製造業)、#08 品質リスクを分析する「ランダムフォレスト」
前回の記事は、現場での測定値をデータベースへ保存する記事でした。今回は、そのデータが集積した(と仮定した)csvファイルを利用します。
このデータベースのファイルを利用して、データを分類、予測できれば、品質を監視でき、エラーやスペックアウトの予防に役立ちます。ここでは、ランダムフォレスト、決定木分析を使用します。
*それでは、スタートです。
*執筆者は以下を参照してください。
使ったツール・準備したこと
ChatGPT 4o
Visual Studio Code環境下でのPython
やってみたこと|コード・ステップ紹介
実行した内容の簡単な流れ
その前に、実測データcsvファイルに関する分析について会話しました。下の表が回答です。
このプロジェクトでは、日々の測定データをデータベースとしてcsvに保存することを教えてもらいました。次は、これによる品質監視を考えています。ある特性Yをレスポンスとして、日々データがどのように関係しているかを分析するにはどのような分析がありますか?

では、上表の中で、想定しているデータを考慮すると要因を分析できる「ランダムフォレスト(wiki)」が好適なため、この分析を実施することを目的に作業を続けていきます。
では、csvを読み込んでランダムフォレストでYとの関係性を探る、コードを生成してください。
コードを実行すると、下には、各因子の重要度が表示され、B因子が寄与率が高いことがわかります。下に分析したデータのイメージを掲載していますが、各要因に対し、特性Yが「normal」or「low」なのかの判定によります。


ツリー中の表記について;
・gini クラスの混ざり具合(0が純粋)
・value [クラス0の数, クラス1の数]
・samples このノードにあるデータ件数
・classこのノードの多数派クラス(予測結果)

アプリ化しておけば、常に確認できますね。
今後の展開・アイデア
次回取り組みたいこと;
・YouTubeで決定木分析を学びます。
*今回のコードです。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.preprocessing import LabelEncoder
import matplotlib.font_manager as fm
# --- 1. CSV読み込みと前処理 ---
df = pd.read_csv(r"ここはファイルを指定してください")
df.columns = df.columns.str.strip() # 列名の空白を削除
# --- 2. 説明変数と目的変数に分ける ---
X = df[['lot', 'A', 'B', 'C']]
Y = df['Y']
# --- 3. lotをダミー変換(文字列 → 数値化)---
X = pd.get_dummies(X, columns=['lot'])
# --- 4. 目的変数(Y)を数値に変換(normal/low → 0/1) ---
le = LabelEncoder()
Y_encoded = le.fit_transform(Y)
# --- 5. データ分割(80%訓練、20%テスト) ---
X_train, X_test, Y_train, Y_test = train_test_split(X, Y_encoded, test_size=0.2, random_state=42)
# --- 6. 単一決定木モデルの学習(深さ制限あり) ---
tree_model = DecisionTreeClassifier(max_depth=4, random_state=42) # max_depthでツリーの複雑さ制御
tree_model.fit(X_train, Y_train)
# --- 7. 精度評価(分類レポート & 混同行列) ---
Y_pred = tree_model.predict(X_test)
print("分類レポート:\n")
print(classification_report(Y_test, Y_pred, target_names=le.classes_))
# --- 8. 混同行列をヒートマップで表示(日本語対応) ---
plt.rcParams['font.family'] = 'Meiryo'
cm = confusion_matrix(Y_test, Y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=le.classes_, yticklabels=le.classes_)
plt.title("混同行列(決定木)")
plt.xlabel("予測ラベル")
plt.ylabel("正解ラベル")
plt.tight_layout()
plt.show()
# --- 9. 決定木の可視化(ツリー表示) ---
plt.figure(figsize=(20,10))
plot_tree(tree_model,
feature_names=X.columns,
class_names=le.classes_,
filled=True,
rounded=True,
fontsize=10)
plt.title("単一決定木の可視化(max_depth=4)")
plt.tight_layout()
plt.show()
