Задача 1

Перевірити (для деяких значень) також твердження:

  1. \(n^2 - n\) завжди ділиться на 2

  2. \(n^4 - n\) завжди ділиться на 4

  3. \(n^5 - n\) завжди ділиться на 5

Перевірка першого завдання

x <- 1:100
(x^2-x)/2
##   [1]    0    1    3    6   10   15   21   28   36   45   55   66   78   91
##  [15]  105  120  136  153  171  190  210  231  253  276  300  325  351  378
##  [29]  406  435  465  496  528  561  595  630  666  703  741  780  820  861
##  [43]  903  946  990 1035 1081 1128 1176 1225 1275 1326 1378 1431 1485 1540
##  [57] 1596 1653 1711 1770 1830 1891 1953 2016 2080 2145 2211 2278 2346 2415
##  [71] 2485 2556 2628 2701 2775 2850 2926 3003 3081 3160 3240 3321 3403 3486
##  [85] 3570 3655 3741 3828 3916 4005 4095 4186 4278 4371 4465 4560 4656 4753
##  [99] 4851 4950

Задача 2

Отримати наступні послідовності:

  1. Всі непарні числа від 1 до 100

  2. Всі числа, що кратні 5 від 1 до 200

  3. Числа виду \(n\pi\) де \(n\) від 1 до 10

Функції

average <- function(x) { # є стандартна реалізація mean
    n <- length(x)
    sum(x) / n
}

Задача 4.

  1. Створити послідовність \(\frac{n(n + 1)}{2}\) і порівняти її з сумою \(1 + 2 + ... + n\)

  2. Створити послідовність \(\frac{n^2(n + 1)^2}{4}\) і порівняти її з сумою \(1^3 + 2^3 + ... + n^3\)

Розв’язок для першого завдання

x <- 1:100
test <- function(n){
  sum(1:n) == n*(n + 1)/2
}
test(10)

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

square <- function(x) {
  x^2
}
square(1:5)
## [1]  1  4  9 16 25

Напишіть функцію, яка повертає \(x^2 + y^2\)

Що таке відсотки?

my_percent <- function(x, p) {
  x * p/100
}
my_percent_growth <- function(x, p){
  x * (1 + p/100)
}

Як зростає депозит?

Людина дає гроші банку. Банк визначає ставку. Потім щорічно банк додає до суми відсотки. За рік отримаємо:

my_percent_growth(100,15)
## [1] 115

Як зростає депозит за декілька років (складні відсотки)?

my_percent_growth <- function(x, p, n = 1){
  x * (1 + p/100)^n
}

За десять років

my_percent_growth(100,15,10)
## [1] 404.5558
my_percent_growth(100,15,20)
## [1] 1636.654
my_percent_growth(100,15,30)
## [1] 6621.177

Правило 72

Якщо поділити 72 на відсотки ми отримаємо час подвоєння депозита. задачка - перевірити правило :)

Задача

Що вигідніше покласти 100 грн на 10 років під 15 відсотків, чи 500 на рік під 15 відсотків?

Домашнє завдання (на тиждень)

  1. Створіть наступні послідовності (з використанням тільки функцій seq rep і ʼ:ʼ):

1.1. 1 1 3 3 5 5 7 7 1 1 3 3 5 5 7 7

1.2. 3 5 7 9 11 8 10 12 14 16

1.3. 2 3 4 5 7 8 9 10 12 13 14 15

1.4. 2 4 6 9 11 13 16 18 20 20 22 24 27 29 31 34 36 38

Домашнє завдання. Відповіді.

rep(seq(1,7,2),times = 2,each = 2)
seq(1,10,1) + seq(2,6,1)
seq(1,12,1) + rep(1:3,each = 4)
rep(1:3,2,each=3) + seq(1,36,2)

Домашнє завдання (на тиждень)

  1. Для вектору часу затримки між виверженнями гейзеру знайти:

2.1. Кількість вимірів у векторі

2.2. Суму всіх елементів

2.3 Кількість всіх елементів, що більші за середнє.

Домашнє завдання. Відповіді.

w <- faithful$waiting
sum(w > mean(w)) 

Домашнє завдання (на тиждень)

  1. Створити послідовність Фібоначчі: 1, 1, 2, 3, 5, 8, … Кожен наступний дорівнює сумі двох попередніх. Перші два - одиниці. Обчислити перші 100 елементів.

  2. Створити послідовність за попереднім правилом для початкових чисел 1, 3.

  3. Перевірити що \(n^3 + (n+1)^3 + (n+2)^3\) ділиться на 9.

  4. Створити послідовність чисел, що діляться на 3 або 7 або 9 без залишку.

Фібоначчі 1

phib <- function(x,n){
  x[n] <- x[n- 1] + x[n - 2]
  x
}
phib_seq <- function(n){
  x <- rep(1,n)
  for (i in 3:n){
    x <- phib(x,i)
  }
  x
}

Фібоначчі 2

vast=function(n){
  x = c(1,1)
  for(i in 3:n) x[i] = x[i-1] + x[i-2]
  return(x)}

Створити послідовність чисел, що діляться на 3 або 7 або 9 без залишку.

Теми на сьогодні

Factors

Фактори необхідні для роботи з даними. Вони використовуються для представлення категоріальних даних :)

Приклад: тест

x <- c("так","так","ні","ні","ні","ні","так","ні")
class(x) # тип вектора 
str(x) # структура 
length(x) # довжина
unique(x) # унікальні значення

Factors

Але це ж просто відповіді на питання - є два варіанти - так і ні

x <- factor(x)
class(x)
str(x)
length(x)
unique(x)

Factors

Тепер можна обчислювати кількість

table(x)
## x
##   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90 
##   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1 
##  91  92  93  94  95  96  97  98  99 100 
##   1   1   1   1   1   1   1   1   1   1
summary(x)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00   25.75   50.50   50.50   75.25  100.00

Задача

Згенерувати вектор з “так” і “ні”. Як це зробити?

Випадковість і ймовірність.

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

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

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

x <- sample(1:100,5) # 5 випадкових чисел з проміжку 1 - 100
x <- sample(c("так","ні"),100,replace = TRUE) # 100 випадкових відповідей так ні
y <- sample(c("чоловік","жінка"),100,replace = TRUE,prob = c(0.7,0.3))

порахуємо кількість так і ні

Створення таблиць

z <- table(x,y) # таблиця з частотами появи елементів
prop.table(z) # пропорційні частки
##      y
## x     жінка чоловік
##   ні   0.13    0.36
##   так  0.18    0.33

Зображення табличних даних

mosaicplot(z,color = TRUE)

Зображення табличних даних

 mosaicplot(z,
            main="Наша табличка",
            xlab="Відповідь",
            ylab="Стать",
            color = "blue")

Data frames

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

Створення DF

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

Створимо датафрейм з наших відповідей

survey <- data.frame(y,x)
names(survey) <- c("Стать","Ви п'єте каву з молоком?")

Додавання нової колонки

z <- sample(c("Jacobs","Lavazza","Nescafe","Ambassador","Chibo"),100,replace = TRUE)
survey$temp <- z 
names(survey) <- c("Стать","Ви п'єте каву з молоком?", "Ваша улюблена кава")

Властивості DF

наступні функції корисні для роботи з датафреймами

str(df)
## 'data.frame':    4 obs. of  2 variables:
##  $ a: int  1 2 3 4
##  $ b: Factor w/ 4 levels "a","b","c","d": 1 2 3 4
summary(df)
##        a        b    
##  Min.   :1.00   a:1  
##  1st Qu.:1.75   b:1  
##  Median :2.50   c:1  
##  Mean   :2.50   d:1  
##  3rd Qu.:3.25        
##  Max.   :4.00

Властивості DF

наступні функції корисні для роботи з датафреймами

class(df)
## [1] "data.frame"
df$a
## [1] 1 2 3 4

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

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

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

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

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

Читання DF з файлу

population <- read.csv("/home/oleksii/MyCode/R/BrovaryLectures/Data/population-for-ukraine.csv")
head(population)
##   Year Population.for.Ukraine
## 1 1990                 51.370
## 2 1991                 51.361
## 3 1992                 51.314
## 4 1993                 51.217
## 5 1994                 51.053
## 6 1995                 50.812

Редагування датафрейму

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("Рік","Населення")

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

population2$Населення <- population2$Населення/1000000

Ми хочемо утворити новий датафрейм - додати виміри

давайте придумаємо як знайти інформацію, яка нам потрібна?

візуалізація

population3 <- merge.data.frame(population,population2, all = TRUE,by = "Рік")
plot(population3$Рік,population3$Населення.x,type="l",col="red")
lines(population3$Рік,population3$Населення.y,col="green")

візуалізація

попередній графік трохи не потрапляв у границі

population3 <- merge.data.frame(population,population2, all = TRUE,by = "Рік")
plot(population3$Рік,population3$Населення.y,type="l",col="red")
lines(population3$Рік,population3$Населення.x,col="green")

візуалізація

Особливість - відсутні дані

Більшість датасетів має відсутні дані. Відсутні дані в R позначаються NA (not available).

Важливо зрозуміти як R опрацьовує відсутні дані.

NA + 5
## [1] NA
NA == NA
## [1] NA
NA != NA
## [1] NA

Особливість - відсутні дані

is.na(NA)
## [1] TRUE
is.na(4)
## [1] FALSE
v <- c(1,NA,2)
sum(v)
## [1] NA

параметри дітей

kids <- read.csv("/home/oleksii/MyCode/R/BrovaryLectures/Data/kids_H_W.csv", stringsAsFactors = FALSE)
head(kids)
##   Index Height.Inches. Weight.Pounds.
## 1     1       65.78331       112.9925
## 2     2       71.51521       136.4873
## 3     3       69.39874       153.0269
## 4     4       68.21660       142.3354
## 5     5       67.78781       144.2971
## 6     6       68.69784       123.3024

Незручний датасет

Виміри у дюймах та фунтах. Жах

Завдання: створити функцію, що переводить дюйми у сантиметри, а фунти у кілограми та застосувати її до датасету.

робота з датасетом

plot(kids[-1])

Домашнє завдання

  1. Зробити виміри своєї сім’ї та внести їх до датафрейму.

  2. Виділити іншим коліром ваші точки щоб зрозуміти де ви у цій множині.

  3. Імпортувати датасети для країн світу та міст.

Домашнє завдання (продовження)

Завдання: 3.1. Написати три питання, які можна задати спеціалісту з даних з приводу цих даних? 3.2. Написати функцію, яка за назвою міста знаходить країну. 3.3. Написати функцію, яка повертає всі міста для заданох країни.