форкнуто от main/python-labs
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
67 строки
2.7 KiB
Python
67 строки
2.7 KiB
Python
# module2.py - Модуль для расчёта коэффициента корреляции
|
|
|
|
import math
|
|
|
|
def calculate_correlation(list1, list2):
|
|
"""
|
|
Вычисляет коэффициент корреляции Пирсона между двумя списками.
|
|
|
|
Аргументы:
|
|
list1 (list): первый список чисел
|
|
list2 (list): второй список чисел
|
|
|
|
Возвращает:
|
|
float: коэффициент корреляции или None при ошибке
|
|
"""
|
|
# Проверяем, что списки не пустые
|
|
if not list1 or not list2:
|
|
print("Ошибка: один из списков пустой")
|
|
return None
|
|
|
|
# Берем минимальную длину из двух списков
|
|
n = min(len(list1), len(list2))
|
|
|
|
if n < 2:
|
|
print("Ошибка: для расчёта корреляции нужно хотя бы 2 элемента")
|
|
return None
|
|
|
|
# Берем только первые n элементов из каждого списка
|
|
x = list1[:n]
|
|
y = list2[:n]
|
|
|
|
# Выводим информацию о количестве используемых элементов
|
|
if len(list1) != len(list2):
|
|
print(f"Внимание: списки разной длины. Используются первые {n} элементов")
|
|
|
|
# Вычисляем суммы
|
|
sum_x = sum(x)
|
|
sum_y = sum(y)
|
|
sum_xy = sum(x[i] * y[i] for i in range(n))
|
|
sum_x2 = sum(x[i] * x[i] for i in range(n))
|
|
sum_y2 = sum(y[i] * y[i] for i in range(n))
|
|
|
|
# Вычисляем коэффициент корреляции
|
|
numerator = n * sum_xy - sum_x * sum_y
|
|
denominator = math.sqrt((n * sum_x2 - sum_x * sum_x) * (n * sum_y2 - sum_y * sum_y))
|
|
|
|
if denominator == 0:
|
|
print("Ошибка: знаменатель равен нулю (нет вариации данных)")
|
|
return None
|
|
|
|
correlation = numerator / denominator
|
|
|
|
return correlation
|
|
|
|
|
|
# Тестирование модуля (если запускается напрямую)
|
|
if __name__ == "__main__":
|
|
# Тестовые данные
|
|
test_list1 = [1, 2, 3, 4, 5]
|
|
test_list2 = [2, 4, 6, 8, 10] # Положительная корреляция
|
|
# test_list2 = [5, 4, 3, 2, 1] # Отрицательная корреляция
|
|
|
|
result = calculate_correlation(test_list1, test_list2)
|
|
if result is not None:
|
|
print(f"Коэффициент корреляции: {result:.4f}")
|
|
print(f"Коэффициент корреляции (округленный): {round(result, 3)}")
|