Модуль 2 - Школа анализа инженерных данных
Исследовательский анализ и объяснение данных — домашнее задание
Цель: научиться выполнять исследовательский анализ данных: вычислять описательные статистики, группировать данные по категориям, применять метод главных компонент, кластеризовать наблюдения и анализировать периодичности во временных рядах.
Данные:
Сталелитейные_данные.csv— новые данные энергопотребления сталелитейного предприятия (~35 000 строк).
Формат сдачи: В проверочную систему Etude нужно вставить код из секции с пометкой ✍️.
Важно: Код должен сохранять результат в переменную, указанную в задании.
# ⚙️ ПОДГОТОВИТЕЛЬНЫЙ КОД
Pkg.add(["CSV", "DataFrames", "Statistics", "StatsBase", "Clustering", "FFTW"])
cd( @__DIR__ )
# Выполните эту ячейку перед началом работы
✏️ Задание 1
Преобразуйте столбец date в формат DateTime и определите диапазон дат в наборе данных. Сохраните минимальную дату в переменную начало, максимальную - в переменную завершение.
Подсказка:
-
Используйте функцию
DateTimeс указанием форматаdateformat"dd/mm/yyyy HH:MM". -
Присвойте новый столбец обращением
df.DateTime. -
Для минимального значения используйте
minimum(df.DateTime), для максимального -maximum(df.DateTime).
# ✍️ ВАШ КОД — ЗАДАНИЕ 1
using CSV, DataFrames, Dates
df = CSV.read("data/Сталелитейные_данные.csv", DataFrame)
df.DateTime = # здесь напишите ваш код
начало = # здесь напишите ваш код
завершение = # здесь напишите ваш код
println("Диапазон: ", начало, " - ", завершение)
Ожидаемый вывод программы: Диапазон: 2018-01-01T00:00:00 - 2018-12-31T23:45:00
✏️ Задание 2
Вычислите описательную статистику для всех числовых столбцов набора данных. Сохраните результат в переменную ans.
Подсказка:
-
Столбцы уже перечислены в векторе
числовые. -
Для получения сводки используйте функцию
describeс двумя аргументами: подмножествомdf[:, числовые]и символом:all, который включает все доступные статистики.
# ✍️ ВАШ КОД — ЗАДАНИЕ 2
using CSV, DataFrames
df = CSV.read("data/Сталелитейные_данные.csv", DataFrame)
числовые = [:Usage_kWh, :Lagging_Current_Reactive_Power_kVarh,
:Leading_Current_Reactive_Power_kVarh, :CO2_tCO2_,
:Lagging_Current_Power_Factor, :Leading_Current_Power_Factor,
:Temperature_C, :Humidity_Pct]
ans = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
M = Matrix(ans)
print(M[5,6])
Ожидаемый вывод программы: 87.96
✏️ Задание 3
Рассчитайте среднее потребление, стандартное отклонение потребления и среднюю температуру для каждого сезона. Сезон уже определён в столбце Season. Сохраните результат в переменную ans.
Подсказка:
-
Сгруппируйте DataFrame по столбцу
Seasonс помощьюgroupby(df, :Season). -
Передайте результат в функцию
combine(). -
Для вычисления среднего используйте конструкцию
:Usage_kWh => mean => :avg_usage, для стандартного отклонения:Usage_kWh => std => :std_usage, для средней температуры:Temperature_C => mean => :avg_temp. -
Перечислите три пары через запятую и добавьте из в качестве следующих аргументов функции
combine()после аргументаgroupby(df, :Season).
# ✍️ ВАШ КОД — ЗАДАНИЕ 3
using CSV, DataFrames, Statistics, Dates
df = CSV.read("data/Сталелитейные_данные.csv", DataFrame)
df.DateTime = DateTime.(df.date, dateformat"dd/mm/yyyy HH:MM")
df.Season = [["Зима", "Зима", "Весна", "Весна", "Весна", "Лето",
"Лето", "Лето", "Осень", "Осень", "Осень", "Зима"][month(dt)]
for dt in df.DateTime]
ans = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
M = Matrix(ans)
print(round(M[1,3], digits=4))
Ожидаемый вывод программы: 37.1293
✏️ Задание 4
Разделите наблюдения на три уровня загрузки: низкая, средняя и высокая, на основе столбца Usage_kWh. Для этого вычислите 33-й и 67-й процентили и присвойте каждому наблюдению соответствующую категорию. Затем подсчитайте количество наблюдений в каждом уровне. Сохраните результат в переменную ans.
Подсказка:
-
Процентили вычисляются функцией
quantileс вектором[0.33, 0.67]. Результат распакуйте в две переменныеq33, q67. -
Для присвоения категорий используйте условный оператор с вложенными проверками:
[x <= q33 ? "Низкая" : x <= q67 ? "Средняя" : "Высокая" for x in df.Usage_kWh]. -
Для подсчёта количества наблюдений сгруппируйте по
LoadLevelи используйтеcombineс паройnrow => :count.
# ✍️ ВАШ КОД — ЗАДАНИЕ 4
using CSV, DataFrames, StatsBase
df = CSV.read("data/Сталелитейные_данные.csv", DataFrame)
q33, q67 = # здесь напишите ваш код
df.LoadLevel = # здесь напишите ваш код
ans = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
M = Matrix(ans)
print(M[2, 2])
Ожидаемый вывод программы: 11851
✏️ Задание 5
Выполните метод главных компонент (PCA) для восьми числовых признаков. Сначала нормализуйте данные, затем обучите модель PCA с двумя компонентами и получите проекцию данных. Сохраните проекцию в переменную проекция.
Подсказка:
-
Матрица признаков уже создана как
pca_data. -
Для нормализации вычтите среднее по столбцам:
mean(pca_data, dims=1), и разделите на стандартное отклонение:std(pca_data, dims=1). -
Модель обучается функцией
fit(PCA, pca_data', maxoutdim=2). -
Проекция получается функцией
MultivariateStats.transform(pca_model, pca_data').
# ✍️ ВАШ КОД — ЗАДАНИЕ 5
using CSV, DataFrames, StatsBase, MultivariateStats
df = CSV.read("data/Сталелитейные_данные.csv", DataFrame)
числовые = [:Usage_kWh, :Lagging_Current_Reactive_Power_kVarh,
:Leading_Current_Reactive_Power_kVarh, :CO2_tCO2_,
:Lagging_Current_Power_Factor, :Leading_Current_Power_Factor,
:Temperature_C, :Humidity_Pct]
pca_data = Matrix(df[:, числовые])
pca_data = # здесь напишите ваш код
pca_model = # здесь напишите ваш код
проекция = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(round(maximum(проекция)+abs(minimum(проекция)), digits=4))
Ожидаемый вывод программы: 9.1079
✏️ Задание 6
Примените алгоритм k-средних для кластеризации наблюдений на 3 группы. Используйте те же нормализованные данные, что и в предыдущем задании. Сохраните метки кластеров в столбец df.Cluster.
Подсказка:
-
Количество кластеров уже задано переменной
k = 3. -
Алгоритм запускается функцией
kmeans(pca_data', k). -
Метки кластеров находятся в поле
cluster_result.assignments. -
Присвойте их в
df.Clusterчерез точку.
# ✍️ ВАШ КОД — ЗАДАНИЕ 6
using Clustering
k = 3
cluster_result = # здесь напишите ваш код
df.Cluster = # здесь напишите ваш код
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(sum(df.Cluster .== 1))
Ожидаемый вывод программы: 12864
✏️ Задание 7
Постройте спектр временного ряда энергопотребления с помощью быстрого преобразования Фурье. Возьмите первые 4096 отсчётов, вычтите среднее значение, примените fft и возьмите модуль результата. Сохраните спектр в переменную spectrum.
Подсказка:
-
Для центрирования используйте
df.Usage_kWh[1:4096] .- mean(df.Usage_kWh[1:4096]). -
Примените
fftк сигналу, затем возьмите модуль черезabs. -
Постройте график для визуальной проверки решения (не для проверочной системы)
# ✍️ ВАШ КОД — ЗАДАНИЕ 7
using CSV, DataFrames, Statistics, FFTW
df = CSV.read("data/Сталелитейные_данные.csv", DataFrame)
signal = # здесь напишите ваш код
spectrum = # здесь напишите ваш код
# ВИЗУАЛИЗАЦИЯ - НЕ КОПИРУЙТЕ В ПРОВЕРОЧНУЮ СИСТЕМУ
freqs = (0:2047) * (1/0.25) / 4096 * 24
plot(freqs[2:100], spectrum[2:100],
xlabel="Частота, циклов/сутки", ylabel="Амплитуда",
title="Спектр энергопотребления",
linewidth=1.5, legend=false)
В проверочной системе используется следующий код для проверки правильности выполнения задания:
# ПРОВЕРОЧНЫЙ КОД в Etude
print(round(mean(spectrum)))
Ожидаемый вывод программы: 1200.0
Заключение
Отлично, вы справились с заданиями по исследовательскому анализу данных! Вы научились преобразовывать временные метки, вычислять описательные статистики, группировать данные по сезонам и уровням загрузки, применять метод главных компонент для снижения размерности, кластеризовать наблюдения и анализировать периодичности в данных с помощью преобразования Фурье.
Эти навыки составляют основу исследовательского анализа инженерных данных. В следующем модуле мы перейдём к построению моделей машинного обучения и вернёмся к акустическим сигналам, чтобы научиться определять дефекты промышленного оборудования.