Міністерство освіти і науки УкраїниНТУУ «КПІ ім. І. Сікорського»
Кафедра цифрових технологій в енергетиці
Вступ до інтелектуального аналізу даних
Лабораторна робота № 1
Варіант №21
Лабораторна робота № 1
Робота з датасетом. Аналіз датасету. Опанування базових навичок мови R
Завдання
1. Імпортувати дані, що відповідають вашому варіанту, до системи R.
2. Проаналізувати дані, що відповідають вашому варіанту, і визначити мету класифікації та ознаку, яка містить мітку класу.
3. Виконати попередній аналіз даних, застосувавши описові статистики:
a. Вивести на екран перші 15 рядків.
b. Визначити виміри та структуру масиву даних.
c. Визначити частку даних кожного класу в загальному наборі.
d. Визначити стандартне квадратичне відхилення та коефіцієнт асиметрії для кожної ознаки числового типу.
e. Обчислити матрицю кореляції для ознак.
4. Виконати візуалізацію даних.
a. Побудувати гістограми для ознак числових типів та стовпчикові діаграми для категоріальних типів.
b. Побудувати діаграму аналізу кореляції.
c. Побудувати діаграми «ящик з вусами» (box and whiskers plot) для ознак числових типів
d. Побудувати попарні діаграми розсіяння (scatterplot) для ознак числових типів
e. Побудувати графіки емпіричної функції розподілу (density) для ознак числових типів
5. Зробити висновки та написати звіт.
Варіант №21 (1) /
По варіанту ми маємо набір даних для оцінки точної кількості мешканців у кімнаті за допомогою кількох неінтрузивних датчиків навколишнього середовища, таких як температура, світло, звук, CO2 та PIR.
Хід роботи
1. Імпортувати дані, що відповідають вашому варіанту, до системи R.
/
Отримуємо змінну з даними на 10129 записів з 19 змінних.
/
2. Проаналізувати дані, що відповідають вашому варіанту, і визначити мету класифікації та ознаку, яка містить мітку класу.
Можемо побачити, що метою класифікації є визначення точної кількості мешканців у кімнаті готелю. Для цього використовуються різні датчики. Міткою класу (вихідною змінною) буде змінна Room_Occupancy_Count.
3. Виконати попередній аналіз даних, застосувавши описові статистики:
a. Вивести на екран перші 15 рядків.
Виводимо за допомогою head(data, n=15), де n=15 – кількість рядків, яку потрібно вивести.
/
b. Визначити виміри та структуру масиву даних.
Це робимо за допомогою dim(data) та str(data) відповідно. Перша функція виводить розміри масиву даних (бачимо 10129 записів по 19 змінних), а str() виводить інформацію про структуру об'єкта. Вона показує тип даних, розмір, список елементів, які містяться в об'єкті та інші деталі. Ми бачимо на скріншоті скільки записів і змінних, що є купа змінних (дата, час, с1_темп,…).
/
c. Визначити частку даних кожного класу в загальному наборі.
Це ми можемо зробити так: round(prop.table(table(data$Date))*100, 2). Цей код визначає частку даних кожного класу у стовпці Date у відсотках. Він спочатку викликає функцію table(), яка підраховує, скільки раз з’являється кожен клас в стовпці. Потім функція prop.table() використовується для визначення частки даних кожного класу відносно загальної кількості випадків. Після цього ми множимо на 100 і округляємо до 2 знаків після коми. У коді розраховано частку даних кожного класу для більшості стовпчиків.
Також можемо це все скоротити за допомогою циклу фор, який проходиться по всім елементам, отриманих за допомогою sapply(sapply(data[,], table), prop.table). Тут ми приміняємо до всіх стовпчиків data спочатку функцію table, а потім prop.table.
/
/
/
d. Визначити стандартне квадратичне відхилення та коефіцієнт асиметрії для кожної ознаки числового типу.
Для визначення коефіцієнту асиметрії скористаємось функцією skewness() бібліотеки moments. Цей показник є мірою нормальності розподілу даних. Якщо він рівний 0, то розподіл є симетричним. Якщо більше 0, то розподіл скошений вправо, а якщо менше, то скошений вліво. Як бачимо, дані скошені вправо. За допомогою sapply() примінимо skewness() до 3-19 колонки фрейму – саме тут числові значення.
/
Стандартне квадратичне відхилення можна обчислити за допомогою функції sd(). Воно показує розсіювання даних відносно їх середнього значення. Аналогічно, за допомогою sapply() зменшуємо собі кількість роботи.
/
e. Обчислити матрицю кореляції для ознак.
За допомогою функції cor(data[,3:19]) обчислюємо матрицю кореляції, в неї передаємо всі числові стовпці фрейму (3-19). У матриці кореляції значення на головній діагоналі будуть дорівнювати 1 (оскільки кожна ознака матиме кореляцію 1 з собою ж), а значення поза головною діагоналлю будуть відображати кореляцію між ознаками. Значення кореляції знаходяться в діапазоні від -1 (для повної зворотної кореляції) до 1 (для повної прямої кореляції), де значення 0 вказує на відсутність кореляції між ознаками. Чим ближче до 0 по модулю значення кореляції, тим сильніший зв'язок. Опис того, що бачимо на матриці кореляції наведено трохи пізніше.
/
4. Виконати візуалізацію даних.
a. Побудувати гістограми для ознак числових типів та стовпчикові діаграми для категоріальних типів.
Гістограма зображується в вигляді послідовності стовпчиків, де висота стовпчика відображає частоту певного діапазону значень. Наприклад, на наступному рисунку гістограма значень температури 3 датчику, частіше всього температура +-24.6 градуса по Цельсію.
/
Стовпчикова діаграма складається з вертикальних стовпчиків, що представляють кількісні значення даних. Кожен стовпчик має вісь, яка показує значення на горизонтальній осі.
Наприклад, на наступній діаграмі (3 датчик температури S3_Temp) ми бачимо всі температури протягом певного часу. Візьмемо ще діаграму з даними кількості людей в кімнаті і побачимо, що температура зазвичай вища тоді, коли є люди.
//
Гістограми будуємо за допомогою hist(data[,3], main=names(data)[3]), де замість 3 будь-яке число від 3 до 19 (індекси стовпців в нашому датасеті числового типу). main=names(data)[3] дає назву гістограмі по назві стопвця. У звіті наведено кілька гістограм, адже всі банально займуть дуже багато місця (34 діаграми буде). Тим не менш, програма має код для виведення всіх. Аналогічно і зі стовпчиковими діаграмами, вони будуються за допомогою, наприклад, barplot(data[,3], main=names(data)[3]).
b. Побудувати діаграму аналізу кореляції.
За допомогою функції corrplot() з однойменної бібліотеки рисуємо графік матриці кореляції.
/
На рисунку ми можемо побачити, що більше всього корелюють, наприклад, 1 датчик температури (S1_Temp) з 2-4 датчиком температури і з датчиком S5_CO2.
1 датчик світла S1_Light корелює найбільше з 1 датчиком температури, 2-3 світла, 1 звуку, S5_CO2 і головним параметром Room_Occupancy_Count.
Більше всього нас цікавить параметр Room_Occupancy_Count, бо він визначає основний параметр для цього датасету. Він параметр більше за всього корелює з 1-3 датчиками температури, 1-3 світла, 1 звуку, S5_CO2 і датчиком руху S7_PIR.
/
c. Побудувати діаграми «ящик з вусами» (box and whiskers plot) для ознак числових типів
Аналогічно до пункту 4а, продемонстровано буде далеко не всі діаграми. Будуємо за допомогою boxplot(data[,5], main=names(data)[5]) для 3 датчика температури.
На діаграмі "ящик з вусами" можемо побачити медіану (лінія в середині "ящика", має значення 25+- градусів цельсія), квартилі (показники, які ділять впорядкований набір даних на чотири рівних частини), мінімальне і максимальне значення ("вуса", лінії, що йдуть від "ящика"), дозволяє виявити викиди (точки поза "вусами") та порівняти розподіл різних ознак між собою.
/
На графіку 1 датчику температури вже є викиди – 2 точки зверху над вусами.
/
d. Побудувати попарні діаграми розсіяння (scatterplot) для ознак числових типів
Діаграма розсіювання використовується для візуалізації взаємозв'язку між двома змінними. Вона з точок на площині.
Діаграма розсіювання дозволяє визначити, чи є зв'язок між двома змінними, і який цей зв'язок: прямий, зворотний або відсутній. Якщо точки на графіку розташовані вздовж лінії, то можна стверджувати про прямий зв'язок між змінними. Якщо в формі оберненої "U", то можливо є зворотній зв'язок. Якщо випадково, то зв'язку між змінними нема.
Всі за раз вивести не вийде, тому розіб’ємо на 2 частини. Тим не менш, у кожній частині буде змінна Room_Occupancy_Count – бо це головна змінна датасету.
/
/
/
На рисунках ми можемо бачити пряму залежність між Room_Occupancy_Count та майже усіма показниками (окрім PIR і ще кількох датчиків, в усіх можна провести умовну пряму через точки). Яскраво виражена пряма залежність попарно між датчиками температури, де точки самі складають майже пряму.
e. Побудувати графіки емпіричної функції розподілу (density) для ознак числових типів
Графіки побудуємо за допомогою бібліотеки lattice і функції density з неї. Використаємо команду plot(density(data[,3]), main=names(data)[3]). Замість 3 може бути будь-яке число від 3 до 19 в даному випадку (числові стовпці в датасеті). Знову ж таки, наведено буде не всі.
Емпірична функція розподілу обчислюється як доля спостережень у вибірці. Якщо ми візуалізуємо функцію графічно, ми отримаємо емпіричну функцію розподілу, яка може допомогти оцінити розподіл вибірки та порівняти її з теоретичними розподілами.
Наприклад, тут ми бачимо, що частіше всього зустрічається температура 25.1 та 25.5 на 1 датчику температури
/
А тут можемо побачити, що частіше всього в кімнаті знаходиться 0 людей, а рідше всього – 1 людина.
/
Висновки
Отже, на лабораторній роботі здобуто навички роботи з датасетом, його аналізом, опановано базові навички мови R.
Імпортовано дані з .csv файлу, проаналізовано їх. Виконано попередній аналіз даних, застосовано різні описові статистики, наприклад визначено частку кожного класу в загальному наборі даних, визначено стандартне квадратичне відхилення та коефіцієнт асиметрії. Обчислено матрицю кореляції, а потім візуалізовано її. Побудовано гістограми і стовпчикові діаграми, «ящик з вусами», діаграми розсіяння і графіки емпіричної залежності. Всі отримані дані графіки, гістограми і діаграми розібрано, проаналізовано і пояснено.
Повний код програми
# Встановимо робочу директорію
setwd("C:/Users/user/Documents/RDATA")
getwd()
#1. Завантажуємо дані з файлу з оцінками зайнятості кімнат
data <- read.csv("Occupancy_Estimation.csv")
#2. Визначити мету класифікації та ознаку, яка містить мітку класу.
#В звіті
#3. Виконати попередній аналіз даних, застосувавши описові статистики:
#3а. Вивести перші 15 рядків
head(data, n=15)
#3b. Визначити виміри та структуру масиву даних
# Виміри масиву даних
dim(data)
# Структура
str(data)
# Бачимо, що в фреймі міститься 10129 записів з 19 змінних (дата, час, с1_темп,.....)
#3c. Визначити частку даних кожного класу в загальному наборі.
#Разом все
for(i in sapply(sapply(data[,], table), prop.table)){
print(round(i*100, 2))
}
#По одному, вручну для деяких
round(prop.table(table(data$Date))*100, 2)
round(prop.table(table(data$S1_Temp))*100, 2)
round(prop.table(table(data$S1_Light))*100, 2)
round(prop.table(table(data$S1_Sound))*100, 2)
round(prop.table(table(data$S5_CO2))*100, 2)
round(prop.table(table(data$S6_PIR))*100, 2)
round(prop.table(table(data$Room_Occupancy_Count))*100, 2)
#3d. Визначити стандартне квадратичне відхилення та коефіцієнт асиметрії для кожної ознаки числового типу.
library(moments)
#Коефіцієнт асиметрії
sapply(data[,3:19], skewness)
#Стандартне квадратичне відхилення
sapply(data[,3:19], sd)
#3e. Обчислити матрицю кореляції для ознак.
corrMatrix <- cor(data[,3:19])
corrMatrix
#4. Виконати візуалізацію даних.
#4a. Побудувати гістограми для ознак числових типів та стовпчикові діаграми для категоріальних типів.
#Гістограми, вручну
hist(data[,3], main=names(data)[3])
hist(data[,4], main=names(data)[4])
hist(data[,5], main=names(data)[5])
hist(data[,6], main=names(data)[6])
hist(data[,7], main=names(data)[7])
hist(data[,8], main=names(data)[8])
hist(data[,9], main=names(data)[9])
hist(data[,10], main=names(data)[10])
hist(data[,11], main=names(data)[11])
hist(data[,12], main=names(data)[12])
hist(data[,13], main=names(data)[13])
hist(data[,14], main=names(data)[14])
hist(data[,15], main=names(data)[15])
hist(data[,16], main=names(data)[16])
hist(data[,17], main=names(data)[17])
hist(data[,18], main=names(data)[18])
hist(data[,19], main=names(data)[19])
#Гістограми, циклом
for(i in 3:19) {
hist(data[,i], main=names(data)[i])
}
#Стовпчикові діаграми, вручну
barplot(data[,3], main=names(data)[3])
barplot(data[,4], main=names(data)[4])
barplot(data[,5], main=names(data)[5])
barplot(data[,6], main=names(data)[6])
barplot(data[,7], main=names(data)[7])
barplot(data[,8], main=names(data)[8])
barplot(data[,9], main=names(data)[9])
barplot(data[,10], main=names(data)[10])
barplot(data[,11], main=names(data)[11])
barplot(data[,12], main=names(data)[12])
barplot(data[,13], main=names(data)[13])
barplot(data[,14], main=names(data)[14])
barplot(data[,15], main=names(data)[15])
barplot(data[,16], main=names(data)[16])
barplot(data[,17], main=names(data)[17])
barplot(data[,18], main=names(data)[18])
barplot(data[,19], main=names(data)[19])
#Стовпчикові діаграми, циклом
for(i in 3:19) {
barplot(data[,i], main=names(data)[i])
}
#4b. Побудувати діаграму аналізу кореляції.
library(corrplot)
corrplot(corrMatrix, method = "color")
#4c. Побудувати діаграми «ящик з вусами» (box and whiskers plot) для ознак числових типів
for(i in 3:19) {
boxplot(data[,i], main=names(data)[i])
}
boxplot(data[,3], main=names(data)[3])
#4d. Побудувати попарні діаграми розсіяння (scatterplot) для ознак числових типів
pairs(data[c(3:10, 19)])
plot.new()
pairs(data[11:19])
#4e. Побудувати графіки емпіричної функції розподілу (density) для ознак числових типів
library(lattice)
for(i in 3:19) {
plot(density(data[,i]), main=names(data)[i])
}