UVOD U R ZA DATA SCIENCE

Na ovim stranicama ćete naći prezentacije, kod, i predloge za čitanje za kurs Uvod u R za Data Science koji u saradnji sa Startitom organizuje Data Science zajednica Srbije. Startit takođe vodi stranice kursa Uvod u R za Data Science [klikni za Startit verziju kursa]. Predavači na kursu su, dipl. ing Branko Kovač, Data Analyst at CUBE, Data Science Mentor at Springboard, Data Science zajednica Srbije, i dr Goran S. MilovanovićDataScientist@DiploFoundation, Data Science zajednica Srbije.
Molimo da sva pitanja koja imate za predavače postavite kao komentare na ovaj blog!
PREGLED KURSA

Sesija 1, 28. april 2016 :: Uvod u programski jezik R

U prostorijama Starita održali smo prvu sesiju kursa Uvod u R za Data Science u četvrtak, 28. aprila 2016. Kao što smo obećali, pregled kursa i svi nastavni materijali će biti dostupni online za sve koji ne mogu da nam se priključe u Startitu – zbog ograničenog kapaciteta kursa na 15 polaznika – a žele da prođu kroz Uvod u R za Data Science sa nama. Ovde ćemo, posle svake održane sesije kursa, predstavljati te materijale sa komentarima, dodatnim uputsvima, i preporukama za dalje čitanje i učenje.

U skladu sa prethodno iznetim, molimo sve koje ovom prilikom nismo mogli da pozovemo da prisustvuju kursu u Startitu da počnu da uče ovde i ipak ne dolaze na sesije in situ. Organizovaćemo još ovakvih kurseva sigurno, pa ćemo javiti kada bude bilo kapaciteta za još polaznika. Osim što je rad sa više od petnest polaznika prezahtevan za predavače na ovakvom kursu, osim što pravimo gužvu u Startit koji mora da podrži još mnoge ovakve i slične aktivnosti, ako dopustimo učešće i onima koje nismo pozvali ovaj put pravimo i nepravdu prema nekih dvesta i nešto kandidata koji su želeli da rade sa nama a mi nismo mogli da im izađemo u susret. Molimo vas zato da imate razumevanja za ograničenje kapaciteta kursa i da, ako niste pozvani u Startit ovaj put, počnete – do sledeće prilike – sa učenjem R i data science na ovim stranicama.

Prezentacija Uvod u R za Data Science :: Sesija 1

[slideshare id=61510595&doc=intrordatasciencesession1-160429163447]

R skript Uvod u R za Data Science :: Sesija 1

########################################################
# Introduction to R for Data Science
# SESSION 1 :: 28 April, 2016
# Data Science Community Serbia + Startit
# :: Branko Kovač and Goran S. Milovanović ::
########################################################

# This is an R comment: it begins with "#" and ends with nothing
# data source: http://www.stat.ufl.edu/~winner/datasets.html (modified, from .dat to .csv)
# from the website of Mr. Larry Winner, Department of Statistics, University of Florida 

# Data set: RKO Films Costs and Revenues 1930-1941
# More on RKO Films: https://en.wikipedia.org/wiki/RKO_Pictures

# First question: where are we?
getwd(); # this will tell you the path to the R working directory

# Where are my files?
filesDir <- "/home/goran/Desktop/__IntroR_Session1/";
class(filesDir); # now filesDir is a of a character type; there are classes and types in R
typeof(filesDir);
# By the way, you do not need to use the semicolon to separate lines of code:
class(filesDir)
typeof(filesDir)
# point R to where your files are stored
setwd(filesDir); # set working directory
getwd(); # check

# Read some data in csv (comma separated values
# - it might turn out that you will be using these very often)
fileName <- "rko_film_1930-1941.csv";
dataSet 0;
reRelease;
is.logical(reRelease);
# vectors, sequences...
# automatic type conversion (coercing) in R: from real to integer
x

Session1-Fig1 Session1-Fig2

# hm, maybe I should use non-parametric correlation instead
cSpearman

Session1-Fig3 Session1-Fig4

# However, who in the World tests the assumptions of the linear model... Kick it!
reg

Session1-Fig5

# and now for a nice plot
library(ggplot2); # first do: install.packages("ggplot2");not now - it can take a while
# library() is a call to use any R package
# of which the powerful ggplot2 is among the most popular
g

Session1-Fig6

# Q1: Is this model any good?
# Q2: Are there any truly dangerous outliers present in the data set?
# print is also a generic function in R: for example,
print("Doviđenja i uživajte u praznicima uz gomilu materijala za čitanje i vežbu!")

# P.S. Play with:
reg

Čitanje za Uvod u R za Data Science :: Sesija 2

[Sesija će se održati 5. maja 2016, 19h]

Prvih pet poglavlja knjige The Art of R Programming, pokrivaju: uvod u R, vektore, matrice i liste. Na Sesiji 2. će Branko postepeno preći ka data.frame tipu koji je Goran već diskutovao na Sesiji 1, ali sa manje teorijskim i više praktičnim pristupom. Ipak, nećete moći daleko u R bez vektora, matrica, i lista, te je zato ovakav izbor čitanja za narednu sesiju. Pripremite sva pitanja koja možete da imate na osnovu čitanja knjige!

The Art of R Programming, Norman Matloff

Chapter 1 – 5, pp. 1 – 54.

20160428_204815
20160428_193859

Sesija 2, 28. april 2016 :: Uvod u programski jezik R: Vektori, matrice, i data.frame objekat u R

U prostorijama Starita održali smo drugu sesiju kursa Uvod u R za Data Science u četvrtak, 5. maja 2016. Sesiju je vodio Branko Kovač i sa polaznicima diskutovao osnove baratanja vektorima, matricama, i data.frame objektima u programskom jeziku R. Dogovorili smo se da čitanje za Sesiju 3. ne bude uvećano već ostane pri prvih pet poglavlja knjige The Art of R Programming.

Prezentacija Uvod u R za Data Science :: Sesija 2

[slideshare id=61813860&doc=intrordatasciencesession2eng-160509114259]

R skript Uvod u R za Data Science :: Sesija 2

########################################################
# Introduction to R for Data Science
# SESSION 2 :: 5 May, 2016
# Data Science Community Serbia + Startit
# :: Goran S. Milovanović and Branko Kovač ::
########################################################

# clear all
rm(list=ls());

# Let's start with some vectors
char_list <- character(length = 0) #empty character list
num_list <- numeric(length = 10) #length can be != 0, but 0 is default value
log_list <- logical(length = 3) #default value is FALSE

# But you can always use good ol' c() for the same purpose
log_list_2 <- c(TRUE, FALSE, FALSE, TRUE, TRUE, TRUE) #some Ts and Fs
num_list_2 <- c(1, 4, 12, NA, 101, 999) #numb
char_list_2 <- c("abc", "qwerty", "test", "data", "science")

# Factor vectors are also part of R
fac_list <- gl(n = 4, k = 1, length = 8, ordered = T, 
               labels = c("low", "med", "high", "very high")) #only mentioning now 🙂

# Subsetting is regular-thing-to-do when using R
char_list_2[5] #single element can be selected
log_list_2[2:4] #or some interval
num_list_2[3:length(num_list_2)] #or even length() function

# New objects can be created when subsetting
test <- num_list_2[-c(2,4)] #or somthing like this - displays all but 2nd and 4th element
test_2 <- num_list_2 %in% test #operator %in% can be very useful
not_na <- num_list_2[!is.na(num_list_2)] #removing NAs using operator ! and is.na() function

# Vector ordering
sort(test, decreasing = T) #using sort() function
test[order(test, decreasing = T)] #or with order() function

# Vector sequences
seq(1,22,by = 2) #we already mentioned seq()
rep(1, 4) #but rep() is something new 🙂
rep(num_list_2, 2) #replicate num_list_2, 2 times

# Concatenation
new_num_vect <- c(num_list, num_list_2) #using 2 vectors to create new one
new_num_vect
new_combo_vect <- c(num_list_2, log_list) #combination of num and log vector
new_combo_vect #all numbers? false to zero? coercion in action

new_combo_vect_2 <- c(char_list_2, num_list_2) #works as well
new_combo_vect_2 #where are the numbers?
class(new_combo_vect_2) #all characters

# Matrices are available in R
matr <- matrix(data = c(1,3,5,7,NA,11), nrow = 2, ncol = 3) #2x3 matrix
class(matr) #yes, it's matrix
typeof(matr) #double as expected

matr[,2] #2nd column
matr[3,] #oops, out of bounds, there's no 3rd row
matr[2,3] #element in 2nd row and 3rd column

matr_2 <- matrix(data = c(1,3,5,"7",NA,11), nrow = 2, ncol = 3) #another 2x3 matrix
class(matr_2) #matrix again
typeof(matr_2) #but not double anymore, type conversion in action!
t(matr_2) #transponed matr_2

# What can we do if a matrix needs to encompass different types of data?
# Introducing data frame!

library(datasets) #there are some datasets in base R like mtcars
cars_data <- mtcars

# Some useful information about data frames
str(cars_data) #lets see what we have here
summary(cars_data) #more information about mtcars dataset
names(cars_data) #column names
?mtcars #dataset documentation is *very* important

# Think of data frame columns as vectors! Because they are!
mean(cars_data$mpg) #mean of cars_data mpg (miles per galon) column
median(cars_data$cyl) #median of cars_data cyl (cylinders) column

is.list(cars_data[1,]); #but rows are lists!

# Lets do some data frame subsetting

cars_data[-1, ] # first row out
cars_data[ ,-1] # first column out

cars_data[c(1,3)] #keeping 1st and 3rd column only
cars_data[-c(1,3)] #removing 1st and 3rd column
cars_data[ ,-c(1,3)] #same as the previous line of code

cars_data[!duplicated(cars_data$mpg), ] #maybe we want to remove all cars with same mpg?
#remember it keeps only the first occurence!

subset(cars_data, mpg < 19) #this is one way (and it can be slow!)
cars_data[cars_data$mpg < 19, ] #this is another one (faster)
cars_data[which(cars_data$mpg < 19), ] #and another one (usually even more faster)

cars_data[cars_data$mpg > 20 & cars_data$am == 1, ] #multiple conditions

cars_data[grep("Merc", row.names(cars_data), value=T), ] #filtering by pattern match

# Data frame transformations
cars_data$trans <- ifelse(cars_data$am == 0, "automatic", "manual") #we can add new colums
cars_data$trans <- NULL #or we can remove them

cars_data[c(1:3,11,4,7,5:6,8:10)] #this way we change column order

# Separation and joining of data frames
low_mpg <- cars_data[cars_data$mpg < 15, ] #new data frame with mpg < 15
high_mpg <- cars_data[cars_data$mpg >= 15, ] #new data frame with mpg >= 15

mpg_join <- rbind(low_mpg, high_mpg) # we can combine 2 data frames like this

car_condition <- data.frame(sample(c("old","new"), replace = T, size = 32)) #creating random data frame
                                                                            #with "old" and "new" values
names(car_condition) <- "condition" #for all kinds of objects
colnames(car_condition) <- "condition" #for "matrix-like" objects, but same effect here
rownames(car_condition) <- rownames(cars_data) #use row names of one data frame as row names of other

mpg_join <- cbind(mpg_join, car_condition) #or combine data frames like this

Čitanje za Uvod u R za Data Science :: Sesija 3

[Sesija će se održati 12. maja 2016, 19h]

Prvih pet poglavlja knjige The Art of R Programming, pokrivaju: uvod u R, vektore, matrice i liste. Na Sesiji 3, po svemu sudeći, idemo na liste, objekte, i elemente kontrole toka u R. Pripremite sva pitanja koja možete da imate na osnovu čitanja knjige!

The Art of R Programming, Norman Matloff

S2p2

S2p3

Sesija 3, 12. maj 2016 :: Uvod u programski jezik R: Liste i funkcije u R

U prostorijama Starita održali smo treću sesiju kursa Uvod u R za Data Science u četvrtak, 12. maja 2016. Sesija je bila posvećena radu sa listama i funkcijama u R, temama kojima smo u međuvremenu odlučili da posvetimo više vremena u odnosu na početni plan. Knjiga The Art of R Programming liste pokriva u poglavlju 5, a funkcije u poglavlju 9. Bližimo se kraju uvodnog dela kursa: pošto naučimo i kontrolu toka u R tokom sledeće sesije, pokrili smo prvih deset poglavlja knjige, osim faktora (poglavlje 7) koje ćemo već sresti tokom analitike u drugoj polovini kursa.

Prezentacija Uvod u R za Data Science :: Sesija 3

[slideshare id=62280111&doc=intrordatasciencesession3eng-160522205629]
 

R skript Uvod u R za Data Science :: Sesija 3


########################################################
# Introduction to R for Data Science
# SESSION 3 :: 12 May, 2016
# Data Science Community Serbia + Startit
# :: Goran S. Milovanović and Branko Kovač ::
########################################################

# clear all
rm(list=ls());

# It's time to speak about lists
num_vct <- c(2:5) # just another num vector
chr_vct <- c("data", "science") # char vector
data_frame <- data.frame(x = c("a", "b", "c", "d"), y = c(1:4)) # simple df

lista <- list(data_frame, num_vct, chr_vct) # and this is a list
lista # this is our list

str(lista) # about a list
length(lista)

as.list(chr_vct) # another way to create a list

# Lists manipulation
names(lista) <- c("data", "numbers", "words")

lista[3] # 3rd element?
lista[[3]] # 3rd element?

is.list(lista[3]) # is this a list?
is.list(lista[[3]]) # and this?

class(lista[[3]]) # also a list? not be so sure!

lista$words # we can also extract an element this way
lista[["words"]] # or even like this

length(lista$words) # 2 as expected

lista[["words"]][1] # digging even deeper

lista$new_elem <- c(TRUE, FALSE, FALSE, TRUE) # add new element

length(lista) # now list has 4 elements
lista$new_elem <- NULL # but we can remove it easily

new_vect <- unlist(lista) # creating a vector from list

# Introduction to Functions in R
# (w. less formalism but tips & tricks added)

# elementary: a defition of a function in R
fun <- function(x) x+10;
fun(5)

# taking two arguments
fun2 <- function(x,y) x+y;
fun2(3,4)

# using "{" and "}" to enclose multiple R expresions in the function body
fun <- function(x,y) {
  a <- sum(x);
  b <- sum(y);
  a-b
}
r <- c(5,4,3);
q <- c(1,1,1);
fun(r,q)
fun(c(5,4,3),c(1,1,1)) # NOTE: "{" and "}" are generally used in R to mark the beginning and the end of block
# a function is a function:
is.function(fun);
is.function(log); # log is built-in

# printing function to acess their source code;
fun
log # try: is.primitive(log); this one is written in C, belongs to the base package - it's "under the hood"

# Built in functions + functional programming ("Everything is a function...")
"^"(2,2)
"^"(2,3) # magic! - how do you do that?
2^2
2^3
# the difference between "operators" and "functions" in R: none. Everything is a function:
"+"(2,2) # Four?
2+2 # yeah, right
# Oh but I love this
"-"("+"(3,5),2);
"&"(">"(2,2),T);
"&"(">"(3,2),T); # punishment: write all your lab code for this week in this fashion...
# built in functions:
x <- 16;
sqrt(x);
x <- c(1,2,3,4,5,6,7,8,9);
mean(x);
# whatch for NAs in statistics (!)
x <- c(1,2,3,4,5,6,7,8,NA);
mean(x);
mean(x, na.rm = T); # right!
median(x);
sd(x);
sum(x);
sum(x, na.rm = T); # a-ha!

# Lexical scoping in R + nested functions
# example taken from: http://adv-r.had.co.nz/Functions.html
# "Advanced R" by Hadley Wickham
# ";"s added by GSM
x <- 1;
h <- function() {
  y <- 2;
  i <- function() {
    z <- 3
    c(x, y, z)
  }
  i();
}
h();

# Messing up argument names (never do this in nested functions unless you have to)
rm(x, h);
x <- 1;
h <- function(x) {
  y <- x+1
  i <- function(x) {
    z <- x+2;
    z
  }
  z <- i(x);
  c(x,y,z)
}
h(x)

# Two things that come handy: lapply and apply
# Step 1: here's a list:
aList <- list(c(1,2,3),
              c(4,5,6),
              c(7,8,9),
              c(10,11,12));
# Step 2: I want to apply the following function:
myFun <- function(x) {
  x[1]+x[2]-x[3]
}
# to all elements of the aList list, and get the result as a list again. Here it is:
res <- lapply(aList, function(x) {
  x[1]+x[2]-x[3]
});
unlist(res) # to get a vector
rm(myFun);

# Now say I've got a matrix
myMat <- matrix(c(1,2,3,4,5,6,7,8,9),
                  nrow=3,
                  ncol=3);
# btw
is.function(matrix);
# reminder
class(myMat);
typeof(myMat);
# now, I want the sums of all rows:
rsMyMat <- apply(myMat, 1, function(x) {
  sum(x)
});
rsMyMat;
is.list(rsMyMat) # just beatiful
# for columns:
csMyMat <- apply(myMat, 2, function(x) {
  sum(x)
});
# with existings functions such as sum(), this will do:
rsMyMat1 <- apply(myMat, 1, sum);
rsMyMat1
csMyMat1 <- apply(myMat, 2, sum);
csMyMat1

 

Čitanje za Uvod u R za Data Science :: Sesija 4

[Sesija će se održati 19. maja 2016, 19h]

Konačno, trebalo bi da do sesije 4. pređete svih prvih deset poglavlja knjige “The Art of R Programming”; ne morate da se bavite faktorima (poglavlje 7) jer ćemo ih svakako sresti negde tokom drugog dela kursa kada budemo radili sa statističkim modelima u R. Pripremite sva pitanja koja možete da imate na osnovu čitanja knjige!

The Art of R Programming, Norman Matloff

S3_2

S3_3

S3_4

Sesija 4, 19. maj 2016 :: Uvod u programski jezik R: strukture podataka + kontrola toka. Vektorizacija koda u R: kako i zašto

U prostorijama Starita održali smo i četvrtu sesiju kursa Uvod u R za Data Science u četvrtak, 19. maja 2016. Prešli smo različite forme kontrole toka u R, tako da smo sada u stanju da kombinujemo strukture podataka, kontrolu toka, i funkcije u kompletne R skripta za najrazličitije namene. Posebnu pažnju posvetili smo vektorizaciji koda u R. Vektorizacija koda (mahom!) rezultira u velikom ubrzanju računice u R, što je za potrebe rada u Data Science od ključnog značaja.

Prezentacija Uvod u R za Data Science :: Sesija 4

[slideshare id=62280720&doc=intrordatasciencesession4eng-160522213931]

R skript Uvod u R za Data Science :: Sesija 4

########################################################
# Introduction to R for Data Science
# SESSION 4 :: 19 May, 2016
# Data Science Community Serbia + Startit
# :: Branko Kovač and Goran S. Milovanović ::
########################################################

# Starting with simple 'if'
num <- 2 # some value to test with
if (num > 0) print("num is positive") # if condition num > 0 stands than print()
                                      # is executed

# Sometimes 'if' has its 'else'
if (num > 0) { # test to see if it's positive
  print("num is positive") # print in case of positive number
} else {
  print("num is negative") # it's negative if not positive
}

# Multiple 'else's are also possible
if (!is.numeric(num)) { # check if it's numeric
  print("this is not a number") # print this if it isn't numeric
} else if (num > 0) { # check if it's greater than 0
  print("num is positive") # print if it's positive
} else if (num < 0) { # maybe it is negative
  print("num is negative") # print it if it's < 0
} else print("ZERO!") # who knows, maybe it is zero

# R is vectorized so there's vectorized if-else
simple_vect <- c(1, 3, 12, NA, 2, NA, 4) # just another num vector with NAs
ifelse(is.na(simple_vect), "nothing here", "some number") # nothing here if it's
                                                          # NA or it's a number

# For loop is always working same way
for (i in simple_vect) print(i) # iterate in set of values

# Be aware that loops can be slow if
vec  <-  numeric()
system.time(
  for(i in seq_len(50000-1)) {
    some_calc <- sqrt(i/10)
    vec <- c(vec, some_calc) # this is what makes it slow
  }  
)

# This solution is slightly faster
iter <- 50000
vec <- numeric(length=iter) # this makes it faster...
system.time(
  for(i in seq_len(iter-1)) {
    some_calc <- sqrt(i/10)
    vec[i] <- some_calc # ...not this!
  }
)

# This solution is even more faster
iter <- 50000
vec <- numeric(length=iter) # not because of this...
system.time(
  for(i in seq_len(iter-1)) {
    vec[i] <- sqrt(i/10) # ...but this!
  }
)

# Another example how loops can be slow (loop vs vectorized function)
iter <- 50000

system.time(
  for (i in 1:iter) {
    vec[i] <- rnorm(n=1, mean=0, sd=1) # approach from previous example
  }
)

system.time(y <- rnorm(iter, 0, 1)) # but this is much much faster

# R also knows about while loop
r <- 1 # initializing some variable
while (r < 5) { # while r < 5
  print(r) # print r
  r <- r + 1 # increase r by 1
}

# Loops can be nested
for(i in 1:5) { # outer loop
  for(j in 1:5) { # inner loop
    print(paste0(i,j)) # some code
  }
}

# Loops can be altered using break and next
for(i in 1:5) {
  if (i == 4) break # jump out of loop if condition is true
  print(i)
}

for(i in 1:5) {
  if (i == 4) next # just skip current iteration if condition is true
  print(i)
}

# Nope, we didn't forget 'repeat' loop
i <- 1
repeat { # there is no condition...
  print(i)
  i <- i + 1
  if (i == 10) break # ...so we have to break it if we don't want infinite loop
}

# And there's something called 'switch' 🙂
switch(2, "data", "science", "serbia") # choose one option based on value

# More on switch:
switchIndicator <- "A"
switchIndicator <- "switchIndicator"
switchIndicator <- "AvAvAv"
# rare situations where you do not need to enclose strings: ' ', or " "
switch(switchIndicator,
       'A' = {print(switchIndicator)},
       'switchIndicator' = {unlist(strsplit(switchIndicator,"h"))},
       'AvAvAv' = {print(nchar(switchIndicator))}
)
# is the same as:
switch(switchIndicator,
       A = {print(switchIndicator)},
       switchIndicator = {unlist(strsplit(switchIndicator,"h"))},
       AvAvAv = {print(nchar(switchIndicator))}
)

# now:
type = 2
cc <- c("A", "B", "C");
switch(type,
       c1 = {print(cc[1])},
       c2 = {print(cc[2])},
       c3 = {print(cc[3])},
       {print("Beyond C...")} # default choice
       )

# BUT if you do this, R will miss the default choice, so be careful w. switch:
type = 4
cc <- c("A", "B", "C");
switch(type,
       print(cc[1]),
       print(cc[2]),
       print(cc[3]),
       {print("Beyond C...")} # the unnamed default choice works only if previous choices are named!
)

# Switch and if-else are similar, but switch is faster (believe us!)
i <- 2
if(i == 1) {
  print("data")
} else if(i == 2) {
  print("science")
} else print("serbia")


#########################################################
### Exercise, exercise...

library(datasets)
head(iris)
is.data.frame(iris)

# suming up Sepal.Length + Sepal.Width
for (i in 1:length(iris$Sepal.Length)) {
  iris$Sepal.LW[i] <- iris$Sepal.Length[i] + iris$Sepal.Width[i]
}
iris$Sepal.LW <- NULL;

# remember: this is a vector programming language:
iris$Sepal.LW <- iris$Sepal.Length + iris$Sepal.Width # avoid loops anytime when possible!
iris$Sepal.LW <- NULL;

out <- length(iris$Sepal.Length);
i <- 0;
repeat
  {
    i <- i+1
    iris$Sepal.LW[i] <- iris$Sepal.Length[i] + iris$Sepal.Width[i];
    if(i==out) break;
  }
# there are many more stupid ways to do this, all in order to avoid the simple and fast:
iris$Sepal.LW <- iris$Sepal.Length + iris$Sepal.Width
iris$Sepal.LW <- NULL;

# for example, by avoiding loops altogether...
iris$Sepal.LW <- apply(data.frame(iris$Sepal.Length, iris$Sepal.Width), 1, function(x) {sum(x)});
iris$Sepal.LW <- NULL;

# ifelse in lapply in unlist
sepalLengthMean <- mean(iris$Sepal.Length);
iris$Sepal.LW <- unlist(lapply(iris$Sepal.Length, function(x){ifelse(x>=sepalLengthMean,T,F)}));
iris$Sepal.LW <- NULL;
# however...
iris$Sepal.LW <- ifelse(iris$Sepal.Length>=mean(iris$Sepal.Length),T,F);
# now leave the iris data set alone...
iris$Sepal.LW <- NULL;

#########################################################
### vectorization in R

dataSet <- USArrests;
head(dataSet)

# data$Murder, data$Assault, data$Rape: columns of data

# in behavioral sciences (psychology or biomedical sciences, for example) we would call them:
# variables (or factors, even more often)
# in data science and machine learning, we usually call them: FEATURES
# in psychology and behavioral sciences, the usage of the term "feature" is usually constrained
# to theories of categorization and concept learning

# Task: classify the US states according to some global indicator of violent crime
# Two categories (simplification): more dangerous and less dangerous (F)
# We have three features: Murder, Rape, Assault, all per 100,000 inhabitants
# The idea is to combine the three available features.

# Let's assume that we arbitrarily assign the following preference order over the features:
# Murder > Rape > Assault
# in terms of the severity of the consequences of the associated criminal acts

# Let's first isolate the features from the data.frame
featureMatrix <- as.matrix(dataSet[, c(1,4,2)]);

# Let's WEIGHT the features in accordance with the imposed preference order:
weigthsVector <- c(3,2,1); # mind the order of the columns in featureMatrix

# Essentially, we want our global indicator to be a linear combination of all three selected features
# Where each feature is weighted by the corresponding element of the weigthsVector:

featureMatrix <- cbind(featureMatrix,numeric(length(featureMatrix[,1])));
for (i in 1:length(featureMatrix[,1])) {
  featureMatrix[i,4] <- sum(weigthsVector*featureMatrix[i,1:3]);
  # don't forget: this "*" multiplication in R is vectorized and operates element-wise
  # we have a 1x3 weightsVector and a 1x3 featureMatrix[i,1:3], Ok
  # sum() then produces the desired linear combination
}

# Classification; in the simplest case, let's simply take a look at the distribution of our global indicator:
hist(featureMatrix[,4],20); # it's multimodal and not too symmetric; go for median
criterion <- median(featureMatrix[,4]);
# And classify:
dataSet$Dangerous <- ifelse(featureMatrix[,4]>=criterion,T,F);

# Ok. You will never do this before you have a model that has actually *learned* the
# most adequate feature weights. This is an exercise only.

# ***Important***: have you seen the for loop above? Well...
# N e v e r  d o  t h a t.
dataSet$Dangerous <- NULL;

# In Data Science, you will be working with huge amounts of quantitative data.
# For loops are slow. But in vector programming languages like R...
# matrix computations are seriously fast.

# What you ***want to do*** is the following:

# Let's first isolate the features from the data.frame
featureMatrix <- as.matrix(dataSet[, c(1,4,2)]);
# Let's WEIGHT the features in accordance with the imposed preference order:
weigthsVector <- c(3,2,1); # mind the order of the columns in featureMatrix

# Feature weighting:
wF <- weigthsVector %*% t(featureMatrix);
# In R, t() is for: transpose
# In R, %*% is matrix multiplication

# oh yes: R knows about row and column vectors - and you want to put this one
# as a COLUMN in your dataSet data.frame, while wF is currently a ROW vector, look:
wF
length(wF);
wF <- t(wF); 

# and classify:
dataSet$Dangerous <- ifelse(wF>=median(wF),T,F);

Sesija 5 :: Struktuiranje podataka: manipulacija stringovima u R

Jedna od stvari po kojima se savremena Data Science razlikuje od prethodnog rada u različitim oblastima analitike podataka je to što smo danas često primorani da se bavimo struktuiranjem nestruktuiranih ili polustruktuiranih informacija, najčešće prikupljenih sa interneta. To mahom znači puno, puno manipulacije stringovima. Uvod u upotrebu R kapaciteta i paketa za rad sa stringovima. Priča za sebe: regularni izrazi u R.

Sesija 6 :: Korelacije i jednostavna linearna regresija u R

Na osnovu vrednosti jedne varijable, pod određenim uslovima koji moraju biti zadovoljeni, u stanju smo da predviđamo vrednost neke druge varijable. Na osnovu nečije težine, makar i neprecizno, možemo da predvidimo koliko je ta osoba visoka, ili koji broj cipela nosi. U tržišnim istraživanjima, neko može da nam naruči da na osnovu nekog raspoloživog znanja o kupcima određenog proizvoda predvidimo kako će se on prodavati. Učimo osnovni model ovakve vrste prediktivnog rada u R, model jednostavne linearne regresije.

Sesija 7 :: Multipla regresija u R

Na osnovu poznavanja vrednosti više varijabli, pod određenim uslovima koji moraju biti zadovoljeni, u stanju smo da predviđamo vrednost neke varijable koja nije među njima. Učimo model multipla regresione analize u kome ćemo već upoznati većinu problema sa kojima se suočavamo u prediktivnom poslu u Data Science. Kako da pokušamo da predvidimo ponašanje nekoga ili nečega na osnovu prikupljenog velikog broja varijabli tj. osobina te osobe ili tog fenomena? Multipla regresija je verovatno najjednostavniji odgovor na ovo veoma komplikovano pitanje.

Sesija 8 :: Proširenje linearnog modela u zadatku klasifikacije: binomijalna i multinomijalna logistička regresija u R

Na osnovu poznavanja toga u koju od dve kategorije neka stvar spada, pokušavamo da kažemo što više možemo o tome zbog kojih njenih osobina – kojih može biti i veliki broj – se ona nalazi baš tamo. Pošto se rešimo problema binomijalne logističke regresije u R, sažetog u prvoj rečenici, prelazimo na složeniji problem multinomijalne logističke regresije: na osnovu znanja o tome iz koje od više raspoloživih kategorija dolazi neka stvar, pokušavamo da zaključimo zbog kojih njenih osobina se ona našla baš tamo? Interesantno, jednom kada znamo koje osobine vode u koju kategoriju stvari, mi možemo da rešimo klasifikacije prethodno neklasifikovanih objekata, što je jedan od najčešćih poslova koje će Data Scientist imati.

POLAZNICI

Ana Peško

ana_peskoZovem se Ana Peško i studentkinja sam treće godine Softverskog inženjerstva Elektrotehničkog fakulteta u Beogradu. Od malih nogu, moja znatiželja i razdoznalost su mi polako otkrivale put kojim želim da se krećem, pa me je taj put eventualno doveo do softverskog inženjerstva. Tokom studiranja na fakultetu sve više i više sam imala prilike da primetim koliko se grana ta široka oblast, što me je ponovo navelo na razmišljanje o tome kuda ići dalje. Kroz razne predmete, a i samostalno interesovanje, Data Science mi je postajao sve privlačnija oblast, između ostalog i zbog fascinacije činjenicom da smo okruženi skoro bezgraničnom količinom podataka u svakodnevnom životu. Posebno me interesuje šta sve možemo pomoću ove oblasti da učinimo kako bismo poboljšali ljudski život i zdravlje, dakle, kombinacija Data Science-a i medicine. Zato sam zgrabila ovu priliku da bih se upoznala sa jezikom R, kao jednim od jezika koji su danas u širokoj upotrebi, kao i da se potencijalno upoznam sa drugim primenama Data Science-a koje mi možda nisu padale na pamet do sad.

Andrijana Peković

andrijana_pekovic

Zovem se Andrijana Pekovic, trenutno sam student četvrte godine Matematičkog fakulteta u Beogradu. Kao student osetila sam da ce mi ovaj kurs dati neophodna znanja i vestine kako bih stvorila temelj na kojem bih mogla da gradim svoju profesionalnu karijeru. Statistika je prozimajuca oblast u svetu informatike i otvara mnoge mogucnosti za strucni rast i razvoj. Verujem da ce ovaj kurs da me upozna sa spomenutnom oblascu na zanimljiv, kreativan i pre svega profesionalan nacin omogucavajuci mi da udjem u IT industriju sa odredjenim nivoom samopuzdanja koji drugacije ne bih imala.

Damjan Stojić

damjan_stojic

Završio sam master sudije na Fizičkom fakultetu u Beogradu, smer – Teorijska i ekspermentalna fizika. Zbog svog osnovnog opredeljenja za nauku, vidim data science kao potencijalno dalje usmerenje. Programiranje (primarno C++) ali i same analitičke metode koje se koriste u ovoj struci (tj. koje sam barem do sada video da se koriste) mi nisu strane i verujem da će mi to dodatno pomoći u karijeri. Neke oblasti R programiranja, kao što su mashine learning ili data mining mi deluju izuzetno zanimljivo i privlačno. Nadam se da mi ovaj kurs moze pomoći kao dalji fokus u realizaciji mog izbora.

Ilija Divljan

ilija_divljan

Diplomirao sam na odsjeku za Računarstvo i informatiku na Elektrotehničkom fakultetu u Istočnom Sarajevu, i sada sam student master studija na odsjeku za Softversko inženjerstvo na Elektrotehničkom fakultetu u Beogradu. Programiranjem se bavim od srednje škole, takođe poslednje dvije godine sam Microsoft Student Partner i imao sam priliku da prisustvujem nekim većim evropskim IT konferencijama, poput TechEd-a. R me privukao zbog svoje velike upotrebe u Machine Learning-u, i zelio bih da ga kombinujem sa svojim postojecim znanjem. To što me najviše privlači kod Machine Learning-a je ogroman spektar primjena, počevši od biologije pa do auto industrije i dalje.

Ivana Đokić

ivana_djokic

Cao, ja sam Ivana Đokić, doktorand na FTN-u,  smer Matematika u tehnici (data mining, optimizacija algoritama pri klasifikaciji i predikciji), radim u IDC-u kao Research Analyst, saradjujem sa lekarima na istrazivanjima iz biomedicine, kao statisticar/analiticar.

Ivana Prokić

ivana_prokic

Apsolvent Ekonomskog fakulteta, zainteresovana za statistička istraživanja i analizu.
Kako je poslednjih godina raslo interesovanje za Data Science, tako sam se sve više informisala čime se jedan Data Scientist bavi, a posebno me privukla interdisciplinarnost i spoj veština potrebnih za taj posao. Da bih približnije videla na koji način se radi, započela sam Data Science Specijalizaciju Johns Hopkins Univerziteta na Coursera-i, gde sam se i prvi put susrela sam radom u R-u. Nakon što sam se oprobala u različitim manipulacijama setovima podataka, bilo mi je još jasnije u kom smeru želim da se usavršavam. Verujem da će mi ovaj kurs pomoći da steknem osnovu za napredak u ovoj oblasti.

Jelena Mitrović

jelena_mitrovic

Bavim se Računarskom lingvistikom, konkretno unapređivanjem resursa i alata koje imamo na raspolaganju za računarsku obradu srpskog jezika – semantičkih mreža, elektronsih rečnika, domenskih ontologija. U svrhu istraživanja u sklopu svog doktorskog rada, radila sam na unapređenju srpskog WordNet-a automatskim dodavanjem novih semantičkih veza koje su zasnovane na retoričkoj figure poređenje. R me konkretno zanima zbog primene u Mašinskom učenju, kojim se takođe bavimo u okviru Društva za jezičke resurse i tehnologiju, Univerziteta u Beogradu, kao na primer u oblasti sentiment analize. Najnoviji poduhvat u tom smeru tiče se automatske detekcije ironije na Twitter-u. Više o mom istraživačkom radu možete videti na Research Gate stranici.

Nikola Dragić

nikola_dragic

Prošle godine sam završio master studije na Biološkom fakultetu, na katedri za Opštu fiziologiju i biofiziku. Master rad je bio iz predmeta Bioinformatika, na kome sam sa profesorom Markom Đorđevićem radio na unapređenju metoda za predikciju transkripcionih početaka kod bakteriofaga. Nakon završenih studija sam želeo da unapredim svoje informatičko znanje, tako da sam počeo samostalno da učim da programiram, pre svega u Pythonu. Uvod u R za Data Science u Startit-u sam video kao odličnu priliku da uz kvalitetno mentorstvo napravim brži iskorak u svom informatičkom opismenjavanju u programskom jeziku koji je bez sumnje među najkorisnijim programskim jezicima kada je biologija u pitanju.

Nikola Nonković

nikola_nonkovic

Zovem se Nikola Nonković. Student sam 4 godine molekularne biologije i fiziologije na Biološkom fakultetu u Beogradu.  Oduvek me je zanimalo da problem sagledavam kroz celu sliku što je u nauci koja se bavi živim bićima do nedavno bilo veoma teško, da ne kažem skoro nemoguće. Pojavom sistemske biologije koja baš to omogućava, i njenog rasta usled razvitka računarskih tehnologija i novih metoda za prikupljanje podataka dovelo je do toga da je ona postala neizostavni deo svakog fundamentalnog i aplikativnog istraživanja. Zbog brzine i količine podataka koje se mogu dobiti kroz svega par merenja me dovodi do toga da mislim da  bez pozvanje oblasti Data science će biti skoro nezamislivo baviti se nekim ozbiljnijim istraživanjima u budučnosti. To je jedan od razloga zašto me privlaći, dok je drugi praktične prirode i omogućava bavljenje većim brojem oblasti i relativno lako menjaje oblasti istraživanja. Na taj način je moguće ići kako i akademskim tako i industrijskim vodama, što retko koja oblast danas može da ponudi, a tu fleksibilnost verovatno bi svako želeo da poseduje. R je logičan nastavak te priče jer je to programski jezik koji poseduje najviše paketa koji umnogome pomažu rešavanju problema u biologji, dok je zajednica ljudi koji se bave biologijom kroz R jedna od najaktivnijih.

Petar Bursać

petar_bursac

Rođen sam 22.05.1994. godine u Požarevcu. Student sam treće godine osnovnih studija na Građevinskom fakultetu, Odsek za geodeziju i geoinformatiku u Beogradu. Moje znanje za programiranje pre kursa vezano je za programski jezik MATLAB. Za kurs Uvod u R za Data Science sam se prijavio iz želje da pre svega proširim svoje znanje novim programskim jezikom, jer je jasno da je to danas ne samo poželjno nego i neophodno.
Za programski jezik R pre kursa nisam znao, ali se veoma brzo spoznao da je to odličan programski jezik, čije okruženje nudi veoma dosta mogućnosti za izvođenje raznih statističkih analiza, linearnih regresionih modela kao i dosta drugih analiza nad velikim setovima podataka, sa velikim brojem dostupnih paketa. Prednosti i znanje koje budem stekao u R-u želim da iskorisitim za analizu podataka u geodeziji, pre svega preciznih geodetskih merenja koja su odlika geodetskog stručnjaka. Isto tako oblast geoinformatike i GIS-a (Geografskih informacionih sistema) raspolaže veoma velikim podacima nad kojima je potrebna analiza, kao i oblast geostatistike. Programski jezik R sa dodatnim paketima ima mogućnosti analize podataka iz obalsti kartografije, što je još jedna prednost koju bih želeo iskoristiti.

Radomir Delić

radomir_delic

Data science-om se delimično bavim na master studujama na saobraćajnom fakultetu na smeru za operaciona istraživanja. Međutim, programski jezik R sam poćeo da učim samostalno jer mi je izazovno koji se sve problemi mogu rešiti primenom data science-a. Nakon završenog python kursa za data science, krenuo sam da učim R i na Goranovo veliko iznenađenje, a verovatno i velikog dela zajednice, R mi je u odosu na python jednostavniji i logičniji u nekim delovima i više mi odgovara pa sam zato nastavio da ga učim samostalno a i na Goranovom i Brankovom kursu koji je odličan. 🙂

Stevan Milić

stevan_milic

Ja sam Stevan Milić, student druge godine doktorskih studija na Građevinskom fakultetu u Beogradu gde sam i zaposlen u svojstvu asistenta. Potreba za automatizacijom procesa obrade velike količine geoprostornih podataka sa kojom se srećem, kao i ljubav prema programiranju i matematici opredeljuje me da što više softverskih alata i algoritama u domenu ovakve primene istražim i probam. Na ovaj kurs R-a sam se prijavio jer se u dosadašnjem radu i studijama nisam puno susretao sa ovim programskim jezikom i želeo sam da nešto više o ovom jeziku saznam od strane ljudi koji ga svakodnevno koriste i koji su pravi R- profesionalci.

Uroš Konstantinović

uros_konstatinovic

Uroš Konstantinović, 23 godine, iz Beograda. Student istraživačkog smera master studija psihologije na Filozofskom fakultetu u Beogradu. Sprovodi istraživanja u oblasti kognitivne psihologije. Zainteresovao se za ovaj kurs zbog sve veće aktuelnosti primene R-a u obavljanju statističkih analiza, njegovih širokih mogućnosti u vidu postojanja paketa za sprovođenje najrazličitijih statističkih analiza koje se često koriste u psihologiji i iz želje da proširi svoje znanje o radu na Big Data.

KATEGORIJE

PRIJAVITE SE NA NAŠU MAILING LISTU