The following thought has crossed my mind: "Maybe the SHA256 algorithm isn't as truly random as is thought, and there is some sort of bias against results with so many zeroes in the beginning, and the total hash power on the network is greater than estimated, and mine is therefore a smaller proportion than I thought".

Not that I seriously suspect this to be the case...

There is no known bias in sha256.

The problem is that you have to have tens of thousands of blocks found to be within 1% of theoretical value. Even after 100 blocks, there is 17% probablility of finding 10% less blocks than the average value. With 10000 blocks found, you have 16% of getting 99% of the theoretical value. Every time you double your theoretical blocks number, you have sqrt(2) less variance.

I run a modified miner that prints all hashes with difficulty one. And after collecting more than 200k of such results, it agrees with the printed hashrate to less than 0.2%. Imagine running this experiment with the current difficulty.