Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import pandas as pd
- def main():
- Y = np.array([7.60, 3.50, 1.40, 3.90, 6.40, 7.30, 7.60, 8.30, 4.40, 5.60, 7.50, 3.20])
- X1 = np.array([1.40, 0.70, 0.40, 0.80, 1.10, 1.40, 1.50, 0.90, 0.80, 0.70, 1.40, 0.60])
- X2 = np.array([3.80, 1.70, 0.70, 1.80, 3.20, 3.60, 3.90, 4.10, 2.20, 2.90, 3.20, 1.70])
- n = len(Y)
- print("--- Вхідні дані ---")
- print(pd.DataFrame({"Y": Y, "X1": X1, "X2": X2}, index=range(1, n+1)))
- print("-" * 40)
- sum_x1 = np.sum(X1)
- sum_x2 = np.sum(X2)
- sum_y = np.sum(Y)
- sum_x1_sq = np.sum(X1**2)
- sum_x2_sq = np.sum(X2**2)
- sum_x1_x2 = np.sum(X1 * X2)
- sum_y_x1 = np.sum(Y * X1)
- sum_y_x2 = np.sum(Y * X2)
- A = np.array([
- [n, sum_x1, sum_x2],
- [sum_x1, sum_x1_sq, sum_x1_x2],
- [sum_x2, sum_x1_x2, sum_x2_sq]
- ])
- B = np.array([sum_y, sum_y_x1, sum_y_x2])
- coeffs = np.linalg.solve(A, B)
- a0, a1, a2 = coeffs
- print(f"\n--- 1. Оцінки параметрів моделі (МНК) ---")
- print(f"Рівняння регресії: Y = {a0:.4f} + {a1:.4f}*X1 + {a2:.4f}*X2")
- print(f"a0 = {a0:.4f}")
- print(f"a1 = {a1:.4f}")
- print(f"a2 = {a2:.4f}")
- def manual_pearson(x, y):
- mean_x = np.mean(x)
- mean_y = np.mean(y)
- numerator = np.sum((x - mean_x) * (y - mean_y))
- denominator = np.sqrt(np.sum((x - mean_x)**2) * np.sum((y - mean_y)**2))
- return numerator / denominator
- r_y_x1 = manual_pearson(Y, X1)
- r_y_x2 = manual_pearson(Y, X2)
- r_x1_x2 = manual_pearson(X1, X2)
- print(f"\n--- 2. Кореляційний аналіз ---")
- print(f"Парні коефіцієнти кореляції:")
- print(f"r(Y, X1) = {r_y_x1:.4f}")
- print(f"r(Y, X2) = {r_y_x2:.4f}")
- print(f"r(X1, X2) = {r_x1_x2:.4f}")
- numerator_1 = r_y_x1 - r_y_x2 * r_x1_x2
- denominator_1 = np.sqrt((1 - r_y_x2**2) * (1 - r_x1_x2**2))
- r_y_x1_part = numerator_1 / denominator_1
- numerator_2 = r_y_x2 - r_y_x1 * r_x1_x2
- denominator_2 = np.sqrt((1 - r_y_x1**2) * (1 - r_x1_x2**2))
- r_y_x2_part = numerator_2 / denominator_2
- print(f"\nЧасткові коефіцієнти кореляції:")
- print(f"r(Y, X1 | X2) = {r_y_x1_part:.4f}")
- print(f"r(Y, X2 | X1) = {r_y_x2_part:.4f}")
- R2_numerator = r_y_x1**2 + r_y_x2**2 - 2 * r_y_x1 * r_y_x2 * r_x1_x2
- R2_denominator = 1 - r_x1_x2**2
- R2 = R2_numerator / R2_denominator
- R = np.sqrt(R2)
- print(f"\n--- 3. Показники якості моделі ---")
- print(f"Коефіцієнт множинної детермінації (R^2): {R2:.4f}")
- print(f"Коефіцієнт множинної кореляції (R): {R:.4f}")
- print(f"\n--- 4. Аналіз результатів ---")
- def analyze(simple_r, partial_r, var_name, control_var):
- print(f"\nАналіз зв'язку Y <-> {var_name} (при фіксованому {control_var}):")
- print(f" Парний r: {simple_r:.4f}")
- print(f" Частковий r: {partial_r:.4f}")
- diff = abs(partial_r) - abs(simple_r)
- if diff > 0.01:
- print(f" > Часткова кореляція ЗРОСЛА (по модулю).")
- print(f" > Висновок: Фактор '{control_var}' приховував (маскував) істинну взаємозалежність.")
- elif diff < -0.01:
- print(f" > Часткова кореляція ЗМЕНШИЛАСЯ (по модулю).")
- print(f" > Висновок: Взаємозалежність значною мірою мала місце завдяки фактору '{control_var}'.")
- else:
- print(f" > Кореляція майже не змінилася.")
- analyze(r_y_x1, r_y_x1_part, "X1 (Площа)", "X2 (Потік)")
- analyze(r_y_x2, r_y_x2_part, "X2 (Потік)", "X1 (Площа)")
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment