РАЗВЕДОЧНЫЙ АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON
Аннотация: В статье рассматривается разведочный анализ данных. Описываются инструменты реализации анализа, библиотеки Python. Представлен пример выполненный на данных обнаружению присутствия людей в помещении.
Abstract: The article deals with exploratory data analysis. Tools for implementing analysis and Python libraries are described. An example performed on the data for detecting the presence of people in the room is presented.
Датасет (Dataset) — набор данных.
Импьютация — это процесс замены отсутствующих данных (пропусков) замещаемыми значениями.
Ни для кого не секрет, что сегодня информация играет очень важную роль в нашей жизни. На сегодняшний день ее объемы колоссальны и продолжают расти.
Под разведочным анализом подразумевается первичный «осмотр» данных с целью получения ценной информации: каких-либо зависимостей между атрибутами, зависимостей временного характера, ранжирование по степени влияния тех или иный атрибутов и т.д.
В качестве входного датасета будем использовать набор данных по обнаружению присутствия людей в помещении [1].
На сегодняшний день, эта задача является очень актуальной для создания «умных домов», которые создают условия для комфортной жизни и(или) работы.
В таком доме необходимо выполнять все требования по кондиционированию воздуха, температурным условиям, но при этом экономить ресурсы в том случае, если людей в помещении нет.
Датасет состоит из трех файлов:
• datatraining.txt — обучающая выборка (ее мы будем анализировать)
• datatest.txt — тестовая выборка
• datatest2.txt — тестовая выборка большего размера.
Каждый файл содержит следующие колонки:
date — дата-время в формате ГОД-МЕСЯЦ-ДЕНЬ ЧАСЫ:МИНУТЫ:СЕКУНДЫ. Набор данных содержит данные с интервалом измерения в минуту.
Temperature — температура в градусах Цельсия.
Humidity — относительная влажность в %.
Light — освещенность в Люксах.
CO2 — концентрация углекислого газа в миллионных долях.
HumidityRatio — величина, производная от температуры и относительной влажности.
Occupancy — целевой признак. Если в помещении находятся люди, то 1, иначе 0.
Анализ будем проводить на языке Python.
Из наиболее известных и широко используемых инструментов — Jupyter Notebook [2] и Google Colaboratory [3].
Jupyter Notebook и Google Colaboratory невероятно мощные инструменты, которые позволяют в интерактивном режиме выполнять анализ данных.
Jupyter Notebook Google Colaboratory *.py
Модель распространения Бесплатно Бесплатно Бесплатно
Возможность запуска локально Есть Отсутствует Есть
Возможность запуска «в облаке» Есть Есть Есть
Поддержка GPU Есть Есть Есть
Интерактивный режим Присутствует Присутствует Отсутствует
В нашем случае, разницы особой не будет, т к все производимые вычисления в пределах данной статьи нересурсоемкие. Для демонстрации я буду использовать Jupyter Notebook. Я его выбрал потому, что в нем присутствует интерактивный режим и Jupyter может работать локально.
Для начала подключим все необходимые библиотеки:
pandas — это Python библиотека для анализа и обработки данных [5].
mathplotlib — библиотеки визуализации [6],
seaborn — обёртка над matplotlib, привносящая в неё множество улучшений, дополнений [7].
Загрузим данные, которые будем анализировать. Загружаем файлы датасета с помощью библиотеки Pandas. Мы будем читать из файла. Не смотря на то, что файлы имеют расширение txt они представляют собой данные в формате CSV. Обычно в файлах такого формата в качестве разделителей используются символы «,», «;» или табуляция. Поэтому вызывая метод read_csv всегда стоит явно указывать разделитель данных с помощью параметра sep. Чтобы узнать какой разделитель используется в файле его рекомендуется предварительно посмотреть в любом текстовом редакторе. В нашем случае это запятая.
Данные мы получили. Теперь посмотрим первые 5 строк:
In [3] : # Первые 5 строк датасета data.headf)
date Temperature Humidity Light со г HumidityRatio Occupancy
2015-02-04 17:55:00 23.10 27.2000 426.0 704.50 0.004757 1
Примечание: Можно указать явное кол-во строк, для этого надо передать функции необходимое значение. Узнаем размер данных:
print(&Всего колонок: <>&.format(column count)) С помощью метода columns, получаем названия колонок:
Out [б] : lndex( [ date», &Temperature&,. 1 Humidity1, &Light&, C02&, 1 HumidityRatio & 1 Occupancy1], dtype=&object&)
С помощью dtypes — типы данных в колонках. In [7] : data.dtypes
Occupancy int64 dtype: object
Последнее, что необходимо сделать перед самим анализом данных -проверить наличие пропусков.
В данном примере, в датасете нет пропусков. Однако данные могут быть разреженными. Тогда придется выполнить дополнительную обработку данных перед их анализом. Это необходимо потому, что мы даже не сможем построить корректно корреляционную матрицу. Из наиболее простых решений: удаление строк, подстановка нулей. Задача импьютации данных, это отдельная тема, требующая особого внимания.
Также не стоит забывать, что большинство алгоритмов машинного обучения не будут с пропусками работать.
Проблема подготовки данных также требует отдельного внимания. Вернемся к нашим данным и посмотрим основные статистические показатели.
Temperature Humidity Light 002 HumidityRatio Occupancy
count a 143 .oooooo В143.000000 0143.000000 B143.000000 В143.000000 B143.000000
mean 20.619QB4 25.731507 119.519375 606.546243 0.003863 0,212330
std 1.016916 5.5312 И 194.755S05 314,320877 0.000852 0.408982
mhi 19.000000 16.745000 0.000000 412.750000 0.002674 0.000000
max 23.180000 39.117500 1546.333333 2023.500000 0.006476 1.oooooo
Метод describe показывает основные статистические характеристики данных по каждому числовому признаку: число значений, среднее, стандартное отклонение, диапазон, медиану, 0.25 и 0.75 квартили.
Построим график плотности распределения температуры:
In [15]: fig, ax = pit.subplots[2, 1, figsize=(10,10))| sns.violinplot(ax=ax[Olr x=data[ Temperature ]) sns . distplot(data[ Temperature ], ax=ax[l[)
Out[15]: -cmatplotlib.axes, subplots.AxesSubplot at Ox7f7adO3404O0>
Бросается в глаза наличие двух «горбиков». Интересно, почему их два, а не один? Я считаю, что это может быть связано с тем, для какой цели даннное помещения предназначается: дом или работа (офисное помещение). На мой взгляд, дома обычно теплее, чем на работе. К сожалению, получить точный ответ, основываясь лишь на данном датасет нельзя.
Парой, для демонстрации хорошо подходит «Ящик с усами» или он же Box plot [4]. Это график демонстрирующий одномерное распределение вероятности.
In [21]: sns.boxplot(x=data[ &Temperature& ])
Получили среднюю температуру в помещении на интервале всего времени: когда помещение пустое и когда в нем кто-нибудь есть.
Однако, нам нужно знать какую температуру надо выставлять в доме в присутствии человека. Для этого отфильтруем данные и посроим иной ящик с усами. Условие фильтрации — наличие человека.
In [16]: Temperature_with_p = data[data[&Occupancy»] == 1]
In [17]: sns.boxpLot[x=Temperature with_p[&Temperature&])
Out[17] : cmatpLotLib.axes. subpLots.AxesSubplot at 0x7fc56003c5f8>
Из этого графика можно сделать вывод, что стоит поддерживать температуру около 21,75 градуса.
Чтобы получить общую картину, я считаю, надо построить «Парные диаграммы» и корреляционную матрицу.
Комбинация гистограмм и диаграмм рассеивания для всего набора данных.
Выводится матрица графиков. На пересечении строки и столбца, которые соответстуют двум показателям, строится диаграмма рассеивания. В главной диагонали матрицы строятся гистограммы распределения соответствующих показателей.
Temperature Humidity Light C02 Humid ity Ratio Occupancy
Temperature 1.000000 -0.141759 0.649942 0.559394 0.151762 0.538220
Humidity -0.141759 1.000000 0.037028 0.439023 0.955198 0.132964
Light 0.649942 0.037328 1.000000 0.664022 0.230420 0,907352
C02 0.559B94 0.439023 0.664022 1.000000 0.626556 0.712235
Humidity Ratio 0.151762 0.955198 0,230420 0.626556 1,000000 0,300282
Occupancy 0.538220 0.132964 0.907352 0.712235 0.300282 1.000000
Ранжируем атрибуты по степени корреляции с целевым признаком: 1. Light — 0,90
Из этого мы можем получить:
• когда человек в помещение, практически всегда в помещении светло.
Поэтому «умному дому» стоит самому включать свет, когда кто-то есть, и выключать в противном случае.
• наличие человека в помещении влияет на концентрацию углекислого газа
Следовательно, стоит включать циркуляцию воздуха в присутствии человека.
• наличие человека коррелирует с температурой воздуха в помещении.
Такое может быть лишь в помещениях, в которых отсутствует система поддержания температуры и человек включает систему отопления вручную. Умный дом должен сам поддерживать необходимую температуру. Как мы выяснили раньше, это 21,75 градуса.
Остальные зависимости (полученные из корреляционной матрицы для целевого), по моему субъективному мнению, незначительные.
Был выполнен первичный анализ данных и получены значения корреляции атрибутов. Выполнено ранжирование по степени влияния целевого атрибута с другими.