読者です 読者をやめる 読者になる 読者になる

廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

dplyr ユーザーのための AWK 入門

R AWK

dplyrを使いこなす!基礎編 - Qiita を参考に、相模原市オープンデータライブラリー | 相模原市 で公開されている駅別乗降人員の推移データを使用して dplyr と対比させながら AWK で簡単な集計を行ってみます。

行の絞り込み

dplyr でいう filter みたいなことがやりたい場合。

AWK は単に条件を書くだけで条件に沿ったデータを出力します。

awk -F, '$2== "町田駅(参考)"' jyoukou_20141111.csv
>横浜線,町田駅(参考),54506,79366,119620,171478,195652,197638,211864,216428,215598,218154,218084,221086,221880
>小田急線,町田駅(参考),154831,197393,236259,281813,297703,279498,282772,291952,289622,290621,288884,291678,292779

-F, はカンマを区切り文字として認識させるためのオプションです。

&& でつなぐことで AND 条件、|| でつなぐことで OR 条件が使用可能です。

集計

dplyr でいう summarise みたいなことがやりたいとき。

AWK はテキストファイルを一行ずつ読んでいき、条件にマッチした行に対してアクションを実行します。

プログラムの構成は基本的には、以下のようになります。

BEGIN {
  (ファイルを読み込む前にやる処理)
}

(条件 1) {
  (アクション 1)
}

(条件 2) {
  (アクション 2)
}
 
...
 
END {
  (ファイルを読み終わった後にやる処理)
}

BEGIN 節、END 節 は省略可能です。

3 列目の合計を求めたいときはこうします。

awk -F, 'NR > 1{sum+=$3}END{print sum}' jyoukou_20141111.csv
>506989

NR > 1 は「行の番号が 1 より大きい」という意味です。最初の行には列名が入っているので飛ばしました。

; で区切ってアクションを複数書くこともできます。

awk -F, 'NR > 1 {sum1 += $3; sum2 += $4} END {print sum1, sum2}' jyoukou_20141111.csv
>506989 599739

グループ化

dplyr でいう group_by みたいなことがやりたいとき。

awk の配列はちょっとトリッキーです。

awk -F, 'NR > 1 {sum[$1] += $3} END {for(i in sum) print i ","sum[i]}' jyoukou_20141111.csv
>小田急線,339273
>京王線,0
>相模線,11690
>中央本線,0
>横浜線,156026

複数列をキーにして集計したいときはこうします。

awk -F, '{array[$1","$2]+=$3} END { for (i in array) {print i"," array[i]}}' jyoukou_20141111.csv

今日はここまで。

R: 複数回答のアンケートのグラフの例

R グラフ

経緯


複数回答ありの場合、合計が100%を超えてしまうので、円グラフや帯グラフは使えない。

レーダーチャート

上田尚一が推奨した風配図は「レーダーチャート」といったほうがわかりやすい。

From Parallel Plot to Radar Plot によれば、こうすると ggplot2 でレーダーチャートがかける。

library(ggplot2)
Q=c("教育","医療","都の行財政改革","景気・雇用","治安・防災",
    "貧困対策","東京五輪・パラリンピックの準備",
    "交通・インフラ整備","分からない・無回答")
A=c(41.9, 39.9, 28.8, 27.9,16.4,12.4,9.7,5.7,0.7)
coord_radar <- function (theta = "x", start = 0, direction = 1){
    theta <- match.arg(theta, c("x", "y"))
    r <- if (theta == "x") 
      "y"
    else "x"
    ggproto("CordRadar", CoordPolar, theta = theta, r = r, start = start, 
            direction = sign(direction),
            is_linear = function(coord) TRUE)
}
ggplot(data.frame(Q=Q,A=A))+
  geom_polygon(aes(x=reorder(Q,-A),y=A,group=1),colour="black",fill=NA)+
  coord_radar()+
  theme_gray(base_family = "HiraKakuProN-W3")+
  xlab("")+ylab("")

f:id:abrahamcow:20160720015640p:plain

データ出典:【東京都知事選・序盤情勢】小池百合子氏、一歩リード 鳥越俊太郎氏、増田寛也氏が急追 序盤情勢(1/2ページ) - 産経ニュース(2つまで回答可)

ただ文字が切れてしまったりしていて、好みではない。

plotrix パッケージを使ったほうがかんたんなようだ。

library(plotrix)
par(family = "HiraKakuProN-W3") #mac ユーザーは日本語のフォントを指定
radial.plot(A,labels=Q,rp.type="p",radial.labels = c(seq(10,40,by=10),NA))

f:id:abrahamcow:20160720020025p:plain

棒グラフ

上田先生は風配図推しのようだったが、ふつうの人の目は極座標表示になれていないので、棒グラフでいいがな、という気がする。

奥村先生は グラフの例:アンケート(複数回答) で、「複数回答の場合は,棒の間のスペースを残しておく。また,絶対に円グラフにしない」としている。

f:id:abrahamcow:20160720020321p:plain

library(cowplot)
ggplot(data.frame(Q=Q,A=A))+
  geom_bar(aes(x=reorder(Q,A),y=A),stat="identity")+
  coord_flip()+
  theme_cowplot(font_family = "HiraKakuProN-W3")+
  xlab("")+ylab("")

その他の注意点

複数回答ありで割合表示にした場合、「のべ回答数に対する割合」か「回答者数に対する割合」か、二通りの解釈がありうる。その点も明記しておいたほうがいい。

参考文献・参考になりそうな文献

統計グラフのウラ・オモテ―初歩から学ぶ、グラフの「読み書き」 (ブルーバックス)

統計グラフのウラ・オモテ―初歩から学ぶ、グラフの「読み書き」 (ブルーバックス)

統計データの視覚化 (Rで学ぶデータサイエンス 12)

統計データの視覚化 (Rで学ぶデータサイエンス 12)

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)