Wisconsin Immigration Arrests

Published

July 18, 2025

Modified

July 21, 2025

New data on immigration arrests was released recently. I learned about it from an Axios article yesterday highlighting the June increase in non-criminal arrests (non-criminal because “being in the U.S. illegally is a civil, not criminal, violation”). The article led with the following chart:

 

Axios chart of ICE arrests by reported criminal status

Axios chart

 

I was curious whether there had been a proportionate increase in ICE arrests near me in Wisconsin, as opposed to the increase being concentrated in places like California. So I downloaded the data from the Deportation Data Project.1

Import data into Stata
clear all
quietly import excel "C:\Users\tjhuegerich\Downloads\2025-ICLI-00019_2024-ICFO-39357_ERO Admin Arrests_raw.xlsx", sheet("Admin Arrests") cellrange(A7:W265233) firstrow

The raw data is detailed enough to identify individual arrests by date and location.2 But here I just need date, state, and “criminal status.”

Collapse to counts by state and criminal classification
gen date = dofc(ApprehensionDate)
quietly drop if date > mdy(6,26,2025) // limited 6/27 data
encode ApprehensionCriminality, gen(cs_id)
assert !missing(BirthYear)
collapse (count) n=BirthYear, by(date ApprehensionState cs_id)

First I confirmed that I could replicate the Axios chart.

Replicate Axios chart
frame copy default NATIONAL
frame NATIONAL {
    collapse (sum) n, by(date cs_id)
    quietly {
        xtset cs_id date
        tsfill, full
        replace n = 0 if missing(n)
        tssmooth ma n_7trailing_ = n, window(6 1 0)
        reshape wide n_7trailing_ n, i(date) j(cs_id)
    }
    format date %tdMonYY
    label var n_7trailing_1 "At least one conviction"
    label var n_7trailing_2 "At least one charge (no conviction)"
    label var n_7trailing_3 "No criminal charges or convictions"
    tsline n_7trailing_1 n_7trailing_2 n_7trailing_3 if date >= mdy(1,7,2025), ///
        lcolor("#FE9116" "#FEC170" "#102BB6") xtitle("") xlabel(#7) legend(position(12)) ///
        title("ICE arrests by reported criminal status") ///
        subtitle("Daily, Seven-day trailing average")
}

Note: Arrests were counted even if they did not lead to detainment; Multiple arrests of the same individual were counted separately; original chart by Kavya Beheraj/Axios.

Then I zoomed out to allow a comparison between the Biden and Trump administrations, also using a different style of chart to more easily see total immigration arrests.

National

Expand and reformat national chart
frame NATIONAL {
    quietly replace date = date - 3 // center moving averages
    gen cumul2_7t = n_7trailing_1 + n_7trailing_2
    gen cumul3_7t = cumul2_7t + n_7trailing_3
    label var n_7trailing_1 "At least one conviction"
    label var cumul2_7t "At least one charge (no conviction)"
    label var cumul3_7t "No criminal charges or convictions"
    format date %tdMonCCYY
    twoway (area cumul3_7t cumul2_7t n_7trailing_1 date if date >= mdy(9,23,2023), ///
            color("#102BB6" "#FEC170" "#FE9116") fintensity(75 75 75) lwidth(none none none)), ///
        xtitle("") legend(ring(0) bplacement(11)) xlabel(#11) ymtick(##5) ///
        title("ICE arrests by reported criminal status") ///
        subtitle("Daily, Seven-day moving average")
}

California

The same chart limited to California shows a Trump Administration increase in arrests just as large as the national one, with an even more pronounced increase in June.

Create California chart
frame copy default CALIFORNIA
frame CALIFORNIA {
    quietly keep if ApprehensionState == "CALIFORNIA"
    drop ApprehensionState
    quietly {
        xtset cs_id date
        tsfill, full
        replace n = 0 if missing(n)
        tssmooth ma n_7trailing_ = n, window(6 1 0)
        reshape wide n_7trailing_ n, i(date) j(cs_id)
        replace date = date - 3 // center moving averages
    }
    gen cumul2_7t = n_7trailing_1 + n_7trailing_2
    gen cumul3_7t = cumul2_7t + n_7trailing_3
    label var n_7trailing_1 "At least one conviction"
    label var cumul2_7t "At least one charge (no conviction)"
    label var cumul3_7t "No criminal charges or convictions"
    format date %tdMonCCYY
    twoway (area cumul3_7t cumul2_7t n_7trailing_1 date if date >= mdy(9,23,2023), ///
            color("#102BB6" "#FEC170" "#FE9116") fintensity(75 75 75) lwidth(none none none)), ///
        xtitle("") legend(ring(0) bplacement(11)) xlabel(#11) ymtick(##5) ///
        title("California ICE arrests by reported criminal status") ///
        subtitle("Daily, Seven-day moving average")
}

Wisconsin

Finally, I wanted a comparable chart for Wisconsin. Because daily Wisconsin arrests are generally in the single digits, making even a moving average of daily arrests quite choppy, I instead plotted weekly arrests.

For purposes of cross-state comparison, I made the y-axis match the scale of the California chart after adjusting for estimated 2022 unauthorized immigrant populations (and the use of a weekly measure rather than daily).3

Create Wisconsin chart
frame copy default WISCONSIN
frame WISCONSIN {
    quietly {
        keep if ApprehensionState == "WISCONSIN"
        local end_dow = 4 // b/c data ends on 2025-6-26, a Thurs.
        gen week_date = `end_dow' + (date - dow(date)) if dow(date) <= `end_dow' 
        replace week_date = `end_dow' + (date + 7 - dow(date)) if dow(date) > `end_dow'
        collapse (sum) n, by(cs_id week_date)
        xtset cs_id week_date
        tsfill, full
        assert missing(n) if dow(week_date) != `end_dow'
        keep if dow(week_date) == `end_dow'
        replace n = 0 if missing(n)
        reshape wide n, i(week_date) j(cs_id)
        gen cumul2 = n1 + n2
        gen cumul3 = cumul2 + n3
        
        expand 2, gen(week_start) // to enable 'stairstep' chart, visually representing weekly aggregation
        replace week_date = week_date - 6 if week_start
        sort week_date
    }
    label var n1 "At least one conviction"
    label var cumul2 "At least one charge (no conviction)"
    label var cumul3 "No criminal charges or convictions"
    format week_date %tdMonCCYY
    twoway (area cumul3 cumul2 n1 week_date if week_date >= mdy(9,21,2023), ///
            color("#102BB6" "#FEC170" "#FE9116") fintensity(75 75 75) lwidth(none none none)), ///
        xtitle("") legend(ring(0) bplacement(11)) xlabel(#10) ///
        yscale(range(46.7))  ///
        title("Wisconsin ICE arrests by reported criminal status") ///
        subtitle("Weekly")
}

Total Wisconsin arrests had apparently been comparable to pre-2025 rates until the past couple months. And the recent increase is not as dramatic as that experienced by California or the U.S. as a whole. On the other hand, recent arrest rates relative to unauthorized population appear comparable to those in California.

There is a lot more that could be done with this data. Ideally someone would put up some interactive charts so that answering a question like this would be easier. If I become aware of any, I’ll put the link(s) here.

Back to top

Footnotes

  1. The “Late June 2025” Arrests data, specifically.↩︎

  2. For instance, I was able to find the record for an acquaintance arrested in the Madison area. He is classified in the data as a “Convicted Criminal” despite, I’m told, merely having the same name as a fugitive from a different country, one thousands of miles away from his own. So maybe take these ICE classifications with a grain of salt.↩︎

  3. Pew Research estimates California’s 2022 unauthorized immigrant population as 1.8 million and Wisconsin’s as 80 thousand. So I set the Wisconsin y-axis maximum to: \(150 \times \frac{80}{1800} \times 7 \approx 46.7\).↩︎