前処理に必要な知識
データ分析業務の大半を占める処理、それが前処理です。前処理とは、データ分析を行う前の準備であり、後続のデータ分析の品質を大きく左右します。データ分析者になるためには、機械学習の手法やデータの可視化方法だけでなく、前処理の技術を身につける必要があります。
前処理の技術を身につけるのは大変です。なぜなら、現場の絶え間ない工夫によって生まれてきた知識が多く、学問として体系だったものは存在しないので全体像がつかみにくいからです。さらに、次のような多岐に渡る知識が求められます。
- プログラミングの知識
- 分析基盤の知識
- 統計学や機械学習の知識
たとえば、1つ目のプログラミングの知識についてですが、前処理ではSQL、R、Pythonの3つのプログラミング言語がよく利用されます。前処理においては、どれか1つのプログラミングだけに習熟していれば十分ということはありません。3つの言語を習得できれば一番良いですが、どういった処理が得意なのか、どのようなパッケージやライブラリがあるかを把握できていることが望まれます。
本稿では、具体的に抽出処理の1つであるランダムサンプリングを簡略化して解説します。
ランダムサンプリング
抽出処理は単純な作業に思えますが、適切な抽出作業によって無駄な処理を減らせたり、扱うデータサイズを小さくしたりできます。主に次の抽出処理があります。
- ❶ データ列を指定して抽出
- ❷ 条件指定によるデータ行の抽出
- ❸ ランダム抽出(サンプリング)
- ❹ 集約IDに基づくランダム抽出(公平なサンプリング)
❸には、恣意的なサンプリングとランダムサンプリングがあります。ここで解説するランダムサンプリングとは、乱数によって対象のデータを抽出する手法です。サンプリングを実現するコードを書くことは簡単です。しかし記述方法によっては、計算コストが跳ね上がってしまいます。
たとえば、ホテルの予約レコードテーブルから、ランダムサンプリングによって約50%の行を抽出するコードを考えてみましょう。
まずはSQLで書かれたコードを見てみます。コード1ではすべてのデータを並び替えているため、データ数が増えると、大きく計算コストが増加し、最悪の場合計算に必要なメモリ量が足りずに実行できなくなります(SQLにおける大きなデータの並び替えは有名なアンチパターンです)。それに対してコード2ではデータ行ごとに乱数を生成して、乱数値に条件式を適用し、サンプリングを実現しています。並び替え(ORDER BY)を利用していないので、計算コストが低く、データ量が増えても分散処理で対応できます。よってSQLではコード2のように書くことが望ましい
です。
コード1 SQL(良くないコード)
SELECT *
FROM work.reserve_tb
-- データ行ごとに乱数を生成し、乱数の小さい順にデータを並び替え
ORDER BY RANDOM()
LIMIT (120000 * 0.5)
コード2 SQL(良いコード)
SELECT *
FROM work.reserve_tb
WHERE RANDOM() <= 0.5
続いて、Rで書かれたコード3とPythonで書かれたコード4を見てみます。SQLとは違い、RとPythonはサンプリング元のデータをメモリ上に持っていることを前提とするため、並び替えによる計算コストやメモリ使用量はあまり気にする必要がありません。
コード3 R(良いコード)
# reserve_tbから50%サンプリング
sample_frac(reserve_tb, 0.5)
コード4 Python(良いコード)
# reserve_tbから50%サンプリング
reserve_tb.sample(frac=0.5)
簡単な例でしたが、いかがでしょうか。こういった知識は駆け出しのデータサイエンティストやデータ分析業務を学びたいシステムエンジニアが早いうちに習得するべきです。
前処理の知識をまとめた書籍『前処理大全 データ分析のためのSQL/R/Python実践テクニック』が発売となります。本書では、利用している関数などをより丁寧に解説し、サンプルコードも公開しています。本書を活用して、皆様がよりAwesomeなデータサイエンティストとなり、活躍されることを願っています。