skype読書会4回目メモ

よんかいめです.気付いたら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までなんですが,これはプラットフォーム依存なんですかね.