Prendiamo i dati relativi alle maggiori cause di morte negli USA relative
agli ultimi 15 anni.
I dati sono presi dal sito del governo americano.
Il file con i dati è scaricabile qui: https://catalog.data.gov/dataset/age-adjusted-death-rates-for-the-top-10-leading-causes-of-death-united-states-2013
import numpy as np, pandas as pd
import matplotlib.pyplot as plt
plt.style.use('bmh')
df = pd.read_csv('D:\\Admin_1\\Download\\NCHS_-_Leading_Causes_of_Death__United_States.csv')
Le prime 10 righe di questa tabella sono ad esempio relative al primo anno preso in esame. La prima riga ad esempio ci dice che nel 1999, in Alabama, sono morte 2313 persone a causa di incidenti fortuiti.
df.head(10)
Cerchiamo ora di strutturare i dati in maniera da avere piu' informazioni possibili.
A tal fine modifichiamo il database originale in maniera tale da sintetizzarlo in questo modo:
per ogni anno e per ogni causa di morte vediamo qual è la somma dei decessi fra tutti gli Stati USA
df2 = df['Deaths'].groupby([df['Year'],df['Cause Name']]).sum()
df2unstack = df2.unstack()
df2unstack
Vediamo quali sono tutte le cause di morte che compaiono nel database
for elem in df2.index.levels[1]:
print(elem)
Ordiniamo il database in modo da visualizzare quali sono nell'ultimo anno preso in considerazione, cioe' l'anno 2015, le cause di morte piu' significative in ordine decrescente.
%matplotlib inline
Decessi_2015 = df2unstack.sort_values(by=2015, axis=1, ascending = False).iloc[:,1:]
plt.figure(figsize=(10,10))
Decessi_2015.loc[2015].plot.barh();
plt.gca().invert_yaxis()
plt.title('Decessi in numero assoluto per causa nel 2015 in USA', fontsize=18)
plt.xlabel('Numero decessi',fontsize = 14)
plt.ylabel('')
plt.xticks(fontsize = 12)
plt.yticks(fontsize = 12);
Il grafico di sopra ci mostra quindi che le prime tre cause di morte in USA nel 2015 sono:
1) Malattie legate al cuore
2) Cancro
3) Malattie legate all'apparato respiratorio (Chronic Lower Respiratory Disease)
Come possiamo vedere nel grafico di sotto infatti, anche se le malattie legate al cuore sono la causa maggiore di decessi, nel corso degli ultimi 15 anni, i decessi legati al cuore sono diminuiti. Il valore assoluto del 2015 quindi ci da poche informazioni. Cio' che va monitorato è come cambia un determinato valore nel corso del tempo. Il grafico sotto ci dice che molto probabilmente si stanno facendo passi avanti nella cura e/o prevenzione delle malattie legate al cuore. Vedremo pero' che un discorso esattamente opposto vale per altre cause di morte
plt.figure(figsize=(10,10))
plt.title('Decessi per malattie al cuore nel corso degli anni')
df2unstack['Diseases of Heart'].plot(linestyle = '--', marker ='o');
plt.axis('tight');
La tabella di sotto mostra la differenza di decessi tra un anno e quello precedente, per ogni singola causa di morte
delta_values = {}
for elem in df2.index.levels[1]:
singlecause = df2.loc[:, elem]
delta_annuo = singlecause.diff()[1:]
delta_values[elem] = delta_annuo
delta_values = pd.DataFrame(delta_values)
delta_values
Cio' che pero' piu' ci interessa è vedere qual è questa differenza cumulativa nel corso degli anni, per ogni causa di morte. Il tutto rispetto ad un anno di riferimento, che ovviamente è l'anno dal quale si inizia l'indagine. In questo caso il 1999.
Ordiniamo quindi la tabella in ordine decrescente, dalla causa di morte che è piu' cresciuta nel corso degli anni, a quella meno. Per ogni anno e per ogni causa di morte abbiamo quindi qual è la differenza tra il numero di decessi di quell'anno e il numero di decessi del 1999.
diff_cumulata = delta_values.cumsum()
del diff_cumulata['All Causes'] #qui eliminiamo 'All Causes' dalla tabella
diff_cumulata_sorted = diff_cumulata.sort_values(by = 2015, axis = 1, ascending = False)
diff_cumulata_sorted
La tabella di sopra è particolarmente importante: ci dice che le cause di morte che piu'
sono aumentate in valore assoluto negli USA negli ultimi 15 anni sono:
1) Alzheimer (nel 2015 ci sono 132 mila decessi in piu' rispetto al 1999 riconducibili a questa malattia)
2) Incidenti fortuiti
3) Cancro
L'ultimo step da fare è rapportare questo differenziale assoluto con quello che era il valore assoluto di ogni causa di morte nel 1999. In questo modo troveremo il tasso con il quale una certa causa di morte si è evoluta nel
corso del tempo.
I valori assoluti del 1999 li abbiamo qui sotto:
initvalue = {}
for elem in df2.index.levels[1][1:]:
singlecause = df2.loc[:,elem]
initvalue[elem] = singlecause.loc[1999]
initvalue = pd.Series(initvalue)
init_sorted = initvalue.sort_values(ascending = False)
init_sorted
Quindi creiamo una tabella dove per ogni causa di morte, vediamo qual è il tasso di incremento cumulativo nel corso degli anni. La differenza tra la seguente tabella e la precedente, è che la tabella di sotto tiene conto dello sviluppo anno dopo anno in termini relativi, dandoci il tasso, mentre quella precedente accumulava l'incremento di ciascuna colonna in termini assoluti, dandoci l'incremento assoluto cumulato di decessi per ogni anno.
evolution = diff_cumulata_sorted / init_sorted
evolution_sorted = evolution.sort_values(by = 2015, axis = 1, ascending = False)
evolution_sorted
La tabella di sopra quindi ci mostra le cause di morte che piu' sono cresciute nel corso degli anni, in ordine descrescente da sx verso dx, in termini relativi.
Nel 2015 il numero dei decessi causati dall'Alzheimer è aumentato del 148% rispetto al 1999.
Nel 2015 il numero del decessi causati dal Parkinson è aumentato del 91,6% rispetto al 1999.
E cosi via.
Andiamo a mettere su un grafico quest'ultima tabella
plt.figure(figsize=(12,12))
ax = evolution_sorted.loc[2015].plot.bar()
vals = ax.get_yticks()
plt.title('Variazione percentuale di decessi tra l\'anno 1999 e l\'anno 2015',fontsize=18)
ax.set_yticklabels(['{:3.0f}%'.format(x*100) for x in vals]);
Come invece avevamo gia' fatto notare, le malattie del cuore, nonostante sia ancora la maggiore causa di morte nel 2015, causano meno decessi rispetto a 15 anni fa.
dfPop = pd.read_csv('D:\\Admin_1\\Download\\DataWorld\\Population\\0f84ec41-55d9-4678-81d3-99665e7c9152_Data.csv')
new = np.array(['1990','2000','2008','2009','2010','2011','2012','2013','2014','2015','2016','2017'])
old = ['Pop','Code','Country Name','Country Code']
dfPop.columns = [old[i] if i < 4 else new[i-4] for i in range(16)]
dfPop.head(10) #visualizziamo le prime 10 righe di questo database
Prendiamo i dati riguardanti gli USA
dfPop[dfPop['Country Name'] == 'United States']
USA = dfPop[dfPop['Country Name'] == 'United States']
USA_int = USA.apply(pd.to_numeric, errors='coerce')
print('Popolazione USA nel 2000:', USA_int['2000'].values[0])
print()
print('Popolazione USA nel 2015:', USA_int['2015'].values[0])
diffperc = (USA_int['2015'] - USA_int['2000']) / USA_int['2000']
diffperc = diffperc.values[0]
print()
print('Incremento percentuale della popolazione USA tra il 2015 e il 2000: {:3.2f}%'.format(diffperc*100))
Se riprendiamo il grafico dei decessi (vedi tabella sotto), la colonna 'All Causes' ci dice il numero di decessi totale negli USA anno per anno. Questo dato include sia le cause singole presenti nella tabella, sia cause minori non presenti nella tabella. Come possiamo vedere, dal 1999 al 2015, il numero totale di decessi negli USA è aumentato ogni anno. Se la popolazione complessiva è aumentata del 14% dal 1999 al 2015, significa che il numero delle nascite, anno per anno, è aumentato con un tasso superiore al tasso con cui è aumentato il numero dei decessi.
# def highlight(s):
# return ['background-color: yellow']
# df2_highlight = df2unstack.style.apply(highlight, axis = 1, subset = ['All Causes'])
# df2_highlight
df2unstack
Sotto troviamo invece l'ultima tabella di questo studio, forse la piu' importante: ci indica anno per anno, qual è stato il peso di ciascuna causa di morte in quell'anno. La tabella è ordinata dalla causa piu' frequente a quella meno nell'anno finale (2015), da sinistra verso destra.
disease_weights = {}
for elem in df2unstack.columns[1:]:
quoz = df2unstack[elem] / df2unstack.iloc[:,0]
disease_weights[elem] = quoz
disease_weights = pd.DataFrame(disease_weights)
disease_weights = disease_weights.sort_values (by = 2015, axis = 1, ascending = False)
disease_weights
fig, ax = plt.subplots(figsize = (20,20))
disease_weights.plot(ax = ax, linestyle = '--', marker = '*');
ax.set_ylabel('Peso della singola causa sul totale dei decessi', fontsize = 16);
ax.set_xlabel('Anno', fontsize = 16);
Ultime note:
La tabella sopra mostra i pesi, ordinati in maniera descrescente da sx verso dx, di ciascuna causa di morte, anno per anno, sul totale di decessi.
Le malattie del cuore causano il 23% dei decessi, ma nel 1999 ne causavano il 30%. Quindi c'è stato un miglioramento relativamente a questa causa di morte. Non sappiamo ovviamente se il miglioramento dipende da una miglior prevenzione o migliori trattamenti farmacologici. Servono molte altri dati e indagini per capirlo.
Il cancro causa il 22% dei decessi nel 2015, una percentuale quasi uguale a quella del 1999. C'è quindi un sostanziale pareggio nella lotta contro questa malattia. Nessun avanzamento della ricerca negli ultimi 15 anni.
Le morti per ictus ('stroke') sono leggermente meno rispetto a quelle del 1999.
Le morti per diabete praticamente uguali.
Il suicidio invece è aumentato in percentuale, e non di poco (decima colonna del grafico di sopra).
Nel 2015 su 100 decessi, 16 sono causati da suicidio, mentre nel '99 erano 12.
L'Alzheimer, la causa di morte piu' cresciuta negli ultimi 15 anni, conta il 4% dei decessi nel 2015.
Mentre nel 1999 meno del 2%. Difficile dire se l'aumento del 148% è imputabile ad un aumento degli over 60-70
nella popolazione, oppure ad un aumento dei fattori di rischio ad esso associati.
Probabilmente un mix dei due.
E' importante notare che per tutte le cause di morte, il decorso dei tassi è stato "graduale" nel tempo.
Se ad esempio prendiamo la prima colonna si è partiti da un 30%, e anno per anno, si è avuto una diminuzione costante nel tempo.
Se prendiamo la colonna relativa al 'Diabete', il relativo peso è rimasto costante non solo tra il 2015 e il 1999, ma praticamente in tutti gli anni.
Se prendiamo la colonna relativa all' 'Alzheimer', il relativo peso è aumentanto in maniera costante nel corso del tempo.
Questa "gradualita'" di aumento o diminuizione ci porta a dire che c'è un trend relativo, e che quindi è molto diffice che il tutto dipenda dal caso.
Idem per quanto riguarda le cause i cui pesi relativi sono rimasti stabili nel tempo.
Immaginiamo infatti 2 scenari:
Scenario a) Nel 1999 e nel 2015 piu' o meno il 3% dei decessi è stato causato dal diabete ma nel 2005 il peso era salito al 10% e nel 2010 era sceso al 1%.
Scenario b) Nel 1999 e nel 2015 piu' o meno il 3% dei decessi è stato causato dal diabete, e non c'è stato nessun anno in cui il peso è aumentato o diminuito rispetto a questo valore.
Nel primo caso avremmo un dato la cui distribuzione ha una varianza molto alta, che non ci consente con facilita' di capire qual'è il peso che dovremmo ragionevolmente aspettarci da quella causa di morte nel prossimo futuro.
Nel secondo caso, che è quello che poi si è verificato, possiamo predire che con molta probabilita' da qui a pochi anni, il peso dei decessi relativo al diabete sara' vicino al 3%.