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


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()