機械翻訳について

3.3.2 データの探索

データにアクセスできたら、データを調べ、データの品質を理解して評価します。 このステージでは、データを評価してデータ内のデータ型およびノイズを識別します。 欠損値および数値外れ値を探します。

データ品質の評価

OML4Pyを使用してPythonからデータベース・データにアクセスするには、まず、データベース表、ビューまたは問合せを表すoml.DataFrameプロキシ・オブジェクトをPythonで作成する必要があります。 SUPPLEMENTARY_DEMOGRAPHICSおよびCUSTOMERSのoml.DataFrameプロキシ・オブジェクトを作成し、キー列(CUST_IDなど)の内部結合によってマージします。 データを評価して、データ内のデータ型とノイズを特定します。 欠落値、外れ値の数値、またはラベルが矛盾するカテゴリ値を探します。

次のステップは、データの探索的分析に役立ちます。

  1. %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)
  2. 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())

    人口統計データを表示

  3. oml.DataFrameオブジェクトDEMOGRAPHICSの行数および列数を確認するには、DataFrame.shapeを使用します。
    print("Shape:",DEMOGRAPHICS.shape)
    (4500, 14)
  4. 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())

    顧客のデータを表示

  5. oml.DataFrameオブジェクトCUSTOMERSの行数および列数を確認するには、DataFrame.shapeを使用します。
    print("Shape:",CUSTOMERS.shape)
    (55500, 6)
  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 = ["",""])
    
  7. oml.DataFrameオブジェクトCUSTOMER_DATAの行と列の数を確認するには、DataFrame.shapeを使用します。
    print("Shape:",CUSTOMER_DATA.shape)
    Shape: (4500, 9)
  8. 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()

    顧客データの表示

  9. 次のスクリプトを実行して、各列のデータ型を表示します。
    print("The datatypes of the column: ","\n")
    print(CUSTOMER_DATA.dtypes)

    データ型を表示します。

  10. 欠落している値があるかどうかを確認するには、次のスクリプトを実行します。 count関数は、各列に対してNULLでない要素の数を返し、len()関数はデータセット内の行数を返します。
    print("Number of missing values in each column is : \n")
    print(len(CUSTOMER_DATA)-CUSTOMER_DATA.count())

    欠落した値を表示します。

  11. クロス集計メソッドを使用して、データベース内のoml.DataFrameオブジェクトの列間分析を実行します。 クロス集計メソッドは、2つ以上の列のクロス集計を計算します。 デフォルトでは、列と集計関数が渡されないかぎり、列の頻度表が計算されます。 この例では、クロス集計関数によって、CUST_CREDIT_LIMITの一意の値の分布がx軸に沿って、発生頻度がy軸に沿って表示されます。
    z.show(CUSTOMER_DATA.crosstab(‘CUST_CREDIT_LIMIT’))

    顧客制限のクロス・タブ。

  12. 透過層メソッドdescribeを使用して、各数値列のCUSTOMER_DATA表の中央の傾向、分散およびシェイプを要約する記述統計を計算します。

    ノート:

    すべての計算はデータベースで計算され、結果統計のみがPythonクライアント(この場合はノートブック)に返されます。 データを移動する必要がなくなり、データベースを高パフォーマンスのコンピュート・エンジンとして使用すると、スケーラビリティが大幅に向上します。
    CUSTOMER_DATA.describe()

    記述

  13. モデルを構築する前に、データがクリーンであることを確認することが重要です。 多くの場合、データには外れ値が含まれており、モデルの品質に悪影響を及ぼす個別のクラスタを形成できます。

    次のスクリプトでは、データ・フレームの四分位数範囲を計算するための関数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)

これで、データの理解およびデータの準備ステージが完了します。