Vai al contenuto

Ricerca scientifica in ambito sociale/Riabilitazione dei senzatetto

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Lo studio https://arxiv.org/abs/2302.04455 dal titolo "Rehabilitating Homeless: Dataset and Key Insights" introduce un nuovo e ampio set di dati sulla riabilitazione dei senzatetto, raccolto per due decenni da un'organizzazione no-profit russa . Viene descritto come il primo set di dati a contenere informazioni dettagliate su migliaia di individui senzatetto in cerca di riabilitazione. Il documento presenta i risultati ottenuti dall'applicazione di modelli di machine learning per prevedere il successo della riabilitazione, sottolineando l'importanza di alcune caratteristiche nel prevedere gli esiti. L'obiettivo principale dell'analisi dei dati è infatti quello di predire il valore della variabile contract_success relativa al completamento del "contratto", che rappresenta l'accordo tra il cliente e l'organizzazione sugli obiettivi di riabilitazione, utilizzando le altre variabili del dataset. Un contratto completato con successo è definito "fulfilled" (adempiuto). Il dataset include anche variabili binarie (0 o 1) per 43 tipologie di contratto che rappresentano i diversi obiettivi specifici che la persona senzatetto intendeva raggiungere attraverso il contratto con l'organizzazione.


E' possibile scaricare i dati e l'analisi fatta in python dagli autori qui : https://github.com/LEYADEV/homeless

Descrizione dataset

[modifica | modifica sorgente]

Le variabili del dataset con le relative descrizioni sono le seguenti:

Variabile Descrizione
type id ID del tipo di contratto (43 tipi totali)
gender sesso del cliente
age età del cliente in anni
is homeless il cliente è senza fissa dimora
is married stato civile del cliente
has dependants il cliente ha persone a carico
has profession il cliente ha una professione
has residence il cliente ha la residenza (ma potrebbe non essere in grado di utilizzarla per qualsiasi motivo)
contacts relatives il cliente ha contattato i parenti di recente
source perm job la principale fonte di sostentamento del cliente è un lavoro permanente
source temp job la principale fonte di sostentamento del cliente è un lavoro temporaneo
source pension la principale fonte di sostentamento del cliente è la pensione
source alms la principale fonte di esistenza del cliente è l'elemosina
source relatives la principale fonte di sostentamento del cliente proviene dai parenti
source other la fonte primaria di esistenza del cliente non è nell'elenco
source gathering la principale fonte di esistenza del cliente è la raccolta
source charity la principale fonte di sostentamento del cliente è la beneficenza
source rehabs la principale fonte di sostentamento del cliente proviene dai centri di riabilitazione
is citizen il cliente è cittadino del paese
is retired il cliente è in pensione
disability group il cliente ha una disabilità di un certo gruppo (1, 2 o 3)
is registered il cliente ha la registrazione
from orphanage il cliente è vissuto in orfanotrofio
was confined il cliente era in isolamento
chem confirmed il cliente conferma una dipendenza chimica
chem possible possibile dipendenza chimica
chem noanswer il cliente ha rifiutato di rispondere sulla dipendenza chimica
chem no il cliente nega la dipendenza chimica
contract_success 0 - se il contratto è "parzialmente adempiuto per rifiuto del cliente” o “non eseguito per rifiuto del cliente” o “parzialmente eseguito per assenza del cliente” o “non eseguito per assenza del cliente”; 1 - se il contratto è “adempiuto”
comments alcohol il cliente ha problemi con l'alcol
comments chem il cliente ha problemi con preparati chimici o farmaci
comments disability il cliente ha una disabilità
comments absence il cliente non si rivolge a un assistente sociale
comments orphange il cliente è cresciuto in un orfanotrofio
comments work il cliente cerca lavoro
comments confinement il cliente era in isolamento
comments noresidence il cliente non ha un posto dove vivere
comments aggression il cliente dimostra un comportamento aggressivo
comments disturbance il cliente ha un disturbo in un rifugio
comments disease il cliente ha una malattia
comments death il cliente, o qualcuno vicino al cliente, è morto
comments nursinghome il cliente deve essere ricoverato in una casa di cura
comments relatives il cliente ha dei parenti
comments illiteracy il cliente è analfabeta
comments foreigner il cliente è straniero
comments ticket il cliente ha bisogno di un biglietto per tornare a casa
comments court il cliente ha problemi con un tribunale
comments pregnancy la cliente è/era incinta
comments mental il cliente ha un problema mentale
comments fire la residenza del cliente è stata bruciata
comments social benefits il cliente ha bisogno di una pensione o di altri benefici sociali
comments divorce cliente divorziato
type 1 Ripristinare/ottenere il passaporto
type 2 Richiedere prestazioni sociali
type 3 Ottenere una polizza assicurativa medica
type 4 Ripristinare/ottenere il codice fiscale (certificato)
type 5 Ottenere la documentazione a supporto dell'esperienza lavorativa
type 6 Registra disabilità
type 7 Organizzare in una casa di cura
type 8 Registrazione temporanea presso l'organizzazione
type 9 Registrazione presso altro indirizzo
type 10 Occupazione
type 11 Occupazione con alloggio
type 12 Organizzare in un ricovero notturno
type 13 Centri di riabilitazione per alcol e droga dipendenza
type 14 Organizzare in ospedale
type 15 Cercare parenti
type 16 Ritorno alla città natale
type 17 Determinare/assumere la cittadinanza
type 18 Assistenza legale in tribunale
type 19 Ottenere un alloggio
type 20 Annullare transazione fraudolenta e ripristinare alloggio
type 21 Inviare richiesta/e e/o domanda/e
type 22 Programma di riabilitazione nome omesso preservare l'anonimato
type 23 Ripristinare documenti scolastici
type 24 Emissione duplicato del certificato di nascita o altro documento
type 25 Ottenere/ripristinare ID militare
type 26 Ottenere il passaporto internazionale
type 27 Mezzi tecnici di riabilitazione (protesici dispositivi, ecc.)
type 28 Ottenere il certificato di assicurazione sociale (assicurazione- numero di conto personale individuale)
type 29 Organizzare in un centro di adattamento sociale
type 30 Assistenza nella formazione professionale
type 31 Identificazione
type 32 Registrazione al centro AIDS
type 33 Organizzare in un centro di crisi
type 34 Supporto psicologico
type 35 Ricalcolare/ripristinare/ottenere benefici sociali
type 36 Caso completo in tribunale civile
type 37 Ottenere lo stipendio non pagato al momento del licenziamento
type 38 Ripristino della salute
type 39 Programma di adattamento all'occupazione
type 40 Alloggio con supporto
type 41 Supporto al programma di riabilitazione del cliente con dipendenza chimica
type 42 Preparazione prima dell'alloggio
type 43 Ostello

Impatto sul successo del contratto delle variabili del dataset

[modifica | modifica sorgente]

L'impatto del consumo di alcol sul successo del contratto è negativo infatti calcolando l'inferenza delle 2 variabili scartiamo l'ipotesi nulla H0 e possiamo affermare che siamo fiduciosi al 95% che la percentuale dei clienti che fa uso di alcol e che adempie al contratto è minore della percentuale di clienti che non ne fa uso e adempie al contratto essendo p_value < 0,05:


library(statsr)

#Caricamento dati:
df <- read.csv("final_with_onehot_types_ALL_221120.csv")

df$contract_success <- factor(df$contract_success, levels = c(0,1), labels = c("non adempiuto","adempiuto"))

df$comments_alcohol <- factor(df$comments_alcohol, levels = c(0,1), labels = c("No","Yes"))

df <- df[,-c(49,53)]

inference(y = contract_success , x = comments_alcohol, data = df, statistic = "proportion", type = "ht", null=0,alternative = "greater", method = "theoretical", success = "adempiuto" )
Response variable: categorical (2 levels, success: adempiuto)
Explanatory variable: categorical (2 levels)
n_No = 6351, p_hat_No = 0.498
n_Yes = 1841, p_hat_Yes = 0.447
H0: p_No =  p_Yes
HA: p_No > p_Yes
z = 3.8543
p_value = 1e-04


Analogamente calcolando l'inferenze per tutte le altre variabili con la variabile contract_success si può valutare se l'impatto sul successo del contratto è positivo o negativo:

for (i in 13:98) {
  dat<-inference(y = contract_success , x = as.factor(df[,i]), data = df, statistic = "proportion", type = "ht", null=0,alternative = "greater", method = "theoretical", success = "adempiuto", verbose = FALSE )

  if (dat$p_value<0.05)
    print(paste(colnames(df[i]),"impatto negativo"))
  else
    print(paste(colnames(df[i]),"impatto positivo"))
}
[1] "comments_alcohol impatto negativo"
[1] "comments_chem impatto positivo"
[1] "comments_disability impatto positivo"
[1] "comments_absence impatto negativo"
[1] "comments_orphange impatto negativo"
[1] "comments_work impatto positivo"
[1] "comments_confinement impatto negativo"
[1] "comments_noresidence impatto positivo"
[1] "comments_aggression impatto positivo"
[1] "comments_disturbance impatto negativo"
[1] "comments_disease impatto positivo"
[1] "comments_death impatto negativo"
[1] "comments_nursinghome impatto positivo"
[1] "comments_relatives impatto negativo"
[1] "comments_illiteracy impatto positivo"
[1] "comments_foreigner impatto negativo"
[1] "comments_ticket impatto positivo"
[1] "comments_court impatto positivo"
[1] "comments_pregnancy impatto positivo"
[1] "comments_mental impatto positivo"
[1] "comments_fire impatto negativo"
[1] "comments_social_benefits impatto positivo"
[1] "comments_divorce impatto positivo"
[1] "contacts_relatives impatto positivo"
[1] "no_relatives impatto positivo"
[1] "source_perm_job impatto positivo"
[1] "source_temp_job impatto negativo"
[1] "source_social_benefits impatto negativo"
[1] "source_alms impatto negativo"
[1] "source_relatives impatto positivo"
[1] "source_other impatto positivo"
[1] "source_gathering impatto positivo"
[1] "source_charity impatto positivo"
[1] "source_rehabs impatto negativo"
[1] "is_citizen impatto positivo"
[1] "is_retired impatto positivo"
[1] "is_registered impatto positivo"
[1] "from_orphanage impatto positivo"
[1] "was_confined impatto positivo"
[1] "chem_confirmed impatto positivo"
[1] "chem_possible impatto positivo"
[1] "chem_noanswer impatto positivo"
[1] "chem_no impatto positivo"
[1] "type_1 impatto positivo"
[1] "type_2 impatto negativo"
[1] "type_3 impatto negativo"
[1] "type_4 impatto positivo"
[1] "type_5 impatto positivo"
[1] "type_6 impatto negativo"
[1] "type_7 impatto negativo"
[1] "type_8 impatto positivo"
[1] "type_9 impatto positivo"
[1] "type_10 impatto positivo"
[1] "type_11 impatto positivo"
[1] "type_12 impatto positivo"
[1] "type_13 impatto positivo"
[1] "type_14 impatto positivo"
[1] "type_15 impatto positivo"
[1] "type_16 impatto positivo"
[1] "type_17 impatto negativo"
[1] "type_18 impatto negativo"
[1] "type_19 impatto negativo"
[1] "type_20 impatto negativo"
[1] "type_21 impatto negativo"
[1] "type_22 impatto positivo"
[1] "type_23 impatto positivo"
[1] "type_24 impatto positivo"
[1] "type_25 impatto positivo"
[1] "type_26 impatto positivo"
[1] "type_27 impatto positivo"
[1] "type_28 impatto positivo"
[1] "type_29 impatto positivo"
[1] "type_30 impatto positivo"
[1] "type_31 impatto negativo"
[1] "type_32 impatto positivo"
[1] "type_33 impatto positivo"
[1] "type_34 impatto negativo"
[1] "type_35 impatto positivo"
[1] "type_36 impatto negativo"
[1] "type_37 impatto positivo"
[1] "type_38 impatto negativo"
[1] "type_39 impatto negativo"
[1] "type_40 impatto positivo"
[1] "type_41 impatto positivo"
[1] "type_42 impatto positivo"
[1] "type_43 impatto positivo"

Previsione del successo del contratto

[modifica | modifica sorgente]

Volendo predire la variabile contract_success, utilizzando le altre, conviene implementare l'algoritmo XGBoost ottenendo un'accuracy previsionale del 77% (risultati migliori si trovano nel report jupyter degli autori dello studio):

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from xgboost import XGBClassifier

with_onehot_types = pd.read_csv('final_with_onehot_types_ALL_221120.csv')

x_columns_t = list(set(with_onehot_types.columns) - set(['contract_id', 'client_id', 'contract_success', 'contract_status_id']))
X_t = with_onehot_types[x_columns_t]
y_t = with_onehot_types.contract_success

X_train_t, X_val_t, y_train_t, y_val_t = train_test_split(X_t,
                                                          y_t,
                                                          test_size=0.2,
                                                          stratify=y_t)
model = XGBClassifier()
model.fit(X_train_t, y_train_t)
preds= model.predict(X_val_t)

print(classification_report(y_val_t, preds))
              precision    recall  f1-score   support
           0       0.77      0.78      0.78       883
           1       0.76      0.75      0.76       824
    accuracy                           0.77      1707
   macro avg       0.77      0.77      0.77      1707
weighted avg       0.77      0.77      0.77      1707