Last updated: October 2009. Kajiyama                    [ 目次に戻る ]

多重クロス表:質的データから3変数のクロス表(三重クロス表)を作成する


  1.  使用するデータの準備

    (1) データセット HairEyeColor

    Rに前もって組み込みこまれたデータセットに「HairEyeColor」がある.ただしクロス表であるのでこれを3変数の原表に復元する.

    592人の大学生を対象に性別,髪の毛の色,目の色を調べた結果が表1である.


    表1 性別(2水準)髪の毛の色(4水準)目の色(4水準)の変数とカテゴリーの2x4x4クロス表

      男性male 女性female
    髪の毛の色 目の色eye color 目の色eye color
    hair color Brown Blue Hazel Green Brown Blue Hazel Green
    Black 32 11 10 3 36 9 5 2
    Brown 53 50 25 15 66 34 29 14
    Red 10 10 7 7 16 7 7 7
    Blond 3 30 5 8 4 64 5 8



    (2) 「HairEyeColor」のクロス表から592人の個人データを復元し,練習用のデータフレーム「 HairEyeColor.stak」を作成する.

    クロス集計表から「スタック」形式のデータフレームへデータ変換の説明.


    HairEyeColor #  と記述し, HairEyeColor のクロス表の内容を確認する.

    次に,

    x <- data.frame(HairEyeColor) #  と記述し,

    Rの内部のクロス表 HairEyeColor の内容を3変数を組み合わせた「スタック」形式のデータフレームxに変換する・戻す.

    x #  と記述し,データフレームxの内容を表示する.

    次に,

    HairEyeColor.stak <- data.frame( lapply (x, function(i) rep(i, x[,"Freq"] ) )[-4] ) #  と記述し,

    Rの内部のクロス表 x の内容を個人データの「スタック」形式のデータフレーム HairEyeColor.stak に変換する・戻す.

    HairEyeColor.stak #  と記述し,Rの内部のデータフレーム HairEyeColor.stak の内容を表示する.

    str( HairEyeColor.stak ) #  と記述し,データフレーム HairEyeColor.stak のデータ構造を表示する.


    > x <- HairEyeColor
    , , Sex = Male
    
           Eye
    Hair    Brown Blue Hazel Green
      Black    32   11    10     3
      Brown    53   50    25    15
      Red      10   10     7     7
      Blond     3   30     5     8
    
    , , Sex = Female
    
           Eye
    Hair    Brown Blue Hazel Green
      Black    36    9     5     2
      Brown    66   34    29    14
      Red      16    7     7     7
      Blond     4   64     5     8
    
    
    > x <- data.frame(HairEyeColor)
    > x
        Hair   Eye    Sex Freq
    1  Black Brown   Male   32
    2  Brown Brown   Male   53
    3    Red Brown   Male   10
    4  Blond Brown   Male    3
    5  Black  Blue   Male   11
    6  Brown  Blue   Male   50
    7    Red  Blue   Male   10
    8  Blond  Blue   Male   30
    9  Black Hazel   Male   10
    10 Brown Hazel   Male   25
    11   Red Hazel   Male    7
    12 Blond Hazel   Male    5
    13 Black Green   Male    3
    14 Brown Green   Male   15
    15   Red Green   Male    7
    16 Blond Green   Male    8
    17 Black Brown Female   36
    18 Brown Brown Female   66
    19   Red Brown Female   16
    20 Blond Brown Female    4
    21 Black  Blue Female    9
    22 Brown  Blue Female   34
    23   Red  Blue Female    7
    24 Blond  Blue Female   64
    25 Black Hazel Female    5
    26 Brown Hazel Female   29
    27   Red Hazel Female    7
    28 Blond Hazel Female    5
    29 Black Green Female    2
    30 Brown Green Female   14
    31   Red Green Female    7
    32 Blond Green Female    8
    
    
    > HairEyeColor.stak <- data.frame( lapply (x, function(i) rep(i, x[,"Freq"]))[-4] )  
    > HairEyeColor.stak
    
          Hair   Eye    Sex
    1   Black Brown   Male
    2   Black Brown   Male
    3   Black Brown   Male
    4   Black Brown   Male
    5   Black Brown   Male
    6   Black Brown   Male
    7   Black Brown   Male
    8   Black Brown   Male
    9   Black Brown   Male
    10  Black Brown   Male
    11  Black Brown   Male
    ・・・・・・・・・・・
    ・・・・・・・・・・・
    581   Red Green Female
    582   Red Green Female
    583   Red Green Female
    584   Red Green Female
    585 Blond Green Female
    586 Blond Green Female
    587 Blond Green Female
    588 Blond Green Female
    589 Blond Green Female
    590 Blond Green Female
    591 Blond Green Female
    592 Blond Green Female
    
    > str( HairEyeColor.stak ) 
    'data.frame':   592 obs. of  3 variables:
     $ Hair: Factor w/ 4 levels "Black","Brown",..: 1 1 1 1 1 1 1 1 1 1 ...
     $ Eye : Factor w/ 4 levels "Brown","Blue",..: 1 1 1 1 1 1 1 1 1 1 ...
     $ Sex : Factor w/ 2 levels "Male","Female": 1 1 1 1 1 1 1 1 1 1 ...
    



  2.  「 HairEyeColor.stak」のスタック形式の592人の個人データから3変数( Hair, Eye , Sex)のクロス表を作成


    方法(1) table関数を利用する

    table ( データフレーム名$変数名1, データフレーム名$変数名2, データフレーム名$変数名3, データフレーム名$変数名4 )

    ちなみに,xtabs ( ~ 変数名1 + 変数名2 + 変数名3 + 変数名4, データフレーム名 )

    y1 <- table( HairEyeColor.stak$Hair, HairEyeColor.stak$Eye, HairEyeColor.stak$Sex )

    #  と記述し,Rの内部のデータフレーム HairEyeColor.stakの内容を3変数のクロス表 y1 に変換する.

    y1 #  と記述し,3変数のクロス表 y1を表示する.

    mosaicplot(y1, main = "性別と髪の毛と目の色の関係") #  と記述し 男女別のグラフを作成する.


    y11 <- apply(y1, c(1, 2), sum) #  男女の欄を合計する

    mosaicplot(y11, main = "髪の毛と目の色の関係")#  と記述し 男女合計のグラフを作成する.

    次に,

    y2 <- addmargins ( y1 ) #  と記述し,Rの内部のクロス表 y1 の周辺の合計欄を加えた3変数のクロス表 y2 を作成する.

    colnames( y2 ) [ncol( y2 )] <- "髪の色合計"

    rownames( y2 ) [nrow( y2 )] <- "目の色合計" #  と記述し,合計欄を日本語にする .

    y2 #  と記述し,Rの内部の3変数のクロス表 y2 の内容を表示する.


    > y1 <- table( HairEyeColor.stak$Hair, HairEyeColor.stak$Eye, HairEyeColor.stak$Sex ) 
    > y1
    , ,  = Male
    
            Brown Blue Hazel Green
      Black    32   11    10     3
      Brown    53   50    25    15
      Red      10   10     7     7
      Blond     3   30     5     8
    
    , ,  = Female
    
            Brown Blue Hazel Green
      Black    36    9     5     2
      Brown    66   34    29    14
      Red      16    7     7     7
      Blond     4   64     5     8
    
    > mosaicplot(y1, main = "性別と髪の毛と目の色の関係") #  と記述し 男女別のグラフを作成する.
    
    
    
    
    
    > y11 <- apply(y1, c(1, 2), sum) #  男女の欄を合計する
    > y11
           
            Brown Blue Hazel Green
      Black    68   20    15     5
      Brown   119   84    54    29
      Red      26   17    14    14
      Blond     7   94    10    16
    
    > mosaicplot(y11, main = "髪の毛と目の色の関係") #  男女合計のグラフ
    
    
    
    
    > y2 <- addmargins ( y1 )
    > colnames( y2 ) [ncol( y2 )] <- "髪の色合計"
    > rownames( y2 ) [nrow( y2 )] <- "目の色合計"
    > y2 
    , ,  = Male
    
                 Brown Blue Hazel Green 髪の色合計
      Black         32   11    10     3         56
      Brown         53   50    25    15        143
      Red           10   10     7     7         34
      Blond          3   30     5     8         46
      目の色合計    98  101    47    33        279
    
    , ,  = Female
    
                 Brown Blue Hazel Green 髪の色合計
      Black         36    9     5     2         52
      Brown         66   34    29    14        143
      Red           16    7     7     7         37
      Blond          4   64     5     8         81
      目の色合計   122  114    46    31        313
    
    , ,  = Sum
    
                 Brown Blue Hazel Green 髪の色合計
      Black         68   20    15     5        108
      Brown        119   84    54    29        286
      Red           26   17    14    14         71
      Blond          7   94    10    16        127
      目の色合計   220  215    93    64        592
    


    方法(2) ftable関数を利用し表を詰めて書く

    ftable ( データフレーム名$変数名1, データフレーム名$変数名2, データフレーム名$変数名3, データフレーム名$変数名4 )


    z1 <- ftable( HairEyeColor.stak$Sex, HairEyeColor.stak$Hair, HairEyeColor.stak$Eye )

    #  と記述し,Rの内部のデータフレーム HairEyeColor.stakの内容を「3変数のクロス表」 z1 に変換する.変数の順序に注意.

    z1 #  と記述し,Rの内部の3変数のクロス表 z1 の内容を表示する.

    >  z1 <- ftable( HairEyeColor.stak$Sex, HairEyeColor.stak$Hair, HairEyeColor.stak$Eye )
    >  z1
                  Brown Blue Hazel Green
                                        
    Male   Black     32   11    10     3
           Brown     53   50    25    15
           Red       10   10     7     7
           Blond      3   30     5     8
    Female Black     36    9     5     2
           Brown     66   34    29    14
           Red       16    7     7     7
           Blond      4   64     5     8
    


    方法(3) tableとftable関数を利用する

    z2 <- table( HairEyeColor.stak$Hair, HairEyeColor.stak$Eye, HairEyeColor.stak$Sex )

    #  と記述し,Rの内部のデータフレーム HairEyeColor.stakの内容を「3変数のクロス表」 z2 に変換する.変数の順序に注意.

    z3 <- addmargins ( z2 ) #  と記述し,Rの内部の3変数のクロス表 z2 の周辺の合計欄を加えた3変数のクロス表 z3 を作成する.

    colnames( z3 ) [ncol( z3 )] <- "髪の色合計"

    rownames( z3 ) [nrow( z3 )] <- "目の色合計" #  と記述し,合計欄を日本語にする .

    z4 <- ftable( z3, row.vars=c( 3, 1) ) #  と記述し整形する .

    z4 #  と記述し,Rの内部の3変数のクロス表 z4 の内容を表示する.


    > z2 <- table( HairEyeColor.stak$Hair, HairEyeColor.stak$Eye, HairEyeColor.stak$Sex )) 
    > z2
    , ,  = Male
    
            Brown Blue Hazel Green
      Black    32   11    10     3
      Brown    53   50    25    15
      Red      10   10     7     7
      Blond     3   30     5     8
    
    , ,  = Female
    
            Brown Blue Hazel Green
      Black    36    9     5     2
      Brown    66   34    29    14
      Red      16    7     7     7
      Blond     4   64     5     8
    
    
    > z3 <- addmargins ( z2 )
    > colnames( z3 ) [ncol( z3 )] <- "髪の色合計"
    > rownames( z3 ) [nrow( z3 )] <- "目の色合計"
    > z3
    , ,  = Male
    
                 Brown Blue Hazel Green 髪の色合計
      Black         32   11    10     3         56
      Brown         53   50    25    15        143
      Red           10   10     7     7         34
      Blond          3   30     5     8         46
      目の色合計    98  101    47    33        279
    
    , ,  = Female
    
                 Brown Blue Hazel Green 髪の色合計
      Black         36    9     5     2         52
      Brown         66   34    29    14        143
      Red           16    7     7     7         37
      Blond          4   64     5     8         81
      目の色合計   122  114    46    31        313
    
    , ,  = Sum
    
                 Brown Blue Hazel Green 髪の色合計
      Black         68   20    15     5        108
      Brown        119   84    54    29        286
      Red           26   17    14    14         71
      Blond          7   94    10    16        127
      目の色合計   220  215    93    64        592
    
    
    > z4 <- ftable( z3, row.vars=c( 3, 1) )
    > z4 
                       Brown Blue Hazel Green 髪の色合計
                                                        
    Male   Black          32   11    10     3         56
           Brown          53   50    25    15        143
           Red            10   10     7     7         34
           Blond           3   30     5     8         46
           目の色合計     98  101    47    33        279
    Female Black          36    9     5     2         52
           Brown          66   34    29    14        143
           Red            16    7     7     7         37
           Blond           4   64     5     8         81
           目の色合計    122  114    46    31        313
    Sum    Black          68   20    15     5        108
           Brown         119   84    54    29        286
           Red            26   17    14    14         71
           Blond           7   94    10    16        127
           目の色合計    220  215    93    64        592
    

[ 目次に戻る ]