Esempi di statistica descrittiva e inferenziale/Analizzare un dataset di grandi dimensioni (OpenCoesione)

Caricamento librerie

modifica
import pandas as pd
import duckdb
import seaborn as sns
import matplotlib.pyplot as plt

Parte 1: Dati

modifica

OpenCoesione è 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

modifica

Per 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

modifica

Contiamo 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