R言語

R言語 クロス集計表・ピボットテーブルの作り方

  1. HOME >
  2. R言語 >

R言語 クロス集計表・ピボットテーブルの作り方

スポンサーリンク

こんにちは、usagi-san です。

今回は集計表及び、ピボットテーブルの作成方法をみていきます。

クロス集計表は、factor型のデータの各levelの度数、和、平均を取り扱う際に便利です。

エクセルではピボットテーブルという機能を用いれば、直感的に簡単に集計表を作成することが可能です。

エクセルで作成した集計表を用いても解析が可能ですが、R言語でもパッケージを用いればピボットテーブルの作成ができます

今回はピボットテーブルの作成の例として、2元及び3元のテーブルを作成していきます(2元及び3元分割表を作成していきます)。

以下のダウンロードリンクから、今回用いるプログラミンコードをダウンロードできます。

是非是非ダウンロードしてください

また、データフレームの操作をすべてまとめた記事も書きました。データフレームの詳細については次の記事を参照。

【R言語】データフレーム操作 作成・値の代入・行と列の追加と削除など

R言語を使う際に避けては通れない道であるデータフレームの操作について解説します。 データフレーム(data.frame)はデータセットを格納するための行列であり、データ解析をするうえで必要不可欠です。 ...

続きを見る

クロス集計表の作り方

データセットの準備

まずは、クロス集計表(2元の分割表)を作る方法を解説していきます。

R言語にデフォルトで入っているmtcarsという自動車のテストデータセットを例に集計方法を解説していきます。

まず次のコードを実行し、dfmtcartを代入しましょう。

試しに、dfの列名および、データの構造を確認してみましょう。関数headを用いるとデータフレームの一部を参照することができます。

上の実行結果のように、dfはmpgなどのnumeric型の列とcyl、vs、am、gear、carbといったfactor型の列から成ることが分かります。

factor型のデータを例にいろいろな集計方法をみていきます。

クロス集計表の作成

では、vsとamに関するクロス集計を行います。

df$vsdf$amのように各2つの列名(タグ)を指定し、次のようにas.factorlevelsを用いることで、0と1のlevelをもつfactro型のデータであることが分かります(注意: vsamなどの列のデータはデフォルトだとcharacter型です)。

これら2つの列のクロス集計表を作成する際に、次の表のように4通りの組み合わせを考える必要があります。

vs\am01
0vs=0かつam=0vs=0かつam=1
1vs=1かつam=0vs=1かつam=1

度数についてのクロス集計

まず、上の表にある条件式を用いて各セルの度数を計算してみます。

次のようにして、上の表の4通りのパターンを計算することができます。

table_11には、vs=0かつam=0の度数が代入されているように、tableの添え字には、線形代数のブロック行列に対応するものとなっています(11の場合、左上の成分。12の場合、右上の成分, . . . )。

次のコードを実行することで、table_11, . . . table_22の各成分を用いてクロス集計表を作成することができます。

また、rownames(table)colnames(table)をそれぞれc(0, 1)にし、集計表の行名と列名を指定しています。

クロス集計表tableをコンソール上で確認すると、次のようにvsとamの集計表を作成できたことが分かります。

和についてのクロス集計

次に、列名mpg各セルの和についてのクロス主計表を作成していきます。

R言語 データフレーム練習【初心者向け】で説明したように、関数sumを用いることで、numeric型のデータの和を計算することができます。

度数の場合と同様に、各4パターンのdf$mpgを考え、関数sumを用いて、それぞれのnumeric型のベクトルの和を求めています。

例として、vs=0かつam=0のとき、関数sumの引数df$mpg[df$vs == 0 & df$am == 0]は次のようになっています。

2行目では、vs=0かつam=0である行のdf$mpgが 出力されていることが確認できます。

またlengthが12であることは、先ほど計算したvs=0かつam=0の度数と一致しているのもわかります。

度数の場合と同様に、次を実行することで、sumTable_11、sumTable_12、sumTable_21、sumTable_22をクロス集計表にまとめます。

コンソール上で、sumTableを確認すると、和に関するクロス集計表ができていることが確認できます。

平均についてのクロス集計

最後に、列名mpg各セルの平均についてのクロス主計表を作成していきます。

各セルの平均は、度数の集計表と和の集計表から計算することができます

ベクトルや行列、データフレームは各要素についての四則演算が可能であるように、次の割り算/で平均についてのクロス集計表を求めることができます。

コンソール上で、meanTableを参照すると、次の平均についてのクロス集計表ができていることが分かります。

2元の場合のクロス集計の方法を説明しましたが、実行するとわかるように、factor型のlevelの数が多くなればなるほど、作成が困難になります。

そのため次では、集計用の関数xtabsを用いた集計表の作成の一連の流れを説明します。

xtabsを用いた作成

クロス集計用の関数として、xtabsを紹介します。

先ほどのクロス集計表の作成の例では、各levelsのパターンを考えて1から作成しましたが、xtabsを用いることで、この計算の手間を省くことができます

xtabsを用いた度数のクロス集計

xtabsを用いて度数についてのクロス集計表を作成するには、xtabsの引数を次のように与えます。

1つ目の引数には式を代入します。今、vsとamの集計表を得たいので"~ vs + am"としています。

2つ目に、集計するデータフレームを代入しています。

tableを参照すると、tableには次のようなint型のリストが格納されているのが分かります。

xtabsを用いた和のクロス集計

xtabsを用いて和の集計を行うには、xtabsの最初の引数である式の"~"の前に和を求める列名を指定します。

次のようにxtabsの引数を指定することで、df$mpgの和についての集計表を作成することができます。

度数の場合と同様に、sumtableには次のようなint型のリストが格納されているのが分かります。

xtabsを用いた平均のクロス集計

xtabsで出力される度数と和の集計表を用いて、平均のクロス集計表を作成することができます。

次のように、割り算/により平均についてのクロス集計表を作成できます。

meanTableには、平均に関するint型のリストが格納されていることがわかります。

csvファイルへの出力

xtabsで作成した集計表は、参照するとわかるようにlint型のリストとなっており、集計表の形でのcsvファイルへの出力は難しいです。

行名や列名を結合しなおすことで、集計表の形を維持したままcsvファイルに出力することができます

まず扱いやすくするために、int型のリストをmatrixに変換します。

次のrbindとcbindで、クロス集計表の行名と列名およびvsとamを結合させています。

例として、tableを参照すると、集計表の形をしたデータフレームが作成されていることが確認できます。

最後に、csvファイルへの出力には、write.csvではなく、write.tableを用います。

これは、write.csvでは引数col.names = TRUEなどの変更が許されないためです。今、上の実行結果から、tableにはすでに列名が挿入されているのが分かるのでcol.names = Fとしてcsvファイルに出力していきます。

次のようにwrite.tableの引数にrow.names = F や col.names = Fを指定することで、上の出力結果の集計表をcsvファイルを出力することができます。

次の画像のように、分割表(度数).csvをみてみると、xtabsで出力した集計表が保存されていることが分かります。

クロス集計表のcsvファイルへの出力

3元以上のクロス集計表

3元以上のクロス集計表の作成

3元以上のクロス集計表を解説していきます。

dfvsとamとgearを例にクロス集計表を作成してみます。

as.factor(df$gear)を参照してみます。

df$gearは上の3つのlevelsをもつfactor型のデータであることと、クロス集計表の作成からdfvsとamとgearのクロス集計表は次の12パターンのセルから成る表であることが分かります。

gear345
vsam
00vs=0かつam=0かつgear=3vs=0かつam=0かつgear=4vs=0かつam=0かつgear=5
1vs=0かつam=1かつgear=3vs=0かつam=1かつgear=4vs=0かつam=1かつgear=5
10vs=1かつam=0かつgear=3vs=1かつam=0かつgear=4vs=1かつam=0かつgear=5
1vs=1かつam=1かつgear=3vs=1かつam=1かつgear=4vs=1かつam=1かつgear=5

クロス集計(3元)

2元の場合と同様に、まずxtabsを用いないでクロス集計表を作ってみます。

上の表にある条件式を用いて各セルの度数を計算してみます。

次のようにして、上の表の12通りのパターンを計算することができます。

2元のときと違うのは、for(i in 1:nlevels(as.factor(df$gear))){. . . }df$gearの各levelについての2元クロス集計表を作っている点です。6~14行目のように、gear=3, 4, 5の3通りに対する2×2の表を作っているのが分かります。

16~22行目では、度数と和についての2×2のデータフレームtableとsumTableを作り、各行名と列名を指定しています。

最後に24行目以降では、tmp <- list(gear = NULL, table = NULL)で各df$geaerのlevelに対する表を格納するリストを初期化しています。この場合list(gear, table)の最初のgearにはdf$gearの各levelが格納され、tableに各levelの2×2のデータフレームが格納されます。

上を実行すると、度数、和、平均についてのクロス集計表がそれぞれtableList、sumTableList 、meanTableList に格納されます。

例として、tableListをコンソール上で確認すると、vs、am、mpgについての度数の集計表ができていることが分かります。

xtabsを用いた作成

2元のクロス集計の場合と同様に、xtabsを用いることで、上で紹介したような各セルの計算をしなくても3元以上のクロス集計表を作ることができます。

またftableを用いると、3元以上のクロス集計表はピボットテーブルに変換され、さらに見栄えが良くなります。

3元以上の度数のクロス集計

xtabsの引数を次のように指定することで、3元以上の度数のクロス集計表を作成できます。

最初の引数の式に"vs+am+mpg"というように列名を"+"で加えることで3元以上のクロス集計表を作れます。

tableを参照すると、次のようにdf$gearのlevelsごとでクロス集計されていることが確認できます。

また、次のようにftableにクロス集計表を適用すると、クロス集計表がピボットテーブルへと変換されます。

tableを参照すると、次のようにクロス集計表であったものがピボットテーブルへと変わっていることが分かります。

3元以上の和のクロス集計

2元の場合と同様に、3元以上の和についてのクロス集計を行うことができます。

xtabsの引数を次のよう指定することで、和についてのクロス集計が行われます。

xtabsの最初の引数の式の"~"の前に和をとりたい列名を指定することで、和についてのクロス集計ができます。

この場合vsとamとgearに関するmpgの和についてのクロス集計表が作成されます。

sumTableは次のようになります。

度数の場合と同様に、ftableを用いることで、ピボットテーブルを作成できます。

3元以上の平均のクロス集計

上で作成した度数と和についてのクロス集計表を用いて、3元に上の平均についてのクロス集計表を作ることができます。

2元の時と同様に、割り算/を用いることで、次のように作成することができます。

meanTableを参照すると、平均についての3元のクロス集計表ができていることが分かります。

度数が0であるセルは、平均を計算することができないため、NaNが挿入されます。

同様に、ftableを用いて、ピボットテーブルに変換できます。

csvファイルへの出力(3元以上)

まずint型のリストで構成されているtable 、sumTable、meanTablematrixに変換します。

行列にすることで、行名や列名や変数名を変更するのが容易になります。

次に、2元の場合と同様に、rbindとcbindを用いて、行名、列名、変数名を整理します。

3元の度数についてのピボットテーブルは次のように、行名、列名、変数名が整理されていることが分かります。

最後にwrite.tableを用いて、これらのピボットテーブルtable、sumTable、meanTableをcsvファイルへと出力します。

 "多元分割表(度数).csv"を開くと、次の画像のようなピボットテーブルが出力されていることが確認できます。

3元ピボットテーブルのcsvファイルへの出力

まとめ

R言語でのクロス集計表ピボットテーブルの作成方法を学んでいきました。

クロス集計表とピボットテーブルはデータの集計に便利である他にも、検定方法の一種である適合度検定を行う際にも便利です。

データを集計する際や適合度検定を行う際に参考にしてください。

スポンサーリンク

  • この記事を書いた人
  • 最新記事

usagi-san

統計学とゲームとかをメインに解説していくよ。 数式とかプログラミングコードにミスがあったり質問があったりする場合はコメントで受け付けます。すぐに対応します。

-R言語
-,