ЛАБОРАТОРНАЯ РАБОТА №3

ЧИСЛЕННЫЙ АНАЛИЗ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ NUMPY

 

1. ЦЕЛЬ РАБОТЫ

Целью лабораторной работы является формирование навыков численного анализа подготовленных данных с использованием библиотеки NumPy, включая:

·       создание и обработку массивов ndarray;

·       выполнение векторных операций;

·       расчёт статистических показателей;

·       фильтрацию данных с использованием булевых масок;

·       анализ взаимосвязей между признаками;

·       масштабирование признаков;

·       сравнение алгоритмического и векторного подходов.

2. ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ

2.1. Формирование числовых массивов

Файл CSV хранит данные в текстовом формате. Это означает, что при чтении файла все значения, включая числовые, воспринимаются как строки. Для выполнения численного анализа такие данные необходимо привести к корректному числовому типу. Процесс формирования массива включает следующие шаги:

1)      Извлечение значений выбранного столбца из таблицы.

2)      Преобразование каждого значения к типу float.

3)      Замена пустых или некорректных значений на np.nan.

4)      Создание массива NumPy:

np.array(values, dtype=float)

Важно контролировать тип данных массива. Если результат имеет тип object, это означает, что в массиве остались строки или значения None. В таком случае численные операции будут выполняться некорректно или с потерей эффективности. После формирования массива необходимо выполнить проверку:

·       тип данных (array.dtype);

·       размерность массива (array.shape);

·       количество пропущенных значений (np.isnan(array).sum()).

Эти проверки подтверждают, что массив корректно подготовлен для дальнейшего анализа.

2.2. Работа с пропусками (NaN)

При преобразовании данных к числовому типу неизбежно возникают ситуации, когда часть значений отсутствует или не может быть корректно интерпретирована как число. В NumPy для обозначения таких случаев используется специальное вещественное значение:

np.nan (Not a Number),

np.nan сохраняет числовую природу массива и позволяет продолжать вычисления без перехода к типу object.

Особенности NaN

·       NaN имеет тип float.

·       Арифметические операции с NaN приводят к результату NaN.

·       Если массив содержит NaN, стандартные статистические функции (например, вычисление среднего) могут вернуть NaN как результат.

Поэтому при расчётах необходимо использовать функции, которые игнорируют пропущенные значения, например,

np.nanmean(array)

np.nanstd(array)

Такие функции позволяют получить корректную оценку показателей даже при наличии пропусков.

Подготовка данных к корреляционному анализу

При вычислении корреляции важно, чтобы сравниваемые массивы не содержали пропусков в одних и тех же позициях. Для этого формируется булева маска, исключающая пары значений, где хотя бы один элемент равен NaN:

mask = ~np.isnan(x) & ~np.isnan(y)

 

x_clean = x[mask]

y_clean = y[mask]

В результате остаются только те наблюдения, для которых оба признака заданы корректно.

y_clean = y[mask]

2.3. Базовые статистические показатели

После формирования числовых массивов можно перейти к вычислению основных статистических характеристик. Для массива array используются функции NumPy:

np.nanmean(array)

np.nanmedian(array)

np.nanstd(array)

np.nanmin(array)

np.nanmax(array)

Префикс nan означает, что при вычислениях пропущенные значения (NaN) автоматически игнорируются.

Среднее значение характеризует «центр» распределения и показывает типичное значение признака.

Медиана – это значение, которое делит упорядоченную выборку пополам. В отличие от среднего, она менее чувствительна к выбросам.

Стандартное отклонение отражает степень разброса данных относительно среднего: чем оно больше, тем сильнее значения отличаются друг от друга.

Минимум и максимум позволяют оценить диапазон изменения признака и выявить возможные экстремальные значения.

Важно понимать, что по сравнению с ЛР2 изменился способ вычисления, а не его математический смысл. Результат остаётся тем же, однако вместо явного перебора элементов используется векторная реализация.

2.4. Булевы маски

При анализе данных часто возникает необходимость отобрать элементы, удовлетворяющие определённому условию. В NumPy для этого используется механизм булевых масок. Булева маска формируется применением логического условия к массиву. Например,

mask = array > 0.8

В результате создаётся новый массив той же длины, состоящий из значений True и False. Значение True соответствует элементу, который удовлетворяет условию. Маска может быть использована для фильтрации данных:

filtered = array[mask]

count = mask.sum()

Таким образом:

·       filtered содержит только те элементы, которые удовлетворяют условию;

·       mask.sum() возвращает количество таких элементов.

Этот механизм позволяет выполнять фильтрацию без использования циклов, что соответствует принципу векторизации.

Отбор 10% наибольших значений. Если требуется определить 10% наибольших значений массива, можно:

1)  Определить пороговое значение (например, на основе сортировки или процентиля).

2)  Сформировать булеву маску относительно найденного порога.

3)  Выполнить отбор элементов с использованием этой маски.

Такой подход позволяет гибко анализировать данные и выполнять выборки различной сложности.

2.5. Корреляция

При анализе данных важно не только изучать отдельные показатели, но и понимать, связаны ли признаки между собой. Для оценки линейной зависимости между двумя числовыми массивами используется коэффициент корреляции Пирсона. В NumPy он вычисляется с помощью функции:

np.corrcoef(x, y)

Результатом является матрица размером 2×2. Искомый коэффициент корреляции находится в позиции [0, 1] (или [1, 0]). Перед вычислением необходимо убедиться, что массивы не содержат пропусков в сравниваемых позициях. При наличии NaN соответствующие пары значений следует предварительно исключить.

Интерпретация коэффициента корреляции. Коэффициент корреляции обозначается как r и принимает значения от −1 до 1:

·       Если r > 0, признаки изменяются в одном направлении (положительная зависимость).

·       Если r < 0, признаки изменяются в противоположных направлениях (отрицательная зависимость).

·       Чем ближе абсолютное значение |r| к 1, тем сильнее линейная связь.

Для учебных целей можно ориентироваться на следующую шкалу:

·       |r| < 0.3 – слабая связь;

·       0.3 ≤ |r| < 0.7 – умеренная связь;

·       |r| ≥ 0.7 – сильная связь.

Следует помнить, что корреляция отражает статистическую зависимость между признаками, но не доказывает наличие причинно-следственной связи.

2.6. Масштабирование признаков

При анализе данных разные признаки могут измеряться в разных единицах и иметь различный масштаб. Например, длительность трека выражается в секундах, а показатель energy принимает значения в диапазоне от 0 до 1. Чтобы сделать признаки сопоставимыми, применяются методы масштабирования.

Стандартизация. Стандартизация позволяет оценить, насколько каждое значение отличается от среднего. Вычисляется по формуле:

z = (x - np.nanmean(x)) / np.nanstd(x)

После преобразования:

·       среднее значение признака становится близким к 0;

·       стандартное отклонение становится равным 1;

·       значения могут быть как положительными, так и отрицательными.

Таким образом, каждое значение интерпретируется как отклонение от среднего в единицах стандартного отклонения.

Min–max нормализация. Minmax нормализация переводит значения признака в фиксированный диапазон от 0 до 1. Формула:

x_norm = (x - np.nanmin(x)) / (np.nanmax(x) - np.nanmin(x))

После преобразования:

·       минимальное значение становится равным 0;

·       максимальное – равным 1;

·       остальные значения распределяются внутри интервала [0; 1].

В этом случае изменяется масштаб признака, но его относительное распределение сохраняется.

2.7. Сравнение производительности

В ЛР2 среднее значение вычислялось алгоритмически – через последовательный перебор элементов массива с использованием цикла Python:

total = 0

count = 0

for value in array:

    if not np.isnan(value):

        total += value

        count += 1

mean = total / count

Такой способ полностью корректен и отражает явную логику вычисления. Однако каждая итерация выполняется интерпретатором Python, что создаёт накладные расходы при обработке больших массивов данных. В NumPy аналогичная операция выполняется векторно:

mean = np.nanmean(array)

В этом случае цикл скрыт внутри библиотеки и реализован на уровне оптимизированного машинного кода. Именно это обеспечивает ускорение вычислений.

Измерение времени выполнения. Для сравнения производительности можно использовать модуль time:

import time

 

start = time.time()

# вычисление

end = time.time()

Разность end - start показывает время выполнения операции.

Для более корректного сравнения рекомендуется:

·       выполнить вычисление несколько раз;

·       сравнить среднее время выполнения;

·       учитывать, что при небольших объёмах данных различие может быть незначительным.

Таким образом, сравнение производительности позволяет увидеть, что векторизация – это не просто сокращение кода, а изменение вычислительной модели.

3. ИСХОДНЫЕ ДАННЫЕ

В лабораторной работе используется учебный набор данных:

data/spotify_edu_dataset_ru_complex.csv

Файл содержит информацию о музыкальных треках, включая как текстовые, так и числовые характеристики. В рамках ЛР3 используются следующие числовые признаки:

·           duration_sec – длительность трека (в секундах);

·           energy – показатель энергичности композиции;

·           danceability – показатель танцевальности;

·           tempo – темп (BPM);

·           views – количество просмотров.

При формировании массивов NumPy значения указанных столбцов должны быть приведены к типу float. Пустые или некорректные значения необходимо заменить на np.nan, что обеспечивает корректность последующих вычислений и совместимость со встроенными функциями NumPy.

4. ЗАДАНИЕ К ЛАБОРАТОРНОЙ РАБОТЕ

Выполнение лабораторной работы осуществляется последовательно по этапам.

Этап 1. Формирование массивов NumPy

1)      Считать данные из CSV-файла.

2)      Выделить числовые признаки:

·       duration_sec

·       energy

·       danceability

·       tempo

·       views

3)      Преобразовать значения указанных признаков к типу float.

4)      Пустые и некорректные значения заменить на np.nan.

5)      Сформировать для каждого признака массив ndarray.

6)      Проверить:

·       тип данных (dtype);

·       размерность (shape);

·       количество пропусков.

Этап 2. Базовая статистика

Для каждого числового признака вычислить:

·       среднее значение (с учётом пропусков);;

·       медиану;

·       стандартное отклонение;

·       минимальное и максимальное значения.

Сравнить среднее значение длительности трека с результатом, полученным в ЛР2.

Этап 3. Булевы маски и фильтрация

Определить:

1)      Количество треков с energy > 0.8.

2)      Количество треков с длительностью выше среднего значения.

3)      10% наиболее популярных треков по числу просмотров (на основе ранжирования по убыванию значений views).

4)      Долю треков с danceability < 0.3.

Этап 4. Корреляционный анализ

1)      Рассчитать коэффициенты корреляции между:

·       energy и danceability;

·       duration_sec и views;

·       tempo и energy.

2)      Определить направление и силу связи.

3)      Дать краткую интерпретацию результатов.

Этап 5. Масштабирование признака

Для одного выбранного числового признака:

1)  Выполнить стандартизацию.

2)  Выполнить min–max нормализацию.

3)  Сравнить диапазон значений и интерпретацию результатов.

Этап 6. Сравнение производительности

1)      Реализовать вычисление среднего значения через цикл Python.

2)      Реализовать вычисление среднего через NumPy.

3)      Измерить время выполнения.

4)      Сформулировать вывод о различии подходов.

5. ИСПОЛЬЗОВАНИЕ ЭТАЛОННОГО КАРКАСА

Для выполнения лабораторной работы допускается использование эталонного кодового каркаса, приведённого в Приложении 4 («Эталон выполнения лабораторной работы №3»).

Эталонный каркас демонстрирует:

·       рекомендуемую архитектуру программного решения;

·       порядок формирования массивов NumPy;

·       корректную обработку пропущенных значений (np.nan);

·       заготовки функций для выполнения этапов 2–6.

Использование эталона не освобождает от самостоятельной работы. В отчёте должны быть представлены:

·       собственные результаты вычислений;

·       интерпретация полученных показателей;

·       пояснения к ключевым этапам обработки данных.

6. СОДЕРЖАНИЕ ОТЧЁТА

Отчёт по лабораторной работе должен быть оформлен в структурированном виде и содержать следующие разделы:

1) Цель работы. Кратко сформулировать цель лабораторной работы и указать, какие навыки численного анализа с использованием NumPy были освоены.

2) Теоретическое обоснование. В связной форме изложить:

·       особенности структуры ndarray;

·       принципы векторизации;

·       работу с пропущенными значениями (np.nan);

·       роль статистических показателей и корреляционного анализа в численном исследовании данных.

3) Код программы с комментариями. Решение должно быть структурировано и логически организовано. Комментарии должны пояснять:

·       формирование массивов;

·       обработку пропусков;

·       использование статистических функций;

·       реализацию корреляционного анализа и масштабирования.

4) Результаты формирования массивов. Необходимо представить:

·       типы данных массивов (dtype);

·       размерность (shape);

·       количество пропущенных значений.

5) Результаты базовой статистики. Представить вычисленные показатели и кратко интерпретировать их.

6) Результаты фильтрации с использованием булевых масок. Показать полученные значения (количество/доли) и дать краткий аналитический комментарий.

7) Результаты корреляционного анализа. Представить коэффициенты корреляции, указать направление и силу связи, дать интерпретацию.

8) Результаты масштабирования выбранного признака. Показать диапазоны значений после стандартизации и нормализации, пояснить различие методов.

9) Сравнение производительности алгоритмического и векторного подходов. Представить результаты измерения времени выполнения и сформулировать вывод о различии вычислительных моделей.

10) Ответы на контрольные вопросы.

11) Выполнение заданий к СРО.

12) Итоговый вывод. Вывод должен носить аналитический характер и отражать понимание перехода от алгоритмической модели (ЛР2) к численной модели анализа (NumPy).

7. КОНТРОЛЬНЫЕ ВОПРОСЫ

1)  В чём принципиальное отличие списка Python от массива ndarray?

2)  Почему при формировании числовых массивов используется тип float?

3)  В чём особенность значения np.nan и почему оно применяется вместо None?

4)  Почему стандартная функция mean() может вернуть NaN?

5)  Что такое булева маска и как она используется при фильтрации данных?

6)  Что показывает коэффициент корреляции Пирсона?

7)  Почему корреляция не означает причинно-следственную связь?

8)  В чём различие между стандартизацией и minmax нормализацией?

9)  Почему векторные операции NumPy выполняются быстрее циклов Python?

10)  В каких случаях различие производительности становится существенным?

8. ВЫВОДЫ ПО ЛАБОРАТОРНОЙ РАБОТЕ

В выводе необходимо отразить:

·       какие навыки работы с массивами NumPy были сформированы;

·       какие особенности числового анализа выявлены при работе с пропущенными значениями;

·       какие зависимости между признаками были обнаружены;

·       в чём проявляется преимущество векторных вычислений;

·       каким образом ЛР3 подготавливает к переходу к табличному анализу (Pandas) и последующему моделированию.

Выводы должны носить аналитический характер и демонстрировать понимание выполненной работы.

9. ЗАДАНИЯ К САМОСТОЯТЕЛЬНОЙ РАБОТЕ ОБУЧАЮЩЕГОСЯ (СРО)

1)      Рассчитать матрицу корреляций для всех числовых признаков набора данных.

2)      Исследовать влияние выбросов на значение среднего и стандартного отклонения.

3)      Сравнить результаты корреляции до и после удаления 5% экстремальных значений.

4)      Выполнить стандартизацию двух различных признаков и сравнить распределение полученных значений.

5)      Искусственно увеличить объём массива (дублирование данных) и повторить сравнение производительности.

Задания к СРО должны быть выполнены самостоятельно и отражены в отчёте.

10. МЕТОДИЧЕСКАЯ СВЯЗЬ ЛР3 С ЛР4

ЛР3 вводит числовую модель анализа данных (NumPy): векторизация, статистика, корреляция, масштабирование.

В ЛР4 выполняется переход к табличной модели (Pandas), что позволяет:

·       объединять числовые и категориальные признаки в одной структуре;

·       выполнять группировку и агрегирование;

·       работать с таблицей как целостным объектом анализа.

Таким образом: ЛР2 → алгоритмическая модель, ЛР3 → числовая модель, ЛР4 → табличная аналитика.