There’s a few reasons that estimates go wrong.
When we have the wrong people making the estimates.
No good trying to have someone who doesn’t do software development state how long it will take to do something.
Better still, it’s preferable to have the person who will perform the work making the work estimate.
When we have the right people giving us answers we want to hear.
Guilty as charged.
We’ve all done this.
We hedge our bets.
We say things we hope will make the other person happy.
And finally (though not the final reason), our estimates are based not on faulty assumptions but on the best data we have available at this time.