機械翻訳について

3.1.2 データの探索

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

データの理解と準備

この段階では、次のステップを使用してデータセットを明確に理解することに重点を置きます:

  • Import necessary libraries: 基本的なPythonライブラリをOracle Machine Learning (OML)とともにロードします。
  • Load the dataset: 初期探索のためにデータセットをインポートします。
  • Create a DataFrame proxy object: データ操作を簡略化するために、プロキシ・オブジェクトを使用して表を表します。
  • Perform initial analysis: データセットの構造(シェイプ、データ型、欠損値、質的特徴のカーディナリティなど)を調べます。

これらのステップは、より深いデータ探索および前処理のための強固な基盤を提供します。

データの準備および理解のために、次のステップを実行します:

  1. 必要なライブラリのインポート

    %pythonインタプリタ・パラグラフで次のスクリプトを実行して、omlモジュールとPandaのモジュールをインポートし、表示オプションを設定します:
    
    import oml
    import ssl
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    import warnings
    warnings.simplefilter(action='ignore', category=FutureWarning)
  2. データセットのロード

    
    url="https://objectstorage.us-ashburn-1.oraclecloud.com/n/adwc4pm/b/OML_Data/o/brooklyn_sales.csv"
    ssl._create_default_https_context = ssl._create_unverified_context
    brooklyn_sales = pd.read_csv(url, engine='python')
    z.show(brooklyn_sales.head())

    図3-1 生のBrooklynデータ


    このスクリーンショットは、BrooklynのRAWデータセットの初期行を示しています。 データは未処理であり、ID、boroughなどの様々な属性が含まれます。

  3. 欠落値の置換(NaNをNoneに置換)

    
    df = brooklyn_sales.apply(lambda x: x.replace(np.nan, None) if x.dtypes == 'object' else x)
  4. データ型に基づく欠損値の計算

    最初に、コードによって、完全に空であるか、欠落している値のみを含む列が削除されます。 次に、残りの各列を調べ、欠落していない値のデータ型をチェックし、欠落しているデータを列のタイプに基づいて最も適切な置換で入力します。
     
    # Drop columns where all values are missing
    brooklyn_sales1 = brooklyn_sales.dropna(axis=1, how="all")
    
    d = {}
    
    # Iterate through each column and fill missing values based on its data type
    for col in brooklyn_sales1:
        x = brooklyn_sales1[col].dropna().tolist()  # Get non-null values to check the column type
        
        if len(x) > 0:  
            # For text columns, replace missing values with an empty string
            if isinstance(x[0], str):
                y = brooklyn_sales1[col].fillna("")
            # For integer columns, missing values are left unchanged
            elif isinstance(x[0], int):
                y = brooklyn_sales1[col]
            # For other numeric columns (e.g., floats), replace missing values with 0.0
            else:
                y = brooklyn_sales1[col].fillna(float(0))
            
            d[col] = y  # Store the modified column
    
    # Convert the dictionary back into a DataFrame
    brooklyn_sales2 = pd.DataFrame.from_dict(d)
    
    # Print the shape of the updated DataFrame
    print(brooklyn_sales2.shape)
    (390883, 110)
  5. データ・フレーム・プロキシ・オブジェクトの作成

    
    try:
        oml.drop(table = 'BROOKLYN')
    except:
        pass
    
    # Create a persistent table named BROOKLYN in the Oracle database
    BROOKLYN = oml.create(brooklyn_sales2, table="BROOKLYN")
  6. データ・フレームの分析

    シェイプ、データ型、欠損値を確認して解釈し、カーディナリティが低い列を検索します。
    • DataFrameのシェイプ:
      BROOKLYN.shape
      (390883, 110)
    • 列のデータ型:
      BROOKLYN.dtypes
      ID                         <class 'oml.core.integer.Integer'>
      borough                    <class 'oml.core.integer.Integer'>
      neighborhood                 <class 'oml.core.string.String'>
      building_class_category      <class 'oml.core.string.String'>
      tax_class                    <class 'oml.core.string.String'>
                                                ...                
      PFIRM15_FL                     <class 'oml.core.float.Float'>
      Version                      <class 'oml.core.string.String'>
      MAPPLUTO_F                     <class 'oml.core.float.Float'>
      SHAPE_Leng                     <class 'oml.core.float.Float'>
      SHAPE_Area                     <class 'oml.core.float.Float'>
      Length: 110, dtype: object
    • 値が欠落している列(>75%):
      
      def percent_missing(dat):
          per_miss={}
          large_miss_columns=[]
          for i in dat.columns:
              l=len(dat)
              a=100-(dat[i].count()/l)*100
              if a>=75:
                  per_miss[i]=round(a)
          return per_miss
          
      z.show(pd.DataFrame(list(percent_missing(BROOKLYN).items()), columns=["Columns", "% Missing"]))

      図3-2 列とその欠落率を表示します。


      このスクリーンショットは、値が75%以上欠落している列を示しています。

    • カーディナリティが低い列を識別します:
      
      def unique_values_less_10(data):
          cols=[]
          for x in data.columns:
              unique_values=data[x].nunique()
              if  unique_values< 10:
                  cols.append(x)
          return cols
      
      print(unique_values_less_10(BROOKLYN)) 
      ['borough', 'tax_class_at_sale', 'Borough', 'SanitBoro', 'ZoneDist4', 'Overlay1', 'Overlay2',
            'SPDist2', 'SPDist3', 'LtdHeight', 'SplitZone', 'Easements', 'OwnerType', 'AreaSource', 'Ext',
            'ProxCode', 'IrrLotCode', 'BsmtCode', 'BoroCode', 'CondoNo', 'ZMCode', 'PLUTOMapID',
            'FIRM07_FLA', 'PFIRM15_FL', 'Version', 'MAPPLUTO_F']