Thanks to everyone who commented and read through my post last night. The post got a lot more attention than I expected (on hacker news and reddit at least). Many comments both here and on those threads quite reasonably pointed out problems with the data presented. I should have been a lot more clear initially about the caveats and issues, and put those at the front of the post instead of the end.
I’d like to try to address some of the concerns raised when possible, and be clear about which problems I don’t see an easy way of fixing:
Confidence intervals
Many commenters have noted that the results are not significant without including confidence measures. In retrospect I should have calculated confidence intervals from the beginning instead of just the mean values; I had assumed incorrectly that the n=100 cutoff would keep the error low enough to ignore, but that was a mistake. Below is an updated graph with 95% confidence intervals:

and the numbers:
Language |
Mean |
Lower |
Upper |
Samples |
Puppet |
87,589.29 |
77,726.24 |
97,452.33 |
112 |
Haskell |
89,973.82 |
82,773.72 |
97,173.92 |
191 |
PHP |
94,031.19 |
90,956.90 |
97,105.47 |
978 |
CoffeeScript |
94,890.80 |
90,025.16 |
99,756.45 |
435 |
VimL |
94,967.11 |
90,735.70 |
99,198.51 |
532 |
Shell |
96,930.54 |
93,771.76 |
100,089.33 |
979 |
Lua |
96,930.69 |
86,169.26 |
107,692.13 |
101 |
Erlang |
97,306.55 |
88,631.11 |
105,981.98 |
168 |
Clojure |
97,500.00 |
91,448.24 |
103,551.76 |
269 |
Python |
97,578.87 |
95,481.64 |
99,676.10 |
2314 |
JavaScript |
97,598.75 |
95,897.67 |
99,299.83 |
3443 |
Emacs Lisp |
97,774.65 |
92,503.64 |
103,045.65 |
355 |
C# |
97,823.31 |
94,116.76 |
101,529.86 |
665 |
Ruby |
98,238.74 |
96,471.81 |
100,005.68 |
3242 |
C++ |
99,147.93 |
95,633.62 |
102,662.23 |
845 |
CSS |
99,881.40 |
95,361.99 |
104,400.82 |
527 |
Perl |
100,295.45 |
97,172.79 |
103,418.12 |
990 |
C |
100,766.51 |
98,602.83 |
102,930.19 |
2120 |
Go |
101,158.01 |
94,435.87 |
107,880.15 |
231 |
Scala |
101,460.91 |
94,925.79 |
107,996.02 |
243 |
ColdFusion |
101,536.70 |
93,627.35 |
109,446.05 |
109 |
Objective-C |
101,801.60 |
97,560.43 |
106,042.77 |
562 |
Groovy |
102,650.86 |
94,601.74 |
110,699.99 |
116 |
Java |
103,179.39 |
100,474.36 |
105,884.42 |
1402 |
XSLT |
106,199.19 |
96,887.72 |
115,510.65 |
123 |
ActionScript |
108,119.47 |
99,297.36 |
116,941.58 |
113 |
As it turns out, the commenters who noted that the top and bottom languages were likely because of small samples were correct. Although the confidence ranges of the top and bottom groups don’t overlap, the difference is not as clear-cut as the means would suggest.
I’m going to try to gather some data from sparser-represented languages to clean this up, and will update here when I have better numbers (this might take a while because of API rate limiting.)
Household Income vs Personal Income
Many commenters noted that these numbers use household income rather than personal income. This is a limitation of the data sets I’m using rather than voluntary; the Rapleaf API only returns household income. Rather than give up I decided to use the household measure instead.
This is not ideal, but I don’t think it is a critical flaw; for this difference to skew the results, authors of certain languages would need significantly different marriage patterns or a tendency to marry richer / poorer spouses relative to other languages. This is not impossible, but I think the results are still useful with this caveat in mind.
If anyone can suggest a data set with personal incomes I can use instead, I’ll gladly use those. Otherwise I’ll be more clear that the incomes are household rather than personal.
Correcting for Confounding Variables
The original numbers did not attempt to adjust for any other variables, some of the more obvious being age and location. It’s been suggested that I look into using partial dependence plots to separate out other variables. I’ll be taking a look at that over the next few days.
Missing Languages
Unfortunately there’s not a lot I can do about many missing languages; many are not recognized by GitHub (SQL, among others). As I gather more data, I’ll include the languages which were omitted here because of sample size.
Thanks again to everyone who read and commented. I’m going to process the lessons here and be more careful when posting numbers in the future (I’d still like to give similar breakdowns for gender and age soon.)