In [1]:
import matplotlib.pyplot as plt
import math
# Исходные данные
data = [-0.03, -0.59, 0.38, 0.14, -1.59, -0.38, -0.15, 0.06, 0.61, -0.05, 0.73, -1.59, 1.49, -0.62, 1.45, -1.49, 0.63, -1.59, 0.62, 1.56]
n = len(data)
# 1. Вариационный ряд
sorted_data = sorted(data)
# 2. Статистический ряд
unique_elements = sorted(set(sorted_data))
frequencies = [sorted_data.count(x) for x in unique_elements]
# 3. Минимальное, максимальное значение и размах
x_min = min(data)
x_max = max(data)
range_value = x_max - x_min
# 4. Математическое ожидание
mean = sum(data) / n
# 5. Дисперсия
variance = sum((x - mean) ** 2 for x in data) / n
# 6. Исправленная дисперсия
corrected_variance = variance * n / (n - 1)
# 7. Среднеквадратическое отклонение
std_dev = math.sqrt(variance)
# 8. Исправленное среднеквадратическое отклонение
corrected_std_dev = math.sqrt(corrected_variance)
# 9. Медиана
def find_median(data):
sorted_data = sorted(data)
n = len(sorted_data)
if n % 2 == 0:
mid = n // 2
return (sorted_data[mid -1] + sorted_data[mid]) / 2
else:
return sorted_data[n //2]
median_value = find_median(data)
# 10. Мода
def find_mode(data):
frequency_dict = {}
for num in data:
frequency_dict[num] = frequency_dict.get(num, 0) + 1
max_frequency = max(frequency_dict.values())
modes = [num for num, freq in frequency_dict.items() if freq == max_frequency]
if len(modes) == 1:
return modes[0]
else:
return modes # Вернуть список мод, если их несколько
mode_value = find_mode(data)
# 11. Эмпирическая функция распределения
empirical_function = [(sorted_data[i], (i +1) / n) for i in range(n)]
empirical_function.insert(0, (x_min, 0.0))
# 12. Количество интервалов по формуле Стерджесса
m = 6 # Как рассчитано ранее
interval_length = (x_max - x_min) / m
x_start = x_min # Начинаем с минимального значения
# 13. Интервальное распределение
intervals = [(x_start + i * interval_length, x_start + (i +1) * interval_length) for i in range(m)]
interval_frequencies = [0] * m
for x in data:
index = int((x - x_start) / interval_length)
if index == m:
index -= 1 # Последний элемент включаем в последний интервал
interval_frequencies[index] +=1
interval_probabilities = [freq / n for freq in interval_frequencies]
# 14. Вывод результатов
print("1. Вариационный ряд:")
print(sorted_data)
print("\n2. Статистический ряд:")
print("Элементы:", unique_elements)
print("Частоты:", frequencies)
print(f"\n3. Минимальное значение: {x_min}")
print(f"4. Максимальное значение: {x_max}")
print(f"5. Размах: {range_value}")
print(f"\n6. Математическое ожидание (среднее): {mean}")
print(f"7. Дисперсия: {variance}")
print(f"8. Исправленная дисперсия: {corrected_variance}")
print(f"9. Среднеквадратическое отклонение: {std_dev}")
print(f"10. Исправленное среднеквадратическое отклонение: {corrected_std_dev}")
print(f"\n11. Медиана: {median_value}")
print(f"12. Мода: {mode_value}")
print("\n13. Эмпирическая функция распределения:")
for i in range(1, len(empirical_function)):
prev_x = empirical_function[i - 1][0]
x = empirical_function[i][0]
f = empirical_function[i][1]
print(f"F(x) = {f:.2f}, при {prev_x} < x ≤ {x}")
print(f"\n14. Количество интервалов (по формуле Стерджесса): {m}")
print(f"Длина интервала: {interval_length}")
print(f"Начальная точка: {x_start}")
print("\n15. Интервальное распределение частот:")
for i, interval in enumerate(intervals):
print(f"Интервал {i +1}: [{interval[0]:.4f}, {interval[1]:.4f}), Частота: {interval_frequencies[i]}, Частотность: {interval_probabilities[i]:.4f}")
# 16. Построение графиков
# Гистограмма
plt.bar([interval[0] for interval in intervals], interval_probabilities, width=interval_length, align='edge', edgecolor='black')
plt.title("Гистограмма относительных частот")
plt.xlabel("Интервалы")
plt.ylabel("Относительная частота")
plt.grid(True)
plt.show()
# Полигон частот
polygon_x = [interval[0] + interval_length /2 for interval in intervals]
polygon_y = interval_probabilities
plt.plot(polygon_x, polygon_y, marker='o', linestyle='-', color='blue')
plt.title("Полигон относительных частот")
plt.xlabel("Середины интервалов")
plt.ylabel("Относительная частота")
plt.grid(True)
plt.show()
# Эмпирическая функция распределения
empirical_x = [point[0] for point in empirical_function]
empirical_y = [point[1] for point in empirical_function]
plt.step(empirical_x, empirical_y, where='post', label='Эмпирическая функция распределения')
plt.title("График эмпирической функции распределения")
plt.xlabel("x")
plt.ylabel("F(x)")
plt.grid(True)
plt.legend()
plt.show()
1. Вариационный ряд: [-1.59, -1.59, -1.59, -1.49, -0.62, -0.59, -0.38, -0.15, -0.05, -0.03, 0.06, 0.14, 0.38, 0.61, 0.62, 0.63, 0.73, 1.45, 1.49, 1.56] 2. Статистический ряд: Элементы: [-1.59, -1.49, -0.62, -0.59, -0.38, -0.15, -0.05, -0.03, 0.06, 0.14, 0.38, 0.61, 0.62, 0.63, 0.73, 1.45, 1.49, 1.56] Частоты: [3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 3. Минимальное значение: -1.59 4. Максимальное значение: 1.56 5. Размах: 3.1500000000000004 6. Математическое ожидание (среднее): -0.02050000000000001 7. Дисперсия: 0.96544475 8. Исправленная дисперсия: 1.0162576315789473 9. Среднеквадратическое отклонение: 0.9825704809325385 10. Исправленное среднеквадратическое отклонение: 1.0080960428346832 11. Медиана: 0.015 12. Мода: -1.59 13. Эмпирическая функция распределения: F(x) = 0.05, при -1.59 < x ≤ -1.59 F(x) = 0.10, при -1.59 < x ≤ -1.59 F(x) = 0.15, при -1.59 < x ≤ -1.59 F(x) = 0.20, при -1.59 < x ≤ -1.49 F(x) = 0.25, при -1.49 < x ≤ -0.62 F(x) = 0.30, при -0.62 < x ≤ -0.59 F(x) = 0.35, при -0.59 < x ≤ -0.38 F(x) = 0.40, при -0.38 < x ≤ -0.15 F(x) = 0.45, при -0.15 < x ≤ -0.05 F(x) = 0.50, при -0.05 < x ≤ -0.03 F(x) = 0.55, при -0.03 < x ≤ 0.06 F(x) = 0.60, при 0.06 < x ≤ 0.14 F(x) = 0.65, при 0.14 < x ≤ 0.38 F(x) = 0.70, при 0.38 < x ≤ 0.61 F(x) = 0.75, при 0.61 < x ≤ 0.62 F(x) = 0.80, при 0.62 < x ≤ 0.63 F(x) = 0.85, при 0.63 < x ≤ 0.73 F(x) = 0.90, при 0.73 < x ≤ 1.45 F(x) = 0.95, при 1.45 < x ≤ 1.49 F(x) = 1.00, при 1.49 < x ≤ 1.56 14. Количество интервалов (по формуле Стерджесса): 6 Длина интервала: 0.525 Начальная точка: -1.59 15. Интервальное распределение частот: Интервал 1: [-1.5900, -1.0650), Частота: 4, Частотность: 0.2000 Интервал 2: [-1.0650, -0.5400), Частота: 2, Частотность: 0.1000 Интервал 3: [-0.5400, -0.0150), Частота: 4, Частотность: 0.2000 Интервал 4: [-0.0150, 0.5100), Частота: 3, Частотность: 0.1500 Интервал 5: [0.5100, 1.0350), Частота: 4, Частотность: 0.2000 Интервал 6: [1.0350, 1.5600), Частота: 3, Частотность: 0.1500
In [6]:
import matplotlib.pyplot as plt
import numpy as np
# Исходные данные остаются теми же
data = [-0.03, -0.59, 0.38, 0.14, -1.59, -0.38, -0.15, 0.06, 0.61, -0.05, 0.73, -1.59, 1.49, -0.62, 1.45, -1.49, 0.63, -1.59, 0.62, 1.56]
n = len(data)
# 1. Гистограмма относительных частот
plt.figure(figsize=(10, 6), facecolor='white')
plt.clf()
ax = plt.gca()
ax.set_facecolor('white')
# Определяем интервалы как в оригинальном графике
bins = [-1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5]
hist_heights = [0.20, 0.10, 0.20, 0.15, 0.20, 0.15] # высоты из оригинального графика
bin_centers = [(bins[i] + bins[i+1])/2 for i in range(len(bins)-1)]
# Рисуем гистограмму
plt.bar(bin_centers, hist_heights, width=np.diff(bins),
alpha=0.5, color='lightblue', edgecolor='black', hatch='//')
# Добавляем точки и подписи
for i in range(len(hist_heights)):
plt.plot(bin_centers[i], hist_heights[i], 'ko')
plt.text(bin_centers[i], hist_heights[i], f'w{i+1}/h = {hist_heights[i]:.2f}',
ha='center', va='bottom')
# Настройка осей и сетки
plt.grid(True, linestyle='--', alpha=0.3)
plt.xlabel('$x_i$')
plt.ylabel('$w_i/h$')
plt.title('Гистограмма относительных частот')
plt.ylim(0, 0.25)
plt.show()
# 2. Полигон относительных частот
plt.figure(figsize=(10, 6), facecolor='white')
plt.clf()
ax = plt.gca()
ax.set_facecolor('white')
# Значения из оригинального графика
y_values = [0.20, 0.10, 0.20, 0.15, 0.20, 0.15]
x_values = bin_centers
# Рисуем полигон
plt.plot(x_values, y_values, 'k-', linewidth=1)
plt.plot(x_values, y_values, 'ko', markersize=6)
# Добавляем горизонтальные линии и подписи
unique_y = sorted(set(y_values))
for i, y in enumerate(unique_y):
plt.axhline(y=y, color='gray', linestyle='--', alpha=0.3)
plt.text(-1.6, y, f'p{i+1}', va='center')
plt.grid(True, linestyle='--', alpha=0.3)
plt.xlabel('$x_i$')
plt.ylabel('$p_i^*$')
plt.title('Полигон относительных частот')
plt.ylim(0, 0.25)
plt.show()
# 3. Эмпирическая функция распределения
# Настройка графика
plt.figure(figsize=(10, 6), facecolor='white')
plt.clf()
ax = plt.gca()
ax.set_facecolor('white')
# Создаем дополнительные оси для подписей
ax2 = ax.twinx()
ax2.set_ylim(-0.05, 1.05)
# Подготовка данных
sorted_data = sorted(data)
x_min = min(data)
empirical_function = [(sorted_data[i], (i + 1) / n) for i in range(n)]
empirical_function.insert(0, (x_min, 0))
empirical_x = [point[0] for point in empirical_function]
empirical_y = [point[1] for point in empirical_function]
# Рисуем ступенчатую функцию со стрелками на основной оси
for i in range(len(empirical_x)-1):
# Горизонтальная линия со стрелкой
ax.arrow(empirical_x[i], empirical_y[i],
empirical_x[i+1]-empirical_x[i]-0.1, 0,
head_width=0.02, head_length=0.1, fc='k', ec='k')
# Вертикальная линия с точками
if i < len(empirical_x)-1:
ax.plot([empirical_x[i+1], empirical_x[i+1]],
[empirical_y[i], empirical_y[i+1]], 'k:', linewidth=1)
ax.plot(empirical_x[i+1], empirical_y[i], 'ko', markersize=4)
ax.plot(empirical_x[i+1], empirical_y[i+1], 'ko', markersize=4)
# Добавляем подписи mi/n на дополнительной оси
y_ticks = np.linspace(0, 1, n+1)
y_labels = ['m1/n', 'm2/n', 'm3/n', 'm4/n', 'm5/n',
'm6/n', 'm7/n', 'm8/n', 'm9/n', 'm10/n',
'm11/n', 'm12/n', 'm13/n', 'm14/n', 'm15/n',
'm16/n', 'm17/n', 'm18/n', 'm19/n', 'm20/n', '1']
ax2.set_yticks(y_ticks)
ax2.set_yticklabels(y_labels)
# Настройка внешнего вида
ax.set_xlabel('$x$')
ax.set_ylabel('$F_n^*(x)$')
ax.set_title('Эмпирическая функция распределения')
ax.grid(False)
ax.set_ylim(-0.05, 1.05)
# Перемещаем подписи на левую сторону
ax2.yaxis.set_label_position('left')
ax2.yaxis.tick_left()
ax.yaxis.set_visible(False) # Скрываем оригинальные метки
plt.tight_layout()
plt.show()
In [16]:
import matplotlib.pyplot as plt
import numpy as np
# Данные
data = [-0.03, -0.59, 0.38, 0.14, -1.59, -0.38, -0.15, 0.06, 0.61, -0.05,
0.73, -1.59, 1.49, -0.62, 1.45, -1.49, 0.63, -1.59, 0.62, 1.56]
n = len(data)
# Сортировка данных
sorted_data = sorted(data)
empirical_function = [(sorted_data[i], (i + 1) / n) for i in range(n)]
empirical_function.insert(0, (min(sorted_data), 0)) # Добавляем точку начала (0)
# Подготовка данных для графика
empirical_x = [point[0] for point in empirical_function]
empirical_y = [point[1] for point in empirical_function]
# График
plt.figure(figsize=(10, 6), facecolor='white')
# Добавляем стрелки для ступеней
for i in range(len(empirical_x) - 1):
# Горизонтальная линия со стрелкой
plt.arrow(empirical_x[i], empirical_y[i],
empirical_x[i + 1] - empirical_x[i] - 0.02, 0,
head_width=0.02, head_length=0.02, fc='k', ec='k', length_includes_head=True)
# Вертикальная линия между ступенями
plt.plot([empirical_x[i + 1], empirical_x[i + 1]],
[empirical_y[i], empirical_y[i + 1]], 'k:', linewidth=1)
# Метки на оси y
y_ticks = [i / n for i in range(n + 1)]
y_labels = [0] + [f'm{i}/n' for i in range(1, n + 1)] # Добавляем m1/n, m2/n, ..., m20/n
plt.yticks(ticks=y_ticks, labels=y_labels)
# Настройка осей
plt.xlabel('$x$')
plt.ylabel('$F_n^*(x)$')
plt.title('Эмпирическая функция распределения')
plt.grid(True, linestyle='--', alpha=0.6)
plt.ylim(-0.05, 1.05)
plt.xlim(min(empirical_x) - 0.1, max(empirical_x) + 0.1)
# Отображение графика
plt.tight_layout()
plt.show()
In [18]:
import math
from scipy import stats
# Задача 2
# Данные выборки
data = [63.4, 64.5, 57.1, 51.7, 40.1, 37.7, 45.8, 54.9, 35.9, 31.0, 35.5, 19.2, 13.6, 31.4, 40.1]
n = len(data)
gamma = 0.9
alpha = 1 - gamma
# Вычисление выборочного среднего
x_bar = sum(data) / n
# Вычисление исправленной выборочной дисперсии
s_squared = sum((x - x_bar) ** 2 for x in data) / (n - 1)
s = math.sqrt(s_squared)
# Критическое значение t
t_alpha = stats.t.ppf(1 - alpha / 2, df=n - 1)
# Стандартная ошибка
SE = s / math.sqrt(n)
# Доверительный интервал
lower_bound = x_bar - t_alpha * SE
upper_bound = x_bar + t_alpha * SE
print("Доверительный интервал для задачи 2:")
print(f"({lower_bound:.2f}; {upper_bound:.2f})")
# Задача 3
n = 100
x_bar = 82
sum_x_squared = 686800
gamma = 0.98
alpha = 1 - gamma
# Вычисление исправленной выборочной дисперсии
s_squared = (sum_x_squared - n * x_bar ** 2) / (n - 1)
s = math.sqrt(s_squared)
# Критическое значение z
z_alpha = stats.norm.ppf(1 - alpha / 2)
# Стандартная ошибка
SE = s / math.sqrt(n)
# Доверительный интервал
lower_bound = x_bar - z_alpha * SE
upper_bound = x_bar + z_alpha * SE
print("Доверительный интервал для задачи 3:")
print(f"({lower_bound:.2f}; {upper_bound:.2f})")
Доверительный интервал для задачи 2: (34.66; 48.26) Доверительный интервал для задачи 3: (79.19; 84.81)