diff --git a/practice2/README.md b/practice2/README.md index 332624b..3c967af 100644 --- a/practice2/README.md +++ b/practice2/README.md @@ -1,8 +1,577 @@ + ## **Практическая работа №2** ### Вариант 6 -Таблица 1. Критерии оценки визуализации, и примерные вопросы для их оценивания +Таблица находится в конце файла. Так же все файлы проекта (в том числе +отчёт в формате odt или pdf) можно скачать с git: + + +Изначально проект писался в vscode под линуксом, если не работает +установка пакетов в первом блоке, попробуйте заменить % на ! или +установить пакеты вручную и удалить его + +1. Подгружаем нужные для работы пакеты + +``` python +# установка matplotlib, numpy и pandas +%pip install matplotlib numpy pandas seaborn --upgrade +``` + + + Requirement already satisfied: matplotlib in ./.venv/lib64/python3.11/site-packages (3.7.1) + Requirement already satisfied: numpy in ./.venv/lib64/python3.11/site-packages (1.24.2) + Requirement already satisfied: pandas in ./.venv/lib64/python3.11/site-packages (1.5.3) + Requirement already satisfied: seaborn in ./.venv/lib64/python3.11/site-packages (0.12.2) + Requirement already satisfied: contourpy>=1.0.1 in ./.venv/lib64/python3.11/site-packages (from matplotlib) (1.0.7) + Requirement already satisfied: cycler>=0.10 in ./.venv/lib64/python3.11/site-packages (from matplotlib) (0.11.0) + Requirement already satisfied: fonttools>=4.22.0 in ./.venv/lib64/python3.11/site-packages (from matplotlib) (4.38.0) + Requirement already satisfied: kiwisolver>=1.0.1 in ./.venv/lib64/python3.11/site-packages (from matplotlib) (1.4.4) + Requirement already satisfied: packaging>=20.0 in ./.venv/lib64/python3.11/site-packages (from matplotlib) (23.0) + Requirement already satisfied: pillow>=6.2.0 in ./.venv/lib64/python3.11/site-packages (from matplotlib) (9.4.0) + Requirement already satisfied: pyparsing>=2.3.1 in ./.venv/lib64/python3.11/site-packages (from matplotlib) (3.0.9) + Requirement already satisfied: python-dateutil>=2.7 in ./.venv/lib64/python3.11/site-packages (from matplotlib) (2.8.2) + Requirement already satisfied: pytz>=2020.1 in ./.venv/lib64/python3.11/site-packages (from pandas) (2022.7.1) + Requirement already satisfied: six>=1.5 in ./.venv/lib64/python3.11/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0) + + [notice] A new release of pip available: 22.2.2 -> 23.0.1 + [notice] To update, run: pip install --upgrade pip + Note: you may need to restart the kernel to use updated packages. + +``` python +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import seaborn as sns +``` + +1. Загружаем данные. Они представляют результаты эксперимента по + выявлению дефектов в подшипниковых узлах жидкостного трения. Время + эксперимента 10 мин. Частота получения данных о колебаниях ротора + 1000 сиг/сек. Частота съема данных о температуре 1 сиг/сек. В работе + используются набор данных с и без дефектов. Задача: выявить выбросы + в данных, найти переходный период, в течение которого система + выходит на режим, выяснить, в каких атрибутах наиболее ярко + выражаются отличия в экспериментах с дефектами и без, а так же можно + ли на этапе переходного периода говорить о наличии дефекта. + +- Набор данных без дефектов + +``` python +df_norm = pd.read_csv('./data_5_1.csv') +display(df_norm.info()) +display(df_norm.describe()) +``` + + + + RangeIndex: 601000 entries, 0 to 600999 + Data columns (total 10 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 Fluctuations_X_in_the_left_bearing 601000 non-null float64 + 1 Fluctuations_Y_in_the_left_bearing 601000 non-null float64 + 2 Fluctuations_X_in_the_right_bearing 601000 non-null float64 + 3 Fluctuations_Y_in_the_right_bearing 601000 non-null float64 + 4 Fluctuations_X_in_the_left_bearing_smooth 601000 non-null float64 + 5 Fluctuations_Y_in_the_left_bearing_smooth 601000 non-null float64 + 6 Fluctuations_X_in_the_right_bearing_smooth 601000 non-null float64 + 7 Fluctuations_Y_in_the_right_bearing_smooth 601000 non-null float64 + 8 Temperature_in_the_left_bearing 601000 non-null float64 + 9 Temperature_in_the_right_bearing 601000 non-null float64 + dtypes: float64(10) + memory usage: 45.9 MB + + + None + + +| Fluctuations_X_in_the_left_bearing | Fluctuations_Y_in_the_left_bearing | Fluctuations_X_in_the_right_bearing | Fluctuations_Y_in_the_right_bearing | Fluctuations_X_in_the_left_bearing_smooth | Fluctuations_Y_in_the_left_bearing_smooth | Fluctuations_X_in_the_right_bearing_smooth | Fluctuations_Y_in_the_right_bearing_smooth | Temperature_in_the_left_bearing | Temperature_in_the_right_bearing | +|------------------------------------|------------------------------------|-------------------------------------|-------------------------------------|-------------------------------------------|-------------------------------------------|--------------------------------------------|--------------------------------------------|---------------------------------|----------------------------------| +| count | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | +| mean | 5.455242 | 6.335448 | 5.691674 | 7.220008 | 5.455247 | 6.335445 | 5.691669 | 7.220007 | 1108.853443 | 1112.852181 | +| std | 0.084957 | 0.100096 | 0.079720 | 0.077585 | 0.071788 | 0.081333 | 0.065328 | 0.063549 | 4.983924 | 5.274466 | +| min | 5.032000 | 5.818000 | 5.152000 | 6.745000 | 5.201000 | 6.022000 | 5.442000 | 6.993000 | 1091.353000 | 1100.433000 | +| 25% | 5.388000 | 6.263000 | 5.635000 | 7.164000 | 5.390000 | 6.264000 | 5.636000 | 7.165000 | 1106.737000 | 1109.069000 | +| 50% | 5.463000 | 6.332000 | 5.692000 | 7.212000 | 5.465000 | 6.331000 | 5.691000 | 7.211000 | 1110.546000 | 1113.650000 | +| 75% | 5.521000 | 6.410000 | 5.749000 | 7.276000 | 5.520000 | 6.407000 | 5.744000 | 7.274000 | 1112.673000 | 1117.756000 | +| max | 6.089000 | 7.171000 | 6.362000 | 8.006000 | 5.744000 | 6.734000 | 6.001000 | 7.578000 | 1113.476000 | 1119.457000 | + + +- Набор данных с наличием несоосности в муфте + +``` python +df_misal = pd.read_csv('./data_4_2.csv') +display(df_misal.info()) +display(df_misal.describe()) +``` + + + + RangeIndex: 601000 entries, 0 to 600999 + Data columns (total 10 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 Fluctuations_X_in_the_left_bearing 601000 non-null float64 + 1 Fluctuations_Y_in_the_left_bearing 601000 non-null float64 + 2 Fluctuations_X_in_the_right_bearing 601000 non-null float64 + 3 Fluctuations_Y_in_the_right_bearing 601000 non-null float64 + 4 Fluctuations_X_in_the_left_bearing_smooth 601000 non-null float64 + 5 Fluctuations_Y_in_the_left_bearing_smooth 601000 non-null float64 + 6 Fluctuations_X_in_the_right_bearing_smooth 601000 non-null float64 + 7 Fluctuations_Y_in_the_right_bearing_smooth 601000 non-null float64 + 8 Temperature_in_the_left_bearing 601000 non-null float64 + 9 Temperature_in_the_right_bearing 601000 non-null float64 + dtypes: float64(10) + memory usage: 45.9 MB + + + None + + +| Fluctuations_X_in_the_left_bearing | Fluctuations_Y_in_the_left_bearing | Fluctuations_X_in_the_right_bearing | Fluctuations_Y_in_the_right_bearing | Fluctuations_X_in_the_left_bearing_smooth | Fluctuations_Y_in_the_left_bearing_smooth | Fluctuations_X_in_the_right_bearing_smooth | Fluctuations_Y_in_the_right_bearing_smooth | Temperature_in_the_left_bearing | Temperature_in_the_right_bearing | +|------------------------------------|------------------------------------|-------------------------------------|-------------------------------------|-------------------------------------------|-------------------------------------------|--------------------------------------------|--------------------------------------------|---------------------------------|----------------------------------| +| count | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | +| mean | 4.984535 | 6.652319 | 5.795459 | 7.310637 | 4.984530 | 6.652318 | 5.795455 | 7.310634 | 1107.421877 | 1114.138790 | +| std | 0.069982 | 0.108803 | 0.088409 | 0.088030 | 0.052889 | 0.092470 | 0.075171 | 0.075327 | 3.960030 | 5.357683 | +| min | 4.526000 | 6.121000 | 5.345000 | 6.751000 | 4.773000 | 6.324000 | 5.541000 | 6.959000 | 1100.641000 | 1100.666000 | +| 25% | 4.935000 | 6.572000 | 5.733000 | 7.257000 | 4.942000 | 6.573000 | 5.734000 | 7.261000 | 1103.898000 | 1110.323000 | +| 50% | 4.995000 | 6.636000 | 5.795000 | 7.303000 | 4.995000 | 6.636000 | 5.792000 | 7.302000 | 1107.961000 | 1115.154000 | +| 75% | 5.027000 | 6.738000 | 5.860000 | 7.371000 | 5.021000 | 6.735000 | 5.856000 | 7.370000 | 1110.810000 | 1118.884000 | +| max | 5.635000 | 7.505000 | 6.544000 | 8.087000 | 5.298000 | 7.047000 | 6.114000 | 7.654000 | 1113.633000 | 1121.417000 | + + +- Набор данных с наличием дисбаланса + +``` python +df_disbal = pd.read_csv('./data_4_3.csv') +display(df_disbal.info()) +display(df_disbal.describe()) +``` + + + + RangeIndex: 601000 entries, 0 to 600999 + Data columns (total 10 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 Fluctuations_X_in_the_left_bearing 601000 non-null float64 + 1 Fluctuations_Y_in_the_left_bearing 601000 non-null float64 + 2 Fluctuations_X_in_the_right_bearing 601000 non-null float64 + 3 Fluctuations_Y_in_the_right_bearing 601000 non-null float64 + 4 Fluctuations_X_in_the_left_bearing_smooth 601000 non-null float64 + 5 Fluctuations_Y_in_the_left_bearing_smooth 601000 non-null float64 + 6 Fluctuations_X_in_the_right_bearing_smooth 601000 non-null float64 + 7 Fluctuations_Y_in_the_right_bearing_smooth 601000 non-null float64 + 8 Temperature_in_the_left_bearing 601000 non-null float64 + 9 Temperature_in_the_right_bearing 601000 non-null float64 + dtypes: float64(10) + memory usage: 45.9 MB + + + None + + +| Fluctuations_X_in_the_left_bearing | Fluctuations_Y_in_the_left_bearing | Fluctuations_X_in_the_right_bearing | Fluctuations_Y_in_the_right_bearing | Fluctuations_X_in_the_left_bearing_smooth | Fluctuations_Y_in_the_left_bearing_smooth | Fluctuations_X_in_the_right_bearing_smooth | Fluctuations_Y_in_the_right_bearing_smooth | Temperature_in_the_left_bearing | Temperature_in_the_right_bearing | +|------------------------------------|------------------------------------|-------------------------------------|-------------------------------------|-------------------------------------------|-------------------------------------------|--------------------------------------------|--------------------------------------------|---------------------------------|----------------------------------| +| count | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | +| mean | 5.459564 | 6.337034 | 5.668791 | 7.144426 | 5.459570 | 6.337033 | 5.668790 | 7.144428 | 1109.347354 | 1108.257027 | +| std | 0.094292 | 0.104977 | 0.081341 | 0.079577 | 0.082518 | 0.087532 | 0.067253 | 0.065966 | 3.584635 | 3.298593 | +| min | 4.979000 | 5.824000 | 5.212000 | 6.661000 | 5.187000 | 6.022000 | 5.414000 | 6.892000 | 1097.972000 | 1100.383000 | +| 25% | 5.382000 | 6.256000 | 5.608000 | 7.086000 | 5.383000 | 6.258000 | 5.611000 | 7.089000 | 1108.479000 | 1106.538000 | +| 50% | 5.458000 | 6.336000 | 5.674000 | 7.151000 | 5.459000 | 6.336000 | 5.675000 | 7.151000 | 1110.300000 | 1109.447000 | +| 75% | 5.539000 | 6.419000 | 5.729000 | 7.200000 | 5.537000 | 6.416000 | 5.725000 | 7.198000 | 1111.793000 | 1110.628000 | +| max | 6.118000 | 7.173000 | 6.346000 | 7.888000 | 5.756000 | 6.742000 | 5.985000 | 7.448000 | 1113.015000 | 1112.332000 | + + +- Набор данных со втулкой с дефектами + +``` python +df_defect = pd.read_csv('./data_4_4.csv') +display(df_defect.info()) +display(df_defect.describe()) +``` + + + + RangeIndex: 601000 entries, 0 to 600999 + Data columns (total 10 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 Fluctuations_X_in_the_left_bearing 601000 non-null float64 + 1 Fluctuations_Y_in_the_left_bearing 601000 non-null float64 + 2 Fluctuations_X_in_the_right_bearing 601000 non-null float64 + 3 Fluctuations_Y_in_the_right_bearing 601000 non-null float64 + 4 Fluctuations_X_in_the_left_bearing_smooth 601000 non-null float64 + 5 Fluctuations_Y_in_the_left_bearing_smooth 601000 non-null float64 + 6 Fluctuations_X_in_the_right_bearing_smooth 601000 non-null float64 + 7 Fluctuations_Y_in_the_right_bearing_smooth 601000 non-null float64 + 8 Temperature_in_the_left_bearing 601000 non-null float64 + 9 Temperature_in_the_right_bearing 601000 non-null float64 + dtypes: float64(10) + memory usage: 45.9 MB + + + None + + +| Fluctuations_X_in_the_left_bearing | Fluctuations_Y_in_the_left_bearing | Fluctuations_X_in_the_right_bearing | Fluctuations_Y_in_the_right_bearing | Fluctuations_X_in_the_left_bearing_smooth | Fluctuations_Y_in_the_left_bearing_smooth | Fluctuations_X_in_the_right_bearing_smooth | Fluctuations_Y_in_the_right_bearing_smooth | Temperature_in_the_left_bearing | Temperature_in_the_right_bearing | +|------------------------------------|------------------------------------|-------------------------------------|-------------------------------------|-------------------------------------------|-------------------------------------------|--------------------------------------------|--------------------------------------------|---------------------------------|----------------------------------| +| count | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | 601000.000000 | +| mean | 5.343087 | 6.470311 | 6.011416 | 7.066158 | 5.343089 | 6.470312 | 6.011420 | 7.066161 | 1109.685379 | 1106.292003 | +| std | 0.092243 | 0.082721 | 0.071645 | 0.072093 | 0.079303 | 0.058977 | 0.056743 | 0.054376 | 5.512947 | 5.618381 | +| min | 4.882000 | 5.900000 | 5.614000 | 6.548000 | 5.044000 | 6.205000 | 5.792000 | 6.859000 | 1092.609000 | 1085.364000 | +| 25% | 5.266000 | 6.417000 | 5.964000 | 7.021000 | 5.268000 | 6.419000 | 5.967000 | 7.024000 | 1106.780000 | 1103.882000 | +| 50% | 5.346000 | 6.476000 | 6.003000 | 7.060000 | 5.348000 | 6.476000 | 6.001000 | 7.059000 | 1111.812000 | 1109.040000 | +| 75% | 5.419000 | 6.522000 | 6.062000 | 7.110000 | 5.417000 | 6.519000 | 6.056000 | 7.107000 | 1114.155000 | 1110.130000 | +| max | 6.073000 | 7.247000 | 6.747000 | 7.795000 | 5.656000 | 6.814000 | 6.300000 | 7.413000 | 1115.813000 | 1110.790000 | + + +1. На основании приведённого выше описания, можно сказать, что pandas + верно справился с определением типа - все 10 параметров имеют + вещественный (float64) тип данных. Что соответствует исходным + данным: + +- 1 столбец массива - `Fluctuations_X_in_the_left_bearing` - + горизонтальные колебания в левом подшипнике, в Вольтах + +- 2 столбец массива - `Fluctuations_Y_in_the_left_bearing` - + вертикальные колебания в левом подшипнике, в Вольтах + +- 3 столбец массива - `Fluctuations_X_in_the_right_bearing` - + горизонтальные колебания в правом подшипнике, в Вольтах + +- 4 столбец массива - `Fluctuations_Y_in_the_right_bearing` - + вертикальные колебания в правом подшипнике подшипнике, в Вольтах + +- 5 столбец массива - `Fluctuations_X_in_the_left_bearing_smooth` - + горизонтальные колебания в левом подшипнике с учетом сглаживания, в + Вольтах + +- 6 столбец массива - `Fluctuations_Y_in_the_left_bearing_smooth` - + вертикальные колебания в левом подшипнике с учетом сглаживания, в + Вольтах + +- 7 столбец массива - `Fluctuations_X_in_the_right_bearing_smooth` - + горизонтальные колебания в правом подшипнике с учетом сглаживания, в + Вольтах + +- 8 столбец массива - `Fluctuations_Y_in_the_right_bearing_smooth` - + вертикальные колебания в правом подшипнике подшипнике с учетом + сглаживания, в Вольтах + +- 9 столбец массива - `Temperature_in_the_left_bearing` - температура + в левом подшипнике, в Омах + +- 10 столбец массива - `Temperature_in_the_right_bearing` - + температура в правом подшипнике, в Омах + +``` python +# Для удобства итерации создадим кортежи с датафреймами, их читабельными именами для подписей и цветами +dfs = (df_norm, df_misal, df_disbal, df_defect) +df_names = ("Без дефектов", "Несоосность в трубке", "Дисбаланс", "Втулка с дефектом") +df_colors = ("tab:blue", "tab:orange", "tab:red", "tab:purple") + +# Шкала времени для 1000 зап/сек +time = np.arange(0, df_norm.shape[0]/1000, 0.001) + +import itertools as itt +pic_n_gen = itt.count(1) # Счётчик для номеров рисунков +``` + +## Линейные графики + +1. Построим линейные графики для флуктуаций и температур для каждого из + наборов данных + +``` python +a4figsize = (8, 11) # размер листа А4 в дюймах + +def plot_linear(df, fields, suptitle, xcoord, ylabel, ylim, figsize = a4figsize, linewidth=0.5, color=None): + fig, ax = plt.subplots(len(fields), figsize=figsize, sharex=True, sharey=True) + + fig.suptitle(suptitle) + fig.supxlabel(f"Рисунок {next(pic_n_gen)}") + + for j, field in enumerate(fields): + ax[j].plot(xcoord, df[field], linewidth=linewidth, color=color) + + ax[j].set_ylabel(ylabel) + ax[j].set_title(field) + + ax[j].spines['top'].set_visible(False) + ax[j].spines['right'].set_visible(False) + + ax[j].set_xlim((np.min(xcoord), np.max(xcoord))) + ax[j].set_ylim(ylim) + + ax[-1].set_xlabel("Время, с") + + fig.tight_layout() + +for i, df in enumerate(dfs): + plot_linear( + df, + fields=df.keys()[:-2], + suptitle=df_names[i], + xcoord=time, + ylabel="Вольты", + ylim=(np.min(df.min()[:-2]), np.max(df.max()[:-2])), # растягиваем график на всю высоту флуктуаций при одинаковых границах для всех + color=df_colors[i] + ) + + plot_linear( + df, + fields=df.keys()[-2:], + suptitle=df_names[i], + xcoord=time, + ylabel="Омы", + ylim=(np.min(df.min()[-2:]), np.max(df.max()[-2:])), # растягиваем график на всю высоту температур при одинаковых границах для всех + figsize=(8,5), + linewidth=1, + color=df_colors[i] + ) +``` + + +![](pictures/1.png) + + +![](pictures/2.png) + + +![](pictures/3.png) + + +![](pictures/4.png) + + +![](pictures/5.png) + + +![](pictures/6.png) + + +![](pictures/7.png) + + +![](pictures/8.png) + +1. Из построенных графиков видно, что линейное представление флуктуаций + несёт мало информации, поэтому в дальнейшем будут исследоваться + только распределение и корреляция между этими признаками. С другой + стороны, график температуры имеет ясно различимую временную + зависимость, поэтому для него имеет смысл рассмотреть её, а так же + корреляцию. + +## Распределение флуктуаций + +1. Как отмечалось в предыдущем пункте, проанализируем распределение для + полей, отражающих флуктуации. Первым делом визуализируем данные с + помощью так называемого \"Ящика с усами\". На каждом графике + отобразим одну из четырёх флуктуаций и сглаженную версию для каждого + набора данных. + +``` python +for i in range(4): + fig, ax = plt.subplots(figsize=(7, 7)) + plt.xticks(rotation=90) + + fig.suptitle(df_norm.keys()[i]) + fig.supxlabel(f"Рисунок {next(pic_n_gen)}") + + flierprops = dict(marker='o', markersize=3) + + for j, df in enumerate(dfs): + ax.boxplot(df[df.keys()[i]], positions=[j*2], flierprops=flierprops) + ax.boxplot(df[df.keys()[i+4]], positions=[j*2+1], flierprops=flierprops) + + ax.set_ylabel("Величина") + ax.set_xticks(range(8), itt.chain.from_iterable((df_names[j], df_names[j]+" сглаженное") for j in range(4))) + + ax.grid(linestyle='--') + + fig.tight_layout() +``` + + +![](pictures/9.png) + + +![](pictures/10.png) + + +![](pictures/11.png) + + +![](pictures/12.png) + +1. Из визуализации видно, что несглаженные данные имеют одиночные + выбросы - отдельные окружности, не сливающиеся с соседними. Поэтому + при дальнейшей работе есть смысл использовать сглаженные данные, так + как они дают более широкую гистаграмму, чем позволяют лучше видеть + диапазон принимаемых значений и уменьшают количество выбросов. Так + же сгруппируем графики по параметрам колонок 5-8. На каждом графике + изобразим одновременно распределение с и без дефектов. Заметим, что + нам не так уж важны конкретные значения, поэтому, для урупнения + изображений было принято решение не делать общей шкалу величины. + +``` python +for i, field in enumerate(df_norm.keys()[4:-2]): + fig, ax = plt.subplots(3, 1, figsize=a4figsize) + + fig.suptitle(field) + fig.supxlabel(f"Рисунок {next(pic_n_gen)}") + + for j, df in enumerate(dfs[1:]): + ax[j].hist(df_norm[field], bins=50, label=df_names[0], color=df_colors[0]) + ax[j].hist(df[field], bins=50, label=df_names[j+1], color=df_colors[j+1]) + + ax[j].set_xlabel("Величина") + ax[j].set_ylabel("Количество") + + ax[j].legend() + + fig.tight_layout() +``` + + +![](pictures/13.png) + + +![](pictures/14.png) + + +![](pictures/15.png) + + +![](pictures/16.png) + +1. Из построенной визуализации уже можно сделать некоторые выводы о + том, какие признаки меняются при определённых дефектах. + +- Например, видно, что при несоосности в трубке, значительные + отклонения по величине наблюдаются в левом подшипнике, в то время + когда в правом смещение видно в меньшей степени. + +- При дисбалансе, отклонения по форме и величине распределения видны + только по оси Y в правом подшипнике, а остальные параметры + практически совпадают. + +- Если же проблема в дефектах втулки, тогда все параметры смещаются в + большую или меньшую сторону, при этом сохраняя в общих чертах свою + форму, не считая оси X в правом подшипнике. + +## Линейный анализ температуры + +1. Теперь перейдём к анализу температуры подшипников. Для этого снова + изобразим линейные графики для каждого дефекта, наложив на них + соответствующие значения для нормы. + +``` python +fig, ax = plt.subplots(2, 3, figsize=a4figsize, sharex=True, sharey='row') + +# fig.suptitle(df_names[i+1]) +fig.supxlabel(f"Рисунок {next(pic_n_gen)}") + +for i, df in enumerate(dfs[1:]): + for j, field in enumerate(df.keys()[-2:]): + ax[j][i].plot(time, df_norm[field], color=df_colors[0], label=df_names[0]) + ax[j][i].plot(time, df[field], color=df_colors[i+1], label=df_names[i+1]) + + if i == 1: + ax[j][i].set_title(field) + + ax[j][i].set_ylabel("Температура, Омы") + + ax[j][i].grid(linestyle='--') + + ax[0][i].legend() + + ax[-1][i].set_xlabel("Время, с") + +fig.tight_layout() +``` + + +![](pictures/17.png) + +1. Если смотреть на график температуры прибора без дефектов, можно + увидеть обвал, начавшийся для левого подшипника на 400-ой секунде, а + для правого на 500-ой. Однако, неизвестно, остановился ли рост + температуры после этого, поэтому судить об окончании перехожного + процесса непросто. При этом, даже если считать, что первые 400 + секунд система для левой и 500 для правой входила в режим работы, + ввиду однородности флуктуаций, что видно на рис. 1,3,5,7, те выводы, + что были сделаны для их распределения в пункте 8, остаются в силе. + Что каается температуры, на основании её изменения, так же можно + сделать некоторые наблюдения: + +- При несоосности в трубке, на левом подшипнике наблюдается более + линейно растущий график, при этом около 500-ой секунды он пересекает + нормальный график и не останавливает свой рост. Температура для + правого несколько больше на всём временном отрезке и также не + замедляет рост после 500-ой секунды + +- Дисбаланс характеризуется более высокими температурами, но при этом + более коротким переходным режимом на левом подшипнике. При этом, на + правом температура наоборот значительно ниже, что так же видно с + самого начала наблюдений. + +- Дефектная втулка выдаёт себя только на правом подшипнике - опять же, + более низкими температурами на правом подшипнике. Но, возможно, это + происходит из-за гораздо более низкой начальной температуры (это + можно отнести к ошибкам измерения). При этом, температурная кривая + для левого подшипника практически идеально повторяет нормальную, но + только до конца переходного процесса, после чего продолжает расти + несмотря на его конец. + +## Матрица корреляции + +1. Наконец, построим матрицу корреляции для выявления корреляции между + параметрами нормальных и имеющими дефекты наборами. Нам не интересна + внутренняя корреляция, поэтому берём только корреляцию между разными + наборами. + +``` python +for i, df in enumerate(dfs[1:]): + fig, ax = plt.subplots(figsize=(10,10)) + + df_j = df.join(df_norm, lsuffix="_defective", rsuffix="_normal") + + corr = df_j.corr() + + corr = corr[filter(lambda key: key.count("_normal"), corr.keys())] + + corr = corr[np.array(list(map(lambda key: key.count("_defective") == 1, corr.index)),dtype=bool)] + + sns.heatmap( + corr, + cbar=False, + ax=ax, + annot=True, + cmap='coolwarm', + vmin=-1, + vmax=1 + ) + + fig.suptitle(df_names[i+1]) + fig.supxlabel(f"Рисунок {next(pic_n_gen)}") + + fig.tight_layout() +``` + + +![](pictures/18.png) + + +![](pictures/19.png) + + +![](pictures/20.png) + +Таблица. Критерии оценки визуализации, и примерные вопросы для их +оценивания | Вопрос | Ответ | |--------|-------|