Analisi della struttura della popolazione italiana
  • AI Chat
  • Code
  • Report
  • Beta
    Spinner

    Analisi della struttura della popolazione in Italia

    L'analisi ha lo scopo di individuare le relazioni tra i principali indici di struttura della popolazione italiana e costruire un modello atto a predirre l'indice di dipendenza strutturale.

    Legenda

    Indice di vecchiaia [ind_vecch]
    Rappresenta il grado di invecchiamento di una popolazione. È il rapporto percentuale tra il numero degli ultrassessantacinquenni ed il numero dei giovani fino ai 14 anni. Ad esempio, nel 2021 l'indice di vecchiaia per l'Abruzzo dice che ci sono 202,5 anziani ogni 100 giovani.

    Indice di dipendenza strutturale [ind_dip_strut]
    Rappresenta il carico sociale ed economico della popolazione non attiva (0-14 anni e 65 anni ed oltre) su quella attiva (15-64 anni). Ad esempio, teoricamente, in Abruzzo nel 2021 ci sono 58,6 individui a carico, ogni 100 che lavorano.

    Indice di ricambio della popolazione attiva [ind_rica_pop_att]
    Rappresenta il rapporto percentuale tra la fascia di popolazione che sta per andare in pensione (60-64 anni) e quella che sta per entrare nel mondo del lavoro (15-19 anni). La popolazione attiva è tanto più giovane quanto più l'indicatore è minore di 100. Ad esempio, in Abruzzo nel 2021 l'indice di ricambio è 152,4 e significa che la popolazione in età lavorativa è molto anziana.

    Indice di struttura della popolazione attiva [ind_strut_pop_att]
    Rappresenta il grado di invecchiamento della popolazione in età lavorativa. È il rapporto percentuale tra la parte di popolazione in età lavorativa più anziana (40-64 anni) e quella più giovane (15-39 anni).

    Indice di natalità [ind_nat_1000]
    Rappresenta il numero medio di nascite in un anno ogni mille abitanti.

    Indice di mortalità [ind_mort_1000]
    Rappresenta il numero medio di decessi in un anno ogni mille abitanti.

    Fonte https://www.tuttitalia.it/

    Importazione dei moduli necessari

    from bs4 import BeautifulSoup
    import requests
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # Parametri di visualizzazione
    sns.set(rc={"figure.figsize":(12, 5)})
    sns.set_context("notebook")
    sns.set_style("white")

    Web Scraping

    Questa sezione ha lo scopo di reperire sul web i dati relativi alla struttura della popolazione di ogni regione italiana e inserirli in un Dataframe, in modo da poterli utilizzare.

    Il sito su cui lo scraping viene effettuato è www.tuttitalia.it .

    # URL di riferimento
    url = "https://www.tuttitalia.it/"
    
    # Estrae il codice HTML di riferimento
    html = requests.get(url).content
    
    # Crea la "soup" con il codice HTML
    soup = BeautifulSoup(html)
    # Estrae i nomi delle regioni e li inserisce in una lista
    regioni =[x.getText() for x in soup.find_all("dl")[0].find_all("dt")]
    
    display(regioni)
    # Lista vuota
    statistiche = []
    
    # Itera sulla lista delle regioni
    for i in range(len(regioni)):
        
        # Individua l'URL della pagina che contiene le statistiche della regione
        url_regione = "https://www.tuttitalia.it/" + regioni[i].lower().replace(" ", "-").replace("'", "-") + "/statistiche/indici-demografici-struttura-popolazione/"
        
        # Estrae il codice HTML di riferimento
        html_regione = requests.get(url_regione).content
        
        # Inserisce la tabella con le statistiche di interesse in un dataframe
        df = pd.read_html(html_regione, decimal=",", thousands=".", header=0)[1].drop(0, axis=0)
        
        # Aggiunge il dataframe nella lista
        statistiche.append(df)
    statistiche[0]
    # A ogni dataframe presente nella lista aggiunge una colonna con il nome della regione corrispondente
    for i in range(len(statistiche)):
        statistiche[i]["Regione"] = regioni[i]
    # Concatena tutti i dataframe presenti nella lista
    dati = pd.concat(statistiche)
    
    # Elimina l'indice di carico di figli per donna feconda (contiene solo valori a 0)
    dati.drop("Indice di carico di figli per donna feconda", axis=1, inplace=True)
    
    display(dati.head())
    display(dati.shape)
    
    # Controlla che siano state estratte tutte le 20 regioni
    print("Regioni:", len(dati.Regione.unique()))

    Data Cleaning & Validation

    Questa sezione ha lo scopo di effettuare la pulizia dei dati necessaria perché questi siano utilizzabili per analisi esplorativa e creazione di un modello di machine learning.

    # Rinomina le colonne del dataframe
    dati.columns = ["Anno", "ind_vecch", "ind_dip_strut", "ind_rica_pop_att", 
                    "ind_strut_pop_att", "ind_nat_1000", 
                    "ind_mort_1000", "Regione"]
    # Converte il tipo di dato dell'anno in numero intero
    dati["Anno"] = dati["Anno"].astype('int')
    
    # Converte il tipo di dato delle altre colonne con dati numerici in numero decimale (reale)
    for x in dati.columns[1:7]:
        dati[x] = dati[x].str.replace("-", "").replace("", np.nan).astype("float")