Timing of the game and cost.
Mid-week games at home are never going to sell out easily.
If we summarise significantly; it's a struggle for a lot of people who finish work at 5pm, most people aren't in the best financial position at the moment, it's just after Xmas, there's a greater incentive to go to Blackburn away knowing that it will be a good atmosphere and is at a more convenient time, there are more tickets to sell for the West Ham game.
I really think that the cost of supporting a 'good' football team often gets ignored when we consider crowds and how well tickets sell. We've not got that broad fan base United, Arsenal, Liverpool and Chelsea have got. There's no shame in that.
I've always thought of football attendances being made up of three layers of fans. We've got, lets say, a core of 50/55,000 fans made up of ST holders and regulars (more than 15 home games a season). Those who go to every home game basically. Then we've got the next layer, if want for a better word, of fan who will attend around 5-10 home games a season (usually the weekend games). Again, let's say of around 10-15,000. Finally there's a third layer of day tripper fan which has increased significantly in the last few years (those who attend 1-2 games a season). I'd say every football club's support is made up like this and some layers are greater and more significant to a club's fan base than others.
When some of our core fans can't attend (for financial and logistical reasons i,e. midweek games, early Sunday/Saturday games) the second layer will top up the attendance to 47-48,000 as tickets become available. However, when games come around that mid-week or at a daft time at the weekend or are expensive, that game becomes less accessible to each 'layer' of fan. With United, for example, I'd argue that their second and third layer is so varied and so big that even their shitty mid-week games at home to Stoke will attract the majority of the core fans (as would we) and given the size of the other 'layers' there'd be enough people to buy tickets/increase the crowd/'available' for the game.
Bit complicated and probably not worded brilliantly but hopefully you'll catch my drift!