Загрузка данных
from smm_funcs import test_5_plot_monlin_test
# Список факторов для проверки на нелинейность
factors_to_test = ['pr_p_n', 'new_delta', 'duration_months']
for factor in factors_to_test:
# Для new_delta используем бининг с шагом 0.25
if factor == 'new_delta':
df_temp = df.copy()
df_temp['new_delta_binned'] = np.round(df_temp['new_delta'] / 0.25) * 0.25
group_col = 'new_delta_binned'
else:
df_temp = df
group_col = factor
test_5_plot_monlin_test(
df=df_temp,
weight_column='portfolio_share',
group_column=group_col,
columns=['renewed_fact_rate'],
bins=20,
figsize=(12, 6),
title=f'Зависимость доли пролонгаций от {factor}',
xlabel=factor,
ylabel='Взвешенная доля пролонгаций'
)
import statsmodels.api as sm
from statsmodels.stats.diagnostic import linear_reset
# Используем данные из теста статистической значимости
# Предполагается, что у вас есть:
# - X_const – матрица признаков с константой
# - z_series – преобразованная целевая переменная
# - weight_series – веса
# Взвешенная регрессия через WLS
wls_model = sm.WLS(z_series, X_const, weights=weight_series)
results = wls_model.fit()
# Тест Рамсея (RESET) – проверка на пропущенные нелинейности
reset_test = linear_reset(results, power=2, test_type='fitted')
print("\n=== ТЕСТ РАМСЕЯ (RESET) НА НЕЛИНЕЙНОСТЬ ===")
print(f"F-статистика: {reset_test.fvalue:.4f}")
print(f"p-value: {reset_test.pvalue:.4f}")
if reset_test.pvalue < 0.05:
print(" Есть свидетельства нелинейности (p < 0.05) – модель может требовать нелинейных преобразований.")
else:
print(" Нет явных свидетельств нелинейности (p >= 0.05) – линейная модель адекватна.")
import matplotlib.pyplot as plt
import numpy as np
# Получаем остатки и предсказанные значения
residuals = results.resid
fitted = results.fittedvalues
# График остатков
plt.figure(figsize=(10, 5))
plt.scatter(fitted, residuals, alpha=0.5)
plt.axhline(0, color='red', linestyle='--')
plt.xlabel('Предсказанные значения (z)')
plt.ylabel('Остатки')
plt.title('График остатков vs предсказанные значения')
plt.grid(True, alpha=0.3)
plt.show()
# Если на графике видна систематическая кривизна (например, парабола) – это признак нелинейности.
from smm_funcs import test_5_plot_monlin_test
import statsmodels.api as sm
from statsmodels.stats.diagnostic import linear_reset
import matplotlib.pyplot as plt
import numpy as np
print("=== 1. ВИЗУАЛЬНАЯ ОЦЕНКА НЕЛИНЕЙНОСТЕЙ ===")
# Факторы для проверки
factors = ['pr_p_n', 'new_delta', 'duration_months']
for factor in factors:
if factor == 'new_delta':
df_temp = df.copy()
df_temp['new_delta_binned'] = np.round(df_temp['new_delta'] / 0.25) * 0.25
group_col = 'new_delta_binned'
else:
df_temp = df
group_col = factor
test_5_plot_monlin_test(
df=df_temp,
weight_column='portfolio_share',
group_column=group_col,
columns=['renewed_fact_rate'],
bins=20,
figsize=(12, 6),
title=f'Зависимость доли пролонгаций от {factor}',
xlabel=factor,
ylabel='Взвешенная доля пролонгаций'
)
print("\n=== 2. СТАТИСТИЧЕСКИЙ ТЕСТ (РАМСЕЯ) ===")
# Используем данные из теста статистической значимости
wls_model = sm.WLS(z_series, X_const, weights=weight_series)
results = wls_model.fit()
reset_test = linear_reset(results, power=2, test_type='fitted')
print(f"F-статистика: {reset_test.fvalue:.4f}")
print(f"p-value: {reset_test.pvalue:.4f}")
if reset_test.pvalue < 0.05:
print(" Есть свидетельства нелинейности (p < 0.05)")
else:
print(" Нет явных свидетельств нелинейности (p >= 0.05)")
print("\n=== 3. ГРАФИК ОСТАТКОВ ===")
residuals = results.resid
fitted = results.fittedvalues
plt.figure(figsize=(10, 5))
plt.scatter(fitted, residuals, alpha=0.5)
plt.axhline(0, color='red', linestyle='--')
plt.xlabel('Предсказанные значения (z)')
plt.ylabel('Остатки')
plt.title('Остатки vs предсказанные значения')
plt.grid(True, alpha=0.3)
plt.show()