Научная статья на тему 'Разведочный анализ данных с помощью Python'

Разведочный анализ данных с помощью Python Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
2422
345
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
DATA SCIENCE / EXPLORATORY ANALYSIS / PYTHON / JUPYTER NOTEBOOK / GOOGLE COLABORATORY / РАЗВЕДОЧНЫЙ АНАЛИЗ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Григорьев Е.А., Климов Н.C.

В статье рассматривается разведочный анализ данных. Описываются инструменты реализации анализа, библиотеки Python. Представлен пример выполненный на данных обнаружению присутствия людей в помещении.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.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Разведочный анализ данных с помощью Python»

УДК 004.6

Информационные технологии

Григорьев Е. А., студент факультет "Информатика и системы управления " Московский государственный технический университет

имени. Н.Э. Баумана Россия, г. Москва Климов Н. C., студент факультет "Информатика и системы управления" Московский государственный технический университет

имени. Н.Э. Баумана Россия, г. Москва

РАЗВЕДОЧНЫЙ АНАЛИЗ ДАННЫХ С ПОМОЩЬЮ PYTHON

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

Ключевые слова: data science, разведочный анализ, Python, Jupyter Notebook, Google Colaboratory.

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.

Keywords: data science, exploratory analysis, Python, Jupyter Notebook, Google Colaboratory.

1. Введение

Датасет (Dataset) - набор данных.

Импьютация - это процесс замены отсутствующих данных (пропусков) замещаемыми значениями.

Ни для кого не секрет, что сегодня информация играет очень важную роль в нашей жизни. На сегодняшний день ее объемы колоссальны и продолжают расти.

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

2. Входные данные

В качестве входного датасета будем использовать набор данных по обнаружению присутствия людей в помещении [1].

На сегодняшний день, эта задача является очень актуальной для создания "умных домов", которые создают условия для комфортной жизни и(или) работы.

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

Датасет состоит из трех файлов:

• datatraining.txt - обучающая выборка (ее мы будем анализировать)

• datatest.txt - тестовая выборка

• datatest2.txt - тестовая выборка большего размера.

Каждый файл содержит следующие колонки:

date - дата-время в формате ГОД-МЕСЯЦ-ДЕНЬ ЧАСЫ:МИНУТЫ:СЕКУНДЫ. Набор данных содержит данные с интервалом измерения в минуту.

Temperature - температура в градусах Цельсия.

Humidity - относительная влажность в %.

Light - освещенность в Люксах.

CO2 - концентрация углекислого газа в миллионных долях.

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

Occupancy - целевой признак. Если в помещении находятся люди, то 1, иначе 0.

3. Инструменты

Анализ будем проводить на языке Python.

Из наиболее известных и широко используемых инструментов - Jupyter Notebook [2] и Google Colaboratory [3].

Jupyter Notebook и Google Colaboratory невероятно мощные инструменты, которые позволяют в интерактивном режиме выполнять анализ данных.

Проведем их сравнение:

Jupyter Notebook Google Colaboratory *.py

Модель распространения Бесплатно Бесплатно Бесплатно

Возможность запуска локально Есть Отсутствует Есть

Возможность запуска "в облаке" Есть Есть Есть

CPU Есть Есть Есть

Поддержка GPU Есть Есть Есть

Интерактивный режим Присутствует Присутствует Отсутствует

В нашем случае, разницы особой не будет, т к все производимые вычисления в пределах данной статьи нересурсоемкие. Для демонстрации я буду использовать Jupyter Notebook. Я его выбрал потому, что в нем присутствует интерактивный режим и Jupyter может работать локально.

4. Разведочный анализ

Для начала подключим все необходимые библиотеки:

pandas - это Python библиотека для анализа и обработки данных [5].

mathplotlib - библиотеки визуализации [6],

seaborn - обёртка над matplotlib, привносящая в неё множество улучшений, дополнений [7].

Загрузим данные, которые будем анализировать. Загружаем файлы датасета с помощью библиотеки Pandas. Мы будем читать из файла. Не смотря на то, что файлы имеют расширение txt они представляют собой данные в формате CSV. Обычно в файлах такого формата в качестве разделителей используются символы ",", ";" или табуляция. Поэтому вызывая метод read_csv всегда стоит явно указывать разделитель данных с помощью параметра sep. Чтобы узнать какой разделитель используется в файле его рекомендуется предварительно посмотреть в любом текстовом редакторе. В нашем случае это запятая.

Данные мы получили. Теперь посмотрим первые 5 строк:

In [3] : # Первые 5 строк датасета data.headf)

Out [3 ] :

date Temperature Humidity Light со г HumidityRatio Occupancy

1 2015-02-04 17:51:: 00 23.1а 27.2720 426.0 721.25 0.004703 1

2 2015-02-04 17:51:59 23.15 27.2675 429.5 714.00 0.004733 1

3 2015-02-04 17:53:00 23.15 27.2450 426.0 713.50 0.004779 1

4 2015-02-04 17:54:00 23.15 27.2000 426.0 709.25 0.004772 1

& 2015-02-04 17:55:00 23.10 27.2000 426.0 704.50 0.004757 1

Примечание: Можно указать явное кол-во строк, для этого надо передать функции необходимое значение. Узнаем размер данных:

print('Всего колонок: {>'.format(column count)) С помощью метода columns, получаем названия колонок:

In [6]: data.columns

Out [б] : lndex( [ date", 'Temperature',. 1 Humidity1, 'Light', C02', 1 HumidityRatio ' 1 Occupancy1], dtype='object')

С помощью dtypes - типы данных в колонках. In [7] : data.dtypes

Out[7]: date object

Temperature float64

Humidity float64

Light float64

C02 float64

HumidityRatio float64

Occupancy int64 dtype: object

Последнее, что необходимо сделать перед самим анализом данных -проверить наличие пропусков.

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

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

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

1п [8] : (1а1а.(1е£СГ±ЬеО

0и±[3] :

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

25% 19.700000 20,200000 0.000000 439.000000 0.003073 0.000000

50% 20.390000 26,222500 0.000000 453.500000 0.003801 0.000000

75% 21.390000 30 533333 256.375000 бзааззззз 0.004352 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>

19 20 21 22 23

Temperature

0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0.0

Бросается в глаза наличие двух "горбиков". Интересно, почему их два, а не один? Я считаю, что это может быть связано с тем, для какой цели даннное помещения предназначается: дом или работа (офисное помещение). На мой взгляд, дома обычно теплее, чем на работе. К сожалению, получить точный ответ, основываясь лишь на данном датасет нельзя.

Парой, для демонстрации хорошо подходит "Ящик с усами" или он же Box plot [4]. Это график демонстрирующий одномерное распределение вероятности.

In [21]: sns.boxplot(x=data[ 'Temperature' ])

Out[21]: <matplotLib.axes._subpLots.AxesSubplot at 0x7f7ac9e59198>

19 20 21 22 23

Temperature

Получили среднюю температуру в помещении на интервале всего времени: когда помещение пустое и когда в нем кто-нибудь есть.

Однако, нам нужно знать какую температуру надо выставлять в доме в присутствии человека. Для этого отфильтруем данные и посроим иной ящик с усами. Условие фильтрации - наличие человека.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

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>

19.5 20.0 20.5 21.0 21.5 22.0 22.5 23.0 Temperature

Из этого графика можно сделать вывод, что стоит поддерживать температуру около 21,75 градуса.

Чтобы получить общую картину, я считаю, надо построить "Парные диаграммы" и корреляционную матрицу.

"Парные диаграммы"

Комбинация гистограмм и диаграмм рассеивания для всего набора данных.

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

In [9]: sns. pairplot(data)

Корреляционная матрица

In [11]: data.corrO

Out[111 :

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

2. CO2 - 0,71

3. Temperature - 0,54

4. HumidityRatio - 0,30

5. Humidity - 0,13.

Из этого мы можем получить:

• когда человек в помещение, практически всегда в помещении светло.

Поэтому "умному дому" стоит самому включать свет, когда кто-то есть, и выключать в противном случае.

• наличие человека в помещении влияет на концентрацию углекислого газа

Следовательно, стоит включать циркуляцию воздуха в присутствии человека.

• наличие человека коррелирует с температурой воздуха в помещении.

Такое может быть лишь в помещениях, в которых отсутствует система поддержания температуры и человек включает систему отопления вручную. Умный дом должен сам поддерживать необходимую температуру. Как мы выяснили раньше, это 21,75 градуса.

Остальные зависимости (полученные из корреляционной матрицы для целевого), по моему субъективному мнению, незначительные.

5. Вывод

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

Библиографический список:

1. Dataset [Электронный ресурс]

https://archive.ics.uci.edu/ml/datasets/Occupancy+Detection+ (Дата обращения: 10.11.2019).

2. Jupyter Notebook [Электронный ресурс] https://jupyter.org/ (Дата обращения: 10.11.2019).

3. Google Colaboratory [Электронный ресурс] https://colab.research.google.com/ (Дата обращения: 10.11.2019).

4. Ящик с усами [Электронный ресурс] https://ru.wikipedia.org/wiki/%D0%AF%D1%89%D0%B8%D0%BA_%D1%81_% D1 %83%D 1 %81 %D0%B0%D0%BC%D0%B8 (Дата обращения: 10.11.2019).

5. Pandas [Электронный ресурс] https://pandas.pydata.org/ (Дата обращения: 10.11.2019).

6. MathPlotLib [Электронный ресурс] https://matplotlib.org/ (Дата обращения: 10.11.2019).

7. Seaborn [Электронный ресурс] https://seaborn.pydata.org/ (Дата обращения: 10.11.2019).

i Надоели баннеры? Вы всегда можете отключить рекламу.