This report looks at family violence incidents recorded by Victoria Police. Each number in the report represents a person involved in a difficult situation.
If you or someone you know is affected by family violence, free and confidential support is available through 1800RESPECT (1800 737 732) and Safe Steps (1800 015 188).
In this report, an affected family member means a person whom police identify as having experienced harm or being at risk of harm. An other party means a person whom police record as being associated with the risk. Being recorded as an other party does not mean that the person has been found guilty of an offence.
The Story Behind the Numbers.
When people think about family violence, they often imagine two adults involved in an incident. However, Victoria’s police data shows that young people are also part of this picture.
This report focuses on young people and their involvement in recorded family violence incidents. It explores the ages at which people are recorded, the differences between females and males, and the differences between areas across Victoria. It also looks at what happens during these incidents, including whether children are present and whether police apply for intervention orders or issue safety notices.
The report uses five interactive charts to explain these patterns. You can move your cursor over a chart to see more details. You can also click on the legend to show or hide different groups. Some charts include controls that allow you to explore different years or local government areas.
# ---------- DATA PREPARATION: statewide tables ----------
# Table 03 = affected family members (AFM), Table 04 = other parties (OTH), by sex and age.
# Steps: drop the 'Total' age row and the 'People' (= females + males) sex row to avoid
# double counting; tidy age labels; stack the two tables into one long table.
clean_age <- function(x) {
x %>% str_replace(" years and over", "+") %>% str_remove(" years") %>%
str_replace_all("\\b0(\\d)", "\\1") %>% str_replace("-", "\u2013")
}
age_lvls <- c("0\u20134", "0\u20139", "5\u20139", "10\u201314", "15\u201317", "18\u201319", "20\u201324", "25\u201329", "30\u201334",
"35\u201339", "40\u201344", "45\u201349", "50\u201354", "55\u201359", "60\u201364", "65\u201369", "70\u201374", "75+")
afm <- read_excel(f_state, sheet = "Table 03") %>%
filter(`AFM Sex` %in% c("Females", "Males"), `AFM Age Group` != "Total") %>%
transmute(Year, Role = "Affected family members", Sex = `AFM Sex`,
Age = clean_age(`AFM Age Group`), Count = `AFM Counter`,
Rate = `Rate per 100,000 population`)
oth <- read_excel(f_state, sheet = "Table 04") %>%
filter(`OTH Sex` %in% c("Females", "Males"), `OTH Age Group` != "Total") %>%
transmute(Year, Role = "Other parties", Sex = `OTH Sex`,
Age = clean_age(`OTH Age Group`), Count = `OTH Counter`,
Rate = `Rate per 100,000 population`)
age_df <- bind_rows(afm, oth) %>%
mutate(Age = factor(Age, levels = age_lvls), Role = factor(Role, levels = names(col_role)))
latest <- max(age_df$Year)
first_year <- min(age_df$Year)
# peak age group for each role / sex / year (used in the story text below)
peaks <- age_df %>% group_by(Role, Sex, Year) %>% slice_max(Rate, n = 1, with_ties = FALSE) %>% ungroup()
peak_f_oth <- peaks %>% filter(Role == "Other parties", Sex == "Females") %>% pull(Age) %>% as.character() %>% unique()
peak_m_oth <- peaks %>% filter(Role == "Other parties", Sex == "Males") %>% pull(Age) %>% as.character() %>% unique()
Why this chart matters: This chart helps us understand how the recorded rates of family violence involvement differ between age groups. The bold lines show the latest year, while the lighter lines show the previous four years. This makes it easier to compare the latest results with earlier years.
# ---------- CHART 1: rate per 100,000 by age, sex and role (latest year highlighted) ----------
c1 <- age_df %>%
mutate(is_latest = Year == latest,
tip = paste0("<b>", Sex, ", aged ", Age, "</b><br>Year ending June ", Year,
"<br>", round(Rate), " per 100,000 people of that age and sex"))
# grey band behind the 15-17 age group in each panel (a column on the discrete axis)
teen_band <- c1 %>% group_by(Role) %>%
summarise(ymax = max(Rate) * 1.05, .groups = "drop") %>%
mutate(Age = factor("15\u201317", levels = age_lvls))
# Note: alpha (transparency) is set as a fixed value per layer, not mapped to a variable.
# Newer versions of plotly cannot convert a mapped alpha on lines, so earlier years and the
# latest year are drawn as separate layers instead.
g1 <- ggplot(mapping = aes(x = Age, y = Rate, colour = Sex,
group = interaction(Year, Sex), text = tip)) +
geom_col(data = teen_band, aes(x = Age, y = ymax), inherit.aes = FALSE,
fill = "#EEEEEE", width = 1) +
geom_line(data = filter(c1, !is_latest), linewidth = 0.7, alpha = 0.3) +
geom_line(data = filter(c1, is_latest), linewidth = 1.1) +
geom_point(data = filter(c1, is_latest), size = 2) +
scale_colour_manual(values = col_sex, name = "") +
scale_y_continuous(limits = c(0, NA), expand = expansion(mult = c(0, 0.05))) +
facet_wrap(~ Role, ncol = 1, scales = "free_x") +
labs(x = "Age group (years)", y = "Recorded per 100,000 people") +
theme_minimal(base_size = 14) +
theme(panel.grid.minor = element_blank(), strip.text = element_text(face = "bold", hjust = 0),
legend.position = "top")
ggplotly(g1, tooltip = "text", height = 700) %>%
layout(font = base_font,
title = left_title("Girls aged 15\u201317 stand out in both panels",
"Bold lines = year ending June 2026; faint lines = 2022 to 2025"),
margin = list(t = 90))
What does this chart show?
The chart has two sections. The first section shows affected family members, and the second shows other parties. Each section compares females and males across different age groups.
The vertical axis shows the number of people recorded per 100,000 people of the same age and sex. This allows us to compare age groups of different sizes. The orange lines represent females, and the blue lines represent males. The grey background highlights the 15 to 17 age group.
What stands out in the data?
Among affected family members, the recorded rate for females increases sharply during the teenage years. It also remains much higher than the rate for males across most adult age groups. The pattern is different for other parties. The recorded rate for males is higher than the rate for females at almost every age. However, females show an unusual pattern. Their highest recorded rate occurs in the 15–17 age group in every year shown. This rate is higher than the rates recorded for adult female age groups. For males, the highest rate occurs much later, around the 40–44 and 35–39 age group.
What does this mean?
Family violence is often discussed as a problem mainly involving adults. However, these results show that the teenage years are an important part of the recorded data.
The high rate among teenage girls recorded as other parties is different from the pattern seen among adult females. This finding deserves further attention. However, the chart cannot explain why this pattern occurs or what circumstances are behind these incidents.
cat("<details><summary>Text alternative: data table for this chart (latest year)</summary>")
c1 %>% filter(Year == latest) %>% select(Role, Sex, Age, `Rate per 100,000` = Rate) %>%
mutate(`Rate per 100,000` = round(`Rate per 100,000`)) %>%
kable(format = "html", table.attr = "class='table table-condensed'") %>% cat()
| Role | Sex | Age | Rate per 100,000 |
|---|---|---|---|
| Affected family members | Females | 0–4 | 108 |
| Affected family members | Females | 5–9 | 271 |
| Affected family members | Females | 10–14 | 933 |
| Affected family members | Females | 15–17 | 2285 |
| Affected family members | Females | 18–19 | 2656 |
| Affected family members | Females | 20–24 | 2772 |
| Affected family members | Females | 25–29 | 3059 |
| Affected family members | Females | 30–34 | 3653 |
| Affected family members | Females | 35–39 | 3942 |
| Affected family members | Females | 40–44 | 3616 |
| Affected family members | Females | 45–49 | 3121 |
| Affected family members | Females | 50–54 | 2571 |
| Affected family members | Females | 55–59 | 1724 |
| Affected family members | Females | 60–64 | 1201 |
| Affected family members | Females | 65–69 | 971 |
| Affected family members | Females | 70–74 | 784 |
| Affected family members | Females | 75+ | 509 |
| Affected family members | Males | 0–4 | 101 |
| Affected family members | Males | 5–9 | 345 |
| Affected family members | Males | 10–14 | 524 |
| Affected family members | Males | 15–17 | 802 |
| Affected family members | Males | 18–19 | 880 |
| Affected family members | Males | 20–24 | 741 |
| Affected family members | Males | 25–29 | 772 |
| Affected family members | Males | 30–34 | 863 |
| Affected family members | Males | 35–39 | 909 |
| Affected family members | Males | 40–44 | 996 |
| Affected family members | Males | 45–49 | 1062 |
| Affected family members | Males | 50–54 | 1017 |
| Affected family members | Males | 55–59 | 840 |
| Affected family members | Males | 60–64 | 723 |
| Affected family members | Males | 65–69 | 554 |
| Affected family members | Males | 70–74 | 462 |
| Affected family members | Males | 75+ | 350 |
| Other parties | Females | 0–9 | 8 |
| Other parties | Females | 10–14 | 548 |
| Other parties | Females | 15–17 | 1311 |
| Other parties | Females | 18–19 | 1106 |
| Other parties | Females | 20–24 | 1114 |
| Other parties | Females | 25–29 | 1008 |
| Other parties | Females | 30–34 | 1225 |
| Other parties | Females | 35–39 | 1192 |
| Other parties | Females | 40–44 | 1138 |
| Other parties | Females | 45–49 | 1032 |
| Other parties | Females | 50–54 | 827 |
| Other parties | Females | 55–59 | 483 |
| Other parties | Females | 60–64 | 294 |
| Other parties | Females | 65–69 | 164 |
| Other parties | Females | 70–74 | 113 |
| Other parties | Females | 75+ | 63 |
| Other parties | Males | 0–9 | 37 |
| Other parties | Males | 10–14 | 814 |
| Other parties | Males | 15–17 | 2307 |
| Other parties | Males | 18–19 | 2432 |
| Other parties | Males | 20–24 | 2502 |
| Other parties | Males | 25–29 | 3254 |
| Other parties | Males | 30–34 | 3881 |
| Other parties | Males | 35–39 | 4412 |
| Other parties | Males | 40–44 | 4115 |
| Other parties | Males | 45–49 | 3618 |
| Other parties | Males | 50–54 | 2774 |
| Other parties | Males | 55–59 | 1696 |
| Other parties | Males | 60–64 | 944 |
| Other parties | Males | 65–69 | 576 |
| Other parties | Males | 70–74 | 426 |
| Other parties | Males | 75+ | 276 |
cat("</details>")
Why this chart matters: In the adult age groups, females make up a much larger share of affected family members, while males make up a larger share of other parties. This chart explores whether the same pattern appears among teenagers. You can press Play or move the slider to compare the results across different years.
# ---------- CHART 2: share of each role that is female, by age (animated by year) ----------
# Uses counts (not rates) of females and males within each age group. Common age groups only
# (10-14 upwards) so the two roles can be compared like for like.
c2 <- age_df %>%
filter(Age %in% age_lvls[match("10\u201314", age_lvls):length(age_lvls)]) %>%
select(Year, Role, Sex, Age, Count) %>%
pivot_wider(names_from = Sex, values_from = Count) %>%
mutate(PctFemale = 100 * Females / (Females + Males),
tip = paste0("<b>", Role, ", aged ", Age, "</b><br>Year ending June ", Year,
"<br>", round(PctFemale), "% female")) %>%
arrange(Year, Role, Age) %>%
mutate(Age = droplevels(Age))
plot_ly(c2, x = ~Age, y = ~PctFemale, color = ~Role, colors = col_role,
linetype = ~Role, linetypes = c("solid", "dash"),
frame = ~Year, type = "scatter", mode = "lines+markers",
text = ~tip, hoverinfo = "text", line = list(width = 3), marker = list(size = 8)) %>%
layout(font = base_font,
title = left_title("Among teenagers, the lines move towards an even split",
"Percentage of each group who are female, by age"),
xaxis = list(title = "Age group (years)", categoryorder = "array",
categoryarray = levels(c2$Age)),
yaxis = list(title = "% female", range = c(0, 100), ticksuffix = "%"),
shapes = list(list(type = "line", xref = "paper", x0 = 0, x1 = 1, yref = "y",
y0 = 50, y1 = 50, line = list(color = "#999999", dash = "dot"))),
annotations = list(list(x = 1, xref = "paper", xanchor = "right", y = 52, yref = "y",
text = "even split", showarrow = FALSE, font = list(size = 12))),
legend = list(orientation = "h", x = 0, y = -0.25),
margin = list(t = 90)) %>%
animation_opts(frame = 900, transition = 400, redraw = FALSE) %>%
animation_slider(currentvalue = list(prefix = "Year ending June ", font = list(size = 14)))
What does this chart show?
The chart compares the percentage of females in each age group for two groups: affected family members and other parties.
The teal line shows the percentage of affected family members who are female. The dashed grey line shows the percentage of other parties who are female. The dotted horizontal line represents a 50% split, where females and males make up equal shares.
The chart uses the number of people recorded in each group rather than the rate per 100,000 people. It focuses on age groups from 10 to 14 years onwards so that the two groups can be compared using the same age ranges.
What stands out in the data?
Among adults, females make up most affected family members, while males make up most other parties. This creates a large gap between the two lines.
During the teenage years, the lines move closer together. This means that the difference between the percentage of females among affected family members and the percentage of females among other parties is smaller in these age groups.
The same general pattern appears across the years shown. Therefore, the teenage pattern is not limited to just one year of data.
What does this mean?
The results suggest that the pattern commonly associated with adult family violence does not fully describe the teenage age groups.
This does not mean that all teenage incidents are the same or that the reasons behind them are known. Instead, it suggests that schools, police and support services should consider the different situations that young people may experience. Support designed mainly around adult relationships may not address every situation involving teenagers.
Why this chart matters: Statewide figures can hide important differences between local areas. This chart compares local government areas (LGAs) across Victoria to see how the rate of family incidents relates to the involvement of young people. You can search for a particular LGA or use the legend to focus on different police regions.
# ---------- DATA PREPARATION: LGA tables ----------
# Table 01 = incidents and rate per 100,000 residents by LGA.
# Table 02 = affected family members by LGA and age group; Table 04 = other parties by LGA and age.
# Steps: trim stray spaces in LGA names (Table 01 has leading spaces); remove regional totals,
# 'Justice institutions' and 'Unincorporated Vic' rows; keep the latest year for the scatter;
# turn age counts into the share aged 0-17 (a share needs no population data);
# approximate each LGA's population as incidents / rate x 100,000.
lga_rates <- read_excel(f_lga, sheet = "Table 01") %>%
mutate(LGA = str_squish(`Local Government Area`)) %>%
filter(LGA != "Total", !is.na(`Rate per 100,000 population`),
!str_detect(`Police Region`, "Justice|Unincorporated")) %>%
transmute(Year, LGA, Police_Region = `Police Region`, Incidents = `Family Incidents`,
Rate = `Rate per 100,000 population`, Pop = Incidents / Rate * 1e5)
u18_share <- function(sheet, count_col) {
read_excel(f_lga, sheet = sheet) %>%
mutate(LGA = str_squish(`Local Government Area`)) %>%
filter(!is.na(.data[[count_col]])) %>% # LGAs with confidentialised cells are blank
group_by(Year, LGA) %>%
summarise(share = sum(.data[[count_col]][`Age Group` == "00 - 17 years"]) / sum(.data[[count_col]]),
.groups = "drop")
}
u18_afm <- u18_share("Table 02", "AFM Counter") %>% rename(PctU18_AFM = share)
u18_oth <- u18_share("Table 04", "OTH Counter") %>% rename(PctU18_OTH = share)
lga3 <- lga_rates %>% filter(Year == latest) %>%
inner_join(u18_oth %>% filter(Year == latest), by = c("Year", "LGA")) %>%
inner_join(u18_afm %>% filter(Year == latest), by = c("Year", "LGA")) %>%
mutate(across(starts_with("PctU18"), ~ 100 * .x),
hover = paste0("<b>", LGA, "</b> (", str_remove(Police_Region, "^\\d "), ")",
"<br>", round(Rate), " incidents per 100,000 residents",
"<br>", Incidents, " incidents in total",
"<br>", round(PctU18_OTH, 1), "% of other parties aged 0\u201317",
"<br>", round(PctU18_AFM, 1), "% of affected family members aged 0\u201317"))
state_u18 <- 100 * sum(u18_oth %>% filter(Year == latest) %>% inner_join(
read_excel(f_lga, sheet = "Table 04") %>% mutate(LGA = str_squish(`Local Government Area`)) %>%
filter(Year == latest, `Age Group` == "00 - 17 years") %>% group_by(LGA) %>%
summarise(n = sum(`OTH Counter`, na.rm = TRUE)), by = "LGA") %>% inner_join(
read_excel(f_lga, sheet = "Table 04") %>% mutate(LGA = str_squish(`Local Government Area`)) %>%
filter(Year == latest) %>% group_by(LGA) %>% summarise(tot = sum(`OTH Counter`, na.rm = TRUE)),
by = "LGA") %>% pull(n)) /
sum(read_excel(f_lga, sheet = "Table 04") %>% filter(Year == latest) %>% pull(`OTH Counter`), na.rm = TRUE)
# ---------- CHART 3: LGA scatter (5 variables: rate, % under 18, size, region colour + shape) ----------
sd3 <- SharedData$new(lga3, key = ~LGA)
p3 <- plot_ly(sd3, x = ~Rate, y = ~PctU18_OTH, size = ~Incidents, sizes = c(10, 45),
color = ~Police_Region, colors = col_region,
symbol = ~Police_Region, symbols = unname(sym_region[levels(factor(lga3$Police_Region))]),
type = "scatter", mode = "markers", text = ~hover, hoverinfo = "text",
marker = list(opacity = 0.8, line = list(width = 1, color = "#FFFFFF"))) %>%
layout(font = base_font,
title = left_title("Places with more incidents don't have more young other parties",
"Each bubble is an LGA; bubble size = number of incidents"),
xaxis = list(title = list(text = "Family incidents per 100,000 residents",
standoff = 15),
rangemode = "tozero"),
yaxis = list(title = "% of other parties aged 0\u201317", ticksuffix = "%", rangemode = "tozero"),
shapes = list(list(type = "line", xref = "paper", x0 = 0, x1 = 1, yref = "y",
y0 = state_u18, y1 = state_u18, line = list(color = "#999999", dash = "dot"))),
annotations = list(list(x = 1, xref = "paper", xanchor = "right", y = state_u18, yref = "y",
yanchor = "bottom", text = "all LGAs combined", showarrow = FALSE,
font = list(size = 12))),
legend = list(orientation = "h", x = 0, y = -0.3),
margin = list(t = 120,b =140))
bscols(widths = c(3, 9),
filter_select("lga_search", "Search for an LGA", sd3, ~LGA, multiple = TRUE),
p3)
What does this chart show?
Each bubble represents one local government area in the year ending June 2026.
The horizontal axis shows the rate of recorded family incidents per 100000 residents. The vertical axis shows the percentage of other parties who are under 18 years old. The size of each bubble represents the total number of incidents recorded in that area.
The color and shape of each bubble identify its police region. The dotted horizontal line shows the percentage of other parties under 18 when all included LGAs are considered together.
What stands out in the data?
The bubbles are spread across the chart, and there is only a weak relationship between the two measures. This means that an area with a higher rate of family incidents does not necessarily have a higher percentage of other parties who are under 18.
Some regional areas and areas on the edge of Melbourne have relatively high percentages of young other parties. The Mornington Peninsula is one example. Some inner Melbourne areas and smaller rural areas have lower percentages.
You can move your cursor over any bubble to see more information about that LGA. This includes the incident rate and the percentage of affected family members who are under 18.
What does this mean?
The results show that the teenage pattern is not limited to areas with the highest overall rates of family incidents. Young people appear in the recorded data across different parts of Victoria, but the size of their share varies between areas.
This suggests that local differences are important. Police, schools and support services may need to consider local data when planning services for young people and families.
Why this chart matters: The previous chart compared different LGAs in one year. This chart looks at how the rate of recorded family incidents has changed over time. It compares the year ending June 2022 with the year ending June 2026. You can use the police region filters to focus on particular parts of Victoria.
# ---------- CHART 4: dumbbell, rate per 100,000 in the first vs latest year, by LGA ----------
d4 <- lga_rates %>% filter(Year %in% c(first_year, latest)) %>%
select(LGA, Police_Region, Year, Rate, Pop) %>%
pivot_wider(names_from = Year, values_from = c(Rate, Pop), names_sep = "_") %>%
rename(rate_start = paste0("Rate_", first_year), rate_end = paste0("Rate_", latest),
pop_end = paste0("Pop_", latest)) %>%
filter(!is.na(rate_start), !is.na(rate_end)) %>%
mutate(change = rate_end - rate_start) %>%
arrange(change) %>%
mutate(LGA = factor(LGA, levels = LGA),
tip_start = paste0("<b>", LGA, "</b><br>Year ending June ", first_year, ": ", round(rate_start), " per 100,000"),
tip_end = paste0("<b>", LGA, "</b> (", str_remove(Police_Region, "^\\d "), ")",
"<br>Year ending June ", latest, ": ", round(rate_end), " per 100,000",
"<br>Change: ", ifelse(change >= 0, "+", ""), round(change), " per 100,000",
"<br>Approx. population: ", format(round(pop_end, -2), big.mark = ",")))
sd4 <- SharedData$new(d4, key = ~LGA)
p4 <- plot_ly(sd4, height = 1350) %>%
add_segments(x = ~rate_start, xend = ~rate_end, y = ~LGA, yend = ~LGA,
line = list(color = "#B0B0B0", width = 2), showlegend = FALSE, hoverinfo = "none") %>%
add_markers(x = ~rate_start, y = ~LGA, name = paste("Year ending June", first_year),
marker = list(symbol = "circle-open", size = 9, color = "#444444", line = list(width = 2)),
text = ~tip_start, hoverinfo = "text") %>%
add_markers(x = ~rate_end, y = ~LGA, color = ~Police_Region, colors = col_region,
symbol = ~Police_Region, symbols = unname(sym_region[levels(factor(d4$Police_Region))]),
marker = list(size = 11), text = ~tip_end, hoverinfo = "text") %>%
layout(font = base_font,
title = left_title("Rates rose in most LGAs, but not everywhere",
"Open circle = 2022, filled shape = 2026; LGAs ordered by change"),
xaxis = list(title = "Family incidents per 100,000 residents", rangemode = "tozero"),
yaxis = list(title = "", categoryorder = "array", categoryarray = levels(d4$LGA),
tickfont = list(size = 12)),
legend = list(orientation = "h", x = 0, y = 1.03),
margin = list(t = 120))
bscols(widths = c(3, 9),
filter_checkbox("region", "Police region", sd4, ~Police_Region, inline = FALSE),
p4)
What does this chart show?
Each row represents a local government area. The open circle shows the rate of recorded family incidents per 100000 residents in the year ending June 2022. The filled shape shows the rate in the year ending June 2026.
The line joining the two points shows the difference between the two years. When the filled shape is further to the right, the rate has increased. When it is further to the left, the rate has decreased.
The LGAs are arranged according to how much their rates have changed. This makes it easier to compare areas with the largest increases and decreases.
What stands out in the data?
The rate increased in most LGAs between 2022 and 2026. However, the pattern was not the same everywhere. Roughly one third of the LGAs shown experienced a decrease.
The largest increases occurred in regional LGAs. Some areas in Melbourne also experienced decreases, including growth corridor areas such as Wyndham, Hume and Melton. Some regional LGAs also recorded decreases.
These results show that changes in family incident rates vary from one area to another. The statewide pattern does not describe every local area equally well.
What should we be careful about?
Rates in areas with small populations can change considerably when the number of recorded incidents changes by only a small amount. For this reason, a large increase in a small LGA should be interpreted carefully.
You can move your cursor over each LGA to see its figures, including its approximate population. This information helps provide context when comparing areas of different sizes.
Why this chart matters:
Every recorded incident involves people and circumstances that may require a response. This chart looks at three aspects of those incidents: whether a child was recorded as present, whether police applied for an intervention order, and whether police issued a family violence safety notice.
# ---------- CHART 5: share of incidents with child present / IVO applied / FVSN issued ----------
# Table 01 (statewide) gives counts for 'yes' and 'no' for each flag. Share = yes / (yes + no).
# NOTE: the 'charges laid' flag is deliberately NOT used: its 'unsolved' category jumps in the
# latest year, which looks like a recording change rather than real change (see Data notes).
c5 <- read_excel(f_state, sheet = "Table 01") %>%
filter(Outcome %in% c("Child recorded as present", "No child was present/not recorded",
"Applied for", "Not applied for", "Issued", "Not issued")) %>%
mutate(Measure = recode(Category,
"Children Present Flag" = "Child recorded as present",
"Intervention Order Taken (IVO)" = "Intervention order applied for",
"Family Violence Safety Notice (FVSN)" = "Safety notice issued"),
Yes = Outcome %in% c("Child recorded as present", "Applied for", "Issued")) %>%
group_by(Year, Measure) %>%
summarise(Share = 100 * sum(`Family Incident Count`[Yes]) / sum(`Family Incident Count`), .groups = "drop") %>%
mutate(tip = paste0("<b>", Measure, "</b><br>Year ending June ", Year, "<br>", round(Share), "% of incidents"))
g5 <- ggplot(c5, aes(x = Year, y = Share, colour = Measure, linetype = Measure, shape = Measure,
group = Measure, text = tip)) +
geom_line(linewidth = 1.1) + geom_point(size = 3) +
scale_colour_manual(values = c("#8C510A", "#01665E", "#762A83")) +
scale_x_continuous(breaks = unique(c5$Year)) +
scale_y_continuous(limits = c(0, 50), labels = function(x) paste0(x, "%")) +
labs(x = "Year ending June", y = "% of family incidents", colour = "", linetype = "", shape = "") +
theme_minimal(base_size = 14) + theme(panel.grid.minor = element_blank(), legend.position = "bottom")
ggplotly(g5, tooltip = "text", height = 450) %>%
layout(font = base_font,
title = left_title("A child is present at roughly one in three incidents",
"Share of all family incidents statewide"),
legend = list(orientation = "h", x = 0, y = -0.25), margin = list(t = 90))
What does this chart show?
The chart shows the percentage of recorded family violence incidents in Victoria that had each of these three features.
The first line shows the percentage of incidents in which a child was recorded as present. The second line shows the percentage in which an intervention order was applied for. The third line shows the percentage in which a family violence safety notice was issued.
The chart compares these percentages across the years ending June 2022 to June 2026. The vertical axis starts at zero, making it easier to compare the sizes of the percentages without exaggerating the differences.
What stands out in the data?
Approximately one in three recorded family violence incidents had a child recorded as present. This percentage has decreased slightly over the period, with a more noticeable decrease in the latest year.
Intervention orders and family violence safety notices were recorded in a smaller percentage of incidents than child presence. The percentage of incidents involving a safety notice also shows a gradual decrease over the period.
These figures describe what was recorded in the police data. They do not tell us everything about what happened during each incident or whether additional support was provided in other ways.
What does this mean?
Children are recorded as being present in a substantial proportion of family violence incidents. This shows that the impact of family violence can extend beyond the people directly identified in an incident.
The findings highlight the importance of considering children’s safety and wellbeing when responding to family violence. However, the fact that an order or notice was not recorded does not, by itself, tell us whether an incident was serious or whether other forms of support were provided.
Family violence in Victoria is not only an adult story. Teenage girls are recorded as other parties at a higher rate than any adult age group of women, and in the teenage years the usual split between “male other party” and “female affected family member” becomes much less lopsided. Young people make up part of the picture in every corner of the state, though how large a part varies widely from one LGA to the next, and a child is recorded as present at about one in three incidents.
The data shows that family violence recorded by Victoria Police is not only an adult issue. Young people are also an important part of the picture.
One of the most noticeable findings is that teenage girls recorded as other parties have a higher rate than adult female age groups. The data also shows that the difference between females and males in the two recorded roles becomes smaller during the teenage years.
The patterns vary across Victoria. Some local government areas have a higher percentage of young people recorded as other parties, while others have a lower percentage. Overall family incident rates have also increased in many areas and decreased in others.
Another important finding is that a child is recorded a present approximately one in three family violence incidents. Together, these findings show why it is important to look beyond statewide totals and adult age groups when studying family violence.
What Can We Learn from These Findings?
The result raise several important questions for people who work with young ones and families.
1.Do teenagers have access to appropriate support? From the high recorded rate among teenage girls in the other-party group suggests that adolescent family violence deserves further attention. Schools,youth services and police should consider whether their existing approaches adress these different incidents that teenagers may experience.
2.Should local services use local data when planning support? The results differ and vary across local government areas. A response that works well in one area may not meet the needs of another, Local data can help services understand circumenstances in their communities and plan their support accordingly.
3.Why is recorded rate highest among teenage girls in the other-party group? The data shows that this pattern exists, but it cannot explain why it occurs. Further research and input from professionals who work with young people would be needed to understand the reasons behind it.
These questions are not conclusions that can be answered from the chart alone. They are areas for further investigation and discussion.
How was the data prepared?
The data was cleaned and organised using R before the charts were created. - The total age rows and combined people rows were removed from the statewide tables to avoid counting the same people more than once in calculation. -Extra spaces were removed from LGA names so that records from different tables could be matched correctly. - Regional totals, justice institutions and unincorporated Victoria were excluded from the LGA analysis. - Some LGAs were excluded from the age analysis because the CSA does not publish certain small counts for confidentiality reasons. - Percentage were used to compare the share of people under 18 across LGAs. This allowed comparisons without requiring population estimates for those percentages. - Approximate LGA populations were calculated by diving the number of recorded incidents by the published rate and multiplying by 100,000. These estimates are used only to provide additional information when hovering over the chart.
What are the limitations of this data?
There are several important limitations to consider when interpreting the results. - The data only includes incidents recorded by police. Incidents that are never reported to police are not included. So, these figures do not represent every family violence incident that occurs in Victoria. - Being recorded as an other party does not mean a person is guilty of an offence. The term describes how the person was recorded in the police data. - A person may be counted more than once. The CSA counts a person’s appearance in separate incidents. Therefore, the number of records does not necessarily represent the number of unique individulas. - Rates in small area can change sharply. A small change in the number of incidents can produce a large change in the rate when a LGA has a small population. - The age groups differ between datasets. The statewide and LGA workbooks use different age categories. So, the two datasets are not plotted on the same age axis.
How was accessibility considered?
The charts use colors designed to be distinguishable for people with different types of colour vision. Text and chart colors were also selected to provide good contrast against the white background.
Color is not the only way information is presented. Line styles, marker shapes, labels and hover information provide additional ways to distinguish the groups.
Each chart includes a separate written explanation. The first two charts also provide a text-based table alternative. The vertical axis starts at zero wherever the size of the values matters which helps readers to compare the data without exagerating differences.
References
Crime Statistics Agency. (2026a). Family incidents: Data tables, year ending June 2026 [Data set]. State of Victoria. https://www.crimestatistics.vic.gov.au/
Crime Statistics Agency. (2026b). Family incidents by local government area: Data tables, year ending June 2026 [Data set]. State of Victoria. https://www.crimestatistics.vic.gov.au/