Ricerca scientifica in ambito sociale/Riabilitazione dei senzatetto
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