mirosh111000

Прикладна_економетрика_ЛР№7_Мірошниченко

Nov 23rd, 2025 (edited)
838
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.88 KB | None | 0 0
  1. import numpy as np
  2. import pandas as pd
  3. import math
  4.  
  5. data = {
  6.     'x1': [32.8, 29.9, 30.12, 31.15, 25.25, 32.8, 29.9, 24.12, 20.15, 33.25],
  7.     'x2': [0.92, 0.46, 0.73, 0.64, 0.54, 0.74, 0.68, 0.46, 0.36, 0.95],      
  8.     'x3': [20.0, 16.2, 14.2, 10.0, 24.1, 13.2, 18.0, 15.1, 15.2, 75.5]        
  9. }
  10.  
  11. df = pd.DataFrame(data)
  12. n = len(df)
  13. m = len(df.columns)
  14.  
  15. print("=== Вхідні дані ===")
  16. print(df)
  17. print("-" * 50)
  18.  
  19. def manual_pearson_corr(x, y):
  20.     x_arr = np.array(x)
  21.     y_arr = np.array(y)
  22.    
  23.     x_mean = np.mean(x_arr)
  24.     y_mean = np.mean(y_arr)
  25.    
  26.     numerator = np.sum((x_arr - x_mean) * (y_arr - y_mean))
  27.    
  28.     sum_sq_diff_x = np.sum((x_arr - x_mean) ** 2)
  29.     sum_sq_diff_y = np.sum((y_arr - y_mean) ** 2)
  30.     denominator = np.sqrt(sum_sq_diff_x * sum_sq_diff_y)
  31.    
  32.     return numerator / denominator
  33.  
  34. cols = df.columns
  35. R_matrix = np.zeros((m, m))
  36.  
  37. for i in range(m):
  38.     for j in range(m):
  39.         if i == j:
  40.             R_matrix[i, j] = 1.0
  41.         else:
  42.             r = manual_pearson_corr(df[cols[i]], df[cols[j]])
  43.             R_matrix[i, j] = r
  44.  
  45. corr_matrix = pd.DataFrame(R_matrix, index=cols, columns=cols)
  46.  
  47. det_R = np.linalg.det(corr_matrix.values)
  48. chi2_observed = - (n - 1 - (2 * m + 5) / 6) * np.log(det_R)
  49.  
  50. # df = m(m-1)/2 = 3(2)/2 = 3
  51. # alpha = 0.05
  52. # Таблиця: chi2(0.95, 3) ≈ 7.815
  53. CHI2_CRITICAL_TABLE = 7.815
  54.  
  55. print("\n>>> Перевірка всього масиву (Критерій Пірсона)")
  56. print(f"Кореляційна матриця R:\n{corr_matrix.round(4)}")
  57. print(f"Визначник матриці det(R) = {det_R:.6f}")
  58. print(f"Хі-квадрат спостережуване = {chi2_observed:.4f}")
  59. print(f"Хі-квадрат критичне (табличне, df=3) = {CHI2_CRITICAL_TABLE}")
  60.  
  61. if chi2_observed > CHI2_CRITICAL_TABLE:
  62.     print("ВИСНОВОК: Мультиколінеарність ІСНУЄ.")
  63.    
  64.     inv_matrix_values = np.linalg.inv(corr_matrix.values)
  65.     inv_corr_matrix = pd.DataFrame(inv_matrix_values, index=cols, columns=cols)
  66.    
  67.     print("\n>>> Оцінка кожної змінної (F-критерій)")
  68.     print(f"Обернена матриця C:\n{inv_corr_matrix.round(4)}")
  69.    
  70.     # df1 = m - 1 = 2
  71.     # df2 = n - m = 7
  72.     # Таблиця: F(0.95, 2, 7) ≈ 4.737
  73.     F_CRITICAL_TABLE = 4.737
  74.    
  75.     f_results = []
  76.     collinear_vars = []
  77.    
  78.     for col in cols:
  79.         c_kk = inv_corr_matrix.loc[col, col]
  80.         F_obs = (c_kk - 1) * (n - m) / (m - 1)
  81.        
  82.         is_bad = F_obs > F_CRITICAL_TABLE
  83.         if is_bad: collinear_vars.append(col)
  84.        
  85.         f_results.append({
  86.             "Змінна": col,
  87.             "c_kk": round(c_kk, 4),
  88.             "F_спост": round(F_obs, 4),
  89.             "F_крит": F_CRITICAL_TABLE,
  90.             "Результат": "Мультиколінеарна" if is_bad else "Норма"
  91.         })
  92.    
  93.     print(pd.DataFrame(f_results).to_string(index=False))
  94.    
  95.     print("\n>>> Виявлення пар (t-критерій)")
  96.    
  97.     # df = n - m - 1 = 6
  98.     # alpha = 0.05 (двостороння), тому шукаємо t(0.975, 6)
  99.     # Таблиця: t(0.975, 6) ≈ 2.447
  100.     T_CRITICAL_TABLE = 2.447
  101.    
  102.     pairs_results = []
  103.     conflict_pairs = []
  104.    
  105.     for i in range(m):
  106.         for j in range(i + 1, m):
  107.             var1 = cols[i]
  108.             var2 = cols[j]
  109.            
  110.             c_ij = inv_corr_matrix.loc[var1, var2]
  111.             c_ii = inv_corr_matrix.loc[var1, var1]
  112.             c_jj = inv_corr_matrix.loc[var2, var2]
  113.            
  114.             r_partial = -c_ij / math.sqrt(c_ii * c_jj)
  115.            
  116.             if abs(r_partial) >= 1.0:
  117.                 t_obs = float('inf')
  118.             else:
  119.                 t_obs = (abs(r_partial) * math.sqrt(n - m - 1)) / math.sqrt(1 - r_partial**2)
  120.            
  121.             is_significant = t_obs > T_CRITICAL_TABLE
  122.            
  123.             if is_significant:
  124.                 conflict_pairs.append((var1, var2, r_partial))
  125.            
  126.             pairs_results.append({
  127.                 "Пара": f"{var1} - {var2}",
  128.                 "r_частковий": round(r_partial, 4),
  129.                 "t_спост": round(t_obs, 4),
  130.                 "t_крит": T_CRITICAL_TABLE,
  131.                 "Зв'язок": "Є мультикол." if is_significant else "Немає"
  132.             })
  133.            
  134.     print(pd.DataFrame(pairs_results).to_string(index=False))
  135.    
  136.     print("\n" + "="*50)
  137.     print("РІШЕННЯ ЩОДО КОРИГУВАННЯ МОДЕЛІ")
  138.     print("="*50)
  139.    
  140.     if conflict_pairs:
  141.         print("Виявлено проблемні пари:")
  142.         variables_to_drop = set()
  143.         for v1, v2, r in conflict_pairs:
  144.             print(f"- {v1} та {v2} (часткова кореляція r = {r:.4f})")
  145.            
  146.             if 'x1' in (v1, v2) and 'x2' in (v1, v2):
  147.                 print(f"  -> Залишаємо x1 (Продуктивність праці), прибираємо x2 (Фондомісткість).")
  148.                 if v1 == 'x2': variables_to_drop.add(v1)
  149.                 else: variables_to_drop.add(v2)
  150.             elif 'x3' in (v1, v2):
  151.                 print(f"  -> Прибираємо x3 (Плинність кадрів) як менш стабільний фактор.")
  152.                 variables_to_drop.add('x3')
  153.        
  154.         if variables_to_drop:
  155.             print(f"\nОстаточне рішення: виключаємо з моделі змінну(і): {', '.join(variables_to_drop)}")
  156.     else:
  157.         print("Значущої колінеарності між окремими парами за t-критерієм не виявлено. Змінні залишаємо.")
  158. else:
  159.     print("ВИСНОВОК: Мультиколінеарність відсутня. Всі змінні залишаємо в моделі.")
  160.  
Advertisement
Add Comment
Please, Sign In to add comment