changed font size on plots
This commit is contained in:
parent
f56935c748
commit
bd7889eed2
149
latency.py
149
latency.py
@ -2,50 +2,60 @@ import pandas as pd
|
|||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from scipy import stats
|
from scipy import stats
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
|
||||||
|
def parse_args():
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('-f', '--file', type=str, help='Path to the file')
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
def calculate_confidence_interval(data, confidence=0.95):
|
def calculate_confidence_interval(data, confidence=0.95):
|
||||||
"""
|
"""
|
||||||
Вычисление доверительного интервала для среднего значения
|
Вычисление доверительного интервала для среднего значения
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
data: массив данных
|
data: массив данных
|
||||||
confidence: уровень доверия (по умолчанию 95%)
|
confidence: уровень доверия (по умолчанию 95%)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
tuple: (среднее, нижняя граница, верхняя граница, стандартная ошибка)
|
tuple: (среднее, нижняя граница, верхняя граница, стандартная ошибка)
|
||||||
"""
|
"""
|
||||||
n = len(data)
|
n = len(data)
|
||||||
mean = np.mean(data)
|
mean = np.mean(data)
|
||||||
std_error = stats.sem(data) # Стандартная ошибка среднего
|
std_error = stats.sem(data) # Стандартная ошибка среднего
|
||||||
|
|
||||||
# Вычисление доверительного интервала с использованием t-распределения
|
# Вычисление доверительного интервала с использованием t-распределения
|
||||||
ci = stats.t.interval(confidence, n-1, loc=mean, scale=std_error)
|
ci = stats.t.interval(confidence, n-1, loc=mean, scale=std_error)
|
||||||
|
|
||||||
return mean, ci[0], ci[1], std_error
|
return mean, ci[0], ci[1], std_error
|
||||||
|
|
||||||
def plot_delay_histogram_with_ci(csv_file_path, save_to_file=True, show_plot=False,
|
|
||||||
confidence_level=0.99, delimiter=','):
|
def plot_delay_histogram_with_ci(csv_file_path, save_to_file=True, show_plot=False,
|
||||||
|
confidence_level=0.99, title="default", delimiter=','):
|
||||||
"""
|
"""
|
||||||
Универсальный скрипт для построения гистограммы с доверительным интервалом
|
Универсальный скрипт для построения гистограммы с доверительным интервалом
|
||||||
"""
|
"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Чтение данных
|
# Чтение данных
|
||||||
df = pd.read_csv(csv_file_path, delimiter=delimiter, header=None,
|
df = pd.read_csv(csv_file_path, delimiter=delimiter, header=None,
|
||||||
names=['index', 'delay_ms'])
|
names=['index', 'delay_ms'])
|
||||||
delays = df['delay_ms'].values
|
delays = np.array(df['delay_ms'].values)
|
||||||
|
plt.rcParams.update({'font.size': 18})
|
||||||
|
|
||||||
# Вычисление базовой статистики
|
# Вычисление базовой статистики
|
||||||
mean_delay = np.mean(delays)
|
mean_delay = np.mean(delays)
|
||||||
median_delay = np.median(delays)
|
median_delay = np.median(delays)
|
||||||
std_delay = np.std(delays)
|
std_delay = np.std(delays)
|
||||||
min_delay = np.min(delays)
|
min_delay = np.min(delays)
|
||||||
max_delay = np.max(delays)
|
max_delay = np.max(delays)
|
||||||
|
|
||||||
# Вычисление доверительного интервала
|
# Вычисление доверительного интервала
|
||||||
mean_ci, ci_lower, ci_upper, std_error = calculate_confidence_interval(
|
mean_ci, ci_lower, ci_upper, std_error = calculate_confidence_interval(
|
||||||
delays, confidence_level)
|
delays, confidence_level)
|
||||||
|
|
||||||
# Вывод статистики
|
# Вывод статистики
|
||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
print("АНАЛИЗ ЗАДЕРЖЕК С ДОВЕРИТЕЛЬНЫМ ИНТЕРВАЛОМ")
|
print("АНАЛИЗ ЗАДЕРЖЕК С ДОВЕРИТЕЛЬНЫМ ИНТЕРВАЛОМ")
|
||||||
@ -59,66 +69,71 @@ def plot_delay_histogram_with_ci(csv_file_path, save_to_file=True, show_plot=Fal
|
|||||||
print(f"Медианная задержка: {median_delay:.2f} мс")
|
print(f"Медианная задержка: {median_delay:.2f} мс")
|
||||||
print(f"Стандартное отклонение: {std_delay:.2f} мс")
|
print(f"Стандартное отклонение: {std_delay:.2f} мс")
|
||||||
print(f"Стандартная ошибка: {std_error:.4f} мс")
|
print(f"Стандартная ошибка: {std_error:.4f} мс")
|
||||||
|
|
||||||
print(f"\n--- ДОВЕРИТЕЛЬНЫЙ ИНТЕРВАЛ {confidence_level*100}% ---")
|
print(f"\n--- ДОВЕРИТЕЛЬНЫЙ ИНТЕРВАЛ {confidence_level*100}% ---")
|
||||||
print(f"Точечная оценка среднего: {mean_ci:.2f} мс")
|
print(f"Точечная оценка среднего: {mean_ci:.2f} мс")
|
||||||
print(f"Доверительный интервал: [{ci_lower:.2f}, {ci_upper:.2f}] мс")
|
print(f"Доверительный интервал: [{ci_lower:.2f}, {ci_upper:.2f}] мс")
|
||||||
print(f"Ширина интервала: {ci_upper - ci_lower:.2f} мс")
|
print(f"Ширина интервала: {ci_upper - ci_lower:.2f} мс")
|
||||||
print(f"Погрешность: ±{(ci_upper - ci_lower)/2:.2f} мс")
|
print(f"Погрешность: ±{(ci_upper - ci_lower)/2:.2f} мс")
|
||||||
|
|
||||||
# Дополнительные метрики
|
# Дополнительные метрики
|
||||||
cv = (std_delay / mean_delay) * 100 # Коэффициент вариации
|
cv = (std_delay / mean_delay) * 100 # Коэффициент вариации
|
||||||
print(f"\n--- ДОПОЛНИТЕЛЬНЫЕ МЕТРИКИ ---")
|
print(f"\n--- ДОПОЛНИТЕЛЬНЫЕ МЕТРИКИ ---")
|
||||||
print(f"Коэффициент вариации: {cv:.1f}%")
|
print(f"Коэффициент вариации: {cv:.1f}%")
|
||||||
print(f"Q1 (25-й перцентиль): {np.percentile(delays, 25):.2f} мс")
|
print(f"Q1 (25-й перцентиль): {np.percentile(delays, 25):.2f} мс")
|
||||||
print(f"Q3 (75-й перцентиль): {np.percentile(delays, 75):.2f} мс")
|
print(f"Q3 (75-й перцентиль): {np.percentile(delays, 75):.2f} мс")
|
||||||
print(f"IQR (межквартильный размах): {np.percentile(delays, 75) - np.percentile(delays, 25):.2f} мс")
|
print(
|
||||||
|
f"IQR (межквартильный размах): {np.percentile(delays, 75) - np.percentile(delays, 25):.2f} мс")
|
||||||
|
|
||||||
# Создание гистограммы
|
# Создание гистограммы
|
||||||
plt.figure(figsize=(14, 8))
|
plt.figure(figsize=(14, 8))
|
||||||
n_bins = min(30, len(delays) // 5)
|
n_bins = min(30, len(delays) // 5)
|
||||||
|
|
||||||
# Гистограмма
|
# Гистограмма
|
||||||
n, bins, patches = plt.hist(delays, bins=n_bins, alpha=0.7, color='steelblue',
|
n, bins, patches = plt.hist(delays, bins=n_bins, alpha=0.7, color='steelblue',
|
||||||
edgecolor='black', linewidth=0.5, density=False)
|
edgecolor='black', linewidth=0.5, density=False)
|
||||||
|
|
||||||
plt.xlabel('Задержка (мс)', fontsize=12)
|
plt.xlabel('Задержка (мс)')
|
||||||
plt.ylabel('Частота', fontsize=12)
|
plt.ylabel('Частота')
|
||||||
plt.title(f'Распределение задержек на обработку нажатия мыши (n={len(delays)}, CI={confidence_level*100}%)',
|
plt.title(f'Распределение задержек на обработку нажатия мыши {title} (n={len(delays)}, CI={confidence_level*100}%)',
|
||||||
fontsize=14, fontweight='bold')
|
fontsize=14, fontweight='bold')
|
||||||
plt.grid(True, alpha=0.3)
|
plt.grid(True, alpha=0.3)
|
||||||
|
|
||||||
|
mean_delay = float(mean_delay)
|
||||||
|
median_delay = float(median_delay)
|
||||||
# Добавление статистических линий
|
# Добавление статистических линий
|
||||||
plt.axvline(mean_delay, color='red', linestyle='-', linewidth=2,
|
plt.axvline(mean_delay, color='red', linestyle='-', linewidth=2,
|
||||||
label=f'Среднее ({mean_delay:.1f} мс)')
|
label=f'Среднее ({mean_delay:.1f} мс)')
|
||||||
plt.axvline(median_delay, color='green', linestyle='-', linewidth=2,
|
plt.axvline(median_delay, color='green', linestyle='-', linewidth=2,
|
||||||
label=f'Медиана ({median_delay:.1f} мс)')
|
label=f'Медиана ({median_delay:.1f} мс)')
|
||||||
|
|
||||||
# Добавление доверительного интервала
|
# Добавление доверительного интервала
|
||||||
plt.axvspan(ci_lower, ci_upper, alpha=0.2, color='yellow',
|
plt.axvspan(ci_lower, ci_upper, alpha=0.2, color='yellow',
|
||||||
label=f'ДИ {confidence_level*100}%: [{ci_lower:.1f}, {ci_upper:.1f}] мс')
|
label=f'ДИ {confidence_level*100}%: [{ci_lower:.1f}, {ci_upper:.1f}] мс')
|
||||||
|
|
||||||
# Вертикальные линии для границ доверительного интервала
|
# Вертикальные линии для границ доверительного интервала
|
||||||
plt.axvline(ci_lower, color='orange', linestyle='--', linewidth=1, alpha=0.7)
|
plt.axvline(ci_lower, color='orange',
|
||||||
plt.axvline(ci_upper, color='orange', linestyle='--', linewidth=1, alpha=0.7)
|
linestyle='--', linewidth=1, alpha=0.7)
|
||||||
|
plt.axvline(ci_upper, color='orange',
|
||||||
plt.legend(loc='upper right', fontsize=10)
|
linestyle='--', linewidth=1, alpha=0.7)
|
||||||
|
|
||||||
|
plt.legend(loc='upper right')
|
||||||
plt.tight_layout()
|
plt.tight_layout()
|
||||||
|
|
||||||
# Сохранение в файл
|
# Сохранение в файл
|
||||||
if save_to_file:
|
if save_to_file:
|
||||||
output_file = f'delay_distribution_ci_{int(confidence_level*100)}.png'
|
output_file = f'delay_distribution_{title}_ci_{int(confidence_level*100)}.png'
|
||||||
plt.savefig(output_file, dpi=300, bbox_inches='tight')
|
plt.savefig(output_file, dpi=300, bbox_inches='tight')
|
||||||
print(f"\n✓ Гистограмма сохранена как: {output_file}")
|
print(f"\n✓ Гистограмма сохранена как: {output_file}")
|
||||||
|
|
||||||
# Показ графика
|
# Показ графика
|
||||||
if show_plot:
|
if show_plot:
|
||||||
plt.show()
|
plt.show()
|
||||||
else:
|
else:
|
||||||
plt.close()
|
plt.close()
|
||||||
|
|
||||||
print("\n✓ Анализ завершен успешно")
|
print("\n✓ Анализ завершен успешно")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'data': delays,
|
'data': delays,
|
||||||
'mean': mean_delay,
|
'mean': mean_delay,
|
||||||
@ -128,7 +143,7 @@ def plot_delay_histogram_with_ci(csv_file_path, save_to_file=True, show_plot=Fal
|
|||||||
'ci_upper': ci_upper,
|
'ci_upper': ci_upper,
|
||||||
'confidence_level': confidence_level
|
'confidence_level': confidence_level
|
||||||
}
|
}
|
||||||
|
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print(f"✗ Ошибка: Файл '{csv_file_path}' не найден")
|
print(f"✗ Ошибка: Файл '{csv_file_path}' не найден")
|
||||||
return None
|
return None
|
||||||
@ -136,28 +151,30 @@ def plot_delay_histogram_with_ci(csv_file_path, save_to_file=True, show_plot=Fal
|
|||||||
print(f"✗ Ошибка: {e}")
|
print(f"✗ Ошибка: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def compare_confidence_intervals(csv_file_path, confidence_levels=[0.90, 0.95, 0.99], delimiter=','):
|
def compare_confidence_intervals(csv_file_path, confidence_levels=[0.90, 0.95, 0.99], delimiter=','):
|
||||||
"""
|
"""
|
||||||
Сравнение доверительных интервалов для разных уровней доверия
|
Сравнение доверительных интервалов для разных уровней доверия
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
df = pd.read_csv(csv_file_path, delimiter=delimiter, header=None,
|
df = pd.read_csv(csv_file_path, delimiter=delimiter, header=None,
|
||||||
names=['index', 'delay_ms'])
|
names=['index', 'delay_ms'])
|
||||||
delays = df['delay_ms'].values
|
delays = np.array(df['delay_ms'].values)
|
||||||
|
|
||||||
print("=" * 70)
|
print("=" * 70)
|
||||||
print("СРАВНЕНИЕ ДОВЕРИТЕЛЬНЫХ ИНТЕРВАЛОВ ДЛЯ РАЗНЫХ УРОВНЕЙ ДОВЕРИЯ")
|
print("СРАВНЕНИЕ ДОВЕРИТЕЛЬНЫХ ИНТЕРВАЛОВ ДЛЯ РАЗНЫХ УРОВНЕЙ ДОВЕРИЯ")
|
||||||
print("=" * 70)
|
print("=" * 70)
|
||||||
print(f"Количество измерений: {len(delays)}")
|
print(f"Количество измерений: {len(delays)}")
|
||||||
print(f"Среднее значение: {np.mean(delays):.2f} мс")
|
print(f"Среднее значение: {np.mean(delays):.2f} мс")
|
||||||
print(f"Стандартная ошибка: {stats.sem(delays):.4f} мс\n")
|
print(f"Стандартная ошибка: {stats.sem(delays):.4f} мс\n")
|
||||||
|
|
||||||
results = []
|
results = []
|
||||||
for conf in confidence_levels:
|
for conf in confidence_levels:
|
||||||
mean, ci_lower, ci_upper, std_error = calculate_confidence_interval(delays, conf)
|
mean, ci_lower, ci_upper, std_error = calculate_confidence_interval(
|
||||||
|
delays, conf)
|
||||||
width = ci_upper - ci_lower
|
width = ci_upper - ci_lower
|
||||||
margin = width / 2
|
margin = width / 2
|
||||||
|
|
||||||
results.append({
|
results.append({
|
||||||
'confidence': conf,
|
'confidence': conf,
|
||||||
'mean': mean,
|
'mean': mean,
|
||||||
@ -166,43 +183,47 @@ def compare_confidence_intervals(csv_file_path, confidence_levels=[0.90, 0.95, 0
|
|||||||
'width': width,
|
'width': width,
|
||||||
'margin': margin
|
'margin': margin
|
||||||
})
|
})
|
||||||
|
|
||||||
print(f"Доверительный интервал {conf*100:.0f}%:")
|
print(f"Доверительный интервал {conf*100:.0f}%:")
|
||||||
print(f" [{ci_lower:.2f}, {ci_upper:.2f}] мс")
|
print(f" [{ci_lower:.2f}, {ci_upper:.2f}] мс")
|
||||||
print(f" Ширина: {width:.2f} мс, Погрешность: ±{margin:.2f} мс")
|
print(f" Ширина: {width:.2f} мс, Погрешность: ±{margin:.2f} мс")
|
||||||
print()
|
print()
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Ошибка при сравнении интервалов: {e}")
|
print(f"Ошибка при сравнении интервалов: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
# Пример использования
|
# Пример использования
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# Укажите путь к вашему файлу
|
# Укажите путь к вашему файлу
|
||||||
csv_file = "delays.csv"
|
csv_file = parse_args().file
|
||||||
|
title = csv_file.split('/')[1].split('.')[0]
|
||||||
print("АНАЛИЗ ДОВЕРИТЕЛЬНЫХ ИНТЕРВАЛОВ ДЛЯ ЗАДЕРЖЕК")
|
print("АНАЛИЗ ДОВЕРИТЕЛЬНЫХ ИНТЕРВАЛОВ ДЛЯ ЗАДЕРЖЕК")
|
||||||
print("=" * 50)
|
print("=" * 50)
|
||||||
|
|
||||||
# Основной анализ с 95% доверительным интервалом
|
# Основной анализ с 95% доверительным интервалом
|
||||||
results = plot_delay_histogram_with_ci(
|
results = plot_delay_histogram_with_ci(
|
||||||
csv_file_path=csv_file,
|
csv_file_path=csv_file,
|
||||||
save_to_file=True,
|
save_to_file=True,
|
||||||
show_plot=False,
|
show_plot=False,
|
||||||
confidence_level=0.99
|
confidence_level=0.99,
|
||||||
|
title=title
|
||||||
)
|
)
|
||||||
|
|
||||||
print("\n" + "=" * 50)
|
print("\n" + "=" * 50)
|
||||||
|
|
||||||
# Сравнение разных уровней доверия
|
# Сравнение разных уровней доверия
|
||||||
compare_results = compare_confidence_intervals(csv_file, [0.90, 0.95, 0.99])
|
compare_results = compare_confidence_intervals(
|
||||||
|
csv_file, [0.90, 0.95, 0.99])
|
||||||
|
|
||||||
# Интерпретация результатов
|
# Интерпретация результатов
|
||||||
if results:
|
if results:
|
||||||
print("\n--- ИНТЕРПРЕТАЦИЯ РЕЗУЛЬТАТОВ ---")
|
print("\n--- ИНТЕРПРЕТАЦИЯ РЕЗУЛЬТАТОВ ---")
|
||||||
print(f"С вероятностью 95% истинное среднее значение задержки ")
|
print(f"С вероятностью 95% истинное среднее значение задержки ")
|
||||||
print(f"находится в интервале от {results['ci_lower']:.2f} до {results['ci_upper']:.2f} мс.")
|
print(
|
||||||
|
f"находится в интервале от {results['ci_lower']:.2f} до {results['ci_upper']:.2f} мс.")
|
||||||
print(f"Это означает, что если бы мы повторили эксперимент много раз,")
|
print(f"Это означает, что если бы мы повторили эксперимент много раз,")
|
||||||
print(f"95% вычисленных таким образом интервалов содержали бы истинное среднее значение.")
|
print(f"95% вычисленных таким образом интервалов содержали бы истинное среднее значение.")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user