2013/10/18
データいろいろ
 >  プログラミング言語の好き嫌い(Hacker News)
先週、Hacker News という海外のウェブサイトに、プログラミング言語の好き嫌い投票の結果が載っていた。興味深い結果なので、当該ウェブページの HTML を PostgreSQL + cURL で取り込み、PL/R でグラフにした。

Poll: What are your liked and disliked programming languages?
https://news.ycombinator.com/item?id=6527104


↓ 結果のグラフ。投票数(好き+嫌い)上位30位までの言語を表示している。棒と左の縦軸が好き・嫌いの投票数。赤い点と横方向の点線が「好き」の割合。
https://kenpg.up.seesaa.net/image/20131018_HackerNews_plr.pdf


下が一連の手順。すべて pgAdminV のクエリツール内で完結し、一度に実行できる。実行環境は 2013/10/12、Windows への cURL インストールは 2013/09/25、PostgreSQL 9.3 への PL/R インストールは 2013/10/13 をそれぞれ参照。PostgreSQL のスキーマ名、cURL のバス、PDF の場所などは適宜環境に合わせる。
-- 1. cURL で HTML 取り込み
-- https なので -k オプション付加
CREATE TEMP TABLE "18_tmp" (rowid serial, rowtt text ) ;
COPY "18_tmp" (rowtt)
FROM PROGRAM 'curl.exe -k https://news.ycombinator.com/item?id=6527104' ;
CREATE TABLE "201310"."18_HackerNews_html" AS
SELECT string_agg(rowtt, E'\n') html FROM (
SELECT * FROM "18_tmp" ORDER BY rowid
) foo ;
DROP TABLE "18_tmp" ;

-- 2. HTML からテーブルに整理
CREATE TABLE "201310"."18_HackerNews_data" AS
WITH a AS (
SELECT regexp_matches(html
, '(.+?) - (?:(Like)|(Dislike)).+?>(\d+) points'
, 'gn') reg
FROM "201310"."18_HackerNews_html"
), b AS (
SELECT reg[1] pname
, CASE WHEN reg[2] = 'Like' THEN reg[4] END p1
, CASE WHEN reg[3] = 'Dislike' THEN reg[4] END p2
FROM a
)
SELECT pname, string_agg(p1, '') :: int points_like
, string_agg(p2, '') :: int points_dislike
FROM b
GROUP BY pname ;
DROP TABLE IF EXISTS "201310"."18_HackerNews_html" ;

-- 3. グラフ作成用の PL/R ストアド関数
CREATE OR REPLACE FUNCTION "201310"."18_HackerNews_plr"()
RETURNS void LANGUAGE plr STABLE AS $$

pdf = "R:/20131018_HackerNews_plr.pdf"
pdw = 297 # 横幅(mm)
pdh = 210 # 縦

sql = '
SELECT *, points_like :: float
/ (points_like + points_dislike) score_like
FROM "201310"."18_HackerNews_data"
ORDER BY points_like + points_dislike DESC
LIMIT 30 # 投票数 上位30に限定
'
df1 = pg.spi.exec(sql)

ylm = max(c(df1[,"points_like"],df1[,"points_dislike"]))
ylm = 2000 # 上を変更。余白調整のため
graphics.off()
pdf(file=pdf, width=pdw/25.4, height=pdh/25.4)
par(mai=par("mai") * c(1.2, 1, 1.2, 1)) # 上下余白開げる
brp = barplot(df1[,"points_like"], names.arg=df1[,"pname"], las=2
, ylim=c(-ylm, ylm), space=1.5, axes=F)
barplot(add=T, -1 * df1[,"points_dislike"], axes=F, space=1.5)
points(brp, (df1[,"score_like"] - 0.5) * ylm * 2, pch=21, col="white"
, bg="red", lwd=2, cex=1.5)
for(i in c(-1, 1)){
for(j in c(1, 2)){
lines(range(brp), rep(i * ylm / j, 2), lty=2, lwd=1, col="red")
if(i == 1 & j == 1) lab = "Like 100%\n"
if(i == 1 & j == 2) lab = "75%\n"
if(i == -1 & j == 2) lab = "25%\n"
if(i == -1 & j == 1) lab = "Like 0%\n"
text(label=lab, x=max(brp), y=i * ylm / j, adj=1, col="red"
, xpd=NA)
}
}
lab_axis = c(paste(sep="\n", c(rep("Dislike", 2), "", rep("Like", 2))
, c(1, 0.5, 0, 0.5, 1) * ylm, c(rep("", 4), "points")))
axis(2, at=seq(-1, 1, length=5) * ylm, labels=lab_axis, las=1)
par(lheight=1.2)
mtext(3, xpd=NA, line=1.5
, text="Poll: What are your liked and disliked programming languages?")
dev.off()
$$ ;

-- 4. PL/R ストアド関数を実行
SELECT "201310"."18_HackerNews_plr"() ;

上の 2. までを実行すると、下のテーブルができる。後は R でテーブルを読み込み、軸やラベルを調整して棒グラフ化するだけ。テーブルの下に PDF を再掲する。



グラフの左ほど投票数(好き+嫌い)が多い、いわばメジャーな言語。その中で PHP にこんなに「嫌い」が多いのは意外だった。SQL が(プログラミング言語と呼べるか微妙だが)「好き」の絶対数で第5位というのも面白い。個人的には納得だが。

投票数が少ないマイナーな言語はおしなべて「好き」が多い。その言語が良いと思った人だけが使い続け、今いちと思った人は嫌うより前に他の言語に乗り換えてしまうのだろうか。逆に、メジャーゆえ仕方なく使わされそうな Java や PHP に「嫌い」が多いのは当然かも。

投票数がそこそこある言語のうち Visual Basic と Actionscript の「嫌い」割合が突出している。私も VBS や VBA は好きでない(Excel がらみで仕方なく使う)。

この Hacker News の投票結果は、下記ブログでも言及されている。SQL がこんなに多く投票されるとは全く驚いたとある。

Taming Serpents and Pachyderms : Most Liked and Disliked Programming Languages
http://pyrseas.wordpress.com/2013/10/11/most-liked-and-disliked-programming-languages/


以上、Hacker News のプログラミング言語好き嫌い投票の結果を PostgreSQL + cURL で取り込み、PL/R でグラフにした。
<< 好き嫌いを Wilson Score Interval …
PL/Python でラスタをファイル出力… >>