LoginSignup
16
18

More than 5 years have passed since last update.

Rのサンプルデータで遊ぶ①

Last updated at Posted at 2016-12-04

はじめに

初投稿です,きぬいとです.
知人がおもしろいことを分析していたので,便乗してRにデフォルトで入っているタイタニックのサンプルデータを用いて統計分析したいと思います.
エンジニア向け,というより,「Rをインストールした!これからRを使いたい!どうしよう!?」という人向けです.
簡単な統計でRと仲良くなってください.

Rで使えるサンプルデータいろいろ

その前に「Rってどんなサンプルデータが使えるのか」ということについても少し触れます.
Rをインストールすると使えるサンプルデータは以下に一覧が掲載されています.

「トライフィールズ」R言語 サンプルデータ一覧

見てみると,経済学,薬学,医学,生物学,天文学など……多くの分野で使われそうなサンプルデータが目白押しです.
興味のあるデータを使って,Rで遊んでみるときっと楽しいと思います.

タイタニック号のデータ

前置きが長くなりました,さっそく使ってみましょう.
Rはインストールできていることを前提としています.
インストールの仕方はそこまで難しくない(と思う)のでggったりyahooったりしてください.
まず,サンプルデータを読み込みます.data.frameは分析のしやすいデータ構造(型)としてデータを読み込む関数です.
簡単な統計はsummary関数で確認できます.結果は下のようにでると思います.

TitanicData.R
#データの読み込み
X <- data.frame(Titanic)
summary(X)

  Class       Sex        Age     Survived      Freq       
 1st :8   Male  :16   Child:16   No :16   Min.   :  0.00  
 2nd :8   Female:16   Adult:16   Yes:16   1st Qu.:  0.75  
 3rd :8                                   Median : 13.50  
 Crew:8                                   Mean   : 68.78  
                                          3rd Qu.: 77.00  
                                          Max.   :670.00  

>

厄介なのは,このデータ,同じ属性を持つ人々がFreq(度数)によってまとめられてしまっているのです.
つまり,「Crewクラスの大人の男性のうち生き残った人」が「何人いるのか」はわかるんですが,一人一人はデータに表れていないということです.
このままでは困っちゃうので,ちょっといろいろやってごまかします.

TitanicData_fix.R
#頻度に応じてデータを複製
X1 <- data.frame(lapply(X,function(i){rep(i,X[,5])}))
#Freqはもういらないのでデータセットから削除
X1 <- X1[,-5]
summary(X1)

#結果
  Class         Sex          Age       Survived  
 1st :325   Male  :1731   Child: 109   No :1490  
 2nd :285   Female: 470   Adult:2092   Yes: 711  
 3rd :706                                        
 Crew:885     

「ちょっといろいろ」の中身は,Freq(頻度:同じ属性をもつ人の数)を複製することでした.
これで,データとしては使えるものになりました.

生き残った人々(性別編)

相関分析をすると,二つの変数の間にどんな傾向があるかがわかります.
Rではcor.test()を使います.この関数,相関係数の種類まで指定できますが,「データで遊ぶ」のが目的の本稿では特に指定しません.デフォルトだとPearsonの積率相関係数です.
as.numeric()関数は,他の型になってるデータを無理やり数値型に直します.
こういう操作をした後は元のデータと数値がどう対応してるか,確認してください.

(2017/12/07追記)なお,cor.test()関数は,デフォルトではPearsonの積率相関係数を返します.他にもSpearmanやKendollの相関分析が可能です.cor.test関数内のmethodパラメタにmethod = "spearman"等を加えることで実現します.

TitanicCor.R
#相関分析
#as.numericは他の型を数値型という型に置き換える関数
#as.numeric(X1$Survive)は1がNo,2がYesに対応
#as.numeric(X1$Sex)は1がmale,2がfemaleに対応
cor.test(as.numeric(X1$Survive),as.numeric(X1$Sex))

#結果
  data:  as.numeric(X1$Survive) and as.numeric(X1$Sex)
t = 24.001, df = 2199, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4218538 0.4880948
sample estimates:
      cor 
0.4556048 

corの下の数値が相関係数の値です.約0.456なので,「女性であるほど生き残っている」という相関関係が割とあることがわかります(この「割と」度合いは分野に応じて様々ですが,ウチのシマじゃ結構強いんですぜ……).
p-valueがその有意性検定の結果です.
「2.2e-16」はとにかく「めっちゃ0にちかい」ということなので,この相関係数は統計的にも有意な結論です.
同様に子どもと生き残りの相関や,あるいは子どもと客室の相関等を見てみると,以下の結果が得られます.

結果のみ.R
#子どもと生き残り
#as.numeric(X1$Age)は1がchild,2がAdultに対応

data:  as.numeric(X1$Survive) and as.numeric(X1$Age)
t = -4.5976, df = 2199, p-value = 4.517e-06
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.13879053 -0.05602226
sample estimates:
        cor 
-0.09757511 

#子どもと客室
#as.numeric(X1$Class)は,1~3がそれぞれ1st~3rd,
#4がCrewに対応

data:  as.numeric(X1$Class) and as.numeric(X1$Age)
t = 3.1152, df = 2199, p-value = 0.001862
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.02457273 0.10776869
sample estimates:
       cor 
0.06628592 

どちらも統計的有意ではありますが,相関係数は非常に低いので,必ずしも「子供であると生き残れていない」とか「客室のクラスが低いと子供が多い」とか,そういうわけでもなかったようですね.

使える変数が4つあり,その組み合わせはここに書くには冗長なので,気になる相関はご自身で分析してみてください.
タイタニックのサンプルデータはすべてfactor型で,そのままぶち込むとエラーを吐きます.as.numeric()で必ず数値型に直してから分析してください.

本当は

この記事だけで全部やりたかったんですが(だらだらと)長くなってしまったので記事を二つに分けることにしました.
数行のコードでいろいろ結果が出るRは,プログラムに触れる機会の少ない人でも使いやすい言語だって思ってますし,これが無料とかすごい時代だと思ってます.
是非使ってください.そしてきぬいとに教えてください.
次回は二項ロジットでも組もうかと思います.

16
18
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
18