ビッグデータからランダムまたは一定間隔にデータを抽出する

本記事はスキルチェックリストの[データエンジニアリング力 No.85]「数十万レコードのデータに対して、ランダムまたは一定間隔にデータを抽出できる」に対応しています。

データを抽出する

昨今はコンピュータやネットワークの性能向上によって、膨大な量のデータを集めて保存しておくことができるようになりました。
分析すべきデータは十分にあるのですが、逆にデータ量が多すぎて扱いにくい場合があります。
データ分析はスーパーコンピューターだけで行うものではなく、企業などでもエンジニアが家庭用と同程度の性能のパソコンを使って行うことも普通にあります。
その場合、数十万レコードもあるデータを扱うのはマシン性能的にしんどい場合も多いのです。

データが多いに越したことはないのですが、ある程度のデータ数があれば統計学的にも十分な精度で分析できます。
そのため、膨大な量のデータから一定数だけを抽出してデータ分析を行う機会は多いです。

Jupyterを使ってランダムまたは一定間隔でデータを抽出する方法を習得しましょう。

データ分析に必須なDataframe

さて、その前に1つとっておきの技を教えましょう

ロボ千代

Jupyter Notebookを使ってデータ分析を行う際に、必須ともいえる機能について知っておく必要があります。
それは、pandasというパッケージのDataframeです。

アイ

デ、データフレーム??

データ分析を「料理」と例えるなら、Dataframeはまさに「包丁」。料理の要といえる道具なのです。

データというのはたいていの場合、こんな風に2次元の表になっています。

アイ

EXCELとかも2次元表だもんね

データを扱うのに2次元表はとても便利です。この形式を保ったままプログラミングで扱うことができたらとてもわかりやすいですよね。

Dataframeはプログラミングにおいてデータを2次元の表形式として扱うことができる機能です。

アイ

うーん、なんかイメージがわかないなぁ
百聞は一見にしかず
実際にお見せしましょう

ロボ千代

データはcsv形式で扱うことが多いと思うので、Jupyter Notebookでcsvファイル(personal_info.csv)をDataframeの形式で読み込んでみましょう。

実はたった2行書くだけです。


import pandas as pd

data = pd.read_csv("personal_info.csv")

アイ

え、これだけ?

少し解説しましょう。

1行目


import pandas as pd

import ○○ :○○というパッケージを読み込んで使える状態にする
as ☓☓ :以降は☓☓という名前で使えるようにする

つまり、1行目は「pandasというパッケージを読み込んで、pdという名前で使えるようにしてね」という命令が書いてあります。

2行目


data = pd.read_csv("personal_info.csv")

pd.○○ :pd(pandas)というパッケージの中の○○というツール(プログラミング的には関数といいます)を使う
ここでは、read_csvというcsvファイルを読み込んでDataframeの形式にする関数を使っています。()の中には読み込みたいファイルの名前を指定します。

つまり、2行目は「pd(pandas)のread_csvという関数でpersonal_info.csvというファイルをDataframe形式で読み込んでdataという名前の箱に入れてね」という命令が書いてあります。

正しく読み込めているか確認してみましょう。
いま、dataという箱にデータが入っているはずです。

Jupyter Notebookでセルを変えて


data

と書いて実行してください。dataの中身が表示されます。

【実行結果】
ね、データを表形式で取り込むことができましたね

ロボ千代

データの読み込み

では、Dataframeという「包丁」を手に入れたところで、いよいよ料理に取りかかりましょう。

今回は擬似的に生成した顧客リストを使います。

データをDataframeの形式で読み込みます。きちんと読み込めているか確認するため、data.head()を使って最初の5行を出力してみます。


import pandas as pd

data = pd.read_csv("personal_info.csv")
data.head()

csvファイルの読み込み
正しく読み込めているようですね。

Dataframeのshapeという機能で読み込んだ表のサイズ(行と列の数)を確認できるので、確認してみましょう。

【実行結果】

(行の数, 列の数)
という形で表示されます。今回の場合は、行数は20000行、列数は7列のデータということが確認できました。

データをランダムに抽出する

データを取り込めたところで、いよいよデータを抽出してみましょう。
まずは、ランダムにデータを抽出する方法です。

Dataframeにはランダムにデータを抽出するためのsample()という関数が含まれています。
この関数を使って、抽出してみましょう。

問題はデータをいくつ抽出するかですが、大きく2つの方法があります。

  1. 数で指定する
  2. 割合で指定する

抽出するデータを数で指定する


data.sample(n=○)

のように○の部分に抽出したいデータの数を指定します。

例えば、10個(10行)のデータを抽出したい場合は、


data.sample(n=10)

と指定します。

【実行結果】
数を指定してランダム抽出

抽出するデータを割合で指定する

もう一つの方法は、データの数ではなく、全体の何%を抽出したいかという割合を指定する方法です。


data.sample(frac=○)

のように○の部分に抽出したいデータの割合を指定します。

例えば、全体の1%のデータを抽出したい場合は、


data.sample(frac=0.01)

と指定します。

【実行結果】
割合を指定してランダム抽出

今回のデータは全部で20000行なので、その1%は200行ですね。確かに、200行が出力されています。

データを一定間隔で抽出する

10行ごと、100行ごと、のようにデータを一定の間隔で抽出したいこともあります。
そのような場合には、Dataframeの「スライス」という機能を使います。

Dataframeは2次元の表になっていますが、その表の
n行目からm行目までをl行ごとに取り出したいときは、下のように書きます。


data[n:m:l]

例えば、2000行目から5000行目までを100行ごとに取り出したいときは、次のようになります。


data[2000:5000:100]

なお、「n行目からm行目まで」の部分は省略することも可能です。


# 最初の行から5000行目までを100行ごとに取り出す
data[:5000:100]

# 2000行目から最後の行までを100行ごとに取り出す
data[2000::100]

# 両方省略すると最初の行から最後の行まで、という意味になります
data[::100]
【実行結果】
一定間隔で抽出

さらに理解を深めたいなら

Pythonに触れた経験が少ないのであれば、まずは基礎的な文法を学んでおきましょう。

プログラミング自体が初めてという方におすすめなのは「Progate」というオンライン学習サイトです。


オンラインプログラミング学習サービス 『Progate』

PythonコースではPythonⅠからPyhtonⅤまで徐々にステップアップしていく形式で、無料コースだとPythonⅠすべてとPythonⅡ~Ⅴの序盤のレッスンを受講できます。
無料コースであれば、変数、データ型、条件分岐といったすべてのプログラミングの基礎となる考え方を学ぶことができます。
まずは無料コースで始めてみて、物足りないようなら有料コースに切り替えるのがよいかもしれません。有料コースでも月額980円と他の学習サイトに比べてお安いです。

レッスンは解説パートと演習パートに別れていて、演習パートでは実際に手を動かしてプログラムを書きながら学ぶことができます。

Progate解説パート
Progate演習パート

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です