次元の海で溺れる

Rとデータ解析と統計手法たちとわたし

【R】【基本の前処理】しんぷるなサンプル抽出を考える

いい感じに韻を踏めたので大満足。


最近ggplot2系の派手めな記事が多かったんですが、
私の中でもっと大事にしたいことは山ほどあって
今日は今更地味なことを書きます。

卵が先か、サンプル抽出が先か

データは全数取れるに越したことはないのですが、
世の中のデータの全てがcsvやらスクレイピングで取れるなんてことは無くって。
しばしば母集団からのサンプル抽出なるものを行う羽目になります。

「15万世帯のばらばらのデータをひとつひとつ集めてくるなんて個人では無理ゲー」
「じゃあランダムに抽出した5000世帯ぶんにしよっか」

とかとか。

このサンプルサイズの設定も奥が深くて苦しみも深くてもう言いたいことは山ほどあるのですが、
あとrandomにしないでpairdするとかもあったりするのですが、ていうかpairdってやっry

...余計なことを言うのはやめます。

抽出方法も系統やら多段やらいろいろですが
今日はさくっとシンプルにrandom抽出したいねって時のScriptをメモ程度に。

Excelでの無作為抽出

よく見かけるのがExcelでやる方法です。

n個のサンプルが欲しかったら
RAND関数で乱数を発生→小さい順にソートして上からn個取ろう!みたいな。

ExcelのRAND関数も奥が深い...一様分布かつ、いかに重複しないかみたいな。仕様読むのたのしい。)

Rでやってみる

Rにも乱数の発生はいろいろあって、

一様分布ならrunif()
正規分布ならrnorm()

などなど

dplyr::manute()とかで乱数の列足してsortして~みたいな感じでやったら先述したExcelと同じ動きもできたりする

が。

RにSample関数なるものがあります。
これは1から200の連番からランダムに20個取ってきてね!みたいなことが出来る関数になります。

好きな関数のひとつなので、今日はそれで。

テーマ

上場企業1894社のIDから500社抽出したい

#データを用意

> head(data,10)
     ID
1  1301
2  1332
3  1333
4  1352
5  1377
6  1379
7  1414
8  1417
9  1419
10 1420

> tail(data,10)
       ID
1885 9984
1886 9986
1887 9987
1888 9989
1889 9990
1890 9991
1891 9993
1892 9994
1893 9995
1894 9997

#1894社のIDリストです。しかも昇順。
#このまま上から500社取っちゃうと業種が偏っちゃうよね~


#まず1から1894の連番を作る
> n<-1:1894

#その連番から500個ランダムに数を取得します。

> index<-sample(n,500);index 
  [1] 1868   78  502  380 1170  148  510   71 1499 1363  247 1344 1736  988 1782 1706 1208  123  165   44 1713
 [22]  185  589 1610 1387 1202  776 1220 1802   65   16 1615  979  919  434  654 1173  726  963 1559 1756 1467
 [43]  208 1545  923 1772  556 1693 1578  569 1765  387  426    4  178 1676 1280   26 1080 1669 1252 1808  130
 [64]  223 1256 1075  168 1889  539 1140 1402  617 1497 1634 1856  580 1627  271 1828 1101  576  483  581 1227
 [85]  491 1458 1152 1046 1131 1111 1775 1416  958 1247  249 1519 1484 1640  823  770 1614 1562  476 1838  454
[106]  652 1287 1163 1264  306 1404 1755  995 1586 1281  615  412 1103 1371 1892 1212 1059  182  423 1133  626
[127] 1268  925 1320  452  137 1514  336 1321  777  458 1463 1415  670  486 1027 1047 1068 1093  234 1481 1657
[148]  904  666   50 1623 1166 1377 1594   72  889   63  933 1366 1183 1023  728 1717  233 1611 1150 1010  408
[169]  926 1389 1688 1588   64 1253 1804 1500  744  893  821  942  273   45  787 1660 1169  467  511 1606  546
[190]  687  161  536 1277  103 1365 1025  621  890 1724 1665 1201  886  526  195 1272  342   81 1198 1102 1063
[211] 1155   12 1846  445  396   36  614 1124  950 1097 1223  503 1728 1721  515 1324  253 1205   95  849 1052
[232]  532  623  232  256 1153 1345 1584 1407 1376  419  939  221 1296  535  817 1275  354  319 1650 1476  283
[253]  573 1686   61  409 1442  339  829 1245  825   23  596 1894  561   39  151 1289  635  242 1720  606 1630
[274]  422  343  519 1830  119  406   30   82  472  390  240 1086  417  507  461 1333   28 1718  244 1644  216
[295]  320  210  713  854  672  497  802  693 1391 1125 1840  947 1290  166  921  743  987  796  633  549 1792
[316]  562  895  863  658 1674  816 1666  463  956  619   41  577 1000 1478  717  170 1524  994  525  102 1793
[337] 1791  344 1591  913  594  366 1842 1122  378  738 1477  109 1878  183  610  646 1043 1821  425 1766   32
[358]  608 1073 1525  752  235 1704  118 1196  891  348  250 1486  146 1279 1188  812  851  588   83  309  258
[379] 1848  605 1866  835 1271 1123  822  162  656  814 1331  792  847 1024  698 1241  448  141 1790  346 1329
[400] 1826  259 1482 1864  181 1430   57 1857 1457    3  735 1553 1727  285    1  512  383 1116  144  613  313
[421]   56  469 1194 1743  618 1816  827  418 1110  749  715 1156  918  528  523 1613  978  704 1739  625  564
[442]  873  498 1029  783  341 1883 1118 1157 1239 1211 1136   66 1694  788 1572   21 1647 1332  667 1831 1378
[463]  932 1642 1515 1168  872  251 1394 1570 1004 1327 1579  583  462 1603  661 1436  837  394 1249  986 1531
[484] 1367  159 1705  364  520  953 1703 1479  362 1013 1099  275 1632 1061  864 1278 1180

#この500個の整数をインデックスにして部分集合を作る

> data_sample[index,] %>>% 
   as.data.frame() ->data_sample500

> colnames(data_sample500)<-"ID" 


#ちゃんと500社に絞れてるかしら

> str(data_sample500)
'data.frame':	500 obs. of  1 variable:
 $ ID: int  8001 4549 8609 7874 6914 3371 4828 7864 1301 7251 ...


#完成

> tail(data_sample500,10)
      ID
491 3202
492 9504
493 8270
494 9997
495 6973
496 7989
497 5440
498 4826
499 2198
500 3222

この部分集合を元にデータマージしたり前処理したり色々です。

サンプルサイズ決めて
どうやって抽出するのが妥当なのか考えて
データ構造見てどうやって分析するのがいいのか考えて

みたいな

この分析の前部分が本当は一番好きだったりはする。かも。

おわり

短いけどおわり。

Tokyo.Rへの初参戦が決まったので
休日出勤を回避すべく馬車馬のようにはたらく!!!

11月はSapporo.Rもあるらしいよ、たのしみ。