MATLAB ユーザーコミュニティー

MATLAB & Simulink ユーザーコミュニティー向け日本語ブログ

【R2023a】MATLAB でピボットテーブル??

こんにちは,道家です.新学期が始まりましたね.娘は一年間着けていた新入生用の黄色いランドセルカバーを取り外して登校し始め,成長を感じています.
さて,新学期ということは MATLAB にとっても大事な時期ですね.先月新しくリリースされた R2023a.恒例のリリースノートの熟読ですが,今回も MATLAB 本体だけでも 100 以上の新機能があり,ワクワクしちゃいますね.このブログではもうすでにいくつかの新機能を紹介してきました.
今回もいろいろある中で何について書こうか迷いましたが,まずは私にとって一番衝撃的だった機能の一つを紹介したいと思います.
ピボットテーブル?!
基本的には簡単な計算でも常に MATLAB で行いますが,最近,表形式のデータをいろいろな観点から見て分析する事が多くなり Microsoft® Excel® のピボットテーブルをよく使うようになりました.もちろん MATLAB でも同じようなことはできるのですが,ピボットテーブルの使いやすさは侮れません.
そんな私なので,リリースノートで pivot 関数を見かけたときは衝撃を受けました.

Microsoft Excel のピボットテーブル

ここでは,MATLAB に入っているデモ用の表データを使います.患者の属性や身体データを含んだ Excel ファイルです.
data = readtable("patients.xls", TextType="string")
data = 100×10 table
 LastNameGenderAgeLocationHeightWeightSmokerSystolicDiastolicSelfAssessedHealthStatus
1"Smith""Male"38"County General Hospital"71176112493"Excellent"
2"Johnson""Male"43"VA Hospital"69163010977"Fair"
3"Williams""Female"38"St. Mary's Medical Center"64131012583"Good"
4"Jones""Female"40"VA Hospital"67133011775"Fair"
5"Brown""Female"49"County General Hospital"64119012280"Good"
6"Davis""Female"46"St. Mary's Medical Center"68142012170"Good"
7"Miller""Female"33"VA Hospital"64142113088"Good"
8"Wilson""Male"40"VA Hospital"68180011582"Good"
9"Moore""Male"28"St. Mary's Medical Center"68183011578"Excellent"
10"Taylor""Female"31"County General Hospital"66132011886"Excellent"
11"Anderson""Female"45"County General Hospital"68128011477"Excellent"
12"Thomas""Female"42"St. Mary's Medical Center"66137011568"Poor"
13"Jackson""Male"25"VA Hospital"71174012774"Poor"
14"White""Male"39"VA Hospital"72202113095"Excellent"
こちらのデータから患者の性別(Gender)と病院(Location)ごとの平均収縮期血圧(Systolic)を計算してみましょう.Excel のピボットテーブル機能を使うとこのように計算できます.

【R2022b以前】MATLAB でピボットテーブル

実は MATLAB でも findgroupssplitapplyunstack などを使うと同じようなことが実現できます.
まず findgroups で性別と病院の組み合わせ(グループ)をもとめます.
[G, Gender, Location] = findgroups(data.Gender, data.Location)
G = 100×1
4 6 2 3 1 2 3 6 5 1
Gender = 6×1 string
"Female"
"Female"
"Female"
"Male"
"Male"
"Male"
Location = 6×1 string
"County General Hospital"
"St. Mary's Medical Ce…
"VA Hospital"
"County General Hospital"
"St. Mary's Medical Ce…
"VA Hospital"
GenderLocation を見ると 6 つのグループがあるのが分かります.G は 100 個の観測データのグループ番号です.
次に splitapply を使って各グループごとの平均血圧を計算します.
averageSystolic = splitapply(@mean, data.Systolic, G)
averageSystolic = 6×1
123.4737 121.0000 120.6842 124.7500 123.0000 123.4444
こちらは上で求めた GenderLocation の 6 グループに対する平均血圧です.分かり易くテーブルにまとめましょう.
result = table(Gender, Location, averageSystolic)
result = 6×3 table
 GenderLocationaverageSystolic
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 を使って GenderLocation の平均血圧に変換します.
pivot1 = unstack(result, "averageSystolic", "Location", VariableNamingRule="preserve")
pivot1 = 2×4 table
 GenderCounty General HospitalSt. Mary's Medical CenterVA Hospital
1"Female"123.4737121120.6842
2"Male"124.7500123123.4444
VariableNamingRule"preserve" にすると,空白や句読点など通常変数名に使えないラベルも変数名として使えるようになります(日本語も使えます!).ちなみに,特定の列を指定する場合はこのように記述します.
vaHospitalData = pivot1.("VA Hospital")
vaHospitalData = 2×1
120.6842 123.4444

【R2023a以降】pivot 関数

さてお待たせしました.R2023a で新しく追加された pivot 関数を使うと以上のコードが次の一行で実現できちゃうんです!
pivot2 = pivot(data, Rows="Gender", Columns="Location", DataVariable="Systolic", Method="mean")
pivot2 = 2×4 table
 GenderCounty General HospitalSt. Mary's Medical CenterVA Hospital
1"Female"123.4737121120.6842
2"Male"124.7500123123.4444
Excel のピボットテーブルと同様,複数の行変数や列変数を指定することもできます.例えば,喫煙者であるかないかをグループとして追加するには下記のように書きます.
pivot3 = pivot(data, Rows=["Gender","Smoker"], Columns="Location", DataVariable="Systolic", Method="mean")
pivot3 = 4×5 table
 GenderSmokerCounty General HospitalSt. Mary's Medical CenterVA Hospital
1"Female"0119.6923120118.6429
2"Female"1131.6667127.5000126.4000
3"Male"0120.2000120.1667118
4"Male"1129.3000128.6667130.2500
今回は平均値を計算しましたが,その他一般的な統計値を計算することもできます.また,行と列の合計値を追加することもできます.詳しくは pivot 関数のドキュメンテーションをご覧ください.

お試しください

いかがでしたでしょうか.
Excel のピボットテーブル ユーザーには必見の機能だと思います.また,こちらは新機能なので是非皆さんに使っていただきフィードバックを頂けたら嬉しいです.ちなみに,私はこの機能について知った時 App Designer を使って対話的にピボットテーブルが作れるようなものを作成してみたいなと思いました.(誰か作ってくれるかなあ...)
|
  • print

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.