こんにちは,道家です.新学期が始まりましたね.娘は一年間着けていた新入生用の黄色いランドセルカバーを取り外して登校し始め,成長を感じています.
さて,新学期ということは MATLAB にとっても大事な時期ですね.先月新しくリリースされた R2023a.恒例のリリースノートの熟読ですが,今回も MATLAB 本体だけでも 100 以上の新機能があり,ワクワクしちゃいますね.このブログではもうすでにいくつかの新機能を紹介してきました. 今回もいろいろある中で何について書こうか迷いましたが,まずは私にとって一番衝撃的だった機能の一つを紹介したいと思います.
ピボットテーブル?!
基本的には簡単な計算でも常に MATLAB で行いますが,最近,表形式のデータをいろいろな観点から見て分析する事が多くなり Microsoft® Excel® のピボットテーブルをよく使うようになりました.もちろん MATLAB でも同じようなことはできるのですが,ピボットテーブルの使いやすさは侮れません.
そんな私なので,リリースノートで pivot 関数を見かけたときは衝撃を受けました.
Microsoft Excel のピボットテーブル
ここでは,MATLAB に入っているデモ用の表データを使います.患者の属性や身体データを含んだ Excel ファイルです.
data = readtable("patients.xls", TextType="string")
data = 100×10 table
| LastName | Gender | Age | Location | Height | Weight | Smoker | Systolic | Diastolic | SelfAssessedHealthStatus |
---|
1 | "Smith" | "Male" | 38 | "County General Hospital" | 71 | 176 | 1 | 124 | 93 | "Excellent" |
---|
2 | "Johnson" | "Male" | 43 | "VA Hospital" | 69 | 163 | 0 | 109 | 77 | "Fair" |
---|
3 | "Williams" | "Female" | 38 | "St. Mary's Medical Center" | 64 | 131 | 0 | 125 | 83 | "Good" |
---|
4 | "Jones" | "Female" | 40 | "VA Hospital" | 67 | 133 | 0 | 117 | 75 | "Fair" |
---|
5 | "Brown" | "Female" | 49 | "County General Hospital" | 64 | 119 | 0 | 122 | 80 | "Good" |
---|
6 | "Davis" | "Female" | 46 | "St. Mary's Medical Center" | 68 | 142 | 0 | 121 | 70 | "Good" |
---|
7 | "Miller" | "Female" | 33 | "VA Hospital" | 64 | 142 | 1 | 130 | 88 | "Good" |
---|
8 | "Wilson" | "Male" | 40 | "VA Hospital" | 68 | 180 | 0 | 115 | 82 | "Good" |
---|
9 | "Moore" | "Male" | 28 | "St. Mary's Medical Center" | 68 | 183 | 0 | 115 | 78 | "Excellent" |
---|
10 | "Taylor" | "Female" | 31 | "County General Hospital" | 66 | 132 | 0 | 118 | 86 | "Excellent" |
---|
11 | "Anderson" | "Female" | 45 | "County General Hospital" | 68 | 128 | 0 | 114 | 77 | "Excellent" |
---|
12 | "Thomas" | "Female" | 42 | "St. Mary's Medical Center" | 66 | 137 | 0 | 115 | 68 | "Poor" |
---|
13 | "Jackson" | "Male" | 25 | "VA Hospital" | 71 | 174 | 0 | 127 | 74 | "Poor" |
---|
14 | "White" | "Male" | 39 | "VA Hospital" | 72 | 202 | 1 | 130 | 95 | "Excellent" |
---|
⋮ |
---|
こちらのデータから患者の性別(Gender)と病院(Location)ごとの平均収縮期血圧(Systolic)を計算してみましょう.Excel のピボットテーブル機能を使うとこのように計算できます.
【R2022b以前】MATLAB でピボットテーブル
実は MATLAB でも findgroups,splitapply,unstack などを使うと同じようなことが実現できます.
[G, Gender, Location] = findgroups(data.Gender, data.Location)
"Female"
"Female"
"Female"
"Male"
"Male"
"Male"
"County General Hospital"
"St. Mary's Medical Ce…
"VA Hospital"
"County General Hospital"
"St. Mary's Medical Ce…
"VA Hospital"
Gender と Location を見ると 6 つのグループがあるのが分かります.G は 100 個の観測データのグループ番号です.
averageSystolic = splitapply(@mean, data.Systolic, G)
123.4737
121.0000
120.6842
124.7500
123.0000
123.4444
こちらは上で求めた Gender と Location の 6 グループに対する平均血圧です.分かり易くテーブルにまとめましょう.
result = table(Gender, Location, averageSystolic)
result = 6×3 table
| Gender | Location | averageSystolic |
---|
1 | "Female" | "County General Hospital" | 123.4737 |
---|
2 | "Female" | "St. Mary's Medical Center" | 121 |
---|
3 | "Female" | "VA Hospital" | 120.6842 |
---|
4 | "Male" | "County General Hospital" | 124.7500 |
---|
5 | "Male" | "St. Mary's Medical Center" | 123 |
---|
6 | "Male" | "VA Hospital" | 123.4444 |
---|
最後に,おまじないコマンド unstack を使って Gender 対 Location の平均血圧に変換します. pivot1 = unstack(result, "averageSystolic", "Location", VariableNamingRule="preserve")
pivot1 = 2×4 table
| Gender | County General Hospital | St. Mary's Medical Center | VA Hospital |
---|
1 | "Female" | 123.4737 | 121 | 120.6842 |
---|
2 | "Male" | 124.7500 | 123 | 123.4444 |
---|
VariableNamingRule を "preserve" にすると,空白や句読点など通常変数名に使えないラベルも変数名として使えるようになります(日本語も使えます!).ちなみに,特定の列を指定する場合はこのように記述します.
vaHospitalData = pivot1.("VA Hospital")
【R2023a以降】pivot 関数
さてお待たせしました.R2023a で新しく追加された pivot 関数を使うと以上のコードが次の一行で実現できちゃうんです! pivot2 = pivot(data, Rows="Gender", Columns="Location", DataVariable="Systolic", Method="mean")
pivot2 = 2×4 table
| Gender | County General Hospital | St. Mary's Medical Center | VA Hospital |
---|
1 | "Female" | 123.4737 | 121 | 120.6842 |
---|
2 | "Male" | 124.7500 | 123 | 123.4444 |
---|
Excel のピボットテーブルと同様,複数の行変数や列変数を指定することもできます.例えば,喫煙者であるかないかをグループとして追加するには下記のように書きます.
pivot3 = pivot(data, Rows=["Gender","Smoker"], Columns="Location", DataVariable="Systolic", Method="mean")
pivot3 = 4×5 table
| Gender | Smoker | County General Hospital | St. Mary's Medical Center | VA Hospital |
---|
1 | "Female" | 0 | 119.6923 | 120 | 118.6429 |
---|
2 | "Female" | 1 | 131.6667 | 127.5000 | 126.4000 |
---|
3 | "Male" | 0 | 120.2000 | 120.1667 | 118 |
---|
4 | "Male" | 1 | 129.3000 | 128.6667 | 130.2500 |
---|
今回は平均値を計算しましたが,その他一般的な統計値を計算することもできます.また,行と列の合計値を追加することもできます.詳しくは pivot 関数のドキュメンテーションをご覧ください. お試しください
いかがでしたでしょうか.
Excel のピボットテーブル ユーザーには必見の機能だと思います.また,こちらは新機能なので是非皆さんに使っていただきフィードバックを頂けたら嬉しいです.ちなみに,私はこの機能について知った時 App Designer を使って対話的にピボットテーブルが作れるようなものを作成してみたいなと思いました.(誰か作ってくれるかなあ...)
コメント
コメントを残すには、ここ をクリックして MathWorks アカウントにサインインするか新しい MathWorks アカウントを作成します。