Почнемо з датафреймів

Data frame

Вектори незалежно від типу є послідовностями даних одного типу. Але дані, як правило мають певну структуру. Як правило, це таблиця з рядками, які відповідають спостереженням. Кожне спостереження містить декілька змінних. Такі структури в R називаються датафреймами (Data frames).

Датафрейм це набір векторів, кожен з яких має бути однакової довжини. Виглядає як двовимірна таблиця. Як правило, ми трактуємо датафрейм як спостереження (рядки) певного набору величин (стовпці).

Створення DF

Для створення DF використовується функція data.frame()

df <- data.frame(a = 1:4, b = letters[1:4])
df
##   a b
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d

Задача

Давайте створемо датафрейм з відповідями на анкету.

завдання:
  1. Потрібно створити датафрейм зі стовпчиками "стать", "Ваша улюблена кава?", "Чи п'єте Ви каву з молоком?", "Скільки чашок кави Ви випиваєте за день?". 
  2. Створити відповіді на цю анкету - спостереження або рядки нашого датафрейму.

Для створення векторів з даними ми будемо використовувати функцію sample:

Використаємо функцію sample()

sample(x, size, replace = FALSE, prob = NULL)
  - x вектор або число
  - n число, кількість потрібних елементів
  - replace чи можна повторювати значення?
  - prob вектор ймовірностей для отримання елементів.

Генеруємо вектори

test <- sample(1:100,5) # 5 випадкових чисел з проміжку 1 - 100
test <- sample(1:3,50,replace = TRUE)

Задача 1. Як порахувати кількість одиниць, двійок і трійок?

підрахувати кількість елементів зі значенням у векторі
використайте функцію table()

Створення датафрейму

Створюємо окремі вектори

x <- sample(c("чоловік","жінка"),100,replace = TRUE,prob = c(0.7,0.3))
y <- sample(c("Jacobs","Lavazza","Nescafe","Ambassador","Chibo"),100,replace = TRUE)
z <- sample(c("так","ні"),100,replace = TRUE)
u <- sample.int(5, 100, replace = TRUE)

Тепер потрібно об’єднати їх у один датафрейм. Для цього є декілька можливостей.

  1. Перша можливість.
df <- data.frame(x,y)
df$z <- z
df$u <- u
head(df)
##         x          y   z u
## 1 чоловік Ambassador  ні 4
## 2   жінка      Chibo  ні 2
## 3 чоловік    Nescafe так 5
## 4 чоловік    Nescafe  ні 5
## 5 чоловік    Lavazza так 4
## 6 чоловік    Lavazza  ні 2
names(df) <- c("Cтать", "Ваша улюблена кава?", "Чи п'єте Ви каву з молоком?", "Скільки чашок кави Ви випиваєте за день?")
head(df)
##     Cтать Ваша улюблена кава? Чи п'єте Ви каву з молоком?
## 1 чоловік          Ambassador                          ні
## 2   жінка               Chibo                          ні
## 3 чоловік             Nescafe                         так
## 4 чоловік             Nescafe                          ні
## 5 чоловік             Lavazza                         так
## 6 чоловік             Lavazza                          ні
##   Скільки чашок кави Ви випиваєте за день?
## 1                                        4
## 2                                        2
## 3                                        5
## 4                                        5
## 5                                        4
## 6                                        2

Це зручно для розуміння що означає той чи інший вектор даних, але для програмування краще короткі англійські терміни.

names(df) <- c("x","y","z","u")

Subset - створення підмножин

subset(df, df$x == "чоловік")
##           x          y   z u
## 1   чоловік Ambassador  ні 4
## 3   чоловік    Nescafe так 5
## 4   чоловік    Nescafe  ні 5
## 5   чоловік    Lavazza так 4
## 6   чоловік    Lavazza  ні 2
## 7   чоловік    Lavazza так 2
## 8   чоловік    Nescafe так 2
## 9   чоловік      Chibo  ні 5
## 10  чоловік      Chibo так 2
## 12  чоловік     Jacobs  ні 3
## 13  чоловік    Nescafe так 1
## 16  чоловік    Lavazza  ні 2
## 17  чоловік Ambassador  ні 5
## 18  чоловік Ambassador  ні 3
## 20  чоловік    Lavazza так 5
## 22  чоловік Ambassador так 4
## 23  чоловік     Jacobs  ні 4
## 24  чоловік    Lavazza  ні 1
## 25  чоловік    Nescafe так 5
## 26  чоловік Ambassador  ні 4
## 27  чоловік    Nescafe  ні 3
## 28  чоловік Ambassador  ні 4
## 29  чоловік      Chibo так 2
## 30  чоловік Ambassador  ні 3
## 31  чоловік      Chibo так 3
## 33  чоловік    Lavazza так 1
## 35  чоловік      Chibo так 4
## 36  чоловік    Lavazza так 5
## 37  чоловік      Chibo так 4
## 38  чоловік      Chibo  ні 2
## 39  чоловік     Jacobs  ні 5
## 40  чоловік     Jacobs так 3
## 41  чоловік    Nescafe так 4
## 42  чоловік    Nescafe так 1
## 43  чоловік    Nescafe  ні 1
## 45  чоловік    Nescafe так 3
## 46  чоловік      Chibo так 3
## 47  чоловік    Lavazza так 5
## 49  чоловік    Nescafe так 3
## 52  чоловік     Jacobs  ні 3
## 54  чоловік      Chibo  ні 1
## 55  чоловік      Chibo так 4
## 59  чоловік    Lavazza  ні 2
## 60  чоловік      Chibo так 1
## 62  чоловік    Nescafe так 4
## 63  чоловік Ambassador  ні 2
## 64  чоловік Ambassador  ні 3
## 65  чоловік      Chibo так 2
## 67  чоловік     Jacobs так 2
## 68  чоловік      Chibo так 1
## 71  чоловік    Nescafe так 3
## 72  чоловік      Chibo так 2
## 74  чоловік Ambassador так 2
## 75  чоловік      Chibo  ні 4
## 76  чоловік    Nescafe так 2
## 78  чоловік Ambassador  ні 3
## 79  чоловік      Chibo  ні 1
## 80  чоловік Ambassador  ні 5
## 81  чоловік    Nescafe  ні 3
## 83  чоловік Ambassador так 1
## 84  чоловік    Lavazza  ні 5
## 85  чоловік      Chibo так 5
## 86  чоловік    Lavazza  ні 2
## 87  чоловік     Jacobs так 5
## 88  чоловік      Chibo так 4
## 90  чоловік    Lavazza  ні 4
## 91  чоловік     Jacobs так 3
## 92  чоловік      Chibo  ні 3
## 94  чоловік    Lavazza  ні 1
## 96  чоловік     Jacobs так 4
## 98  чоловік    Nescafe так 1
## 99  чоловік    Nescafe  ні 3
## 100 чоловік     Jacobs так 5

або можна вибрати всіх людей, що п’ють 5 чашок кави на день

subset(df, u == 5)
##           x          y   z u
## 3   чоловік    Nescafe так 5
## 4   чоловік    Nescafe  ні 5
## 9   чоловік      Chibo  ні 5
## 17  чоловік Ambassador  ні 5
## 20  чоловік    Lavazza так 5
## 25  чоловік    Nescafe так 5
## 36  чоловік    Lavazza так 5
## 39  чоловік     Jacobs  ні 5
## 47  чоловік    Lavazza так 5
## 56    жінка Ambassador  ні 5
## 80  чоловік Ambassador  ні 5
## 84  чоловік    Lavazza  ні 5
## 85  чоловік      Chibo так 5
## 87  чоловік     Jacobs так 5
## 97    жінка    Lavazza  ні 5
## 100 чоловік     Jacobs так 5

Задачки на розминку

Скільки чоловіків п’ють каву з молоком?

Скільки жінок люблять каву Аmbassador?

Скільки людей п’ють більше однієї чашки в день?

Який відсоток людей п’є каву з молоком?

Які долі (відсотки) популярності кожної кавової марки?

Спробуємо поекспериментувати з функцією plot

plot(df$x)

plot(df$y)

Питання до всіх: що буде з іншими стовпцями?

plot(df$y,df$x)

Ще один важливий спосіб аналізу даних це гістограма

hist(islands)

Побудуємо гістограму кількості чашок кави

hist(df$u)

Мозаічний графік

a <- table(df$y,df$x)
prop.table(a)
##             
##              жінка чоловік
##   Ambassador  0.07    0.13
##   Chibo       0.05    0.19
##   Jacobs      0.06    0.10
##   Lavazza     0.04    0.14
##   Nescafe     0.05    0.17
mosaicplot(prop.table(a))

Реальний датасет про каву

Розглянемо тепер реальні дані: файл coffee.csv

coffee <- read.csv2("/home/oleksii/MyCode/R/BrovaryLectures/Data/coffee.csv")
head(coffee)
##   Cups.of.coffee.in.one.week. Cups.of.coffee.outside.home.per.week.
## 1                           3                                     5
## 2                           6                                     4
## 3                          14                                     2
## 4                          28                                    24
## 5                           7                                     0
## 6                          15                                     5
##   Taste.Preference Tempature.Preference
## 1            black               frozen
## 2       milk/cream                  hot
## 3            black                  hot
## 4       milk/cream                  hot
## 5       milk/cream                  hot
## 6       milk/cream                  hot

Завдання 2.

  1. Який відсоток людей любить гарячу, холодну чи зз льодом?

  2. Побудувати гістограму споживання кави.

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

Тепер попрацюємо з датафреймом про населення України

population <- read.csv("/home/oleksii/MyCode/R/BrovaryLectures/Data/population-for-ukraine.csv")
names(population)
## [1] "Year"                   "Population.for.Ukraine"
names(population) <- c("Рік","Населення")

Найпростіша візуалізація

plot(population)

Трошки інша візуалізація

plot(population, type = "l")

Ще про датафрейми

Звернення до елементів

population[1,1]
## [1] 1990
population[1,2]
## [1] 51.37

Отримання рядка і ствопця

population[1,]
##    Рік Населення
## 1 1990     51.37
population[2,]
##    Рік Населення
## 2 1991    51.361
population[,1]
##  [1] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
## [15] 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
population[,2]
##  [1] 51.370 51.361 51.314 51.217 51.053 50.812 50.490 50.096 49.655 49.197
## [11] 48.746 48.311 47.891 47.494 47.127 46.795 46.503 46.249 46.028 45.831
## [21] 45.647 45.478 45.320 45.165 45.002

Отримання рядка і ствопця іншим способом

population[,"Рік"]
##  [1] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
## [15] 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
population$Рік
##  [1] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
## [15] 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014

Але населення важко порахувати, тому важливо мати декілька джерел

population2 <- read.csv("/home/oleksii/MyCode/R/BrovaryLectures/Data/population-for-ukraine2.csv", stringsAsFactors = FALSE)
head(population2)
##   X1990 X51891400
## 1  1991  52000500
## 2  1992  52150400
## 3  1993  52179200
## 4  1994  51921400
## 5  1995  51512800
## 6  1996  51057800

Додаємо імена (аналогічно до попереднього прикладу)

names(population2) <- c("Рік","Населення")

Задача 3.

  1. Як маштабувати і утворити один датасет?

Другий спосіб створення датафреймів - функція merge.data.frame() Для використання потрібно викликати функцію для двох датафреймів, які ми хочемо об’єднати, та задати додаткові параметри:

all = TRUE - означає, що ми хочемо об'єднати всі значення першого датафрейму і всі значення другого.
by = "Рік" - це спільний рядок, в результаті буде створено датафрейм в якому є рядок Рік і всі інші з обох датафреймів
population2$Населення <- population2$Населення/1000000
population3 <- merge.data.frame(population,population2, all = TRUE,by = "Рік")

Завдання додому!

  1. Виконати наступний код і надіслати мені графіки на пошту.

  2. Для датасету animals провести аналіз, який ми вже проходили:

2.1. Знайти максимальні, мінімальні значення.

2.2. Знайти середнє від кожного вектора.

2.3. Створити функцію, яка рахує відношення маси тіла до маси мозку. Обчислити це співідношення для кожної тварини і додати в свій датафрейм (в вашому датафреймі мають бути рядки: animal, body, brain, ratio).

2.4. Побудувати гістограми для ваги тіла і ваги мозку.

2.5. Побудувати графік - залежність між вагою тіла і вагою мозку.

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

library(MASS)
Animals
##                       body  brain
## Mountain beaver      1.350    8.1
## Cow                465.000  423.0
## Grey wolf           36.330  119.5
## Goat                27.660  115.0
## Guinea pig           1.040    5.5
## Dipliodocus      11700.000   50.0
## Asian elephant    2547.000 4603.0
## Donkey             187.100  419.0
## Horse              521.000  655.0
## Potar monkey        10.000  115.0
## Cat                  3.300   25.6
## Giraffe            529.000  680.0
## Gorilla            207.000  406.0
## Human               62.000 1320.0
## African elephant  6654.000 5712.0
## Triceratops       9400.000   70.0
## Rhesus monkey        6.800  179.0
## Kangaroo            35.000   56.0
## Golden hamster       0.120    1.0
## Mouse                0.023    0.4
## Rabbit               2.500   12.1
## Sheep               55.500  175.0
## Jaguar             100.000  157.0
## Chimpanzee          52.160  440.0
## Rat                  0.280    1.9
## Brachiosaurus    87000.000  154.5
## Mole                 0.122    3.0
## Pig                192.000  180.0

Візуалізація

plot(population3$Рік,population3$Населення.x,type="l",col="red") 
lines(population3$Рік,population3$Населення.y, col="green")

Може скластись хибне враження від невірного маштабування

plot.new()
plot.window(xlim=c(1990, 2016),
            ylim = c(0,55))
lines(population3$Рік,population3$Населення.x,type="l",col="red")
lines(population3$Рік,population3$Населення.y,col="green")
axis(1)
axis(2)
box()
title(main = "Населення України",xlab = "Рік", ylab = "Кількість (млн. чол.)")