Notebook B4DS – Technological Forecasting in R

Cosa descrive una Time Series?

Una serie storica (in inglese Time Series) è costituita da un insieme di variabili relative ad un certo fenomeno e ordinate nel tempo. La serie storica esprime la dinamica del fenomeno nel tempo.

Le serie storiche sono studiate:

  • per interpretare il fenomeno analizzato;
  • per prevedere l’andamento nel futuro del fenomeno sotto analisi.

L’utilizzo di un modello in entrambi i casi è di fondamentale importanza per non dare delle conclusioni affrettate sul fenomeno. Prendiamo ora come esempio la seguente serie storica:

computer %>% 
  tail(10)
## # A tibble: 10 x 3
##    tech      year     n
##    <chr>    <dbl> <dbl>
##  1 computer  2008  7130
##  2 computer  2009  5913
##  3 computer  2010  5718
##  4 computer  2011  5870
##  5 computer  2012  6323
##  6 computer  2013  6730
##  7 computer  2014  6844
##  8 computer  2015  6474
##  9 computer  2016  6204
## 10 computer  2017  6915

Il dataset computer mostrato rappresenta l’andamento nel tempo del numero di brevetti sottomessi negli uffici brevettuali di tutto il mondo, che contengono nel loro testo la parola computer. Lo studio di questo fenomeno è di particolare interesse per l’ Innovation Management (gestione dell’innovazione). Quello che stiamo analizzando in questo specifico caso è l’evoluzione nel tempo di una tecnologia (nel nostro caso della tecnologia computer), fenomeno che viene definito in gestione dell’innovazione come Traiettoria Tecnologica. Nel seguente documento presenteremo un particolare modello che viene utilizzato per investigare la traiettoria tecnologica, che è la Curva ad S.

Con l’ondata tecnologica che si è avuta con l’Industria 4.0, l’analisi delle traiettorie tecnologiche o delle serie storiche e in generale la processazione dei dati, ha avuto nuova vita. Infatti, i nuovi tool di analisi dei dati, come R, sono maggiormente accessibili ad una sempre più ampia popolazione. Tuttavia quello che succede, a volte, è pensare che questi strumenti possano sostituirsi all’intelletto umano.

Ad esempio, un approccio tipico che emerge nella costruzione di un modello nel software Rstudio è di far interpolare in modo automatico un insime di dati al software, utilizzando una funzione predefinita. Facciamo un esempio: partendo dal nostro dataset computer abbiamo mostrato nella figura, il numero di brevetti che contengono la parola computer per ogni anno: ogni punto nel grafico rappresenta un singolo anno. In particolare sull’asse x della figura abbiamo il tempo, in anni, mentre sull’y abbiamo il numero di brevetti.

computer %>% 
  ggplot(aes(x = year, y = n)) +
  geom_point() +
  xlab("Year") +
  ylab("Number of patents") +
  theme_minimal() + geom_smooth() +
  theme(text = element_text(size = 25))

plot of chunk plot-starting-dataset-smooth

Abbiamo usato una funzione di interpolazione contenuta nel pacchetto ggplot2: geom_smooth(). Questa funzione costruisce la linea che meglio interpola i dati, nel grafico rappresentata dalla linea blu. Ma l’esercizio non può ritenersi chiuso qui. Lo studioso dovrebbe andar oltre il mero esercizio grafico e chiedersi:

  • Quale funzione meglio cattura l’andamento della linea che il software ha disegnato?
  • Come posso spiegare questa relazione tra la variabile x e y?
  • Quanto è forte la relazione tra la variabile x e y?

Queste sono soltanto una porzione di domande che possiamo porci. I package utilizzati nella seguente analisi sono: tidyverse e tidymodels, quindi ricordatevi di Installare questi pacchetti e successivamente di caricarli nel vostro ambiente di lavoro, come abbiammo fatto di seguito.

library(tidyverse)
library(tidymodels)
library(textyr)

Teoria sulle Curve ad S

Che cos’è il “Technology Forecasting”

Le curve ad S rientrano nell’ambito del Technology Forecasting, che include una serie di metodologie finalizzate a effettuare delle predizioni quantitative sull’andamento futuro di un campo tecnologico al fine di supportare le decisioni aziendali analizzando le future opportunità e minacce.

Le Curve a S

Le curve ad S descrivono le fasi del ciclo vita della tecnologia, dalla comparsa della tecnologia al suo declino. Il modello di curva ad S è solitamente utilizzato in teoria dell’innovazione per spiegare due fenomeni legati ad una tecnologia:

  • l’andamento della performance tecnologica;
  • il processo di diffusione di una tecnologia sul mercato.

Questi due fenomeni sebbene correlati tra loro, sono però due fenomeni distinti. Il primo è volto a descrivere come le prestazioni di una tecnologia variano lungo il ciclo vita della tecnologia sotto analisi. Il secondo pone l’accento su come il mercato adotta la tecnologia lungo le varie fasi del ciclo vita.

Il ciclo vita di una tecnologia è analizzato sotto due punti di vista:

  • il globale degli investimenti sostenuti dall’area di ricerca e sviluppo sulla tecnologia in esame;
  • gli anni vita della tecnologia supponendo un investimento costante nella tecnologia.

Di norma si riscontra un andamento iniziale lento della performance o nell’adozione della tecnologia, nella fase chiamata Emergente. Questa fase è seguita da una accelerazione della performance o nell’adzione (fase di Crescita) con una conseguente fase che presenta un rallentamento nel processo di miglioramento/adozione (fase di Maturità). il ciclio vita di una tecnologia si chiude con la fase di Saturazione in cui la performance della tecnologia non può essere superata o all’interno del mercato non ci sono nuovi adottanti della tecnologia sotto analisi. Le curve ad S si costruiscono in un piano in cui:

  • sull’asse x è presente una dimensione che quantifica l’impegno nella ricerca e nello sviluppo rispetto alla tecnologia in analisi oppure la dimensione temporale;
  • sull’asse y è riportata una metrica volta a misurare uno dei due fenomeni descritti(ovvero
    parametro di prestazione distintivo della tecnologia oppure la quantità di adottanti della tecnologia stessa).

Per avere una comprensione dell’analisi presentata in questo documento è importante definire questi due elementi di una curva ad S:

  • il punto di inflessione della curva ad S, che è il momento in cui la curva cambia pendenza e la tecnologia si trova nella fase di Maturità;
  • il limite superiore della curva ad S, che è il limite naturale di sviluppo della tecnologia. Ovvero il punto in cui il valore di prestazione non è ulteriormente migliorabile oppure non sono possibili ulteriori adozioni sul mercato.

In generale la curva ad S di una tecnologia non è nota a priori, ma può essere stimata con dei modelli noti e ben studiati. Allo stato dell’arte i modelli più utilizzati sono la curva Logistica e la curva di Gompertz. Questi sono due modelli parametrici che utilizzano 3 paramtri per costruire una curva ad S:

  • a = Coordinata del punto di inflessione sull’asse x,
  • b = Indicatore che fa riferimento alla crescita nel punto di inflessione, ovvero la pendenza della retta tangente la curva a S nel punto di inflessione
  • d = Asintoto orizzontale della curva

Le differenze tra il modello logistico e quello di Gompertz sono:

  • il modello logistico è simmetrico rispetto al punto di inflessione della curva, mentre il modello di Gompertz no;
  • nel modello logistico la crescita è lineare, mentre il modello di Gompertz è esponenziale;
  • il punto di inflessione della tecnologia si trova al 50% del limite superiore per la curva logistica e al 37% per il modello di Gompertz.

Prima di vedere come costruire le curve ad S in R è importante porsi le seguenti domande:

  • Qual è il fenomeno che vogliamo analizzare, l’adozione di una tecnologia oppure l’andamento delle prestazioni relative alla tecnologia?
  • Vogliamo analizzare la cumulata dell’investimento in R&D oppure il tempo sull’asse delle ascisse?
  • Quale metrica vogliamo utilizzare per misurare in modo quantitativo il fenomeno sotto analisi? O detta in altre parole, quale metrica inserire sull’asse delle ordinate?

In questo documento analizzeremo la diffusione di una tecnologia in funzione degli anni della tecnologia stessa. La metrica usata per quantificare la diffusione di una tencologia è la cumulata del numero di brevetti pubblicati che citano la tecnologia in esame. L’ipotesi che stiamo facendo è la seguente: “all’aumentare del numero di brevetti che menzionano nel testo del brevetto una determinata tecnologia aumenta il numero di adottanti della tecnologia sul mercato”.

L’uso delle Curve ad S in R

Gli step per costruire un modello di regressione sono schematizzati come segue e descritti in dettaglio nei paragrafi seguenti:

  1. Preparare il dataset
  2. Esplorare il dataset
  3. Addestrare il modello
  4. Testare il modello
  5. Selezionare il modello

Innazitutto è necessario preparare il dataset ed esplorarlo. Successivamente bisogna costruire il modello ad S e testare la sua bontà per comprendere quanto il modello costruito fitta bene i dati reali. In quest’analisi saranno utilizzati entrambi i modelli di curve ad S che sono stati introdotti sopra: il modello Logistico e di Gompertz. Per questo motivo la fase finale è la selzione del modello che descrive meglio i dati reali nello specifico caso analizzato.

Preparare il dataset

L’obiettivo della fase di preparazione del dataset è realizzare una versione tidy del dataset per facilitare le analisi successive. In questa fase i dati sono acquisiti dal database Free Patents Online (FPO), una risorsa open source per scaricare i brevetti che sono stati depositati negli uffici brevettuali delle varie parti del mondo.
Pertanto, in primo luogo è necessario scrivere la query per scaricare i dati da analizzare, indicando i campi testuali del brevetto in cui eseguire la ricerca dei termini indicati. In questo documento analizziamo l’andamento della tecnologia “computer” dal 1950 al 2017.

# Costruire la query
my_query <- 'ABST/(computer) OR TTL/("computer")'

Per la costruzione della query è possibile usare anche gli operatori logici:

  • AND
  • OR
  • AND NOT

Come nell’esempio che mostriamo di seguito.

my_query <-'ABST/("data mining" AND text AND NOT "text mining")
OR TTL/("data mining" AND text AND NOT "text mining")'

Per scaricare il numero dei brevetti per anno abbiammo creato una nostra funzione in grado di eseguire lo scraping delle informazioni contenute su FPO. La funzione ha come input la query che abbiamo scritto in precedenza e consente anche di indicare l’intervallo di tempo desiderato, che nel nostro caso abbiamo detto essere dal 1950 al 2017. Il risultato che ci restituisce la nostra funzione è il seguente:

## # A tibble: 68 x 3
##    tech      year     n
##    <chr>    <dbl> <dbl>
##  1 computer  1950     0
##  2 computer  1951     0
##  3 computer  1952     0
##  4 computer  1953     0
##  5 computer  1954     1
##  6 computer  1955     0
##  7 computer  1956     0
##  8 computer  1957     0
##  9 computer  1958     0
## 10 computer  1959     0
## # ... with 58 more rows

Per descrivere l’evoluzione nel tempo della tecnologia utilizzando le curve ad S è necessario usare la cumulata del numero di brevetti che citano la tecnologia sotto analisi. Inoltre, è importante ricordare che il numero cumulato di brevetti non va calcolato per anno (per il 1950, 1951, ecc…), ma per età della tecnologia. In tal caso supponiamo che il primo anno di vita della tecnologia sia il primo anno in cui viene pubblicato un brevetto che cita la stessa. Nel nostro esempio è il 1954. Nel seguente chunk di codice è mostrato come calcolare per la tecnologia computer presa in esame:

  • la cumulata del numero di brevetti;
  • gli anni vita della tecnologia.
# Preparare il dataset
computer <- computer %>% 
  arrange() %>%  # i dati devono essere ordinati
  mutate(n_cum = cumsum(n)) %>%  # Cumulata del numero di brevetti
  filter(!(n_cum == 0)) %>% 
  mutate(t = year - min(.$year) + 1) # Anni della tecnologia

computer %>% 
  head(5)
## # A tibble: 5 x 5
##   tech      year     n n_cum     t
##   <chr>    <dbl> <dbl> <dbl> <dbl>
## 1 computer  1954     1     1     1
## 2 computer  1955     0     1     2
## 3 computer  1956     0     1     3
## 4 computer  1957     0     1     4
## 5 computer  1958     0     1     5

Come è possibile osservare dal dataset computer, abbiamo aggiunto due colonne al dataset: la colonna n_cum in cui è presente la cumulata del numero di brevetti per ogni anno e la colonna t che fa riferimento agli anni vita della tecnologia.

Esploare il dataset

Gli obiettivi dell’esplorazione del dataset sono:

  • capire quale tipo di modello usare,
  • decidere se è necessario eseguire un pre-processing dei dati,
  • indentificare gli outliers.

Nel nostro caso possiamo saltare questa fase in quanto la domanda di ricerca a cui vogliamo rispondere è “i dati relativi al numero di brevetti contenenti la tecnologia computer possono essere descritti con la curva a S?”. In ogni caso vi ricordiamo che un possibile modo per esplorare il dataset è la visualizzazione dei dati.

Addestrare il modello

La costruzion del modello è divisa in due fasi fondamentali:

  1. Addestrare il modello sui dati, fase anche chiamata Training del modello;
  2. Valutare la performance del modello, in inglese Test del modello.

Entrambe le fasi hanno come fine ultimo, oltre la costruzione del modello stesso, quello di misurare le performance del modello in termini di capacità di fittare i dati reali. Per poter svolgere le due fasi, si suddivide il dataset di partenza (computer) in training set e test set.

Il training set è utilizzato per costruire il modello nella fase di addestramento, mentre il test set è utilizzato nella fase seuccesiva, in cui si effettuerà una previsione dei valori contenuti nel test set, con il modello in precedenza costruito, in modo da confrontarli con i valori effettivi e definire l’errore che il modello commette.

Una regola empirica utilizzabile per effettuare la divisione del dataset è “usare 2/3 dei dati per il training set e 1/3 per il test set”. Ecco come effettuare la suddivisione del dataset computer con il pacchetto tidymodels:

# impostare un seed rendere l'analisi replicabile
set.seed(4595)

# Dividere il dataset
data_split <- initial_split(computer, strata = "t", p = 0.66)

# Creare il training set
computer_train <- training(data_split)

# Creare il test set
computer_test  <- testing(data_split)

La funzione initial_split() divide il dataset computer in modo random secondo una variabile di stratificazione, strata(che nel nostro caso è la colonna t), usando un parametro per la divisione, p (nel nostro caso pari a 2/3 ~ 0.66). Il training set è il dataset computer_train, mentre il test set è computer_test.

Nota aggiuntiva: L’istruzione set.seed() consente ottenere la stessa divisione anche alle successive esecuzioni del codice, rendendo quindi l’analisi ripetibile.

Per eseguire il training del modello sul dataset computer_train si utilizza la funzione drm(), contenuta nel pacchetto drc. Non abbiamo caricato il paccheto con la funzione library() in quanto questo pacchetto ha una funzione in conflitto con la libreria tidyverse, di cui facciamo ampiamente uso in questa analisi. Di seguito abbiamo riportato come dovrebbe essere utilizzata la funzione drm() in modo astratto.

model <- drc::drm(y ~ x, data = your_dataset, fct = self_start)

Per eseguire il training bisogna definire:

  • la variabile dipendente, y,
  • la varibile indipendente, x,
  • il dataset che contiene le variabili x e y, cioè your_dataset,
  • i valori iniziali per il training (fct). Per stimare i paramentri della curva ad S la funzione drm() ha bisogno di alcuni valori iniziali. Anziché inserire manualmente tali valori si possono utilizzare delle funzioni appositamente sviluppate nel pacchetto drc, che vengono chiamate self starter(self_start), che variano a seconda del modello di riferimento.

Nel nostro caso la variabile dipendente è il numero di brevetti cumulato n_cum, la variabile indipendente è il tempo t e il dataset è computer_train:

## # A tibble: 43 x 5
##    tech      year     n n_cum     t
##    <chr>    <dbl> <dbl> <dbl> <dbl>
##  1 computer  1954     1     1     1
##  2 computer  1955     0     1     2
##  3 computer  1958     0     1     5
##  4 computer  1960     0     1     7
##  5 computer  1961     1     2     8
##  6 computer  1964     1     4    11
##  7 computer  1965     3     7    12
##  8 computer  1966     1     8    13
##  9 computer  1968    24    40    15
## 10 computer  1969    67   107    16
## # ... with 33 more rows

Per quanto riguarda i valori iniziali da inserire al posto di self_start:

  • per il training di un modello Logistico si utilizza la funzione L.3();
  • per il training di un modello Gompertz si utilizza la funzione G.3().

Le funzioni L.3() e G.3() sono nel pacchetto drc.

Vediamo come addestrare il modello e quali sono i parametri stimati nel nostro caso:

# Per addestrare un modello logistico
logistic_model <- drc::drm(n_cum ~ t, data = computer_train, fct = drc::L.3())

# Per addestrare un modello di Gompertz
gompertz_model <- drc::drm(n_cum ~ t, data = computer_train, fct = drc::G.3())

summary(logistic_model)[[3]]
##                    Estimate   Std. Error   t-value      p-value
## b:(Intercept) -1.846875e-01 4.061218e-03 -45.47589 2.315686e-36
## d:(Intercept)  1.658202e+05 2.801598e+03  59.18773 7.125744e-41
## e:(Intercept)  5.407421e+01 2.343227e-01 230.76812 2.018213e-64
summary(gompertz_model)[[3]]
##                    Estimate   Std. Error   t-value      p-value
## b:(Intercept) -8.081910e-02 1.927316e-03 -41.93349 5.561657e-35
## d:(Intercept)  2.327841e+05 5.445793e+03  42.74569 2.624551e-35
## e:(Intercept)  5.450703e+01 3.213437e-01 169.62220 4.438934e-59

Il modello logistico è stato inserito nella variabile logistic_model, mentre il modello di curva ad S costruito con il modello di Gompertz è stato inserito nella variabile gompertz_model. La funzione summary() ci restituisce le informazioni estese di tutto il modello, noi abbiamo preferito mostrare soltanto la tabella dei coefficienti stimati con i relativi valori di p-value. Infatti possiamo osservare che nelle due tabelle di output, abbiamo i tre coefficienti – denominati dal modello come interceptd valore dell’asintoto superiore della curva ad S, b valore legato alla crescita nel punto di inflessione della curva e infine il parametro e (in precedenza chiamato a) che rappresenta la proezione del punto di inflessione sull’asse x. Per ognuno di questi valori possiamo osservare tre variabili ritenute rilevanti per lo studio del modello:

  • Estimate rappresenta il valore stimato dal modello di ogni coefficiente;
  • Std. Error rappresenta l’errore standard stimato dal modello per ogni coefficiente;
  • p-value rappresenta il valore del p-value relativo ad ogni coefficientne. Ricordiamo che il p-value indica la probabilità che il coefficiente in esame sia nullo. Una nota convenzione è accettare valori di p-value inferiori a 0.05.

La stima del valore d secondo il modello logistico ci dice che la cumulata massima del numero di brevetti per la tecnologia computer sarà 165,820, mentre per il modello di Gompertz sarà 232,784. Mentre è interessante vedere come per il modello logistico l’anno in cui si verifica l’anno di inflessione della curva tecnologica del computer è il 54-esimo anno di vita della tecnologia, mentre secondo il modello di Gompertz l’anno di inflessione è 55-esimo anno. Ricordiamo, che quando la traiettoria tecnologica ha superato il punto di inflessione il ciclo vita delle tecnologia è nella fase di Maturità. Nel caso della tecnologia computer l’anno di inflessione sarà nel 2008 per il modello logistico (in quanto l’anno di nascita della tecnologia è stato ipotizzato essere il 1954) e 2009 per Gompertz, quindi in entrabi i casi la tecnologia computer si trova nella fase di maturità, secondo questi modelli.

Per terminare questo paragrafo mostriamo come il modello costruito fitta i dati presenti nel training set. Nella seguente figura in span rosso abbiamo inserito il modello di Gompertz e in span blu il modello logistico.

# Mostrare il modello logistico
logistic_train <- logistic_model$predres %>%  
  as_tibble() %>% 
  rename(n_cum_predicted 
         = `Predicted values`) %>% 
  bind_cols(computer_train %>% select(t))

# Mostrare il modello di Gompertz
gompertz_train <- gompertz_model$predres %>%  
  as_tibble() %>% 
  rename(n_cum_predicted 
         = `Predicted values`) %>% 
  bind_cols(computer_train %>% select(t))


computer_train %>% 
  ggplot(aes(x = t, y = n_cum)) +
  geom_point() +
  geom_line(data = logistic_train, aes(x = t, y = n_cum_predicted), color = "blue") +
  geom_line(data = gompertz_train, aes(x = t, y = n_cum_predicted), color = "red") +
  xlab("Years of Computer technology") +
  ylab("Cumulative number of patents") +
  theme_minimal() +
  theme(text = element_text(size = 25)) 

plot of chunk plot-logistic-model-on-training-set

Testare il modello

Come abbiamo accennato prima, il test del modello è una fase importante per comprendere la bontà dei modelli costruiti nel fittare i dati reali che stiamo analizzando. Il primo step per testare i modelli è calcolare la predizione dei valori per ogni anno con i modelli addestrati:

# Preparare il test set per effettuare la previsione
computer_test_t <- computer_test %>% 
  select(t) %>% 
  as.matrix()

# Predirre i valori con il modello logistico
logistic_preds <- predict(object = logistic_model, 
        newdata = computer_test_t) %>% 
  as_tibble() %>% 
  rename(logistic_prediction = value)

# Predirre i valori con il modello di Gompertz
gompertz_preds <- predict(object = gompertz_model, 
        newdata = computer_test_t) %>% 
  as_tibble() %>% 
  rename(gompertz_prediction = value)

# Aggiungere le previsioni al test set
computer_test_preds <- computer_test %>% 
  bind_cols(
    logistic_preds, 
    gompertz_preds
  )

computer_test_preds
## # A tibble: 21 x 7
##    tech      year     n n_cum     t logistic_prediction gompertz_prediction
##    <chr>    <dbl> <dbl> <dbl> <dbl>               <dbl>               <dbl>
##  1 computer  1956     0     1     3                13.3            2.91e-23
##  2 computer  1957     0     1     4                16.0            4.27e-21
##  3 computer  1959     0     1     6                23.1            2.96e-17
##  4 computer  1962     0     2     9                40.2            1.53e-12
##  5 computer  1963     1     3    10                48.3            3.31e-11
##  6 computer  1967     8    16    14               101.             7.89e- 7
##  7 computer  1975    50   515    22               442.             2.28e- 1
##  8 computer  1976    46   561    23               532.             6.68e- 1
##  9 computer  1980   102   852    27              1110.             2.27e+ 1
## 10 computer  1985   233  1740    32              2766.             4.89e+ 2
## # ... with 11 more rows

Il secondo step è il calcolo della differenza tra il valore previsto e il valore osservato (n_cum):

# Calcolare l'errore per entrambi i modelli
computer_test_preds <- computer_test_preds %>% 
  mutate(logistic_error = logistic_prediction - n_cum) %>%
  mutate(gomperz_error = gompertz_prediction - n_cum) 

Il terzo step è valutare l’errore, analizzando o il plot dell’errore come nell’immagine prodotta dal seguente chunk di codice, oppure utilizzare una metrica di errore.

computer_test_preds %>% 
  select(t, ends_with("error")) %>% 
  gather(key = model, value = "error", ends_with("error")) %>% 
  mutate(model = str_remove(model, "_error")) %>% 
  mutate(model = str_to_title(model)) %>% 
  ggplot(aes(x = t, y = error, color = model)) +
  geom_point() +
  geom_line() +
  geom_hline(yintercept = 0, linetype = 2) +
  theme_minimal() +
  xlab("Years of Computer technology") +
  ylab("Prediction Errors")

plot of chunk plot-error-2

Da questo grafico sembra che il modello di Gompertz abbia un errore più basso rispetto al modello logistico. Per misurare l’errore con una metrica possiamo utilizzare il RMSE – Root Mean Square Error. Di seguito è riportata la formula, ma per maggiori dettagli puoi consultare la pagina RMSE:

Per calcolare l’RMSE su R nel nostro caso utilizziamo le seguenti funzioni:

# Calcolare l'RMSE
computer_error <- computer_test_preds %>% 
  select(ends_with("error")) %>% 
  gather(key = model, value = "error", ends_with("error")) %>% 
  mutate(model = str_remove(model, "_error")) %>% 
  mutate(model = str_to_title(model)) %>% 
  group_by(model) %>% 
  summarise(rmse = sqrt(sum(error^2)/n()))

Selezionare il modello migliore

La selezione del modello può essere effettuata in base a:

  • una metrica di errore (come ad esempio RMSE)
  • una metrica qualitativa (come ad esempio AdjustedR2).

Nel nostro caso abbiamo utilizzato una metrica di errore, ovvero l’RMSE. E come possiamo vedere dalla seguente tabella, il modello che ci consente di effettuare una stima più vicina ai dati reali è il modello di Gompertz, in quanto l’RMSE legato a questo modello è minore rispetto a quello risultante utilizzando il modello di logistico.

computer_error
## # A tibble: 2 x 2
##   model     rmse
##   <chr>    <dbl>
## 1 Gomperz   822.
## 2 Logistic 1532.

A questo punto possiamo effettuare la predizione del nostro fenomeno (diffusione tecnologia) per il futuro. Ad esempio, supponiamo di voler vedere come si evolverà la tecnologia nei prossimi 50 anni:

# Preparare il dataset con i vari anni da predire
year_data <- seq(0, 117) %>% 
  as_tibble() %>% 
  rename(t = value) 

# Predirre i valori
preds_data <- predict(object = gompertz_model, 
        newdata = year_data %>% as.matrix()) %>% 
  as_tibble() %>% 
  rename(Estimated = value)

# Unire il dataset con le previsioni e le osservazioni reali
preds_data <- year_data %>% 
  bind_cols(preds_data) %>%
  left_join(computer %>% select(t, n_cum)) %>% 
  rename(Observed = n_cum)

# Tidy data
preds_data_tidy <- preds_data %>% 
  gather(key = type, value = value, Estimated, Observed)

preds_data_tidy
## # A tibble: 236 x 3
##        t type         value
##    <dbl> <chr>        <dbl>
##  1     0 Estimated 6.44e-31
##  2     1 Estimated 3.71e-28
##  3     2 Estimated 1.31e-25
##  4     3 Estimated 2.91e-23
##  5     4 Estimated 4.27e-21
##  6     5 Estimated 4.25e-19
##  7     6 Estimated 2.96e-17
##  8     7 Estimated 1.49e-15
##  9     8 Estimated 5.49e-14
## 10     9 Estimated 1.53e-12
## # ... with 226 more rows

Infine mostraimo il plot:

preds_data_tidy %>% 
  ggplot(aes(x = t, y = value, color = type)) +
  geom_point() +
  geom_line() +
  theme_minimal() +
  xlab("Years of Computer technology") +
  ylab("Cumulative number of patents") +
  labs(color = NULL)+
  scale_color_manual(values = c("lightblue3", "black"))

plot of chunk prediction-plot

Nell’immagine possiamo osservare due curve: la curva nera è quella reale osservata mentre la curva blu è la previsione.
Da questo grafico possiamo vedere una possibile evoluzione della tecnologia nel tempo e anche a che punto dell’evoluzione si trova attualmente la tecnologia computer.