よんかいめです.気付いたらR苦手の会という立派な名前も付いてました.
今日やったのはココ.
「基本統計量」とかね,名前からして脱線する予感しまくりですよ.
もちろん脱線しまくりましたとも.ええ.そりゃもう.
以下メモ.
基本統計量
合計
> uriage <- c(12, 6, 13, 7, 8, 11, 12, 9, 10, 7) > sum(uriage) [1] 95 > ## 累積和 > cumsum(uriage) [1] 12 18 31 38 46 57 69 78 88 95 > ## 売上の多い順に並べてcumsumをして > ## 「2割の商品で9割の売り上げあげてるのかー」 > ## とかみるといいです by id:syou6162 > cumsum(sort(uriage, T))/sum(uriage) [1] 0.1368421 0.2631579 0.3894737 0.5052632 0.6105263 0.7052632 0.7894737 [8] 0.8631579 0.9368421 1.0000000 > ## 累積プロット > plot(cumsum(sort(uriage, T))/sum(uriage), type="o") > ## 階段ぽくする(ecdf関数により計算された経験/累積分布関数をプロット) > plot(ecdf(uriage), verticals=T, do.p=F)
比率
> ## データ中のある値が相対的に大きいか小さいか > uriage/sum(uriage) [1] 0.12631579 0.06315789 0.13684211 0.07368421 0.08421053 0.11578947 [7] 0.12631579 0.09473684 0.10526316 0.07368421 > 100*(uriage/sum(uriage)) [1] 12.631579 6.315789 13.684211 7.368421 8.421053 11.578947 12.631579 [8] 9.473684 10.526316 7.368421 > ## scaライブラリ使うと%つけて出力とかそんなことが > library(sca) > percent(uriage/sum(uriage)) [1] "13 %" "6 %" "14 %" "7 %" "8 %" "12 %" "13 %" "9 %" "11 %" "7 %" > ## 「名前空間ちゃんとありますよ」by 6162 > sca::percent(uriage/sum(uriage)) [1] "13 %" "6 %" "14 %" "7 %" "8 %" "12 %" "13 %" "9 %" "11 %" "7 %" > ## これでpercent関数が複数あってもあんしん!!
namespaceはC++やるまで気にしたこともなかった.
四分位数
> ## 四分位数 > quantile(Z) 0% 25% 50% 75% 100% -3.763908813 -0.649167465 0.005366433 0.660630102 3.625712555 > ## summary > summary(Z) Min. 1st Qu. Median Mean 3rd Qu. Max. -3.764000 -0.649200 0.005366 0.010420 0.660600 3.626000 > ## 95%信頼区間に線を書くby id:yag_ays > hist(Z) > abline(v=quantile(Z,0.975)) > abline(v=quantile(Z,0.025))
あとweighted.meanとかaveとかがふわっと出た.ふわっと.みんなで?weighted.mean ?aveしてみよう!!
最頻値(mode)
> ## tableで頻度が分かる > table(c(1,5,4,3,3)) 1 3 4 5 1 2 1 1 > ## 最頻値(mode)を求める関数はない(そもそも連続か離散かで違う > ## tableとwhich.maxを組み合わせるとそれっぽいことはできる(データが離散の場合 > ## which.max(table(x)) > ## ちなみにmode()関数はオブジェクトのモードを返す > mode(1:10) [1] "numeric" > mode("hoge") [1] "character" > mode(TRUE) [1] "logical" > mode(NULL) [1] "NULL" > ## 変数が連続変数な時の最頻値の求め方 > Z <- rnorm(10000) > ## hist()にplot=Fを指定 > # hist(Z, plot=F) ##なんか色々出る > hist(Z, plot=F)$counts [1] 1 0 7 48 173 442 902 1455 1931 1873 1557 945 440 163 44 [16] 15 3 1 > ## cut()を使う > table(cut(Z, breaks = -6:6)) (-6,-5] (-5,-4] (-4,-3] (-3,-2] (-2,-1] (-1,0] (0,1] (1,2] (2,3] (3,4] 0 1 7 221 1344 3386 3430 1385 207 18 (4,5] (5,6] 1 0 > ## cymnum()を使うと任意のcutpointでぶった切って任意のsymbolに置き替えることができる > ## 相関行列による使用例 > abs(cor(iris[-5])) Sepal.Length Sepal.Width Petal.Length Petal.Width Sepal.Length 1.0000000 0.1175698 0.8717538 0.8179411 Sepal.Width 0.1175698 1.0000000 0.4284401 0.3661259 Petal.Length 0.8717538 0.4284401 1.0000000 0.9628654 Petal.Width 0.8179411 0.3661259 0.9628654 1.0000000 > symnum(abs(cor(iris[-5])),cutpoint=c(0,0.2,0.4,0.6,0.8,1),symbols=c(" ",".","-","+","**")) S.L S.W P.L P.W Sepal.Length ** ** ** Sepal.Width ** - . Petal.Length ** - ** ** Petal.Width ** . ** ** attr(,"legend") [1] 0 ' ' 0.2 '.' 0.4 '-' 0.6 '+' 0.8 '**' 1 > ## abs():絶対値 cor():相関係数(相関行列) > ## 相関係数とかは応用統計量と呼ぶらしい > ## 正規分布の頻度(これは数字に置き換えてるからこれよりもcut()のが良い) > table(symnum(Z, cutpoint=-6:6, symbols=-5:6)) -1 -2 -3 -4 0 1 2 3 4 5 1344 221 7 1 3386 3430 1385 207 18 1
範囲(range)
> range(Z) [1] -4.279974 4.205178 > c(min(Z), max(Z)) [1] -4.279974 4.205178
分散,標準偏差
> ## <del>Ashi</del> > Mr.A <- c(7206, 6358, 9809, 8915, 7850, 8965) > Mr.B <- c(5550,4880,15914,4856,13013,4890) > var(Mr.A) [1] 1637453 > sd(Mr.A) [1] 1279.630 > sqrt(var(Mr.A)) [1] 1279.630 > ## 標準化 > scale(Mr.A) [,1] [1,] -0.7641533 [2,] -1.4268449 [3,] 1.2700287 [4,] 0.5713892 [5,] -0.2608827 [6,] 0.6104630 attr(,"scaled:center") [1] 8183.833 attr(,"scaled:scale") [1] 1279.630 > var(scale(Mr.A)[,1]) #分散1 [1] 1 > mean(scale(Mr.A)[,1]) #平均0 [1] 2.313055e-16
桁落ちについて
上記meanの例のように整数になるべき演算に誤差が生ずることがある.Rでは実数は全て倍精度浮動小数として計算される.このとき,(1+x)-1=xが成り立つ最小の実数xと(1-y)-1)=-yが成り立つ最小の実数yが存在し,それぞれmachine epsilon,machine negative epsilonと呼ぶ.この値はRの基本定数リスト.Machineに収められており参照できる.
> ## machine epsilon, machine negative epsilon > .Machine$double.eps [1] 2.220446049250313e-16 > .Machine$double.neg.eps [1] 1.110223024625157e-16
これらの値よりも半分以上小さい値を1よりも大きな数に足す(machine negative epsilonは引く)操作を行なうと桁落ちが発生する.
> 1 + 2^(-52) == 1 [1] FALSE > 1 + 2^(-53) == 1 [1] TRUE > 1 - 2^(-53) == 1 [1] FALSE > 1 - 2^(-54) == 1 [1] TRUE
参考:工学のためのデータサイエンス入門―フリーな統計環境Rを用いたデータ解析 (工学のための数学)
ところでoptions(digits=22)とかやっても全部出力されなくて,反映されるのはdigits=16までなんですが,これはプラットフォーム依存なんですかね.