Quali sono i farmaci più venduti in Italia? Quelli per i quali è prevista la pubblicità

I Farmaci più venduti in Italia sono i farmaci per i quali è prevista la pubblicità.

I Farmaci senza obbligo di ricetta sul sito del Ministero della Salute sono divisi in OCT e SOP:

  • Senza Obbligo di Prescrizione
  • Overt The Counter o farmaci da banco o farmaci di automedicazione per i quali è prevista la
    pubblicità

Dati alla mano del Ministero della Salute se si puliscono un po’ è possibile realizzare un grafico  dove in blu ho rappresentati i SOP ed in Rosso gli OTC.
Ad essere rigorosi si deve parlare di “distribuzione” dei farmaci perchè questo è il titolo riportato sulla descrizione del dataset, ma questo valore è strettamente correlato con la vendita.

Aggregando le due categorie e sommando per categoria le “Quantità confezioni fornite alle farmacie ed agli esercizi commerciali” si  ottiene che, nel primo semestre 2016*:

Fonte Ministero Della Salute

Sono 30,3 Milioni le confezioni di farmaci OTC distribuite contro i 12,6 Milioni di confezioni SOP

Totale delle Scatole vendute suddivise per Farmaci Senza Obbligo di Ricetta che possono essere pubblicizzati (OTC ) e non pubblicizzabili (SOP)

Mi scuso se non ho formattato adeguatamente l’asse del y, è espresso come potenza di 10^7 (quindi 3*10^7= 30Milioni)

Sulla base di questi risultati mi sento di scrivere tre affermazioni:

  • I medicinali equivalenti sono poco utilizzati, nonostante l’obbligo del farmacista nel momento dell’acquisto di evidenziare la possibilità di questa scelta
  • Potrebbe esserci un consumo eccessivo di medicinali con ricadute sulla salute legato alla pubblicità e non ad un confronto corretto con il proprio medico di base, ma non sono un medico questa è un valutazione che va oltre le mie competenze
  • E’ importante per permettere una analisi più corretta che vengano pubblicati
    • I Dati più recenti relativi al 2017 e 2018
    • I dati relativi ai farmaci equivalenti per valutare eventuali correlazioni e confronti, anche se non sono tra i 50 più venduti

Per onestà intellettuale ho scritto al Ministero, sia per chiedere un aggiornamento del dataset sia per avere informazioni sui farmaci equivalenti, se dovesse esserci una risposta vi aggiornerò.

Di seguito trovate invece tutto il lavoro svolto in Python per la selezione, analisi e visualizzazione dei dati a partire dal dataset originale.
In particolare successivamente all’aggregazione tramite metodo groupby in pandas del dataframe ho aggiunto una colonna che avesse come label la “Modalità e Prescrizione” del farmaco.
Questa colonna è stata aggiunta attraverso  una unione (merge) con un dataframe contenente solo la lista unica dei Farmaci e la  “Modalità di Prescrizone” che avevo estratto dal dataframe originario.
Grazie per aver letto l’articolo!
Se ti è piaciuto o lo trovi utile ricondividilo, se pensi meriti delle correzioni scrivimi pure 🙂
Un abbraccio 
Andrea

In [1]:
# Import pandas
import pandas as pd
import numpy as np
# Import plotting modules
import matplotlib.pyplot as plt
import re
file_name='C_17_dataset_15_download_itemDownload_0_upFile.csv'
csv=pd.read_csv(file_name,sep=';',encoding="ISO-8859-1",skiprows=1)
csv.info()
#Visualizzo il titolo dei farmaci
#Questo è necessario per il successivo
#processo di pulizia e aggregazione 
csv_mod=csv.dropna().copy()
csv_mod['Farmaco']=None
#Un prodotto Rinazina aveva ** ad inizio stringa perchè il ministero doveva confermare il dato
#per comodità ho rimosso ** 
csv_mod['Denominazione della confezione']=csv_mod['Denominazione della confezione'].str.replace('*','')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 52 entries, 0 to 51
Data columns (total 6 columns):
N°                                                                        51 non-null object
Codice Autorizzazione all'Immissione in Commercio
(AIC)                   50 non-null float64
Denominazione della confezione                                            50 non-null object
Fascia PTN                                                                50 non-null object
Modalità
Prescrizione                                                     50 non-null object
Quantità confezioni fornite alle farmacie ed agli esercizi commerciali    50 non-null object
dtypes: float64(1), object(5)
memory usage: 2.5+ KB
In [2]:
#Aggiungiamo la colonna Farmaco al nostro DataFrame
csv_mod['Farmaco']=None
def primaparola(colonna_di_testo):
    pattern=r'\W*(\w[^,. !?"]*)'
    return re.match(pattern,colonna_di_testo).group()
estratto=csv_mod['Denominazione della confezione'].apply(primaparola)
#Aggiungo la colonna Farmaco al mio dataframe per la successiva aggregazione
csv_mod['Farmaco']=estratto
csv_mod['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali']=pd.to_numeric(csv_mod['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali'].str.replace('.',''))
In [3]:
#In questa sezione realiziamo un dataframe 
#Contenente le categorie uniche di Farmaco
#Per fare questo
#Rimuoviamo i duplicati
selezione= csv_mod.drop_duplicates(subset=['Farmaco']).copy()
#Selezioniamo solo le colonne di interesse che andranno 
#a costituire il nostro
#dataframe
selezione=selezione[['Modalità\nPrescrizione','Farmaco']]
In [4]:
#Iniziamo il nostro lavoro di Aggregazione 
#e visualizzazione in ordine 
#Decrescente per numero di confezioni 
#fornite alle farmacie
grouped=csv_mod.groupby(by='Farmaco').sum()
grouped=grouped.sort_values(by='Quantità confezioni fornite alle farmacie ed agli esercizi commerciali',ascending=False)
print("Grouped Prima del reset dell'index")
print(grouped.head(2))
#Il reset dell'index serve per avere il farmaco come colonna e non come index
grouped=grouped.reset_index()
print("Grouped Dopo il reset dell' index")
print(grouped.head(2))
#Effettuiamo l'unione tra i due dataframe
#L'unione è fatta sfruttando la colonna Farmaco
df_farma=grouped.merge(selezione,on='Farmaco')
print(df_farma.head(3))
print(grouped.info())
#tu hai dei farmaci con lo stessa label in una colonna ma una diversa in un'altra come fare a conoscere se questa affermazione è vera?
#Puoi crare un dizionario che associ ->tachipirina a sop e rinazina a otc
#print(csv_mod.info())
Grouped Prima del reset dell'index
               Codice Autorizzazione all'Immissione in Commercio\n(AIC)  \
Farmaco
TACHIPIRINA                                           89215558.0
ENTEROGERMINA                                         39138155.0
               Quantità confezioni fornite alle farmacie ed agli esercizi commerciali
Farmaco
TACHIPIRINA                                              8309360
ENTEROGERMINA                                            3834716
Grouped Dopo il reset dell' index
         Farmaco  Codice Autorizzazione all'Immissione in Commercio\n(AIC)  \
0    TACHIPIRINA                                         89215558.0
1  ENTEROGERMINA                                         39138155.0
   Quantità confezioni fornite alle farmacie ed agli esercizi commerciali
0                                            8309360
1                                            3834716
         Farmaco  Codice Autorizzazione all'Immissione in Commercio\n(AIC)  \
0    TACHIPIRINA                                         89215558.0
1  ENTEROGERMINA                                         39138155.0
2       VOLTAREN                                        138192273.0
   Quantità confezioni fornite alle farmacie ed agli esercizi commerciali  \
0                                            8309360
1                                            3834716
2                                            2940672
  Modalità\nPrescrizione
0                    SOP
1                    OTC
2                    OTC
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 32 entries, 0 to 31
Data columns (total 3 columns):
Farmaco                                                                   32 non-null object
Codice Autorizzazione all'Immissione in Commercio
(AIC)                   32 non-null float64
Quantità confezioni fornite alle farmacie ed agli esercizi commerciali    32 non-null int64
dtypes: float64(1), int64(1), object(1)
memory usage: 848.0+ bytes
None
In [6]:
##### Ora che abbiamo aggiunto la colonna che definisce 
#quali farmaci sono SOP e quali OTC possiamo 
#realizzare il nostro scatter plot con colori differenti
df_farma=df_farma.sort_values(by='Quantità confezioni fornite alle farmacie ed agli esercizi commerciali',ascending=False)
label=df_farma['Farmaco']
ln=np.arange(0,len(df_farma))
#Creaiamo due dataframe uno per OTC ed uno per i SOP
df_otc=df_farma[df_farma['Modalità\nPrescrizione']=='OTC']
df_sop=df_farma[df_farma['Modalità\nPrescrizione']=='SOP']
#L'index sarà  necessario per la corretta 
#disposizione sull'asse delle x delle corrispoondenti y
index_otc=df_otc.index
index_sop=df_sop.index
otc_plot=plt.scatter(index_otc,df_otc['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali'], color='red')
sop_plot=plt.scatter(index_sop,df_sop['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali'], color='blue')
plt.ylabel('# di confezioni distribuite')
plt.xticks(ln,(label) ,rotation=90)
plt.title('Medicinali senza obbligo di prescrizione più distribuiti primo semestre 2016 alle farmacie aperte al pubblico ed agli esercizi commerciali')
plt.text(10, 4, 'Elaborazioni Ing. Andrea Ciufo',
         fontsize=15, color='gray',
         ha='center', va='top', alpha=0.5)
plt.legend((sop_plot,otc_plot),('SOP= Senza Obbligo di Prescrizione','OTC= Over The Counter o farmaci da banco o farmaci di automedicazione per i quali è prevista la pubblicità'),loc='upper right')
plt.rcParams["figure.figsize"] = (15,4)
plt.show()

In [11]:
#In questa sezione invece Aggreghiamo
#Tutti i Farmaci SOP e tutti i farmaci OTC 
#Per visualizzarli attraverso un Bar Plot
#Per motivi di tempo non sono riuscito a migliorare 
#L'asse delle Y dove i valori sono espressi 
#In termini di x*e7
sum_otc=df_otc.groupby(by='Modalità\nPrescrizione').sum()
sum_sop=df_sop.groupby(by='Modalità\nPrescrizione').sum()
print(sum_otc['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali'])
print(sum_sop['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali'])
sum_df_y=[sum_otc['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali'].values, sum_sop['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali'].values]
sum_df_x=['OTC','SOP']
sum_df = pd.DataFrame({'Modalità Prescrizione':sum_df_x, 'Quantità confezioni fornite alle farmacie ed agli esercizi commerciali':sum_df_y})
ind=np.arange(len(sum_df_y))
plt.bar(ind,sum_df['Quantità confezioni fornite alle farmacie ed agli esercizi commerciali'], width=0.2)
plt.rcParams["figure.figsize"] = (7,3)
plt.title('Medicinali senza obbligo di prescrizione più distribuiti primo semestre 2016')
plt.ylabel('# di confezioni distribuite')
plt.xticks(ind,(sum_df_x) ,rotation=90)
plt.text(0.5, 0.5, 'Elaborazioni Ing. Andrea Ciufo',
         fontsize=15, color='gray',
         ha='center', va='top', alpha=0.5)
plt.show()

Modalità\nPrescrizione
OTC    30361800
Name: Quantità confezioni fornite alle farmacie ed agli esercizi commerciali, dtype: int64
Modalità\nPrescrizione
SOP    12599616
Name: Quantità confezioni fornite alle farmacie ed agli esercizi commerciali, dtype: int64

*il dataset più recente disponibile al 25 Ottobre 2018 sul sito del Ministero

Lascia un commento