Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

tall 配列によるグループ化された統計の計算

この例では、停電データを含む tall timetable のグループ化された統計を計算する方法を説明します。例では関数 grouptransformgroupsummary、および groupcounts を使用して、各地域で最も一般的な停電の原因など、対象とするさまざまな数量を計算します。この例における生のデータには約 1500 行しかありませんが、データのサイズに前提は設けていないため、ここで紹介する手法ははるかに大きなデータセットでも使用できます。

データストアと tall timetable の作成

サンプル ファイル outages.csv には、米国における電力会社の停電を表すデータが含まれています。このファイルには、RegionOutageTimeLossCustomersRestorationTime、および 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")

Figure contains an axes object. The axes object with ylabel Max # Affected Customers contains an object of type categoricalhistogram.

参考

| |

関連するトピック