Esempi di statistica descrittiva e inferenziale/Analizzare un dataset di grandi dimensioni (OpenCoesione)
Caricamento librerie
modificaimport pandas as pd
import duckdb
import seaborn as sns
import matplotlib.pyplot as plt
Parte 1: Dati
modificaOpenCoesione è un'iniziativa di open government che mira a rendere trasparenti e accessibili a tutti i cittadini i dati relativi alle politiche di coesione in Italia. In pratica, si tratta di un portale online dove è possibile trovare informazioni dettagliate sui progetti finanziati con fondi europei, dalla loro progettazione alla realizzazione, passando per le spese sostenute. Da questo link : https://opencoesione.gov.it/it/opendata/#!progetti_section è possibile scaricare il dataset di 4,5 Gb compresso in un file zip con tutti i progetti finanziati.
Parte 2: Domanda di ricerca
modificaPer analizzare il dataset di 4,5 GB di OpenCoesione si utilizza la libreria duckdb, perchè la sola libreria pandas non è sufficiente per gestire un dataset di così grandi dimensioni. In tal modo interrogando il dataset con query SQL si possono esportare i dati ottenuti in un dataframe pandas, in modo da costruire grafici e tabelle .
Parte 3: Esplorazione dati
modificaContiamo il numero di progetti per tema totali e conclusi e visualizziamo il relativo dataframe:
# Path al tuo file CSV
csv_file_path = 'progetti_esteso_20240831.csv'
# Connessione a DuckDB
con = duckdb.connect()
# Query per leggere il file CSV e contare i progetti per tema
query = f"""
SELECT OC_TEMA_SINTETICO, COUNT(*) AS numero_progetti
FROM read_csv_auto('{csv_file_path}')
GROUP BY OC_TEMA_SINTETICO
ORDER BY numero_progetti DESC
"""
# Esegui la query e visualizza il risultato come DataFrame Pandas
df = con.execute(query).fetchdf()
# Visualizza il risultato
print(df)
OC_TEMA_SINTETICO numero_progetti 0 Occupazione e lavoro 1094320 1 Istruzione e formazione 427102 2 Competitività delle imprese 204973 3 Inclusione sociale e salute 96820 4 Reti e servizi digitali 70271 5 Ricerca e innovazione 37452 6 Ambiente 25807 7 Cultura e turismo 23116 8 Energia 17766 9 Capacità amministrativa 16332 10 Trasporti e mobilità 13268
Visualizzazione di un grafico a barre relativo alla tabella precedente:
# Plot using seaborn
plt.figure(figsize=(10, 6))
sns.barplot(data=df, y='OC_TEMA_SINTETICO', x='numero_progetti', palette='rocket')
plt.title("Numero dei progetti di OpenCoesione per Tema")
plt.ylabel("Temi")
plt.xlabel("Numero di progetti")
#plt.xticks(rotation=45)
# Add text labels
for index, value in enumerate(df['numero_progetti']):
plt.text(value, index, str(round(value, 2)), ha='left', va='center', fontsize=8)
plt.tight_layout()
plt.show()
# Query per leggere il file CSV e contare i progetti per tema conclusi
query = f"""
SELECT OC_TEMA_SINTETICO, COUNT(*) AS numero_progetti_conclusi
FROM read_csv_auto('{csv_file_path}')
WHERE OC_STATO_PROGETTO=='Concluso'
GROUP BY OC_TEMA_SINTETICO
ORDER BY numero_progetti_conclusi DESC
"""
# Esegui la query e visualizza il risultato come DataFrame Pandas
df1 = con.execute(query).fetchdf()
df1['percentuale_conclusi']= df1['numero_progetti_conclusi']*100/df['numero_progetti']
# Visualizza il risultato
df1
Visualizziamo il numero di progetti conclusi e non in Sicilia con la relativa percentuale:
query = f"""
SELECT DEN_REGIONE, COUNT(*) AS numero_progetti_conclusi_sicilia
FROM read_csv_auto('{csv_file_path}')
WHERE OC_STATO_PROGETTO=='Concluso' AND DEN_REGIONE LIKE '%SICILIA%'
GROUP BY DEN_REGIONE
ORDER BY numero_progetti_conclusi_sicilia DESC
"""
# Esegui la query e visualizza il risultato come DataFrame Pandas
df = con.execute(query).fetchdf()
# Visualizza il risultato
df
query = f"""
SELECT DEN_REGIONE, COUNT(*) AS numero_progetti_sicilia
FROM read_csv_auto('{csv_file_path}')
WHERE DEN_REGIONE LIKE '%SICILIA%'
GROUP BY DEN_REGIONE
ORDER BY numero_progetti_sicilia DESC
"""
# Esegui la query e visualizza il risultato come DataFrame Pandas
df1 = con.execute(query).fetchdf()
np=df1['numero_progetti_sicilia'].sum()
npc=df['numero_progetti_conclusi_sicilia'].sum()
print(f'Numero progetti in Sicilia = {np}')
print(f'Numero progetti conclusi in Sicilia = {npc}')
print(f'Percentuale progetti conclusi in Sicilia = {npc*100/np}')
Numero progetti in Sicilia = 107666 Numero progetti conclusi in Sicilia = 50435 Percentuale progetti conclusi in Sicilia = 46.8439433061505