1 1 1 1 1 1 1 1 1 1 Rating 0.00 (0 Votes)

R ( https://www.r-project.org/ ) è un linguaggio di scripting pensato per programmare algoritmi statistici, usato per esempio per generare modelli usati per le previsioni meteo o per analizzare andamenti di mercati e compravendite.

Installazione e ambiente di sviluppo

Dal 1997 aggiornato e mantenuto, anche chiamato linguaggio "R & R" dai nomi degli inventori Robert Gentleman and Ross Ihaka è reso disponibile per qualsiasi piattaforma UNIX/LINUX, Windows e MacOS. Di seguito per esempio i passi per istallarlo su Centos 7.

# abilitare EPEL Repository

yum install epel-release
 
yum update
 
 
# installare R

yum install R

Anche per sviluppare esistono diversi ambienti IDE dal plugin per Eclipse ( http://www.walware.de/goto/statet ) a quello per Visual Studio ( https://www.visualstudio.com/it/vs/rtvs/ ) , per me il migliore è stato la versione Server e gratuita di R Studio ( https://www.rstudio.com/products/rstudio/download-server/ )

# installazione R Studio

wget https://download2.rstudio.org/rstudio-server-rhel-1.1.383-x86_64.rpm
 
yum install --nogpgcheck rstudio-server-rhel-1.1.383-x86_64.rpm

essendo di fatto un server web ed un ambiente accessibile da browser, è consigliato abilitare il servizio all'avvio del sistema e la porta del firewall (8787)

# abilita servizio

systemctl status rstudio-server.service
 
systemctl enable rstudio-server.service
 
 
# abilita firewall

firewall-cmd --permanent --zone=public --add-port=8787/tcp
 
firewall-cmd --reload

inoltre per poter installare e compilare le librerie di R sviluppate da terza parti in C, installare i pacchetti di software del proprio sistema operativo per poter compilare sorgenti C/C++

# pacchetti sofwtare per compilare librerie R

yum groupinstall "Development Tools"


Finite le installazioni sarà possibile o via terminale accedere alla console di R

oppure con R Studio via browser

http://localhost:8787/

ricordarsi di loggarsi con l'utente di sistema utilizzato ( nel mio caso boymixli ) oppure uno diverso, R Studio mantiene le sessioni degli utenti con tutto il lavoro svolto fino a quando non si è chiuso il browser.


R studio offre quattro quadranti: il primo è l'editor per lo sviluppo, il secondo visualizza le variabili in modalità debug, un terzo col terminale di esecuzione ed un quarto con l'help (viene aggiornato anche premendo "F1" col cursore sulla funzione nel codice su cui ci si vuole documentare) / accesso al filesystem, ecc..
L'IDE prevedete l'intelligence attraverso i tasti "control space" per il completamento del nome delle funzioni o la visualizzazione della firma o ancora "control clic" per andare alla definizione di una funzione oppure "control f" per effettuare una ricerca.


Un buon inizio ed una completa documentazione la si può trovare sul sito ufficiale ( https://cran.r-project.org/manuals.html ) .

Costrutti di base

Il linguaggio è like C quindi i principali costrutti sono uguali al C, mentre le variabili sono di fatto array di classi e non c'è una dichiarazione con una tipizzazione.

Variabili

# assegnazione intero

NTest = 5
 
 
# ma anche

NTest <- 5
 
 
# stringha

s = "ciao"
 
 
# stampa a console

s
 
 
# risultato

[1] "ciao"
 
 
# ma anche 

s[1]
 
 
# dichiarazione di un array

a <- c(1, "pippo", 3.3 , 4 ,5)
 
 
a
 
 
[1] "1"     "pippo" "3.3"   "4"     "5"    

notare che se c'è una stringa tutto l'array sarà di tipo stringa

# moltiplica x 2 il prima elemento

a[1]*2
 
 
# risultato

Error in a[1] * 2 : 
 
argomento non numerico trasformato in operatore binario

pertanto per gestire array con tipi diversi è necessario usare le funzioni "as.TIPO" come "as.integer", "as.double" ecc...

# utilizzi funzioni di cast

as.integer(a[1])*2+as.double(a[3])
 
 
#risultato

[1] 5.3

è possibile invece pre-allocare matrici anche vuote, ecco ad esempio una matrice 2 righe 5 colonne

m <- matrix(data = NA, nrow=2,ncol = 5)

ed associare solo righe (esempio la prima) o colonne (la seconda)

m[1,] <- a
 
m[,2] = 4
 
m
 
 
#risultato

[,1] [,2] [,3]  [,4] [,5]
 
[1,] "1"  "4"  "3.3" "4"  "5" 
 
[2,] NA   "4"  NA    NA   NA

dove NA è un valore nullo. E' possibile fare operazioni anche solo su parti della matrice, come ad esempio:

as.integer(m[,2])*4
 
 
#risultato

[1] 16 16

Infine vengono molto usati i data frame, matrici con le colonne denominate il cui accesso lo si può fare attraverso un nome (etichetta parlante) al posto dell'indice numerico. Il modo più comodo per caricarle è attraverso un file csv, modo consigliato quando si hanno migliaia di dati.
Ipotizziamo di avere il file

# /home/developer/workspace/R/AllNum.csv

--------------
 
Data,N1,N2,N3,N4,N5,N6,N7,N8,
 
31/12/1997,34,36,71,76,86,89,82,
 
27/12/1997,8,26,35,43,55,67,69,
 
24/12/1997,13,59,63,75,85,87,52,
 
--------------
 
 
# Carica data frame

df <- read.csv("/home/developer/workspace/R/AllNum.csv")
 
 
# dichiara colonna Data come una data

df$Data <- as.Date(df$Data, "%d/%m/%Y") 
 
 
#stampa a video N1

df$N1

ma nulla vieta di accedervi come una matrice classica

df[1,1]
 
 
# risultato

[1] "1997-12-31"

Blocchi di flusso

#commento

 
#esempio IF

if(mtry == 1)
 
  model <- randomForest(formula, data=df, ntree=ntree, mtry=TRUE, na.action = na.roughfix)
 
else if(modelName == "predictNumbersModelARIMATempSerie")
 
{  
    if(is.na(estract))
 
  {
      #80% or 95% mean is same

    estract <- dataExtraction$mean[1]
 
  }
 
}
 
else
 
  model <- randomForest(formula, data=df, ntree=ntree,na.action = na.roughfix)
 
 
#esempio FOR

for(i in 1:8) { print(i) }

notare che è possibile dichiarare un lista di tipo intero sequenziale utilizzano l'operatore ":"

#esempio lista sequenziale

i <- 1:8

è una lista in quanto non è possibile accedere al singolo elemento poiché ha dimensione di una riga e non di una riga ed N colonne

i[1,2]
 
 
#risultato

Error in i[1, 2] : numero di dimensioni errato

E' possibile anche dichiarare funzioni, prima di usarle

#esempio funzione

printAreturnDoubleB <- function(a) {
 
  print(a)
 
  b = as.integer(a)*2
 
  return(b)
 
}
 
 
#richiamo funzione

printAreturnDoubleB(3)

Funzioni utili con un esempio completo

Di seguito uno script R ( RBaseScript.r ). Si vuole analizzare un insieme di serie di numeri ( NumTest.csv ) e prevederne la continuazione futura. Inoltre si calcolerà la massima frequenza dei singoli numeri presenti delle serie denominate N1 .. N8 caricate da un file csv.

#1 Carica dati

# File: NumTest.csv

# Data,N1,N2,N3,N4,N5,N6,N7,N8,
# 31/12/1997,34,36,71,76,86,89,82,
# 27/12/1997,8,26,35,43,55,67,69,
# 24/12/1997,13,59,63,75,85,87,52,
# 20/12/1997,3,27,48,58,78,90,45,
# 31/12/1997,10,65,77,80,81,86,89,
# 13/12/1997,5,22,34,61,62,77,58,
# 10/12/1997,1,2,14,23,78,88,40,
# 06/12/1997,2,4,25,29,30,52,24,
# 03/12/1997,20,36,39,41,72,76,88,
# 30/12/1998,30,36,45,49,63,89,46,
# 28/12/1998,14,43,46,65,71,82,22,
# 23/12/1998,3,9,14,26,47,79,81,
# 19/12/1998,3,6,13,28,49,50,33,
# 16/12/1998,22,43,56,71,77,83,35,
# 12/12/1998,9,37,39,40,42,86,2,
# 09/12/1998,1,11,42,43,61,81,29,
# 05/12/1998,27,35,47,48,59,79,77,
# 02/12/1998,9,23,36,66,67,77,87,
# 28/11/1998,12,15,40,50,66,88,70,
# 25/11/1998,32,39,52,56,69,85,53,

df <- read.csv("/home/developer/workspace/R/NumTest.csv")
 
#2 Normalizza dati
#read csv
df$Data <- as.Date(df$Data, "%d/%m/%Y") 
df$x <- (1:length(df$Data))
 
#3  Funzione di predizione con modello lineare

#3.1
library('forecast')
 
predictLM <- function(formula,df) {
  #3.2
  model <- lm(formula, data = df)
  #3.3
  fit<-predict(model, df)
 
  #3.4 , h = numero predizioni
  fcast <- forecast(fit, h=1)
 
  return(fcast)
}
 
#4 Richiama predizione per N1 e N2: dati N numeri si vuole trovare il valore N+1
# si ipotizza che esiste una relazione lineare tra N1 ed N2 con Data il che vuol dire che :
# considerando y (N*) la variabile dipendente da x (Data) le formule da passare al modello
# saranno N1 ~ Data ed N2 ~ Data, è possibile crearle in modo dinamico così..

#inizializza numeri next
nextNum = c(0,0)
for(i in 1:2)
{
  #4.1
  formula = as.formula(paste(c("N", i," ~ Data"), collapse = "")) 
 
  dataExtraction <- predictLM(formula,df)
 
  #4.2 
  nextNum[i] <- dataExtraction$mean[2]
  if(is.na(nextNum[i]))
  {
    #80% or 95% mean is same
    nextNum[i] <- dataExtraction$mean[1]
  }  
}
 
#5 Calcolo frequenze manualmente dei numeri N1-N8
frequencyMaxNums = c(0,0,0,0,0,0,0,0)
for(i in (1:8))
{
  #5.1
  fnum = sort(table(df[,i]),decreasing = TRUE)
  #5.2
  frequencyMaxNums[i] = names(fnum)[1]
}
 
#5.3
print(sprintf("Max frequency Data: %s, N1:%s, N2:%s, N3:%s, N4:%s, N5:%s, N6:%s, N7:%s"
              ,frequencyMaxNums[1], frequencyMaxNums[2],frequencyMaxNums[3],frequencyMaxNums[4]
              ,frequencyMaxNums[5],frequencyMaxNums[6],frequencyMaxNums[7],frequencyMaxNums[8]))
 
#6 Visualizza dati
par(mfrow=c(1,2))
plot(predictLM("N1 ~ Data",df), type = "l", col = "red" , ylab = "predicted N1" 
     ,main=sprintf("Next N1 %f",nextNum[1]))
plot(predictLM("N2 ~ Data",df), type = "s", col = "gray" , ylab = "predicted N2"
     ,main=sprintf("Next N2 %f",nextNum[2]))
 

#1

Viene caricato il file in un data frame

#2

Si vuole "normalizzare" i dati presenti, facendo un cast della colonna "Data" come classe "Date" definendo il formato della stringa da convertire, inoltre si definisce una nuva colonna "x" che sarà la sequenza numerica da 1 al numero di dati caricati, da notare la funzione "length" che restituisce il numero di elementi di un oggetto

#3

Viene creata una funzione che restituisce un oggetto risultato dell'analisi fatta dalla funzione "forecast" ( https://stats.stackexchange.com/tags/forecasting ) l'analisi per il calcolo di N valori successivi data una serie ed una funzione di relazione, in particolare:

#3.1

la funzione usata fa parte della libreria (o package) "forecast" che non fa parte del core di R , pertanto prima di eseguire lo scrit sarà necessario installarla attraverso l'struzione R

install.packages('forecast')

successivamente per usarla

library('forecast')

#3.2

per fare una predizione è necessario definire un modello dove viene formalizzata la relazionare dei dati da predire con quelli esistenti, si è scelto nell'esempio la funzione "lm" ( Fitting Linear Models )

#3.3

successivamente, sulla base dei dati reali ed il modello definito, parametrizzare la predizione (per esempio la serie è temporale ed è possibile definire l'intervallo di tempo su cui si basa la predizione con campioni presi ogni giorno oppure ogni mese), attraverso la funzione "predict" ( Model Predictions )

#3.4

infine si usa la funzione "forecast" per calcolare la previsione, se si stampa il risultato si avrebbe un risultato del seguente tipo

Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
 
21           15.3  15.3  15.3  15.3  15.3

dove si può leggere: 21, un punteggio associato alla previsione in base ad un suo algoritmo; il valore minimo all'80% di probabilità : 15.3 ; il valore massimo all'80% : 15.3 ; il valore minimo al 95% : 15.3 ; il valore massimo al 95% : 15.3 .
Va notato che nell'esempio iniziale si è usata la funzione "N1 ~ df$x" e si è messo in relazione la serie "N1" con la sequenza di numeri "x" ma l'algoritmo di previsione scelto "ForeCast", serve a predire serie temporali e non numeriche (Prediction of the future events. It is a special case of [prediction], in the context of [time-series]), infatti variando la formula cambiando la variabile indipendente...

N1 ~ df$Data
 
 
#risultato

Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
 
21       14.56438 13.26511 15.86365 12.57732 16.55145

#4

Richiamo della funzione creata per effettuare la previsione delle serie "N1" ed "N2 dipendenti da "Data" .

#4.1

per creare la formula in modo dinamico attraverso un ciclo, si usa la funzione "paste" che concatena un array di stringhe insieme ad una stringa separatore. Notare anche la funzione di cast, "as.formula"

#4.2

si usa la funzione definita in precedenza. L'oggetto restituito da "forecast" è molto più complesso rispetto a quello stampato a video al punto precedente e nell'esempio si è deciso di usare il valore medio al 95%, se è uguale a quella trovata all'80% di probabilità, la property "mean" ha solo un valore e nell'esempio lo si controlla con l' "if" e funzione "is.na"

#5

A scopo puramente didattico delle serie numeriche si è deciso di estrarre i valori più frequenti per ogni serie

#5.1

la funzione "table" ( Cross Tabulation and Table Creation ) permette la creazione di un oggetto con diverse proprietà tra cui la frequenza di ogni valore passatogli come argomento. Combinata con la funzione "sort" le si possono ordinare, nell'esempio lo si fa in modo decrescente

#5.2

"table" restituisce solo i valori calcolati delle frequenze ma per sapere il valore che ha tale frequenza, è necessario usare la funzione "names" la quale restituisce il nome della colonna della riga di frequenze calcolate da "table"

#5.3

"print" e "sprintf" , come in C, vengono usate per formattare e stampare stringhe. La prima per stampare a video una stringa la seconda per creare una stringa composta da testo e variabili di tipologie diverse, nell'esempio si integrano variabili di tipo stringa "%s" e successivamente si userà per stampare un "float" con "%f"

#6

R offre un insieme di funzioni anche per mostrare graficamente i dati , interessante la funzione "par" per disporre più grafici in quadranti diversi (nell'esempio: 1 riga e 2 colonne). I grafici possono essere creati con la funzione "plot". Nell'esempio specifico "plot" supporta la classe "forecast" e quindi si può notare il punto blu del valore medio predetto nell'intorno della probabilità dell'80% (grigio chiaro) e 95% (grigio scuro).

Conclusioni

Mi sono avvicinato a questo mondo per curiosità, ho trovato uno scopo per giorcare con i numeri ( e se diventerò milionario sarà colpa della scienza... ) e questo mi ha fatto capire la potenza di questo linguaggio che consiglio a chiunque voglia fare analisi statistiche o predizioni (o previsioni). Al giorno d'oggi siamo monitorati da qualsiasi servizio "gratuito" che chiede qualche piccola nostra informazione che messa insieme alle altre permette ai "Big" di fare pubblicità mirate e proposte promozionali a cui non possiamo rinunciare... Probabilmente anche i Big usano R !

Martedì, Gennaio 02, 2018 Boymix81 How to, Tutorial 971

R ( https://www.r-project.org/ ) è un linguaggio di scripting pensato per programmare algoritmi statistici, usato per esempio per generare modelli usati per le previsioni meteo o per analizzare andamenti di mercati e compravendite.

Installazione e ambiente di sviluppo

Dal 1997 aggiornato e

...