This is highly unscientific, but massaging the Google search from S.Mark, a little:
+"username" +"closed as" +site:stackoverflow.com -site:meta.stackoverflow.com
I get:
- Neil Butterworth: 2160
- Shog9: 1870
- George Stocker: 1340
- Greg Hewgill: 1300
- gnovice: 1290
- SilentGhost: 1150
- dmckee: 1090
- cletus: 964
- paxdiablo: 853
- skaffman: 779
- S.Lott: 738
- Mehrdad Afshari: 713
- Paul Tomblin: 649
- tvanfosson: 638
For comparison, some other very active or once-active users, all on the first page:
- Gumbo: 353
- Andrew Hare: 337
- JaredPar: 278
- Konrad Rudolph: 188
- Darin Dimitrov: 185
- bobince: 171
- Jon Skeet: 151
- VonC: 85
These are relative numbers only, based on fuzzy data, and only include users that I personally recognize (i.e. mainly the ones in my tags). They're also going to be biased toward the most active users and users who have been members the longest.
Nevertheless, the comparison against the "top" users should be a strong indication that activity level and membership duration alone aren't enough to cause that much of a bias... there are definitely some users who close more often than others (and, frankly, I think these users should receive medals of honour).
Just from my own, very anecdotal experience, these are at least credible results. The numbers themselves are nowhere near accurate, but the rankings make sense. I know that Jon Skeet doesn't close many questions.
Also keep in mind that users with the highest close rates are likely to be the users who spend the most time on the site, and therefore contribute the most, so again I must repeat that closing a high number of questions is not a bad thing. These people are committed to the quality of the site, which is virtually the polar opposite of "negativity."
BTW, here's the SQL script that you would be able to use for the Data Dump imported to SQL Server using the SODDI tool, if the data dump actually contained User IDs for close votes (which it doesn't seem to, probably for privacy reasons):
WITH Votes_CTE AS
(
SELECT
UserId, COUNT(*) AS VoteCount,
ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) AS Seq
FROM Votes
WHERE VoteTypeId = 6
GROUP BY UserId
)
SELECT u.DisplayName, v.VoteCount
FROM Users u
INNER JOIN Votes_CTE v
ON u.Id = v.UserId
WHERE Seq < 10
Oh well, maybe some day...