Vai al contenuto

Ricerca scientifica in ambito sociale/Previsione violenza contro le donne

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

Su Zenodo il progetto "A Questionnaire for the Assessment of Violent Behaviors in Young Couples: The Italian Version of Dating Violence Questionnaire (DVQ) | PLOS One" che si trova qui: https://zenodo.org/records/16073 ed il relativo studio https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0126089 riguardano i comportamenti violenti nelle giovani coppie italiane, indagati tramite il questionario Dating Violence Questionnaire (DVQ).

Presaghi, F., Manca, M., Rodriguez-Franco, L., & Curcio, G. (2015). A QUESTIONNAIRE FOR THE ASSESSMENT OF VIOLENT BEHAVIORS IN YOUNG COUPLES: THE ITALIAN VERSION OF DATING VIOLENCE QUESTIONNAIRE (DVQ) [Data set]. Zenodo. https://doi.org/10.5281/zenodo.16073

Il campione demografico che ha partecipato allo studio era composto principalmente da studenti universitari. Nello specifico:

  • Il campione iniziale era di 418 studenti universitari.
  • Di questi, 310 erano femmine e 92 erano maschi. Sedici partecipanti non hanno indicato il loro genere.
  • L'età media dei partecipanti era di 23 anni con una deviazione standard di 4.71 con un'età compresa tra i 16 e i 26 anni.

Il campione comprendeva quindi tardo adolescenti (16-21 anni) e giovani adulti (21-26 anni). Una parte di questo campione (223 studenti) ha partecipato anche a una fase di retest. Questo sottocampione era composto da 75 maschi e 134 femmine, con informazioni sul genere mancanti per 14 partecipanti e un'età media approssimativamente di 22 anni (SD = 1.45, range 16-26). Il campione finale per il retest è stato di 139 partecipanti a causa di risposte mancanti. I partecipanti sono stati reclutati tra studenti universitari che frequentavano corsi regolari di Psicologia e hanno ricevuto crediti per la partecipazione allo studio.

Domanda di ricerca

[modifica | modifica sorgente]

Utilizzando il dataset del progetto fornito in Zenovo con il relativo codice R, si vogliono predire eventuali reazioni negative del partner alla rottura della relazione, includendo comportamenti di stalking.

Le variabili predittive sono 8 differenti fattori : Distacco (D), Umiliazione (H), Violenza Sessuale (S), Coercizione (C), Violenza Fisica (P), Derisione (Der), Punizione Emotiva (EP),Violenza Strumentale (I), poi ulteriori 4 parametri : Estroversione, Psicoticismo, Nevroticismo e scala della menzogna.

Creazione delle variabili predittive in R

[modifica | modifica sorgente]

Caricamento dati:

 df <- read.csv("df.csv")
 attach(df)

Creazione variabile Distacco (D): Questo fattore si riferisce a comportamenti in cui il partner ignora i sentimenti, non si sente responsabile di ciò che accade nella relazione o a entrambi. Esempi di domande nel DVQ sono: "Ha ignorato i tuoi sentimenti" e "Non si sente responsabile di ciò che accade nella relazione né di ciò che accade a entrambi".

 distacco<-cbind(cuv6a,cuv14a,cuv22a,cuv30a,cuv32a,cuv33a,cuv37a)
 distacco<-as.matrix(data.frame(distacco))
 df$distacco<- rowSums(distacco)

Calcolando la tabella delle frequenze della variabile distacco si vede che essa assume valori interi da 0 a 25 e che la percentuale degli intervistati che ha un distacco superiore a 8 è del 7,57%

table(df$distacco)
paste("distacco=",round(mean(df$distacco>8, na.rm = T)*100,2),"%", sep = "")
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 16 23 25
92 80 64 32 36 16 13 15  6  8  2  5  4  4  3  1  1  1
[1] "distacco=7.57%"


Umiliazione (H): Questo fattore riguarda comportamenti volti a sminuire e denigrare il partner, sia in privato che in pubblico. Esempi di item includono: "Ti umilia in pubblico" e "Ti insulta davanti ai tuoi amici o genitori".

 umiliazione<-cbind(cuv7a,cuv15a,cuv23a,cuv31a,cuv36a,cuv40a,cuv41a)
 umiliazione<-as.matrix(data.frame(umiliazione))
 df$umiliazione<- rowSums(umiliazione)

Violenza Sessuale (S): Questo fattore si riferisce a situazioni in cui il partner coercizza o costringe il partner ad attività sessuali non desiderate. Esempi di item includono: "Ti senti come se dovessi fare sesso con lui/lei solo per non dargli/le spiegazioni" e "Ti costringe a spogliarti quando non vuoi".

violenza_sessuale<-cbind(cuv2a,cuv10a,cuv18a,cuv26a,cuv34a,cuv39a)
violenza_sessuale<-as.matrix(data.frame(violenza_sessuale))
df$violenza_sessuale<- rowSums(violenza_sessuale)

Coercizione (C): Questo fattore comprende comportamenti di controllo e manipolazione, spesso attraverso minacce o ricatti emotivi. Esempi di item includono: "Ti parla delle tue immaginarie relazioni romantiche" e "Ti minaccia di suicidarsi o di farsi del male se lo/la lasci".

coercizione<-cbind(cuv1a, cuv9a, cuv17a, cuv25a, cuv38a,cuv42a)
coercizione<-as.matrix(data.frame(coercizione))
df$coercizione<- rowSums(coercizione)

Violenza Fisica (P): Questo fattore si riferisce ad aggressioni fisiche dirette. Esempi di item includono: "Ti ha dato un pugno" e "Ti ha fatto del male con un oggetto".

violenza_fisica<-cbind(cuv5a, cuv13a, cuv20a, cuv21a,cuv29a)
violenza_fisica<-as.matrix(data.frame(violenza_fisica))
df$violenza_fisica<- rowSums(violenza_fisica)

Derisione (Der): Questo fattore riguarda comportamenti in cui il partner ridicolizza o insulta in modo generale, spesso riferendosi a uomini o donne. Esempi di item includono: "Deride gli uomini o le donne" e "Ridicolizza o insulta gli uomini o le donne".

derisione<-cbind(cuv3a,cuv11a,cuv19a,cuv27a,cuv35a)
derisione<-as.matrix(data.frame(derisione))
df$derisione<- rowSums(derisione)

Punizione Emotiva (EP): Questo fattore si riferisce all'uso del negare supporto, affetto o stima come forma di punizione. Esempi di item includono: "Per punirti ti nega il suo/la sua supporto, affetto o stima" e "Ti minaccia di lasciarti".

punizione_emotiva<-cbind(cuv8a,cuv16a,cuv24a)
punizione_emotiva<-as.matrix(data.frame(punizione_emotiva))
df$punizione_emotiva<- rowSums(punizione_emotiva)

Violenza Strumentale (I): Questo fattore comprende comportamenti in cui il partner sfrutta o danneggia materialmente il partner. Esempi di item includono: "Ti ha rubato" e "Ti ha fatto indebitare".

violenza_strumentale<-cbind(cuv12a,cuv4a,cuv28a)
violenza_strumentale<-as.matrix(data.frame(violenza_strumentale))
df$violenza_strumentale<- rowSums(violenza_strumentale)

Nei documenti forniti, viene descritto l'Eysenck Personality Questionnaire-Revised Short form (EPQR-S). Si tratta di un questionario composto da 48 item con risposta "Sì" o "No". Questo strumento è utilizzato per valutare tre principali domini della personalità:

Estroversione (12 item): Misura il livello di socievolezza, attività e ricerca di stimoli di un individuo.

df$epq.ext <- df[, c('ey3')] +
  df[, c('ey7')] +
  df[, c('ey11')] +
  df[, c('ey15')] +
  df[, c('ey19')] +
  df[, c('ey23')] +
  df[, c('ey32')] +
  df[, c('ey36')] +
  df[, c('ey44')] +
  df[, c('ey48')] +
  (1-df[, c('ey27')]) +
  (1-df[, c('ey41')])

Nevroticismo (12 item): Valuta la tendenza a sperimentare emozioni negative come ansia, preoccupazione e tristezza.

df$epq.nev <- df[, c('ey1')] +
  df[, c('ey5')] +
  df[, c('ey9')] +
  df[, c('ey13')] +
  df[, c('ey17')] +
  df[, c('ey21')] +
  df[, c('ey25')] +
  df[, c('ey30')] +
  df[, c('ey34')] +
  df[, c('ey38')] +
  df[, c('ey42')] +
  df[, c('ey46')]


Psicoticismo (12 item): Misura tratti come l'impulsività, l'aggressività, la mancanza di empatia e la non conformità sociale.

df$epq.psy <- df[, c('ey10')] +
  df[, c('ey14')] +
  df[, c('ey22')] +
  df[, c('ey31')] +
  df[, c('ey39')] +
  (1-df[, c('ey2')]) +
  (1-df[, c('ey6')]) +
  (1-df[, c('ey18')]) +
  (1-df[, c('ey26')]) +
  (1-df[, c('ey28')]) +
  (1-df[, c('ey35')]) +
  (1-df[, c('ey43')])

Le restanti 12 item del questionario costituiscono la scala della menzogna (lie scale), utilizzata per valutare la tendenza del rispondente a presentare un'immagine di sé eccessivamente positiva.

df$epq.lie <- df[, c('ey4')] +
  df[, c('ey16')] +
  df[, c('ey45')] +
  (1-df[, c('ey8')])+
  (1-df[, c('ey12')])+
  (1-df[, c('ey20')])+
  (1-df[, c('ey24')])+
  (1-df[, c('ey29')])+
  (1-df[, c('ey33')])+
  (1-df[, c('ey37')])+
  (1-df[, c('ey40')])+
  (1-df[, c('ey47')])

La variabile stalk.ind da predire rappresenta un punteggio composito per ogni partecipante, ottenuto sommando le risposte ai 7 item della Breaking Relationship Scale (BRS) che mirano a valutare la reazione negativa del (precedente) partner in seguito alla rottura della relazione. Ai partecipanti è stato chiesto di descrivere la reazione del loro partner quando la relazione si è interrotta, basandosi sulla presenza o assenza di specifici comportamenti. Gli item della BRS includono i seguenti esempi:

  • “He/she sent me aggressive or obscene messages” (Mi ha mandato messaggi aggressivi o osceni)
  • “He/she called me without speaking” (Mi ha chiamato senza parlare)
  • “He/she spied me” (Mi ha spiato)
  • “He/she tried to put me in bad light with my friends” (Ha cercato di mettermi in cattiva luce con i miei amici)
  • “After the break of the relationship I was in a state of alertness” (Dopo la rottura della relazione ero in uno stato di allerta)
  • “After the break, I changed my habits” (Dopo la rottura, ho cambiato le mie abitudini)
  • “I changed my cell number” (Ho cambiato il mio numero di cellulare)
#######  Breaking Relationship as.factor (BRS) :
# Reazione violenta del partner alla rottura della relazione
stalk.ind <-cbind(
  df[,'brs1'],
  df[,'brs2'],
  df[,'brs3'],
  df[,'brs4'],
  df[,'brs5'],
  df[,'brs6'],
  df[,'brs7'])
stalk.ind<-as.matrix(data.frame(stalk.ind))
df$stalk.ind<-rowSums(stalk.ind)

Esportazione dati con le variabili create in formato csv:

df<-df[,275:287]
write.csv(df, file = "df.csv", row.names = F)

Creazione modello predittivo in python

[modifica | modifica sorgente]

Utilizziamo l'algoritmo RandomForest per addestrare un modello previsionale della reazione violenta del partner alla rottura della relazione (variabile stalk.ind) tramite i predictors precedentemente creati ottenendo un accuracy del 61,23%


import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

# Carichiamo i dati
data = pd.read_csv('df.csv')

# Convertiamo la variabile da predire in int e le altre in object
data= data.astype(object)
data=data[data['stalk.ind'].notna()]
data['stalk.ind']=data['stalk.ind'].astype('int')


# Separiamo la variabile target dai predittori
y = data['stalk.ind']
X = data.drop(['stalk.ind'], axis=1)

# Dividiamo i dati in un training set del 75% e in un validation set del 25%
X_train, X_valid, y_train, y_valid = train_test_split(X, y, train_size=0.75, test_size=0.25,
                                                      random_state=0)
categorical_cols = X_train.columns

# Preprocessiamo le variabili categoriche
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

preprocessor = ColumnTransformer(
    transformers=[
         ('cat', categorical_transformer, categorical_cols)
    ])

model = RandomForestClassifier()

# Mettiamo il preprocessing e il modello in una pipeline
my_pipeline = Pipeline(steps=[('preprocessor', preprocessor),
                              ('model', model)
                             ])

# addestriamo il modello sul training set
my_pipeline.fit(X_train, y_train)

# otteniamo la previsione sul validation set
preds = my_pipeline.predict(X_valid)

print(classification_report(y_valid, preds))
              precision    recall  f1-score   support
           0       0.61      1.00      0.76        30
           1       0.00      0.00      0.00        13
           2       0.00      0.00      0.00         5
           3       0.00      0.00      0.00         1
    accuracy                           0.61        49
   macro avg       0.15      0.25      0.19        49
weighted avg       0.37      0.61      0.46        49


Esempio di previsione

[modifica | modifica sorgente]

Con la seguente persona di esempio il modello predice 0 cioè assenza di reazione violenta alla rottura della relazione:

nuova_persona= {
   "distacco": 2,
   "umiliazione":3,
   "violenza_sessuale":2,
   "coercizione":4,
   "violenza_fisica":2,
   "derisione":1,
   "punizione_emotiva":1,
   "violenza_strumentale":0,
   "epq.psy":2,
   "epq.ext":0,
   "epq.nev":1,
   "epq.lie":0
}

nuova_persona_df=pd.DataFrame([nuova_persona])
my_pipeline.predict(nuova_persona_df)
array([0])