Violence against women in EU countries
Summary
The percentage of women reporting serious injuries after adjusting for justifying was a good indicator of the prevalence of violence and correlated with being worried about violence.
Most EU countries had a <1% prevalence of serious partner violence (for example, Czechia, Poland, Sweden and the UK all had <1%). The exceptions were Belgium and some of the easternmost countries: Finland, the Baltics, Slovakia, Hungary, Romania and Bulgaria.
As for non-partner violence, the UK had <1% serious partner violence, but non-partner violence made its total prevalence of violence relatively high.
Violence by any perpetrator
I’ll focus on violence during the past 12 months for two reasons: People remember the past 12 months more reliably than their whole lifetime and I’m more interested in how countries are now than how they were a lifetime ago.
But most violence isn’t reported to police
These maps are based on an anonymous survey, not police reports. In fact, the survey asked the subset of women who had experienced violence whether they had reported it to police and most had not.1
But women might not think of what they experienced as violence
The survey asked about specific acts like “Have you been slapped?”, not something abstract like “Have you experienced violence?”
But they might think they deserved it
In principle, if you were slapped, the answer to “Were you slapped?” is still yes, even if you think you deserved it.
But there is data about how many women in each country thought that hitting women is sometimes justified. We can assume that every woman who justified violence reported zero violence, so the true rate of violence is the survey’s reported amount divided by the number of women who say that violence is never justified.
Percentage of women who experienced any violence by any perpetrator during the 12 months before the survey, adjusted for justifying:
But how many women had injuries?
Percentage of women who were injured by any perpetrator during the 12 months before the survey, adjusted for justifying:
But how many had serious injuries?
Say we ignore bruises and scratches and “Other” (unspecified) injuries as non-serious.
Percentage of women who were seriously injured by any perpetrator during the 12 months before the survey, adjusted for justifying:
But wounds and sprains aren’t serious
We already ignored scratches, so wounds are injuries where the flesh underneath the skin was cut by a knife or exposed in another way. Some sprains take 6 months to heal; typical ones take 3 weeks. So I wouldn’t say they’re not serious injuries, but for the sake of argument, let’s try ignoring them.
That leaves bone fractures, concussions, injuries to internal organs and miscarriages.
Percentage of women who were seriously injured by any perpetrator during the 12 months before the survey, ignoring wounds and adjusted for justifying:
Violence per partner
So Belgium and the UK had the most violence when including non-partner violence. But how likely was a given partner to be violent?
Percentage of women who were seriously injured by their current partner during the 12 months before the survey, adjusted for justifying:
Percentage of women who were seriously injured by their current partner during the 12 months before the survey, ignoring wounds and adjusted for justifying:
But their partner didn’t allow them to take the survey in the first place
Say there’s some housewife who is afraid of her husband. An interviewer doing the survey knocked on random doors in each urban and rural area of each country, so they could find her even if the government didn’t know her address. (The interviewer was always a woman.)
If they couldn’t do the survey the first time, they made at least three repeat visits at different times and on different days, so they could meet her when her husband wasn’t home.
But they’re in polygamous households, so they were never alone at home
In every European country, less than 0.5% of people live in polygamous households.
But they lied about it to protect their partner
After the interview, women were asked to write answers again on paper without the interviewer in the room and put them in a closed envelope. The envelope was mixed with other envelopes afterwards. No one could find out who wrote those answers, not even the interviewer.
But if someone was still too afraid of incriminating her partner to admit experiencing violence, could she admit being worried about violence? Worrying doesn’t incriminate anyone.
Worrying follows a similar pattern of Sweden and the UK having more non-partner violence and some of the easternmost countries (Latvia, Lithuania, Slovakia, Romania and Bulgaria, but not Poland) having more partner violence.
But they’re illiterate, so they couldn’t answer the questions
The literacy rate of adult women is >98% in all EU countries except Greece (96.9%) and Portugal (95.1%) (CIA World Factbook, 2020-05-14). Survey answers were circles/checkmarks, so someone who only knew how to read could answer the survey without writing words.
Homicide rate where the victim was a woman and the perpetrator was an intimate partner
Average rate per 100 000 women during 2015-latest available year (United Nations Office on Drugs and Crime):
Slovakia: 0.08
Slovenia: 0.12
Greece: 0.16
Spain: 0.2
Czechia: 0.23
Italy: 0.23
Hungary: 0.24
Netherlands: 0.25
France: 0.28
Sweden: 0.3
Germany: 0.33
Canada: 0.35
Croatia: 0.35
Latvia: 0.36
Malta: 0.36
Finland: 0.47
Lithuania: 0.5
Estonia: 0.57
United States: 0.99
Russia: 1.01
Perceptions
My conclusion is that perceptions are misleading. Women in Slovenia and Spain thought violence against women was common in their countries, but relatively few had experienced or even worried about it themselves. Meanwhile, the country with the lowest perception of violence was Finland, but more women (per capita) were injured there than in Slovenia.
Appendix: Python code
from collections import OrderedDict
from statistics import mean
# Question DVS_A04
any_12m = {
"AT": 5,
"BE": 11,
"BG": 8,
"CY": 5,
"CZ": 8,
"DE": 8,
"DK": 11,
"EE": 5,
"EL": 7,
"ES": 4,
"FI": 10,
"FR": 11,
"HR": 5,
"HU": 9,
"IE": 8,
"IT": 7,
"LT": 6,
"LU": 7,
"LV": 6,
"MT": 5,
"NL": 11,
"PL": 4,
"PT": 6,
"RO": 7,
"SE": 11,
"SI": 3,
"SK": 10,
"UK": 8
}
# Question DVS_A10
partner_12m = {
"AT": 3,
"BE": 6,
"BG": 6,
"CY": 3,
"CZ": 4,
"DE": 3,
"DK": 4,
"EE": 2,
"EL": 6,
"ES": 2,
"FI": 5,
"FR": 5,
"HR": 3,
"HU": 6,
"IE": 3,
"IT": 6,
"LT": 4,
"LU": 3,
"LV": 5,
"MT": 4,
"NL": 5,
"PL": 2,
"PT": 5,
"RO": 6,
"SE": 5,
"SI": 2,
"SK": 6,
"UK": 5
}
# Question DVS_A16
non_partner_12m = {
"AT": 2,
"BE": 7,
"BG": 3,
"CY": 2,
"CZ": 5,
"DE": 6,
"DK": 8,
"EE": 3,
"EL": 2,
"ES": 2,
"FI": 7,
"FR": 7,
"HR": 3,
"HU": 5,
"IE": 5,
"IT": 4,
"LT": 2,
"LU": 4,
"LV": 2,
"MT": 2,
"NL": 7,
"PL": 3,
"PT": 2,
"RO": 2,
"SE": 7,
"SI": 2,
"SK": 5,
"UK": 5
}
# Table 2.3
current_12m = {
"AT": 2,
"BE": 4,
"BG": 6,
"CY": 2,
"CZ": 3,
"DE": 3,
"DK": 4,
"EE": 3,
"EL": 5,
"ES": 1,
"FI": 4,
"FR": 4,
"HR": 2,
"HU": 5,
"IE": 2,
"IT": 5,
"LT": 4,
"LU": 2,
"LV": 6,
"MT": 2,
"NL": 4,
"PL": 2,
"PT": 4,
"RO": 6,
"SE": 2,
"SI": 1,
"SK": 7,
"UK": 2
}
partner_injury_percent = {
"bruises": {
"AT": 49,
"BE": 44,
"BG": 49,
"CY": 42,
"CZ": 54,
"DE": 49,
"DK": 38,
"EE": 52,
"EL": 35,
"ES": 35,
"FI": 42,
"FR": 32,
"HR": 39,
"HU": 36,
"IE": 57,
"IT": 20,
"LT": 46,
"LU": 47,
"LV": 50,
"MT": 37,
"NL": 39,
"PL": 56,
"PT": 47,
"RO": 53,
"SE": 34,
"SI": 33,
"SK": 42,
"UK": 52
},
"wounds": {
"AT": 21,
"BE": 16,
"BG": 10,
"CY": 6,
"CZ": 12,
"DE": 16,
"DK": 6,
"EE": 4,
"EL": 6,
"ES": 7,
"FI": 11,
"FR": 7,
"HR": 9,
"HU": 8,
"IE": 15,
"IT": 5,
"LT": 10,
"LU": 18,
"LV": 5,
"MT": 8,
"NL": 8,
"PL": 13,
"PT": 14,
"RO": 14,
"SE": 11,
"SI": 9,
"SK": 7,
"UK": 12
},
"fractures": {
"AT": 4,
"BE": 10,
"BG": 5,
"CY": 7,
"CZ": 6,
"DE": 5,
"DK": 2,
"EE": 7,
"EL": 1,
"ES": 2,
"FI": 7,
"FR": 3,
"HR": 5,
"HU": 8,
"IE": 14,
"IT": 3,
"LT": 7,
"LU": 7,
"LV": 6,
"MT": 5,
"NL": 4,
"PL": 11,
"PT": 6,
"RO": 8,
"SE": 4,
"SI": 4,
"SK": 4,
"UK": 11
},
"concussion": {
"AT": 4,
"BE": 4,
"BG": 3,
"CY": 3,
"CZ": 6,
"DE": 3,
"DK": 3,
"EE": 9,
"EL": 2,
"ES": 5,
"FI": 4,
"FR": 2,
"HR": 2,
"HU": 2,
"IE": 3,
"IT": 0,
"LT": 7,
"LU": 5,
"LV": 5,
"MT": 1,
"NL": 3,
"PL": 6,
"PT": 0,
"RO": 1,
"SE": 5,
"SI": 5,
"SK": 1,
"UK": 4
},
"internal": {
"AT": 1,
"BE": 5,
"BG": 3,
"CY": 10,
"CZ": 3,
"DE": 2,
"DK": 1,
"EE": 3,
"EL": 6,
"ES": 5,
"FI": 4,
"FR": 3,
"HR": 2,
"HU": 2,
"IE": 4,
"LT": 1,
"LU": 5,
"LV": 3,
"MT": 3,
"NL": 4,
"PL": 2,
"PT": 1,
"RO": 4,
"SE": 2,
"SI": 3,
"SK": 2,
"UK": 2
},
"miscarriage": {
"AT": 5,
"BE": 3,
"BG": 1,
"CY": 9,
"CZ": 3,
"DE": 1,
"DK": 0,
"EE": 2,
"EL": 0,
"ES": 2,
"FI": 1,
"FR": 3,
"HR": 1,
"HU": 2,
"IE": 2,
"IT": 1,
"LT": 2,
"LU": 7,
"LV": 0,
"MT": 3,
"NL": 3,
"PL": 1,
"PT": 0,
"RO": 2,
"SE": 1,
"SI": 2,
"SK": 2,
"UK": 2
},
"other": {
"AT": 3,
"BE": 4,
"BG": 2,
"CY": 1,
"CZ": 4,
"DE": 4,
"DK": 2,
"EE": 5,
"ES": 2,
"FI": 3,
"FR": 3,
"HR": 2,
"HU": 4,
"IE": 3,
"IT": 1,
"LT": 2,
"LU": 6,
"LV": 3,
"MT": 3,
"NL": 3,
"PL": 1,
"PT": 1,
"RO": 1,
"SE": 4,
"SI": 2,
"SK": 6,
"UK": 2
}
}
# Question DVS_B11
non_partner_injury_percent = {
"bruises": {
"AT": 41,
"BE": 39,
"BG": 43,
"CY": 20,
"CZ": 27,
"DE": 38,
"DK": 32,
"EE": 31,
"EL": 22,
"ES": 27,
"FI": 35,
"FR": 28,
"HR": 23,
"HU": 23,
"IE": 38,
"IT": 24,
"LT": 27,
"LU": 33,
"LV": 32,
"MT": 25,
"NL": 38,
"PL": 41,
"PT": 24,
"RO": 30,
"SE": 26,
"SI": 25,
"SK": 23,
"UK": 39
},
"wounds": {
"AT": 10,
"BE": 8,
"BG": 5,
"CY": 2,
"CZ": 6,
"DE": 9,
"DK": 4,
"EE": 4,
"EL": 6,
"ES": 6,
"FI": 8,
"FR": 7,
"HR": 4,
"HU": 6,
"IE": 10,
"IT": 4,
"LT": 6,
"LU": 10,
"LV": 3,
"MT": 13,
"NL": 6,
"PL": 6,
"PT": 6,
"RO": 5,
"SE": 7,
"SI": 7,
"SK": 5,
"UK": 11
},
"fractures": {
"AT": 2,
"BE": 5,
"BG": 2,
"CY": 1,
"CZ": 3,
"DE": 1,
"DK": 1,
"EE": 5,
"EL": 2,
"ES": 3,
"FI": 2,
"FR": 2,
"HR": 5,
"HU": 2,
"IE": 2,
"IT": 2,
"LT": 1,
"LU": 3,
"LV": 1,
"MT": 2,
"NL": 1,
"PL": 3,
"PT": 3,
"RO": 3,
"SE": 1,
"SI": 3,
"SK": 3,
"UK": 6
},
"concussion": {
"AT": 1,
"BE": 3,
"BG": 2,
"CY": 1,
"CZ": 3,
"DE": 1,
"DK": 2,
"EE": 4,
"EL": 3,
"ES": 2,
"FI": 2,
"FR": 1,
"HR": 2,
"HU": 3,
"IE": 2,
"IT": 4,
"LT": 5,
"LU": 4,
"LV": 5,
"NL": 2,
"PL": 2,
"PT": 2,
"RO": 3,
"SE": 2,
"SI": 2,
"SK": 3,
"UK": 1
},
"internal": {
"AT": 2,
"BE": 5,
"BG": 5,
"CY": 8,
"CZ": 1,
"DE": 1,
"DK": 1,
"EE": 1,
"EL": 3,
"ES": 0,
"FI": 2,
"FR": 2,
"HR": 2,
"HU": 1,
"IE": 5,
"IT": 0,
"LU": 5,
"LV": 5,
"MT": 2,
"NL": 4,
"PL": 2,
"PT": 2,
"RO": 5,
"SE": 1,
"SI": 3,
"SK": 1,
"UK": 2
},
"miscarriage": {
"AT": 2,
"BE": 1,
"CZ": 2,
"DE": 0,
"DK": 0,
"EE": 1,
"FI": 0,
"FR": 0,
"HR": 0,
"HU": 1,
"IE": 1,
"IT": 0,
"LU": 1,
"NL": 1,
"PL": 2,
"PT": 1,
"SE": 0,
"SI": 1,
"SK": 1,
"UK": 1
},
"other": {
"AT": 1,
"BE": 4,
"BG": 3,
"CY": 4,
"CZ": 3,
"DE": 3,
"DK": 6,
"EE": 4,
"ES": 1,
"FI": 4,
"FR": 4,
"HR": 1,
"HU": 6,
"IE": 2,
"IT": 1,
"LT": 1,
"LU": 5,
"LV": 3,
"MT": 1,
"NL": 4,
"PL": 7,
"PT": 2,
"RO": 1,
"SE": 1,
"SI": 5,
"SK": 7,
"UK": 1
}
}
# Get `a_dict[a_key]` or replace missing value with average
def or_avg(a_dict, a_key):
return a_dict.get(a_key, a_dict["avg"])
# Estimate missing countries as average of all other countries.
for percent in (partner_injury_percent, non_partner_injury_percent):
for injury_type_percents in percent.values():
injury_type_percents["avg"] = mean(injury_type_percents.values())
for percent in (partner_injury_percent, non_partner_injury_percent):
percent["all"] = {
country: or_avg(percent["bruises"], country) +
or_avg(percent["wounds"], country) +
or_avg(percent["fractures"], country) +
or_avg(percent["concussion"], country) +
or_avg(percent["internal"], country) +
or_avg(percent["miscarriage"], country) +
or_avg(percent["other"], country)
for country in partner_12m.keys()
}
percent["all"]["avg"] = mean(percent["all"].values())
percent["serious"] = {
country: or_avg(percent["wounds"], country) +
or_avg(percent["fractures"], country) +
or_avg(percent["concussion"], country) +
or_avg(percent["internal"], country) +
or_avg(percent["miscarriage"], country)
for country in partner_12m.keys()
}
percent["serious"]["avg"] = mean(percent["serious"].values())
percent["ignore_wounds"] = {
country: or_avg(percent["fractures"], country) +
or_avg(percent["concussion"], country) +
or_avg(percent["internal"], country) +
or_avg(percent["miscarriage"], country)
for country in partner_12m.keys()
}
percent["ignore_wounds"]["avg"] = mean(percent["ignore_wounds"].values())
partner_injuries_12m = {}
current_injuries_12m = {}
for injury_type, percent in partner_injury_percent.items():
partner_injuries_12m[injury_type] = {
country: (
partner_12m[country] * or_avg(percent, country) / 100.0
)
for country in partner_12m.keys()
}
current_injuries_12m[injury_type] = {
country: (
current_12m[country] * or_avg(percent, country) / 100.0
)
for country in partner_12m.keys()
}
any_injuries_12m = {}
for injury_type, percent in non_partner_injury_percent.items():
any_injuries_12m[injury_type] = {
country: partner_injuries_12m[injury_type][country] + (
non_partner_12m[country] * or_avg(percent, country) / 100.0
)
for country in partner_12m.keys()
}
print(
"Any perpetrator",
[(x[0], f"{round(x[1], 2)}%") for x in sorted(
any_injuries_12m["ignore_wounds"].items(), key=lambda x: x[1]
)]
)
print(
"Current partner",
[(x[0], f"{round(x[1], 2)}%") for x in sorted(
current_injuries_12m["ignore_wounds"].items(), key=lambda x: x[1]
)]
)
eur_countries = {
"Austria": "AT",
"Belgium": "BE",
"Bulgaria": "BG",
"Croatia": "HR",
"Cyprus": "CY",
"Czechia": "CZ",
"Denmark": "DK",
"Estonia": "EE",
"Finland": "FI",
"France": "FR",
"Germany": "DE",
"Greece": "EL",
"Hungary": "HU",
"Ireland": "IE",
"Italy": "IT",
"Latvia": "LV",
"Lithuania": "LT",
"Luxembourg": "LU",
"Malta": "MT",
"Netherlands": "NL",
"Norway": "NO",
"Poland": "PL",
"Portugal": "PT",
"Romania": "RO",
"Slovakia": "SK",
"Slovenia": "SI",
"Spain": "ES",
"Sweden": "SE",
"United Kingdom": "UK"
}
# OECD: The percentage of women who agree that violence against
# women is sometimes justified.
# Data for Denmark and Malta was missing (0.00%).
justified = {
"Austria": 4.000,
"Belgium": 2.500,
"Bulgaria": 18.300,
"Croatia": 4.400,
"Cyprus": 7.800,
"Czechia": 2.600,
"Estonia": 17.800,
"Finland": 13.200,
"France": 5.500,
"Germany": 2.500,
"Greece": 5.000,
"Hungary": 11.500,
"Ireland": 1.400,
"Italy": 6.100,
"Latvia": 1.900,
"Lithuania": 1.400,
"Luxembourg": 4.000,
"Netherlands": 7.100,
"Norway": 11.100,
"Poland": 9.700,
"Portugal": 2.500,
"Romania": 8.500,
"Slovakia": 5.500,
"Slovenia": 17.100,
"Spain": 9.600,
"Sweden": 13.100,
"United Kingdom": 12.300
}
# Estimate Denmark as minimum of Norway, Sweden and Finland.
# Estimate Malta as minimum of Italy, Greece and Cyprus.
justified = {eur_countries[name]: j for name, j in justified.items()}
justified["DK"] = min(justified["NO"], justified["SE"], justified["FI"])
justified["MT"] = min(justified["IT"], justified["EL"], justified["CY"])
nonjustifying = {country: (100.0 - percent) / 100.0 for (country, percent) in justified.items()}
import geopandas as gpd
import matplotlib.pyplot as plt
world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
world = world.set_index("name")
plottable = OrderedDict(eur_countries)
del plottable["Malta"]
del plottable["Norway"]
world = world.loc[plottable.keys()]
for name1, name2 in zip(world.index, plottable.keys()):
assert name1 == name2, (world.index, name1, name2)
world.insert(
len(world.columns),
"any_nonjustifying_violence",
[round(any_12m[country] / nonjustifying[country], 1) for country in plottable.values()]
)
world.insert(
len(world.columns),
"any_nonjustifying_all",
[
round(any_injuries_12m["all"][country] / nonjustifying[country], 1)
for country in plottable.values()
]
)
world.insert(
len(world.columns),
"any_nonjustifying_serious",
[
round(any_injuries_12m["serious"][country] / nonjustifying[country], 1)
for country in plottable.values()
]
)
world.insert(
len(world.columns),
"any_nonjustifying_ignore",
[
round(any_injuries_12m["ignore_wounds"][country] / nonjustifying[country], 1)
for country in plottable.values()
]
)
world.insert(
len(world.columns),
"current_nonjustifying_serious",
[
round(current_injuries_12m["serious"][country] / nonjustifying[country], 1)
for country in plottable.values()
]
)
world.insert(
len(world.columns),
"current_nonjustifying_ignore",
[
round(current_injuries_12m["ignore_wounds"][country] / nonjustifying[country], 1)
for country in plottable.values()
]
)
def plot_col(df, col):
ax = df.plot(column=col, cmap="coolwarm")
ax.set_title(col)
df.apply(
lambda x: ax.annotate(
text=x[col], xy=x.geometry.representative_point().coords[0], ha="center"
),
axis=1
)
plot_col(world, "any_nonjustifying_violence")
plot_col(world, "any_nonjustifying_all")
plot_col(world, "any_nonjustifying_serious")
plot_col(world, "any_nonjustifying_ignore")
plot_col(world, "current_nonjustifying_serious")
plot_col(world, "current_nonjustifying_ignore")
plt.show()
import csv
homicide = {}
country = ""
with open('homicide-rate-where-the-perpetrator-is-an-intimate-partner.csv', newline='') as f:
reader = csv.DictReader(f)
for row in reader:
rate = row[
"Homicide rate per 100,000 population - Perpertrator is an intimate partner - Female - All ages"
]
if rate == "":
continue # Missing data
if country != row["Entity"]:
country = row["Entity"]
assert country not in homicide, (homicide, country)
homicide[country] = {}
homicide[country][int(row["Year"])] = float(rate)
# Homicide has decreased over time, so ignore data before 2015 to
# avoid penalizing countries with more data.
avg_homicide = {}
for country, years in homicide.items():
rates = [rate for year, rate in years.items() if year >= 2015]
if len(rates) > 0 and (
country in eur_countries or country in ["Russia", "Canada", "United States"]
):
avg_homicide[country] = round(mean(rates), 2)
print('\n'.join([f"{x[0]}: {x[1]}" for x in sorted(
list(avg_homicide.items()), key=lambda x: x[1]
)]))
Hypothetically, if the maps were based on police reports, it wouldn’t have changed the results for partner violence, because when partner violence did happen, women in Spain and Slovenia were more likely to report it to police than women in most other countries (survey question DVS_B12, “Contacting organisations or services as a result of the most serious incident of physical and/or sexual violence by a partner since the age of 15“).
But police reports might have changed the results for non-partner violence.