大規模なデータセットの操作¶
ビッグデータは現代世界におけるバズワードのようなものです。 statsmodel は、メモリにロードできる小規模および中程度のサイズのデータ セット (おそらく数万の観測値) で適切に機能しますが、数百万以上の観測値を使用するユースケースも存在します。ユースケースによっては、統計モデルが十分なツールとなる場合もあれば、そうでない場合もあります。
statsmodels とそれが書き込まれるソフトウェア スタックのほとんどはメモリ内で動作します。その結果、大規模なデータセットに基づいてモデルを構築することは困難になるか、非現実的になる可能性があります。そうは言っても、statsmodel を使用して大規模なデータセットにモデルを構築するには、2 つの一般的な戦略があります。
分割統治-ジョブの分散¶
システムがすべてのデータをロードできるが、実行しようとしている分析が遅い場合は、データの水平スライスにモデルを構築し、適合した個々のモデルを集約できる可能性があります。
このアプローチの現在の制限は、一般的に patsy をサポートしていないことです。そのため、statsmodelsでデザイン行列( exog )を構築するのは少し困難です。
詳細な例は こちら にあります。
|
分散モデルクラス |
|
モデルの結果を含むクラス |
データのサブセット化¶
データセット全体が大きすぎてメモリに格納できない場合は、 Apache Parquet や bcolz のようなカラム構造のコンテナに格納してみてください。statsmodelsはpatsy formula インターフェースを使って、 __getitem__ 関数(つまり data['Item']) を使って指定された列だけをプルします。
import pyarrow as pa
import pyarrow.parquet as pq
import statsmodels.formula.api as smf
class DataSet(dict):
def __init__(self, path):
self.parquet = pq.ParquetFile(path)
def __getitem__(self, key):
try:
return self.parquet.read([key]).to_pandas()[key]
except:
raise KeyError
LargeData = DataSet('LargeData.parquet')
res = smf.ols('Profit ~ Sugar + Power + Women', data=LargeData).fit()
さらに、適切なモデルが構築されるまで、このサンプル DataSet オブジェクトにコードを追加して、行のサブセットのみを返すことができます。その後、さらに多くのデータに基づいて最終モデルを再調整できます。