3.3.2 データの探索
データにアクセスできたら、データを調べ、データの品質を理解して評価します。 このステージでは、データを評価してデータ内のデータ型およびノイズを識別します。 欠損値および数値外れ値を探します。
データ品質の評価
OML4Pyを使用してPythonからデータベース・データにアクセスするには、まず、データベース表、ビューまたは問合せを表すoml.DataFrame
プロキシ・オブジェクトをPythonで作成する必要があります。 SUPPLEMENTARY_DEMOGRAPHICSおよびCUSTOMERSのoml.DataFrame
プロキシ・オブジェクトを作成し、キー列(CUST_ID
など)の内部結合によってマージします。 データを評価して、データ内のデータ型とノイズを特定します。 欠落値、外れ値の数値、またはラベルが矛盾するカテゴリ値を探します。
次のステップは、データの探索的分析に役立ちます。
%python
インタプリタ・パラグラフで次のスクリプトを実行して、oml
モジュールとPandaのモジュールをインポートし、表示オプションを設定します:import pandas as pd import matplotlib.pyplot as plt import oml pd.set_option('display.max_rows', 500) pd.set_option('display.max_columns', 500) pd.set_option('display.width', 1000) import warnings warnings.simplefilter(action='ignore', category=FutureWarning)
oml.sync
関数を使用して、データベース表SUPPLEMENTARY_DEMOGRAPHICSのプロキシとしてPythonオブジェクトDEMOGRAPHICSを作成します。oml.sync
関数は、oml.DataFrame
オブジェクトを返します。oml.sync
によって返されるoml.DataFrame
オブジェクトは、データベース・オブジェクトのプロキシです。ノート:
指定したデータベース・スキーマに一度に存在できるのは、1つの環境のみです。"schema=None"
の場合、オブジェクトは現在のユーザーのスキーマ内で検索されます。DEMOGRAPHICS = oml.sync(table = "SUPPLEMENTARY_DEMOGRAPHICS", schema = "SH") z.show(DEMOGRAPHICS.head())
oml.DataFrame
オブジェクトDEMOGRAPHICSの行数および列数を確認するには、DataFrame.shape
を使用します。print("Shape:",DEMOGRAPHICS.shape)
(4500, 14)
oml.sync
関数を使用して、データベース表SH.CUSTOMERSのプロキシとしてPythonオブジェクトCUSTOMERSを作成します。 問合せ引数では、SQL SELECT文を使用して、プロキシobject.cで使用するために含める列を選択CUSTOMERS = oml.sync(query = 'SELECT CUST_ID, CUST_GENDER, CUST_MARITAL_STATUS, CUST_YEAR_OF_BIRTH, CUST_INCOME_LEVEL, CUST_CREDIT_LIMIT FROM SH.CUSTOMERS') z.show(CUSTOMERS.head())
oml.DataFrame
オブジェクトCUSTOMERSの行数および列数を確認するには、DataFrame.shape
を使用します。print("Shape:",CUSTOMERS.shape)
(55500, 6)
- CUSTOMERS表とDEMOGRAPHICS表を共通列CUST_IDの内部結合とマージして、新しい
oml.DataFrame
CUSTOMER_DATAを作成します。 マージ関数は、1つのoml.DataFrameを別のoml.DataFrameに結合します。 パラメータは、2つのoml.DataFrameに競合する列名がある場合に使用されます。CUSTOMER_DATA = CUSTOMERS[["CUST_ID", "CUST_GENDER", "CUST_MARITAL_STATUS", "CUST_YEAR_OF_BIRTH", "CUST_INCOME_LEVEL", "CUST_CREDIT_LIMIT"]].merge(DEMOGRAPHICS[["CUST_ID", "HOUSEHOLD_SIZE","YRS_RESIDENCE", "Y_BOX_GAMES"]], how = "inner", on = 'CUST_ID',suffixes = ["",""])
oml.DataFrame
オブジェクトCUSTOMER_DATAの行と列の数を確認するには、DataFrame.shapeを使用します。print("Shape:",CUSTOMER_DATA.shape)
Shape: (4500, 9)
concat
関数では、oml.DataFrame
オブジェクトCUSTOMER_DATAの新しい列CUST_AGEを連結します。 列CUST_AGEには、生年月日が2005年の年齢に変換されるCUST_YEAR_OF_BIRTH列に基づく年齢が含まれます。 CUST_YEAR_OF_BIRTH列の情報は、CUST AGEで変更および保守されているため、CUST_YEAR_OF_BIRTH列を削除します。CUSTOMER_DATA=CUSTOMER_DATA.concat({'CUST_AGE':abs(CUSTOMER_DATA['CUST_YEAR_OF_BIRTH'] -2005)}) CUSTOMER_DATA=CUSTOMER_DATA.drop('CUST_YEAR_OF_BIRTH') CUSTOMER_DATA.head()
- 次のスクリプトを実行して、各列のデータ型を表示します。
print("The datatypes of the column: ","\n") print(CUSTOMER_DATA.dtypes)
- 欠落している値があるかどうかを確認するには、次のスクリプトを実行します。 count関数は、各列に対してNULLでない要素の数を返し、
len()
関数はデータセット内の行数を返します。print("Number of missing values in each column is : \n") print(len(CUSTOMER_DATA)-CUSTOMER_DATA.count())
- クロス集計メソッドを使用して、データベース内の
oml.DataFrame
オブジェクトの列間分析を実行します。 クロス集計メソッドは、2つ以上の列のクロス集計を計算します。 デフォルトでは、列と集計関数が渡されないかぎり、列の頻度表が計算されます。 この例では、クロス集計関数によって、CUST_CREDIT_LIMITの一意の値の分布がx軸に沿って、発生頻度がy軸に沿って表示されます。z.show(CUSTOMER_DATA.crosstab(âCUST_CREDIT_LIMITâ))
- 透過層メソッド
describe
を使用して、各数値列のCUSTOMER_DATA表の中央の傾向、分散およびシェイプを要約する記述統計を計算します。ノート:
すべての計算はデータベースで計算され、結果統計のみがPythonクライアント(この場合はノートブック)に返されます。 データを移動する必要がなくなり、データベースを高パフォーマンスのコンピュート・エンジンとして使用すると、スケーラビリティが大幅に向上します。CUSTOMER_DATA.describe()
- モデルを構築する前に、データがクリーンであることを確認することが重要です。 多くの場合、データには外れ値が含まれており、モデルの品質に悪影響を及ぼす個別のクラスタを形成できます。
次のスクリプトでは、データ・フレームの四分位数範囲を計算するための関数IQRを定義します。 2つの引数を使用: SUMMARY_DF (
スクリプトを実行して、指定した列の四分位範囲を計算します:describe
メソッドを使用して生成されたデータ・フレームのサマリー統計を含む)および機能のリスト。 IQR関数は、forループを使用して、リストの各機能の四分位数範囲をコンピュートします。def IQR(SUMMARY_DF, features): result = [0]*len(features) for i, feature in enumerate(features): result[i] = abs(SUMMARY_DF[feature]['75%'] - SUMMARY_DF[feature]['25%']) return result print(IQR(CUSTOMER_DATA.describe(),['CUST_AGE', 'CUST_CREDIT_LIMIT', 'YRS_RESIDENCE', 'Y_BOX_GAMES']))
[20.0, 6000.0, 2.0, 1.0]
ユーザー定義関数
次の関数は、分位数に基づいて特定の機能の外れ値を持つ行を削除します:remove_outlier
は、四分位数範囲を使用してデータの外れ値を検出し、削除します。 ボックス・プロットでは、外れ値は、上位および下位の四分位数の範囲の1.5倍(Q1)の外側にあるポイントです - 1.5* IQRまたはQ3 + 1.5 * IQR)。 別の形式の外れ値処理では、クリッピングまたはキャッピングが行われます。この場合、より極端な値は、1.5 IRQ値など、最大値または最小値に置き換えられます。def remove_outlier(DF, SUMMARY_DF, features): iqrs = IQR(SUMMARY_DF, features) for i, iqr in enumerate(iqrs): H = 1.5*iqr DF = DF[ ( DF[features[i]] > SUMMARY_DF[features[i]]['25%'] - H ) & ( DF[features[i]] < SUMMARY_DF[features[i]]['75%'] + H )] print(DF.shape) return DF CUSTOMER_DATA_CLEAN= remove_outlier(CUSTOMER_DATA, CUSTOMER_DATA.describe(), ['CUST_AGE', 'CUST_CREDIT_LIMIT', 'YRS_RESIDENCE', 'Y_BOX_GAMES']) print("Shape:",CUSTOMER_DATA_CLEAN.shape)
Shape: (4233, 9)
これで、データの理解およびデータの準備ステージが完了します。
親トピック: クラスタリング・ユース・ケース