Chapter 4 Lab 2 - 15/10/2021

In questa lezione vedremo come importare dati disponibili in un file di tipo comma-separated (csv). Vedremo inoltre come analizzare i dati disponibili in un oggetto di tipo data frame.

4.1 Importazione dei dati

Il file Adjcloseprices.csv contiene i prezzi di alcuni titoli. Si noti che il file di tipo .csv è di fatto un file di testo che può essere aperto con un editor di testo come TextNote, TextEdit o BloccoNote (si veda la Figura 4.1 per un esempio simile).

Anteprima di un file di esempio di tipo csv contenente prezzi

Figure 4.1: Anteprima di un file di esempio di tipo csv contenente prezzi

Ci sono 3 elementi che caratterizzano un file csv:

  • header (intestazione): la prima riga del file che contiene solitamente i nomi delle variabili;
  • il separatore di campo: il carattere utilizzato per separare le informazioni disponibili nel file (solitamente si utilizza il punto e virgola o la virgola);
  • il separatore decimale: il carattere utilizzato per i decimali (solitamente si usa la virgola o il punto).

Dall’anteprima del file riportata in Figura 4.1 si nota che:

  • le stringhe di testo riportate nella prima riga rappresentano i nomi delle variabili;
  • “;” è il separatore di campo;
  • “.” è il separatore decimale.

Queste informazioni devono necessariamente essere specificate in R quando si importano dei dati da un file csv. La funzione che si utilizza è read.csv i cui principali argomenti sono riportati di seguito (si veda anche ?read.csv):

  • file: il nome del file (specificato tra virgolette) da importare con eventualmente la specifica del percorso intero che porta alla cartella dove è contenuto il file;
  • header: valore logico (TRUE o FALSE) che indica se la prima riga del file contiene i nomi delle variabili;
  • sep: il carattere che rappresenta il separatore di campo (da specificare dentro le virgolette);
  • dec: il carattere che rappresenta il separatore decimale (da specificare dentro le virgolette).

Il seguente codice può quindi essere utilizzato per importare i dati disponibili in Adjcloseprices.csv (in particolare, il codice crea un oggetto di nome prices). La difficoltà consiste nello specificare il percorso del file per definirne la localizzazione nel proprio computer:

prices = read.csv("./data/Adjcloseprices.csv", header=TRUE, sep=";", dec=".")

In alternativa è possibile utilizzare la funzionalità di RStudio per l’import dei dati: si veda qui per maggiori informazioni.

La funzionalità “Import Dataset” è disponibile nel pannello in alto a destra (Environment) (si veda la Figura 4.2). Dopo aver scelto “From text (base)” è possibile specificare tutti i settaggi del file csv nella finestra “Import Dataset” che segue (si veda un esempio simile in Figura 4.3.

La funzione Import Dataset di RStudio

Figure 4.2: La funzione Import Dataset di RStudio

Finestra per la definizione delle caratteristiche del file csv

Figure 4.3: Finestra per la definizione delle caratteristiche del file csv

Dopo aver cliccato su Import un oggeto di nome prices verrà creato. Si noti che di fatto RStudio utilizza la funzione read.csv i cui argomenti vengono specificati tramite un’interfaccia user-friendly.

L’oggetto prices è un oggetto di tipo data.frame:

class(prices)
## [1] "data.frame"

I data frame sono matrici di dati le cui righe si riferiscono ai soggetti (in questo caso ai diversi giorni finanziari) e le righe alle variabili (in questo caso le date e i prezzi dei titoli).

Utilizzando la funzione str si ottengono informazioni circa la tipologia delle variabili incluse nel data frame:

str(prices)
## 'data.frame':    1008 obs. of  7 variables:
##  $ Date: Factor w/ 1008 levels "2017-09-11","2017-09-12",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ AAPL: num  38.5 38.4 38.1 37.8 38.1 ...
##  $ GSAT: num  1.6 1.68 1.77 1.78 1.82 1.78 1.77 1.8 1.79 1.77 ...
##  $ AMC : num  11.3 11.4 12.2 12.9 13.6 ...
##  $ AAL : num  44.6 45 45.7 44.9 44.7 ...
##  $ F   : num  9.69 9.85 9.87 9.82 9.87 ...
##  $ IXIC: num  6432 6454 6460 6429 6448 ...

In questo caso la variabile Date è di tipo qualitativo (chr è l’abbreviazione di character, è quindi un vettore di stringhe di testo senza alcun significato temporale) mentre le altre variabili sono di tipo numerico (num).

Utilizzando le funzioni head e tail è possibile ottenere visualizzare la parte superiore e inferiore del data frame:

head(prices) #prime 6 righe in alto (date più remote)
##         Date     AAPL GSAT      AMC      AAL        F    IXIC
## 1 2017-09-11 38.53323 1.60 11.32855 44.60053 9.694755 6432.26
## 2 2017-09-12 38.38054 1.68 11.40889 45.01872 9.847696 6454.28
## 3 2017-09-13 38.09183 1.77 12.21233 45.70923 9.873184 6460.19
## 4 2017-09-14 37.76495 1.78 12.89526 44.92147 9.822205 6429.08
## 5 2017-09-15 38.14671 1.82 13.61836 44.73669 9.873184 6448.47
## 6 2017-09-18 37.85801 1.78 13.37733 44.06564 9.881683 6454.64
tail(prices) #ultime 6 righe in basso (date più recenti)
##            Date   AAPL GSAT   AMC   AAL     F     IXIC
## 1003 2021-09-02 153.65 2.10 44.38 19.76 13.01 15331.18
## 1004 2021-09-03 154.30 2.20 44.02 19.37 12.89 15363.52
## 1005 2021-09-07 156.69 2.07 47.83 19.53 12.95 15374.33
## 1006 2021-09-08 155.11 2.69 47.40 19.13 13.03 15286.64
## 1007 2021-09-09 154.07 2.58 48.52 20.20 12.76 15248.25
## 1008 2021-09-10 148.97 2.60 50.16 18.95 12.68 15115.49

Per ottenere informazioni circa le dimensioni del data frame (numero di righe e colonne) si possono utilizzare le seguenti funzioni alternative:

nrow(prices) #n. di righe
## [1] 1008
ncol(prices) #n. di colonne
## [1] 7
dim(prices) #n. di righe e di colonne
## [1] 1008    7

Si fa notare che l’utilizzo della funzione length() non ha senso per un data frame essendo un oggetto di tipo bidimensionale (mentre length() si può utilizzare per oggetti monodimensionali come i vettori).

4.2 Selezione di dati da un data frame

La selezione di dati da un data frame si effettua utilizzando le parentesi quadre, in maniera simile a quanto visto durante il Lab 1 per i vettori. Nel caso di data frame però all’interno delle parentesi quadre dovranno essere specificati due indici, uno per le righe e uno per le colonne, separati da virgola. Per esempio il codice

prices[4,4] 
## [1] 12.89526

seleziona l’elemento presente nella quarta riga e quarta colonna, corrispondente al prezzo del titolo AMC per il giorno 2017-09-14.

Per selezionare più elementi è possibile utilizzare un vettore di indici:

prices[ c(100,101,102) , 4] #righe 100, 101, 102, quarta colonna 
## [1] 11.00088 11.36758 10.87865

Si noti che il vettore c(100,101,102) rappresenta una sequenza regolare di passo 1 da 100 a 102 il cui codice può essere semplificato con 100:102:

prices[ 100:102 , 4] #righe 100, 101, 102, quarta colonna 
## [1] 11.00088 11.36758 10.87865

Per selezionare un’intera riga (contentente i prezzi di tutti i titoli per un particolare giorno) è necessario specificare solo l’indice di riga:

prices[4, ] #tutti i dati disponibili sulla quarta riga (quarto giorno)
##         Date     AAPL GSAT      AMC      AAL        F    IXIC
## 4 2017-09-14 37.76495 1.78 12.89526 44.92147 9.822205 6429.08

In maniera simile, per estrarre i dati di un’intera colonna (corrispondenti in questo caso all’intera serie storica di prezzi per il titolo selezionato), si specifica solamente l’indice di colonna:

prices[,4] #tutti i valori in quarta colonna 
##    [1] 11.328548 11.408892 12.212335 12.895262 13.618361 13.377328 12.573884
##    [8] 12.332852 12.694401 12.774745 12.172163 12.373023 12.453368 12.051645
##   [15] 11.810614 11.810614 12.774745 12.694401 12.895262 12.212335 11.248203
##   [22] 11.127688 11.047342 11.127688 11.047342 11.047342 11.047342 10.926828
##   [29] 11.449065 11.248203 11.368720 11.489236 11.288376 11.810614 11.850787
##   [36] 11.167859 11.167859 10.806310 10.324244  9.560974  9.802007  9.882351
##   [43]  9.480629  9.159251  8.837874  9.360112  9.802007 10.083211 10.002866
##   [50] 10.404589 10.243900 10.203728 10.605451 11.127688 11.971303 12.975606
##   [57] 12.373023 11.449065 11.408320 11.652783 11.775017 11.612041 11.693530
##   [64] 11.937992 12.426921 12.426921 12.345433 12.875105 12.304689 12.426921
##   [71] 12.426921 12.100968 12.549152 12.141713 11.734273 11.489808 12.100968
##   [78] 12.304689 12.549152 12.223200 11.775017 11.489808 11.245345 11.326833
##   [85] 11.367578 11.489808 11.775017 11.123112 11.204602 10.919392 10.756416
##   [92] 10.797159 10.919392 10.756416 10.715673 10.471209 10.471209 10.267489
##   [99] 10.430464 11.000881 11.367578 10.878650 11.204602 11.571296 11.204602
##  [106] 10.960136 11.326833 11.286089 11.612041 11.937992 11.734273 11.815761
##  [113] 11.734273 11.652783 12.100968 12.589896 12.834361 12.223200 12.019481
##  [120] 12.834361 12.834361 12.997338 12.793618 12.671385 12.960310 12.919033
##  [127] 12.176086 12.423735 12.176086 11.722062 11.680789 11.598239 11.680789
##  [134] 11.391865 11.474415 11.515689 11.226765 11.144215 11.598239 11.680789
##  [141] 12.588834 12.712659 13.496881 13.579432 13.579432 13.868354 13.785807
##  [148] 13.620708 13.992182 14.157281 14.363657 14.487478 14.239828 14.033455
##  [155] 14.157281 14.198557 14.239828 14.198557 14.198557 14.404930 13.538156
##  [162] 13.620708 13.661981 13.455607 14.198557 13.868354 13.249232 13.579432
##  [169] 13.455607 13.538156 13.661981 13.703255 13.703255 13.290507 13.249232
##  [176] 12.877759 12.547560 12.588834 12.423735 11.928435 12.258636 12.217360
##  [183] 12.217360 12.010988 12.176086 12.134812 12.093535 12.093535 12.511998
##  [190] 13.097843 12.930459 13.181537 13.055998 13.390767 13.599998 13.892920
##  [197] 14.395074 13.892920 13.809229 13.265228 13.055998 13.516304 13.307075
##  [204] 13.181537 13.265228 14.060305 14.478766 14.353227 14.520614 14.562457
##  [211] 14.227690 14.269536 13.976613 14.102152 13.683691 13.767382 13.348920
##  [218] 13.014152 12.972306 12.763074 13.139690 13.139690 12.846766 13.641843
##  [225] 13.432612 13.851074 14.353227 14.478766 14.395074 14.646152 14.143997
##  [232] 14.604307 14.604307 14.646152 14.813537 15.148305 15.357535 15.524919
##  [239] 15.775999 15.901537 16.068920 16.027073 15.650459 16.027073 15.859691
##  [246] 15.734150 15.943381 16.110767 16.152615 16.529230 16.825148 16.825148
##  [253] 16.740601 16.951971 16.994246 16.740601 16.867422 16.909695 17.459259
##  [260] 17.543808 18.051102 18.598103 18.142267 18.370186 18.643690 18.689270
##  [267] 18.105803 18.014633 18.315487 18.206083 17.959932 17.868767 17.877882
##  [274] 17.093845 16.783878 17.194130 17.567915 18.370186 18.060219 17.905231
##  [281] 18.060219 18.051102 17.959932 16.255108 17.057379 16.255108 17.066492
##  [288] 17.540565 17.558798 17.540565 17.321762 17.485865 16.792994 16.756523
##  [295] 16.528606 14.276779 13.848293 14.167378 14.295013 13.438041 12.808987
##  [302] 12.298451 12.116117 12.708704 12.654004 12.909272 12.261984 12.617537
##  [309] 12.726937 12.444319 12.963973 13.000439 13.337758 13.189869 13.217599
##  [316] 13.975531 14.114176 13.735209 13.411703 13.005007 12.903334 12.357991
##  [323] 11.997512 11.405956 11.332010 11.720221 11.276552 11.479900 11.350496
##  [330] 11.914326 12.071457 12.515124 13.051224 13.467159 12.894091 12.690743
##  [337] 12.968036 13.060465 13.226841 13.032737 13.041979 13.365488 12.487394
##  [344] 12.746201 13.171384 12.949550 12.949550 13.115924 13.051224 13.541105
##  [351] 13.115924 13.263814 13.005007 12.746201 12.311776 12.681499 12.173131
##  [358] 12.256317 12.487394 12.616798 12.746201 12.200859 12.635283 12.663014
##  [365] 12.820147 12.607554 12.533610 12.820147 12.968036 14.788920 14.326768
##  [372] 14.437683 13.984773 13.679752 13.792188 13.726600 13.511098 13.520467
##  [379] 13.567315 13.586055 14.054539 13.820297 14.017061 14.448067 14.110758
##  [386] 14.335630 13.998321 13.904624 13.839037 13.913995 14.045170 13.848406
##  [393] 13.689121 14.063910 14.035799 15.281968 15.132053 15.132053 15.103945
##  [400] 15.394405 15.459993 15.544322 15.544322 15.038357 14.298152 14.288780
##  [407] 14.466805 14.335630 14.429327 14.523025 14.204454 13.782819 13.773447
##  [414] 13.670382 13.932733 14.026430 13.726600 12.770891 12.948915 12.452321
##  [421] 12.649085 12.724042 12.555388 12.302406 12.180601 12.377365 12.218080
##  [428] 12.133752 11.890139 11.712117 11.299850 11.253001 11.224891 11.149934
##  [435] 11.037498 10.475316 10.390989 10.257404 10.438698 10.534116 10.200154
##  [442] 10.448240 10.457782 10.667701 10.887162 11.001663 10.429156 10.114279
##  [449]  9.551314  9.045600  9.016974  9.055141  8.902473  8.845223  8.787971
##  [456]  8.683013  8.969265  8.454010  8.501719  8.797514  9.016974  9.026517
##  [463]  9.055141  9.331853  9.360478  9.179185 10.057028  9.932984  9.828026
##  [470] 10.286029 10.438698 10.734493 10.925329 11.202041 11.287916 10.744036
##  [477] 11.087539 10.591367 10.801286 10.829910 11.459668 11.621879 11.221124
##  [484] 11.135247 10.257404 10.343281 10.639075 10.868079 10.820370 10.887162
##  [491] 10.982579 10.505490 10.791744 10.362364 10.734493 10.782202 10.600909
##  [498] 10.877620 11.173415 11.469211 11.178113 11.333365 11.304255 11.391583
##  [505] 11.352771 11.605055 11.556539 11.149003 10.838500 10.450372 10.527998
##  [512] 10.401855 10.392153 10.489184 10.498887 10.460074 10.382448 10.304823
##  [519]  9.916694  9.635301  9.528564  9.489753  9.538269  9.111327  8.888152
##  [526]  8.946372  8.684385  8.897856  9.062810  9.062810  9.082216  8.946372
##  [533]  9.470345  9.577082  9.315094  9.431533  9.615893  9.518862  9.121030
##  [540]  9.091920  9.334500  9.460643  9.489753  9.402422  8.965777  9.334500
##  [547]  9.256875  9.004591  8.538836  8.616463  8.500024  8.218631  8.218631
##  [554]  7.888721  7.704359  7.723765  8.131302  7.665546  8.179817  8.130122
##  [561]  8.617134  8.219574  7.881646  7.822012  8.000915  8.179816  8.050611
##  [568]  8.110244  8.249391  8.169878  8.299086  8.070488  7.911463  7.752439
##  [575]  7.682866  7.275366  7.464208  7.295244  7.255488  7.195854  7.195854
##  [582]  7.414512  7.275366  7.076585  7.086524  6.579634  6.420610  6.430549
##  [589]  6.520000  6.808232  7.066647  7.285305  7.235610  7.136220  6.927500
##  [596]  6.758537  6.698902  6.321219  6.748598  6.728720  6.798293  6.480244
##  [603]  6.410671  6.609451  6.957317  6.708841  6.510061  6.748598  6.897683
##  [610]  6.818171  6.957317  7.056707  6.997073  7.265427  7.712683  7.414512
##  [617]  7.007012  6.510061  5.893841  6.052866  6.221829  6.072744  5.774573
##  [624]  5.784513  4.890000  4.530000  3.850000  4.200000  3.640000  2.910000
##  [631]  3.220000  2.600000  2.480000  2.470000  3.370000  3.190000  3.150000
##  [638]  3.560000  3.460000  3.700000  3.600000  3.040000  3.160000  2.620000
##  [645]  2.240000  2.270000  2.880000  3.140000  3.300000  2.600000  2.080000
##  [652]  2.180000  2.410000  2.440000  3.200000  3.180000  3.250000  3.180000
##  [659]  3.110000  3.050000  3.360000  4.140000  5.190000  4.920000  4.570000
##  [666]  4.300000  3.890000  3.920000  3.990000  4.100000  5.320000  5.120000
##  [673]  4.600000  4.550000  4.520000  4.720000  4.560000  4.660000  4.630000
##  [680]  4.580000  5.110000  5.600000  5.070000  5.130000  5.310000  5.590000
##  [687]  5.450000  5.380000  5.910000  6.450000  5.990000  6.290000  5.170000
##  [694]  5.890000  5.800000  5.560000  5.420000  5.630000  5.520000  5.330000
##  [701]  5.100000  4.790000  4.270000  4.180000  4.420000  4.290000  4.570000
##  [708]  4.530000  4.280000  4.130000  4.430000  4.570000  4.600000  4.260000
##  [715]  4.220000  4.500000  4.380000  4.270000  4.150000  4.150000  4.030000
##  [722]  4.060000  4.000000  3.870000  4.150000  4.160000  4.120000  4.040000
##  [729]  4.110000  4.100000  4.150000  4.140000  4.750000  4.470000  4.560000
##  [736]  4.640000  5.310000  5.540000  5.600000  5.350000  5.390000  5.690000
##  [743]  5.190000  5.410000  5.540000  5.600000  6.520000  6.300000  5.880000
##  [750]  6.070000  7.040000  6.600000  7.020000  6.420000  6.260000  5.940000
##  [757]  5.790000  5.540000  5.520000  5.760000  5.720000  5.670000  5.320000
##  [764]  5.210000  4.780000  4.610000  4.880000  4.910000  4.860000  4.710000
##  [771]  4.650000  4.650000  4.130000  4.060000  4.040000  4.140000  4.050000
##  [778]  4.080000  3.540000  2.960000  2.780000  3.040000  3.540000  3.090000
##  [785]  3.000000  3.120000  2.970000  2.750000  2.790000  2.610000  2.520000
##  [792]  2.360000  2.150000  2.340000  2.310000  2.460000  2.490000  3.770000
##  [799]  3.510000  3.130000  2.940000  2.970000  3.110000  2.980000  3.260000
##  [806]  3.190000  3.350000  3.810000  4.580000  4.490000  4.450000  4.270000
##  [813]  4.150000  4.320000  3.630000  3.510000  3.560000  3.980000  3.860000
##  [820]  4.090000  3.920000  3.190000  2.860000  2.780000  2.850000  2.800000
##  [827]  2.680000  2.590000  2.560000  2.510000  2.390000  2.290000  2.160000
##  [834]  2.120000  2.010000  1.980000  2.010000  2.050000  2.140000  2.200000
##  [841]  2.290000  2.180000  2.180000  2.330000  3.060000  2.970000  2.980000
##  [848]  3.510000  4.420000  4.960000 19.900000  8.630000 13.260000 13.300000
##  [855]  7.820000  8.970000  7.090000  6.830000  6.180000  5.500000  5.800000
##  [862]  5.610000  5.590000  5.650000  5.550000  5.510000  5.700000  6.550000
##  [869]  7.700000  9.090000  8.290000  8.010000  9.180000  8.930000  8.580000
##  [876]  8.030000  8.050000  9.290000 10.500000  9.850000 10.280000 11.160000
##  [883] 14.040000 13.020000 13.560000 14.000000 13.930000 12.490000 10.660000
##  [890]  9.020000 10.940000 10.240000 10.350000 10.350000 10.210000  9.360000
##  [897] 10.610000 10.200000  9.850000  9.790000  9.420000  8.620000  8.840000
##  [904]  9.350000  9.900000  9.330000  9.660000  9.280000  9.780000  9.990000
##  [911] 10.160000 11.500000 11.460000 10.850000 10.200000 10.030000  9.710000
##  [918]  9.390000  9.170000  9.000000  9.510000  9.740000 10.050000 10.320000
##  [925] 12.770000 12.980000 13.950000 14.030000 12.640000 12.550000 12.080000
##  [932] 13.680000 16.410000 19.559999 26.520000 26.120001 32.040001 62.549999
##  [939] 51.340000 47.910000 55.000000 55.049999 49.340000 42.810001 49.400002
##  [946] 57.000000 59.040001 55.180000 60.730000 59.259998 55.689999 58.270000
##  [953] 58.299999 56.700001 54.060001 58.110001 56.430000 56.680000 54.220001
##  [960] 51.959999 49.959999 45.070000 47.939999 46.189999 42.610001 39.349998
##  [967] 33.430000 36.000000 34.959999 34.619999 43.090000 40.779999 37.240002
##  [974] 36.990002 40.290001 38.009998 38.900002 38.130001 37.020000 35.200001
##  [981] 33.590000 29.840000 33.509998 32.700001 33.799999 31.750000 31.549999
##  [988] 33.070000 33.470001 35.689999 37.160000 36.549999 33.820000 34.410000
##  [995] 36.779999 44.259998 43.959999 40.310001 40.840000 43.330002 47.130001
## [1002] 43.689999 44.380001 44.020000 47.830002 47.400002 48.520000 50.160000

Alternativamente è possibile selezionare una colonna utilizzando il nome di colonna preceduto dal simbolo di dollaro. Il seguente codice seleziona la colonna di nome AAPL e ne salva i valori in un nuovo oggetto (di tipo vettore) denominato x:

x = prices$AAPL #è un vettore
class(x)
## [1] "numeric"
length(x)
## [1] 1008

4.3 Analisi esplorativa su singole colonne o congiuntamente

Dato un vettore di dati la funzione summary restituisce i valori dei principali indici statistici di posizione:

summary(prices$F)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.010   8.152   9.075   9.305  10.325  15.990

Per il calcolo della mediana si possono usare anche le seguenti funzioni (si ricordi che la mediana è il quantile di ordine 0.5):

median(prices$F)
## [1] 9.074938
quantile(prices$F, 0.5) #calcolo mediana
##      50% 
## 9.074938

Per calcolare misure di variabilità è possibile utilizzare la funzione var (varianza campionaria) sd (standard deviation, data dalla radice della varianza), o il coefficiente di variazione (indice relativo dato dal rapporto tra standard deviation e media):

var(prices$F)
## [1] 4.721864
sd(prices$F)
## [1] 2.172985
sd(prices$F) / mean(prices$F)
## [1] 0.2335304

E’ anche possibile calcolare gli indici di interesse congiuntamente per più colonne (più titoli) utilizzando la funzione apply. Questo approccio è utile quando si hanno molte colonne di dati in quanto evita di copiare lo stesso comando (ad esempio summary) per un numero di volte pari al numero di colonne di prezzi. La funzione apply richiede tre argomenti (si veda ?apply):

  • X: il data frame di dati,
  • MARGIN: un intero che può essere pari a 1 o a 2. Nel primo caso la funzione di interesse sarà applicata riga per riga, nel secondo colonna per colonna (come sarà per noi),
  • FUN: la funzione da applicare.

Si potrebbe quindi applicare la funzione come segue:

apply(prices, 2, mean)

Essendoci però in prices una colonna di testo (Date) la funzione restituisce dei messaggi di warning e nessun output utile. E’ quindi necessario rimuovere dal data frame la prima colonna. Il modo più semplice è quello di utilizzare le parentesi quadre, come visto precedentemente, utilizzando come indice di colonna la specifica -1 (che significa tutte le colonne meno la prima):

medie = apply(prices[  ,  -1], 2, mean)
medie
##         AAPL         GSAT          AMC          AAL            F         IXIC 
##   74.0669685    0.7280952   12.3747869   29.1990895    9.3049330 9321.7951530

Si ottiene quindi con una sola riga di codice un vettore di medie. Analogamente si può procedere per il calcolo delle deviazioni standard:

stdev = apply(prices[  ,  -1], 2, sd)
stdev
##         AAPL         GSAT          AMC          AAL            F         IXIC 
##   36.2769419    0.4902811   10.0278114   12.3677721    2.1729851 2554.0208952

E infine, utilizzando i due vettori medie e stdev si può procedere con il calcolo di tutti i coefficienti di variazione:

stdev / medie
##      AAPL      GSAT       AMC       AAL         F      IXIC 
## 0.4897857 0.6733749 0.8103422 0.4235670 0.2335304 0.2739838

4.4 Grafico di serie storiche

Si intende rappresentare graficamente le serie storiche dei prezzi per i titoli disponibili. Il grafico finale avrà le date sull’asse delle x e i prezzi sull’asse delle y. Iniziamo rappresentando la serie storica di F:

plot(prices$F) 

Ogni punto nel grafico rappresenta un giorno finanziario e la sua posizione nel grafico è data dal prezzo del titolo. Si noti che per il momento sull’asse delle x viene rappresentata, in maniera automatica, la variabile Index data da una sequenza regolare da 1 al numero totale di dati disponibili per la serie storica (in questo caso 1008). L’utilizzo dei punti non è la scelta migliore per rappresentare una serie storica perchè l’andamento temporale della serie non viene rappresentato chiaramente. Il codice che segue utilizza l’argomento type="l" (“l” sta per linea) al fine di avere una rappresentazione di tipo “linea” della serie storica:

plot(prices$F,type="l") 

Per includere le date nell’asse delle x si va a specificare due vettori all’interno della funzione plot (il primo vettore verrà utilizzato per l’asse delle x, il secondo per l’asse delle y). Si noti che, essendo il vettore delle date di tipo chr (come visto precedentemente con str) è necessario trasformarlo in un vettore di tipo Date (vettore di date vere e proprie con un ordinamento temporale). A tal fine si applica la funzione as.Date a prices$Date (si veda anche ?as.Date):

plot(as.Date(prices$Date), prices$F,
     type="l") 

E’ possibile anche cambiare le etichette degli assi e definire un titolo per il grafico:

plot(as.Date(prices$Date), prices$F,
     type="l",
     xlab = "Date",
     main = "Serie storica del titolo FORD") 

Il passo successivo consiste nel rappresentare più serie storiche nello stesso grafico (ad esempio F e AMC). La prima serie storica si rappresenta utilizzando la funzione plot mentre la seconda la funzione lines che va ad aggiungere una nuova linea ad un grafico esistente:

plot(as.Date(prices$Date) , prices$F,
     type="l")
#aggiungere una nuova serie storica
lines(as.Date(prices$Date) , prices$AMC,
      col = "red") #colore linea

Si noti che la serie del titolo N225 non è visibile perchè ha un range di valori completamente diverso (controllare usando summary) e non incluso nell’intervallo di valori utilizzato per l’asse delle y e scelto in automatico da R. Per specificare in maniera diversa il range di valori dell’asse delle y si utilzza l’argomento ylim della funzione plot (andranno specificati il valore minimo e massimo per l’asse delle y):

plot(as.Date(prices$Date),
      prices$F, 
      type = "l",#linea
      xlab = "Date",
      ylim = c(0,80)) 
lines(as.Date(prices$Date),
      prices$AMC,
      col = "red")

Utilizzando lo stesso approccio è quindi possibile rappresentare graficamente più serie storiche dei prezzi:

plot(as.Date(prices$Date),
      prices$F, 
      type = "l",#linea
      xlab = "Date",
      main = "Serie storiche",
      ylim = c(0,200)) 
lines(as.Date(prices$Date),
      prices$AMC,
      col = "red")
lines(as.Date(prices$Date),
      prices$GSAT,
      col = "blue")
lines(as.Date(prices$Date),
      prices$AAPL,
      col = "orange")

Si noti che gli argomenti xlab, ylab e main della funzione plot vengono utilizzati per specificare, rispettivamente, le etichette dell’asse delle x, dell’asse delle y e il titolo del grafico.

E’ anche possibile aggiungere una legenda al grafico utilizzando il seguente codice (non richiesto per l’esame!):

plot(as.Date(prices$Date),
      prices$F, 
      type = "l",#linea
      xlab = "Date",
      main = "Serie storiche",
      ylim = c(0,200)) 
lines(as.Date(prices$Date),
      prices$AMC,
      col = "red")
lines(as.Date(prices$Date),
      prices$GSAT,
      col = "blue")
lines(as.Date(prices$Date),
      prices$AAPL,
      col = "orange")
legend("topleft", 
       lty=c(1,1,1,1), #stile linea (1=linea continua)
       col=c("black","red","blue","orange"),
       legend = c("F","AMC","GSAT","AAPL")) #per ridurre il font size

4.5 Approcciarsi al calcolo dei log-rendimenti

Per comodità si consiglia di iniziare a calcolare i log-rendimenti usando la seguente definizione: \[ r_t = \log\left(\frac{P_t}{P_{t-1}}\right) = \log (P_t) - \log (P_{t-1}) \] per \(t=2, \ldots, n\).

In particolare sfrutteremo il fatto che i dati in R sono ordinati dai più antichi (prime righe del data frame) ai più recenti (ultime righe del data frame) e che i rendimenti logaritmici sono dati da differenze consecutive dei prezzi logaritmici (\(log(P_t) - log(P_{t-1})\)). I prezzi logaritmici sono facilmente calcolabili utilizzando la funzione log. Le differenze consecutive (per un vettore di prezzi) while differences posso essere ottenute utilizzando la funzione diff. Al fine di apprendere il funzionamento della funzione diff si consideri un piccolo vettore contenente i primi 5 prezzi di F:

mini = prices$F[1:5]
mini
## [1] 9.694755 9.847696 9.873184 9.822205 9.873184

Applicando la funzione log all’oggetto (vettore) mini si ottiene il seguente vettore di prezzi logaritmici:

log(mini)
## [1] 2.271585 2.287238 2.289822 2.284646 2.289822

Successivamente si applica la funzione diff per calcolare le differenze tra log-prezzi:

diff(log(mini))
## [1]  0.015652502  0.002584876 -0.005176756  0.005176756

il cui primo elemento è dato dalla differenza tra il secondo log-prezzo (2.2872375) e il primo (2.271585). Analogamente la seconda differenza è data dalla differenza tra il terzo log-prezzo (2.2898224) e il secondo (2.271585). Ripetendo la procedura per ogni giorno si otterrà un vettore di log-rendimenti la cui lunghezza è \(n-1\).

A titolo di controllo si può calcolare “manualmente” il primo log-rendimento:

log(mini[2]/mini[1])
## [1] 0.0156525
log(mini[2])-log(mini[1])
## [1] 0.0156525

E’ assolutamente importante ricordare che l’ordine delle due funzioni è importante: con diff(log(mini)) calcoliamo prima i log-prezzi e poi le loro differenze. E’ assolutamente sbagliato utilizzare il codice log(diff(mini)).

4.6 Esercizi Lab 2

4.6.1 Esercizio 1

Scaricare dall’e-learning i tre file CSV JNJ.csv, PFE.csv e NVS.csv (fonte dei dati: https://finance.yahoo.com/). Essi si riferiscono alle serie storiche dei prezzi dei seguenti titoli per il periodo 3/10/2013 - 3/10/2018: Johnson & Johnson (JNJ), Pfizer Inc. (PFE) e Novartis AG (NVS). Ogni file contiene le seguenti variabili:

  • Date: data
  • Open: prezzo di apertura
  • High: prezzo massimo registrato dal titolo nella giornata di negoziazione
  • Low: prezzo minimo registrato dal titolo nella giornata di negoziazione
  • Close: prezzo di chiusura
  • Adj.Close: prezzo di chiusura aggiustato per dividendi e frazionamenti
  • Volume: quantita’ complessiva di titoli scambiati nella giornata

Importare i 3 file in R creando 3 oggetti diversi con nomi JNJ, PFE e NVS. Fate attenzione al separatore di campo!

  1. Visualizzare le prime righe dei 3 dataframe. Verificare inoltre la dimensione dei 3 dataframe e la loro struttura. Si riferiscono i dati alle stesse date?

  2. Considerare solamente per i 3 dataframe la variabile Adj.Close. Calcolare per i tre titoli delle statistiche descrittive. Quale titolo presenta maggiore variabilità?

  3. Utilizzando la funzione quantile (vedere ?quantile) calcolare il quantile di ordine 0.99 per i prezzi Adj.Close di JNJ. Commentare il valore.

  4. Per i prezzi Adj.Close di JNJ si considerano estremi i valori inferiori al quantile di ordine 0.1 o superiori al quantile di ordine 0.99.

  • Calcolare quanti sono in valore assoluto i valori estremi. Suggerimento: in questo caso la condizione e’ doppia e di tipo OR che in R si traduce con l’operatore |.
  • Quanto vale la media dei prezzi estremi?
  • In quali date si verificano i valori estremi?
  1. Rappresentare sullo stesso grafico le tre serie storiche dei prezzi Adj.Close

  2. Per ogni titolo calcolare la percentuale di prezzi superiori alla media. Per quale titolo si osserva una percentuale maggiore di prezzi maggiori della media?

  3. Si considerino i più recenti 5 prezzi per Pfizer Inc. (PFE). Calcolare i log-rendimenti usando le funzioni log e diff e verificare poi manualmente la correttezza del calcolo.

4.6.2 Esercizio 2

Importare i dati del file worldbankdata.csv che contiene per 25 paesi europei i dati relativi alle seguenti variabili: Population density (people per sq. km of land area) 2016, Electric power consumption (kWh per capita) 2014, Proportion of seats held by women in national parliaments (%) 2016, Mobile cellular subscriptions 2016, Rail lines (total route-km) 2014

  1. Estrarre tutti i valori disponibili per la variabile pop_density.

  2. Calcolare utilizzando la funzione apply la mediana e la media per tutte le variabili quantitative. Verificare per quali variabili la media è maggiore della mediana.

  3. Selezionare tutti i dati disponibili per il paese in 3a riga.

  4. Selezionare tutti i dati disponibili per il paese il cui nome Country e’ Croatia (in questo caso sarà necessario vedere quale nome di paese è esattamente uguale (==) a "Croatia").

  5. Trovare il paese con la maggiore densità di popolazione utilizzando all’interno del proprio codice la funzione max.