このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
tall 配列によるグループ化された統計の計算
この例では、停電データを含む tall timetable のグループ化された統計を計算する方法を説明します。例では関数 grouptransform
、groupsummary
、および groupcounts
を使用して、各地域で最も一般的な停電の原因など、対象とするさまざまな数量を計算します。この例における生のデータには約 1500 行しかありませんが、データのサイズに前提は設けていないため、ここで紹介する手法ははるかに大きなデータセットでも使用できます。
データストアと tall timetable の作成
サンプル ファイル outages.csv
には、米国における電力会社の停電を表すデータが含まれています。このファイルには、Region
、OutageTime
、Loss
、Customers
、RestorationTime
、および Cause
の 6 つの列があります。
outages.csv
ファイルのデータストアを作成します。"TextScanFormats"
オプションを使用して、各列に含まれるデータの種類を categorical ("%C"
)、浮動小数点数値 ("%f"
)、または datetime ("%D"
) で指定します。
data_formats = ["%C","%D","%f","%f","%D","%C"]; ds = tabularTextDatastore("outages.csv","TextscanFormats",data_formats);
データストアの先頭に tall table を作成し、tall table を tall timetable に変換します。変数 OutageTime
は table 内の最初の datetime 変数または duration 変数であるため、行時間に使用されます。
T = tall(ds); T = table2timetable(T)
T = Mx5 tall timetable OutageTime Region Loss Customers RestorationTime Cause __________ ______ ____ _________ _______________ _____ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? : : : : : : : : : : : :
欠損データの置換
変数 RestorationTime
のいくつかの行には、NaT
値で表される欠損時間があります。これらの行を table から削除します。
T = rmmissing(T,"DataVariables","RestorationTime");
timetable 内の数値変数の場合は、欠損値をもつ行を削除する代わりに、欠損値を各地域の平均値に置き換えます。
T = grouptransform(T,"Region","meanfill",["Loss","Customers"]);
ismissing
を使用して、欠損データが table 内に一切残っていないことを確認します。
tf = any(ismissing(T),"all");
gather(tf)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 4: Completed in 0.17 sec - Pass 2 of 4: Completed in 0.38 sec - Pass 3 of 4: Completed in 0.22 sec - Pass 4 of 4: Completed in 0.25 sec Evaluation completed in 1.5 sec
ans = logical
0
データのプレビュー
データに欠損値が含まれなくなったので、少数の行をメモリに入れて、データに何が含まれているかを把握します。
gather(head(T))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.16 sec Evaluation completed in 0.22 sec
ans=8×5 timetable
OutageTime Region Loss Customers RestorationTime Cause
________________ _________ ______ __________ ________________ _______________
2002-02-01 12:18 SouthWest 458.98 1.8202e+06 2002-02-07 16:50 winter storm
2003-02-07 21:15 SouthEast 289.4 1.4294e+05 2003-02-17 08:14 winter storm
2004-04-06 05:44 West 434.81 3.4037e+05 2004-04-06 06:10 equipment fault
2002-03-16 06:18 MidWest 186.44 2.1275e+05 2002-03-18 23:23 severe storm
2003-06-18 02:49 West 0 0 2003-06-18 10:54 attack
2004-06-20 14:39 West 231.29 1.5354e+05 2004-06-20 19:16 equipment fault
2002-06-06 19:28 West 311.86 1.5354e+05 2002-06-07 00:51 equipment fault
2003-07-16 16:23 NorthEast 239.93 49434 2003-07-17 01:12 fire
地域別の平均停電期間
groupsummary
を使用して、各地域の平均停電期間を求めます。まず、停電ごとの期間を含む新たな変数 OutageDuration
を table 内に作成します。この期間は、停電時刻を復旧時刻から減算することで求められます。groupsummary
の呼び出しで、以下を指定します。
"Region"
をグループ化変数として"mean"
を計算方法として"OutageDuration"
を操作対象の変数として
T.OutageDuration = T.RestorationTime - T.OutageTime; times = groupsummary(T,"Region","mean","OutageDuration")
times = Mx3 tall table Region GroupCount mean_OutageDuration ______ __________ ___________________ ? ? ? ? ? ? ? ? ? : : : : : :
結果の期間の表示形式を日数単位に変更し、結果をメモリに収集します。結果では、各地域の平均停電期間と、各地域で報告されている停電数が示されます。
times.mean_OutageDuration.Format = "d";
times = gather(times)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.5 sec - Pass 2 of 2: Completed in 0.25 sec Evaluation completed in 0.99 sec
times=5×3 table
Region GroupCount mean_OutageDuration
_________ __________ ___________________
MidWest 138 34.135 days
NorthEast 548 24.21 days
SouthEast 379 1.7013 days
SouthWest 25 2.4799 days
West 349 28.061 days
地域別の最も多い停電の原因
各地域での、停電の原因ごとの発生頻度を求めます。変数 Cause
と変数 Region
をグループ化変数に指定して、groupcounts
を使用します。結果をメモリに収集します。
causes = groupcounts(T,["Cause","Region"]); causes = gather(causes)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.12 sec - Pass 2 of 2: Completed in 0.17 sec Evaluation completed in 0.49 sec
causes=43×4 table
Cause Region GroupCount Percent
________________ _________ __________ ________
attack MidWest 12 0.83391
attack NorthEast 135 9.3815
attack SouthEast 19 1.3204
attack West 126 8.7561
earthquake NorthEast 1 0.069493
earthquake West 1 0.069493
energy emergency MidWest 19 1.3204
energy emergency NorthEast 29 2.0153
energy emergency SouthEast 79 5.4899
energy emergency SouthWest 7 0.48645
energy emergency West 46 3.1967
equipment fault MidWest 9 0.62543
equipment fault NorthEast 17 1.1814
equipment fault SouthEast 40 2.7797
equipment fault SouthWest 2 0.13899
equipment fault West 85 5.9069
⋮
それぞれの原因が table に複数回現れているため、table には正しいデータが含まれているものの、各原因がそれぞれの地域で発生する頻度を確かめるための適切な形式とはなっていません。データの表現法を改善するため、各列が地域に対応し各行が停電の原因に対応するよう、変数 GroupCount
をスタック解除します。
RegionCauses = gather(unstack(causes,"GroupCount","Region","GroupingVariables","Cause"))
RegionCauses=10×6 table
Cause MidWest NorthEast SouthEast SouthWest West
________________ _______ _________ _________ _________ ____
attack 12 135 19 NaN 126
earthquake NaN 1 NaN NaN 1
energy emergency 19 29 79 7 46
equipment fault 9 17 40 2 85
fire NaN 5 3 NaN 17
severe storm 30 139 132 6 22
thunder storm 31 102 54 6 7
unknown 4 10 3 NaN 4
wind 16 40 13 3 22
winter storm 17 70 36 1 19
停電の原因と地域の組み合わせすべてにデータがあるわけではないため、結果の table にはいくつかの NaN
が含まれています。NaN
値を 0 で埋めます。
RegionCauses = fillmissing(RegionCauses,"constant",{"",0,0,0,0,0})
RegionCauses=10×6 table
Cause MidWest NorthEast SouthEast SouthWest West
________________ _______ _________ _________ _________ ____
attack 12 135 19 0 126
earthquake 0 1 0 0 1
energy emergency 19 29 79 7 46
equipment fault 9 17 40 2 85
fire 0 5 3 0 17
severe storm 30 139 132 6 22
thunder storm 31 102 54 6 7
unknown 4 10 3 0 4
wind 16 40 13 3 22
winter storm 17 70 36 1 19
各地域での最悪の停電
各地域の停電ごとに、最も広範な顧客への影響を計算します。
WorstOutages = groupsummary(T,["Region","Cause"],"max","Customers"); WorstOutages = gather(WorstOutages)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.1 sec - Pass 2 of 2: Completed in 0.16 sec Evaluation completed in 0.46 sec
WorstOutages=43×4 table
Region Cause GroupCount max_Customers
_________ ________________ __________ _____________
MidWest attack 12 2.4403e+05
MidWest energy emergency 19 5.0376e+05
MidWest equipment fault 9 2.4403e+05
MidWest severe storm 30 3.972e+06
MidWest thunder storm 31 3.8233e+05
MidWest unknown 4 3.0879e+06
MidWest wind 16 2.8666e+05
MidWest winter storm 17 7.7697e+05
NorthEast attack 135 1.5005e+05
NorthEast earthquake 1 0
NorthEast energy emergency 29 1.5005e+05
NorthEast equipment fault 17 1.667e+05
NorthEast fire 5 4.5139e+05
NorthEast severe storm 139 1.0735e+06
NorthEast thunder storm 102 5.9689e+06
NorthEast unknown 10 2.4983e+06
⋮
変数 Region
と変数 Cause
のデータを簡単に string に変換することで、単一の categorical 変数へと組み合わせます。その後、各地域で原因ごとに影響を受けた顧客の最大数のカテゴリカル ヒストグラムを作成します。
WorstOutages.RegionCause = categorical(string(WorstOutages.Region)+" ("+string(WorstOutages.Cause)+")"); histogram("Categories",WorstOutages.RegionCause,"BinCounts",WorstOutages.max_Customers,... "DisplayOrder","descend") ylabel("Max # Affected Customers")
参考
findgroups
| splitapply
| tall