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
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
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()
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
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()
No description has been provided for this image
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)