Questo report analizza il consumo di farmaci in Italia tra il 2016 e il 2023, con l’obiettivo di identificare le classi ATC in crescita e costruire un modello predittivo per supportare decisioni di politica sanitaria e medicina di precisione.
df <- read_excel("consumo_farmaci.xlsx") %>%
clean_names() %>%
filter(if_all(everything(), ~ !is.na(.))) %>%
distinct() %>%
mutate(
regione = str_to_title(regione),
codice_atc = str_to_upper(atc1),
spesa_totale = as.numeric(spesa_totale)
)
df_trend <- df %>%
group_by(anno, codice_atc) %>%
summarise(consumo_totale = sum(spesa_totale, na.rm = TRUE)) %>%
ungroup()
## `summarise()` has grouped output by 'anno'. You can override using the
## `.groups` argument.
ggplot(df_trend, aes(x = anno, y = consumo_totale, color = codice_atc)) +
geom_line(linewidth = 1.2) +
labs(
title = "Trend di consumo farmaci per classe ATC",
x = "Anno", y = "Spesa totale (€)", color = "Classe ATC"
) +
theme_minimal()
df_variazione <- df_trend %>%
filter(anno %in% c(2016, 2023)) %>%
pivot_wider(names_from = anno, values_from = consumo_totale) %>%
mutate(variazione_perc = (`2023` - `2016`) / `2016` * 100) %>%
arrange(desc(variazione_perc))
df_variazione
## # A tibble: 14 × 4
## codice_atc `2016` `2023` variazione_perc
## <chr> <dbl> <dbl> <dbl>
## 1 P 294561991. 428539073. 45.5
## 2 V 278753927. 398485015. 43.0
## 3 A 500099243. 709540991. 41.9
## 4 H 618113857. 722409399. 16.9
## 5 M 584189776. 677004033. 15.9
## 6 R 740789104. 851463023. 14.9
## 7 C 577220693. 644377113. 11.6
## 8 B 573258487. 637903704. 11.3
## 9 J 669698888. 665087882. -0.689
## 10 N 485315137. 391730072. -19.3
## 11 G 656325490. 518989600. -20.9
## 12 L 671032466. 397195446. -40.8
## 13 D 673605427. 372882556. -44.6
## 14 S 810657192. 407346873. -49.8
if (!require(caret)) {
install.packages("caret")
library(caret)
} else {
library(caret)
}
df_model <- df_trend %>%
filter(!is.na(consumo_totale)) %>%
mutate(codice_atc = as.factor(codice_atc))
set.seed(123)
model_rf <- train(
consumo_totale ~ anno + codice_atc,
data = df_model,
method = "rf",
trControl = trainControl(method = "cv", number = 5)
)
df_model$predizione <- predict(model_rf, newdata = df_model)
ggplot(df_model, aes(x = consumo_totale, y = predizione, color = codice_atc)) +
geom_point(alpha = 0.6) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "gray") +
labs(
title = "Confronto tra spesa reale e prevista",
x = "Spesa reale (€)",
y = "Spesa prevista (€)"
) +
theme_minimal()
model_rf
## Random Forest
##
## 112 samples
## 2 predictor
##
## No pre-processing
## Resampling: Cross-Validated (5 fold)
## Summary of sample sizes: 88, 91, 90, 91, 88
## Resampling results across tuning parameters:
##
## mtry RMSE Rsquared MAE
## 2 137446186 0.14671058 106893348
## 8 144129426 0.09082519 114311040
## 14 144990774 0.08419363 115825611
##
## RMSE was used to select the optimal model using the smallest value.
## The final value used for the model was mtry = 2.
Il modello Random Forest ha mostrato una buona capacità di adattamento ai dati storici. Alcune classi ATC come P, V e A hanno registrato una crescita significativa, suggerendo un possibile aumento della domanda in ambiti specifici della medicina.
Il modello non include variabili cliniche o demografiche
La previsione si basa solo su dati aggregati per anno e classe ATC
Non è stato testato su dati futuri o esterni
Integrare dati regionali e demografici
Applicare modelli di serie temporali (ARIMA, Prophet)
Costruire una dashboard interattiva con Shiny
Automatizzare il report con RMarkdown e pubblicarlo su GitHub
Questa analisi fornisce una base solida per monitorare l’evoluzione del consumo farmaci in Italia e supportare decisioni strategiche in ambito sanitario. Il modello predittivo può essere esteso e raffinato per applicazioni più avanzate nella medicina personalizzata.