フィルターが先、ソートは後、という大原則
Power Queryの決まり事。ビッグデータ解析では必須とされる「フィルターが先、ソートが後」の大原則。
だが、フィルターとソート、「中の人」が良しなにしてくれるので、その順番に実は差はない。
元データ1
75000行ほどの小さいデータ。
拙著『モダンExcel入門」(日経BP)のサンプルファイルがもとになっている。
方針
このデータで、左列「アイテム」でイチゴとオレンジの2つに「フィルター」、右列「純売上高」で昇順で「ソート」する。
フィルターとソートの順番次第で、表示される結果に違いは出ない。
ただし、処理速度が違う。
今回は典型的な4つのパターンで検証。
①全列で、ソートが先で、フィルターが後
「適用したステップ」のとおり、「並べ替えられた行」が先、「フィルターされた行」が後。
かかった時間を計測。
②全列で、フィルターが先で、ソートが後
「適用したステップ」のとおり、「フィルターされた行」が先、「並べ替えられた行」が後。
かかった時間を計測。
①1.6➡②0.8、ほぼ半分の処理時間。
③対象列を絞り、ソートが先で、フィルターが後
「適用したステップ」のとおり、「削除された他の列」を実行後、「並べ替えられた行」が先、「フィルターされた行」が後。
かかった時間を計測。
①1.6➡③1.3。短縮された。
④対象列を絞り、フィルターが先で、ソートが後
「適用したステップ」のとおり、「削除された他の列」を実行後、「フィルターされた行」が先、「並べ替えられた行」が後。
かかった時間を計測。
①1.6>③1.3>②0.8>④0.6。
④が最速。
ここまでの結論
最長①、最短④の差は、およそ1秒。
たった7万行のデータで、これだけの差。
ビッグデータになるほど、留意したい論点の一つ。
「フィルターが先で、ソートは後。」
MS一次情報にも書いてあることだから、当然これで処理速度が速くなる。
そう思い込んでいた………。
小さいデータでは間違いのもとだ、反省。
元データ2
加賀田さんから指摘を受けた。
「実は、中の人がうまいことやってくれる」
ん?
ということで、再度確かめることにした。
今度は「104万行の壁」に再挑戦。104万8576行×500列。
エクセルでも読み込める最大行数のデータを対象に再検証。
方針
Colmun1で昇順に「ソート」、Colmun2で1~5に「フィルター」。
つまり、その他の1,048,571行と498列は不要な列。
前回同様、①全列、ソート、フィルター。②全列、フィルター、ソート。③対象列、ソート、フィルター。④対象列、フィルター、ソート。4つのパターンで検証。
その結果は、実に興味深いものであった。
①全列で、ソートが先で、フィルターが後
全列、ソート、フィルターの結果は、次のとおり。
かかった時間を計測。
①48.21秒。
②全列で、フィルターが先で、ソートが後
全列、フィルター、ソートの結果は、次のとおり。
かかった時間を計測。
①48.21>②48.18。
ほぼ、同じ結果???
③対象列を絞り、ソートが先で、フィルターが後
対象列、ソート、フィルターの結果は、次のとおり。
かかった時間を計測。
③13.45秒。①②よりも格段に速くなった。
データ分析の対象列を絞り込むことは、処理速度にかなり影響があるということ。
④対象列を絞り、フィルターが先で、ソートが後
対象列、フィルター、ソートの結果は、次のとおり。
かかった時間を計測。
③13.45>④13.10。
ほぼ同じ???
本当の結論
「フィルターが先、ソートが後」というのは、大原則。
これは、MS一次情報にも書いてある。
しかし、この大原則は「中の人」がうまいことやってくれる。
さすが、Power Query。
もちろん、「フィルターが先、ソートが後」という基本原則は、処理速度を速めるには大切な思考回路だ。
実際、①>②、③>④という検証結果もある(但し、その差は僅少、大勢に影響はない)。
実は、処理速度を高めるために最も有効なのは、一番遅い①48.21>一番早い④13.10の違い、つまり「不要な列」の削除ということになる。
「列全部ではなく、対象を絞る」
これで、処理速度が格段に速くなる。
エクセル脳では、この辺りで躓く。
Power Queryはコネクトしているだけなので、元データはそのまま存在する。
だから、不要な行列は削除して分析対象となるデータだけに絞る方が、圧倒的に処理速度が速くなる。
「フィルター」すれば、データを絞り込め、その分後工程の負荷が小さくなる。だから「先」の方が有利。
「ソート」は、全部読み込んでから並べ替えるので、負荷が高くなりがち、だから「後」回しの方が良い。
これが大原則。
だが、これら「フィルター」「ソート」の順番は、そこまで気にする必要がないのかもしれない。
上記のように「中の人」がサポートしてくれている。
一応、「フィルターが先、ソートが後」の原則は、知っておいた方が良い。
繰り返す。
処理速度を高めるために最も大切なのは、分析対象となる「行列」を絞ること。
エクセル脳だと、すべての行列を残したり、ファイルをコピーしてごみと化したり………。
なんでもエクセルで、というのは、そろそろやめた方が良いと思う。
モダンExcelであれば、PowerQueryで行列の削除を実行しても、元データはそのまま残る。
とにかく、必要なデータに絞り込もう。
これで、処理速度を圧倒的に高められる。
基本が大切。
蛇足
モダンExcelは、エクセルを入り口にしているだけの別物、こうした認識が大切だ。
「モダンExcel研究所」を楽しむ際の【注意事項】
コンテンツコピー、スクレイピングなど【厳禁】 ☚【検知ツール設置済】☚悪質な場合【法的措置】を講じます
(過負荷によるサーバー障害が生じた経験上、ご協力お願いいたします!)
モダンExcel研究所
フォローお待ちしてます!