I am not a gun-owner, nor do I ever really plan to own a gun. However like most of us I have been forced to think about gun violence recently, particularly in the context of mass shootings. I often find myself discussing this issue with friends who are gun-owners, and the conversation typically gravitates toward assault weapons. What is it about assault rifles (like the AR-15) that makes them particularly deadly?

One intuitive answer that I’ve heard is that the .223 round typically used in an AR-15 has a lot of power and not much recoil. That seems very plausible to me, and it is pretty easy to test.

So the main goal of this project was to find some data about the speed and force of various guns and types of ammo, and make a basic scatterplot of muzzle energy (a combination of bullet mass and the speed at which it leaves the gun) and recoil energy.

There should be an overall positive correlation between these two, but if the .223 is particularly powerful for it’s recoil, it should stand out as a clear outlier.


I pulled the dataset from this page. Thanks to Chuck Hawks for unknowingly lending me 236 datapoints.

I did some initial cleaning and took out brand names in Excel. Here’s what the dataset looks like:

data <- read.csv("BallisticsData.csv")[,1:5]
Our first few rows of data:
Caliber bulletWeight MuzzleVel RifleWeight RecoilEnergy
0.170 17 2550 7.5 0.2
0.170 25 4000 8.5 1.6
0.204 33 4225 8.5 2.6
0.218 45 2800 8.5 1.3
0.219 55 3300 8.5 3.2

Something to note is that the data includes multiple rows of the same caliber. Something I’ve learned since starting this project is that different companies make different bullets at the same caliber, and they’re a little different. So while the .17 HMR and the .17 Hornet are both a little over .17 inches in diameter, the Hornet is a slightly larger bullet by mass (20 grains compared to 17). Hawks also has data from different rifles. For our purposes this will come into play later with rifle weight.

High Muzzle Energy, Low Recoil?

Next I calculated muzzle energy (rounded to the nearest ft/lb) using a formula from this site.

data$MuzzleEnergy <- round((data$bulletWeight)*(data$MuzzleVel^2)/450240)

The correlation between muzzle energy and recoil energy is strong and positive. This make intuitive sense (i.e., equal and opposite reaction). Here’s the scatterplot:

data %>%
    ggplot(aes(x = MuzzleEnergy, y = RecoilEnergy)) + theme_light() +
    geom_point(alpha=.3, colour = "#1215E4") +
    labs(x ='Muzzle Energy (ft/lb)', y = 'Recoil Energy (ft/lb)', title='Muzzle & Recoil Energy (r = .87)')

It looks like there are a couple of very extreme outliers here, maybe those are the .223 rounds? Let’s add color to figure it out.

# factor to identify .223 (for color in plots)
data$is223 <- rep('No', nrow(data))
data$is223[which(data$Caliber == .223)] <- 'Yes'

data %>%
    ggplot(aes(x = MuzzleEnergy, y = RecoilEnergy)) +  theme_light() +
    geom_point(aes(color = is223, alpha = is223, size = is223)) +
    scale_colour_manual(name = ".223?", values = c("#1215E4", "#E41212")) +
    scale_size_manual(name = ".223?", values = c(1,3)) +
    scale_alpha_manual(name = ".223?", values = c(.3, 1)) +
    labs(x='Muzzle Energy (ft/lb)', y='Recoil Energy (ft/lb)', title="Muzzle & Recoil Energy (.223 highlighted)")

Well that’s a little underwhelming. The big outlier that’s over 10,000 ft/lb of muzzle energy isn’t a .223, and it looks like the (large, red) .223 datapoints aren’t outliers in terms of the relationship between muzzle energy and recoil energy.

One possibility is that weight is a factor here; some of these guns are huge. (30 lbs!)

Weights in this dataset are in increments of .25lb, which is pretty fine-grained for our purposes. Let’s just look at a histogram of the weights, with one-pound bins.

data %>%
    ggplot(aes(x = RifleWeight)) +  theme_light() +
    geom_histogram(binwidth = 1, fill = '#1215E4', alpha = .3, color = "#1215E4") +
    labs(x='Rifle Weight', y = 'Count', title='Distribution of Rifle Weights')