Загрузка данных


from smm_funcs import test_4_permutation_importance

# Определяем функцию-обёртку для вашей модели прогнозирования
# Она должна принимать df и model_coefs, и добавлять в df столбец с прогнозом
def smm_wrapper(df, model_coefs):
    """
    Обёртка для функции predict_prolongation.
    Добавляет в DataFrame столбец 'prediction'.
    """
    # Используем глобальные переменные: coeff_dict, features, F
    z = coeff_dict['intercept']
    for feat in features:
        z += coeff_dict[feat] * df[feat].values
    df['prediction'] = F(z)
    return df

# Запуск теста перестановочной важности
importance_result = test_4_permutation_importance(
    df=df,                       # данные для теста
    df_history=df,               # данные для расчёта бенчмарка (можно те же)
    features=features,           # список признаков
    smm_func=smm_wrapper,        # функция расчёта прогноза
    model_coefs=None,            # коэффициенты (не используются, т.к. они в функции)
    random_states=[42, 123, 456], # несколько состояний для устойчивости
    group_column='end_month_plan',
    weight_column='portfolio_share',
    smm_fact_column='renewed_fact_rate',
    smm_pred_column='prediction'
)

print("=== ПЕРЕСТАНОВОЧНАЯ ВАЖНОСТЬ ПРИЗНАКОВ ===")
print(importance_result)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Предполагается, что у вас есть:
# - model_results – результат test_3_ols_metrics (или test_3_wls_metrics)
# - X_train – матрица признаков (DataFrame) для тренировочных данных
# - z_train – преобразованная целевая переменная

# Извлекаем коэффициенты (без константы, если она есть)
if 'const' in model_results.params.index:
    coefs = model_results.params.drop('const')
else:
    coefs = model_results.params

# Стандартные отклонения признаков и z
X_std = X_train.std()
z_std = z_train.std()

# Бета-коэффициенты
beta_coefs = coefs * X_std[coefs.index] / z_std

# Сортировка по убыванию абсолютного значения
beta_sorted = beta_coefs.abs().sort_values(ascending=False)

# Вывод таблицы
importance_beta = pd.DataFrame({
    'Признак': beta_sorted.index,
    'Коэффициент': coefs[beta_sorted.index].round(4),
    'Бета (стандартизованный)': beta_sorted.round(4),
    '|Бета|': beta_sorted.abs().round(4)
})

print("\n=== СТАНДАРТИЗОВАННЫЕ КОЭФФИЦИЕНТЫ (БЕТА) ===")
print(importance_beta.to_string(index=False))

# График важности
plt.figure(figsize=(10, 6))
plt.barh(beta_sorted.index, beta_sorted.abs().values, color='steelblue')
plt.axvline(x=0.2, color='red', linestyle='--', label='Порог существенности (|β| > 0.2)')
plt.xlabel('|Стандартизованный коэффициент| (бета)')
plt.title('Существенность влияния факторов модели')
plt.legend()
plt.gca().invert_yaxis()
plt.tight_layout()
plt.show()

# Объединение результатов
if 'importance_result' in locals():
    # Извлекаем относительное изменение RMSE из перестановочной важности
    perm_change = importance_result['Относительное изменение, %']
    perm_change = perm_change[perm_change.index != 'Без изменений']
    
    # Создаём итоговую таблицу
    final_importance = pd.DataFrame({
        'Признак': beta_sorted.index,
        '|Бета|': beta_sorted.abs().round(4),
        'Изменение RMSE, %': perm_change.reindex(beta_sorted.index).round(2)
    }).sort_values('|Бета|', ascending=False)
    
    print("\n=== СВОДНАЯ ТАБЛИЦА СУЩЕСТВЕННОСТИ ФАКТОРОВ ===")
    print(final_importance.to_string(index=False))