Understanding an abnormal grade distribution I have three years of experience teaching as part of a team (many teachers, some with more experience, agreeing on a syllabus and preparing the tests together), but this year is the first time I am fully in charge of some courses.

After grading the mid-term exam for one of my class, I noticed I had a weird grade distribution:



(If this is useful, there are 24 grades, the set of grades is { 1.2, 1.4, 1.4, 1.9, 2.0, 2.3, 2.6, 2.6, 3.4, 4.2, 4.2, 4.3, 4.6, 4.6, 4.8, 4.8, 4.9, 5.3, 6.0, 6.2, 6.4, 7.1, 7.8, 7.8 }, the average is 4.25 and the standard deviation is 2.01.)

I have looked carefully at all my previous tests, and I can confirm I have never seen a curve like this before.

In my short experience, I have heard, read of reflected that a distribution with two curves would probably either mean that a) a large subgroup of students cheated or b) as a teacher I am mostly addressing the best students and letting the others down.

But this looks like there are actually three curves, and I am wondering which characteristic of my teaching or my students could explain that.

Besides, if someone is aware of any scholarly work on this subject, that would be lovely. I couldn't find anything myself.
I agree with the other answers that this may be an artifact of the histogram. May I humbly offer a few alternative ways to plot these grades?



All of these essentially show that your effects are likely due to small n and possibly an essentially discrete underlying data generating process.

R code:

require(hdrcde)
require(Hmisc)
require(denstrip)
require(beanplot)
require(beeswarm)

grades &lt;- c(1.2, 1.4, 1.4, 1.9, 2.0, 2.3, 2.6, 2.6, 3.4, 4.2, 4.2, 4.3, 4.6, 4.6, 4.8, 4.8, 4.9, 5.3, 6.0, 6.2, 6.4, 7.1, 7.8, 7.8)

opar &lt;- par(mfrow=c(1,6), mar=c(3,2,4,1))
    boxplot(grades, col="gray90", main="Standard\nboxplot",yaxt="n")
    hdr.boxplot(grades, main="HDR\nboxplot",yaxt="n")
    bpplot(grades,xlab="",name=FALSE,main="Box-Percentile\nPlot")
    beanplot(grades,col="grey",yaxt="n",main="Bean plot/\nViolin plot",border="black")
    plot(c(0,2),range(grades),type="n",xaxt="n",yaxt="n",xlab="",ylab="",
        main="Density\nplot")
    denstrip(grades, horiz=FALSE, at=1, width=1)
    beeswarm(grades,pch=19,main="Beeswarm\nplot")
par(opar)


EDIT: (sorry, I'm a statistician, I can't help it...) I went and took Jack's kernel density estimate and resampled 24 "students" from it a couple of times. In each case, I plotted a histogram. The result is below. We see that even an innocuous unimodal curve can lead to pretty bumpy histograms, because of the discretization and the small sample size.



R code:

dens &lt;- density(grades)

opar &lt;- par(mfrow=c(2,4))
for ( ii in 1:8 ) {
    samp &lt;- rnorm(length(grades), sample(grades, size = length(grades), replace = TRUE), dens$bw)
    hist(pmin(10,pmax(0,samp)),breaks=0:10,xlab="",ylab="",main="",col="gray")
}
par(opar)