# ============================================================================== # ライブラリのインポート # ============================================================================== import pandas as pd import numpy as np from sklearn.tree import DecisionTreeClassifier, export_text, export_graphviz from sklearn.model_selection import cross_val_score import graphviz # ============================================================================== # 1. 分析の基本設定 ★★★ ここを編集してください ★★★ # ============================================================================== # アップロードしたExcelファイル名 file_name = 'your_file_name.xlsx' # 自分のファイル名に変更 # 元の目的変数の列名(Excelの項目名) target_variable = 'Y' # 自分の目的変数の名前に変更 # 目的を達成したと見なす「基準値」 threshold = 1.1 # 生成される決定木の「深さ」の最大値(ルールの複雑さ) max_depth_of_tree = 3 # 交差検証の分割数(データを何分割して評価を繰り返すか) cv_folds = 5 # ============================================================================== # 2. データの読み込みと前処理 # ============================================================================== print("1. データの読み込みと前処理を開始します...") # Excelファイルを読み込む try: df = pd.read_excel(file_name) print(f"✅ 「{file_name}」を正常に読み込みました。") except FileNotFoundError: print(f"❌ エラー: 「{file_name}」が見つかりません。ファイル名を正しく入力したか、ファイルをアップロードしたか確認してください。") raise SystemExit # 数値データのみを抽出し、文字列やエラー値を0に変換 X = df.drop(columns=[target_variable]).apply(pd.to_numeric, errors='coerce').fillna(0) print(f"✅ 説明変数の前処理が完了しました。") # 目的変数を「達成(1)」か「未達成(0)」に変換 y = (df[target_variable] >= threshold).astype(int) print(f"✅ 目的変数を基準値 {threshold} で「達成(1)/未達成(0)」に変換しました。") # ============================================================================== # 3. 交差検証によるモデル性能の評価 # ============================================================================== print(f"\n2. 交差検証({cv_folds}分割)でモデルの性能を評価します...") # 決定木モデルを定義 model = DecisionTreeClassifier(max_depth=max_depth_of_tree, min_samples_leaf=5, random_state=42) # 交差検証を実行し、各回のスコアを取得 scores = cross_val_score(model, X, y, cv=cv_folds, scoring='accuracy') # 平均と標準偏差を計算 mean_accuracy = scores.mean() std_accuracy = scores.std() print(f"✅ モデルの性能評価が完了しました。") print(f" 平均正解率: {mean_accuracy:.2%}") print(f" 精度の標準偏差: (+/- {std_accuracy:.2%})") print(" (分割の仕方によって、この程度のばらつきが出ることを示します)") # ============================================================================== # 4. 最終モデルの構築とルールの可視化 # ============================================================================== print("\n3. 全データを使って最終的な決定木を作成し、ルールを抽出します...") # 全データを使ってモデルを再訓練 model.fit(X, y) # 決定木をGraphviz形式でエクスポート dot_data = export_graphviz(model, out_file=None, feature_names=X.columns, class_names=['未達成', '達成'], filled=True, rounded=True, special_characters=True, proportion=True) # 決定木を描画 graph = graphviz.Source(dot_data) display(graph) # テキスト形式でルールを抽出 print("\n" + "="*60) print(" 「達成」に至るためのIF-THENルール") print("="*60) tree_rules = export_text(model, feature_names=list(X.columns)) print(tree_rules)