3.1.2.1 データ準備
データ準備とは、クリーニング(欠損値、外れ値および不整合の処理)、変換(スケーリング、エンコーディングおよび新機能の作成)および生データの編成(機械学習アルゴリズムとの互換性向上)のプロセスです。
データ準備
この段階では、次のステップを使用してデータセットを明確に理解することに重点を置きます:
- 冗長列:
- データの消去: 重複レコード、冗長列および相関性の高い列を識別および削除します。
- データ・サブセットの作成: 関連する列をフィルタ/選択します。
- ビジュアライゼーション: 視覚的な表現を生成して、データのパターンと関係を理解します。
- 機能エンジニアリング: 「Decade Built」、「Sale Age」、「Street Address」などの新機能を作成します。
- DataFrameを消去: 欠落した値、外れ値および不整合を処理します。
- データ・フレーム・ディメンション: クリーニング後に正しいディメンションを確認してください。
これらのステップは、データ準備の強固な基盤となります。
冗長列: データのクリーン・アップ
冗長列を識別するには、列名と説明を比較します。 次に、列内のデータを分析して、値が同一であるか、相関性が高いかを確認します。 冗長列を特定したら、削除する列を決定する必要があります。 値が欠落している列、書式設定が一貫していない列、またはほとんどが一意の値である列は削除できます。
類似した命名規則による列の分析
ネーミング規則またはフォーマットの内容やバリエーションにより、類似する列のペアまたはグループを分析および比較します。 目的は、データの一貫性を確保し、冗長性を検出し、列が同じ情報を表しているかどうかを確認することです。
次の列が比較されます:
- borough、BoroughおよびBoroCode
- YearBuiltおよびyear_built
- ZipCodeおよびzip_code
同様に、これは、building_class、BldgClassおよびbuilding_class_at_sale;などの他の列、住所および住所にも適用できます。
-
列の比較: borough、BoroughおよびBoroCode
列名"borough"、"Borough"および"BoroCode"はよく似ており、同じ情報が含まれている可能性があります。 これを確認するには、比較のために各列から5つのランダム・サンプルを出力します。 さらに、列の説明に基づいて、3つの列すべてがBrooklyn区を表し、「BK」や「3.0」などの値があります。 データはBrooklynに固有であるため、これらの列は冗長であるため、データセットから安全に削除できます。
z.show(BROOKLYN[['borough','Borough', 'BoroCode']].sample(n=5))
-
照合データ率の識別
def matching_percentage(data, cols, threshold=0.9): # Filter rows where both columns have non-zero values filtered_df = data[(data[cols[0]] != 0) & (data[cols[1]] != 0)] # Calculate matching percentage total_rows = len(filtered_df) matching_rows = len(filtered_df[filtered_df[cols[0]] == filtered_df[cols[1]]]) matching_percentage = matching_rows / total_rows if total_rows else 0 # Output result if matching_percentage >= threshold: print(f"The columns have a high percentage ({matching_percentage * 100:.2f}%) of matching values, suggesting similarity.") else: print("The columns do not have a high percentage of matching values.")
-
列の比較: YearBuiltおよびyear_built
列名"YearBuilt"と"year_built"はよく似ており、同じ情報が含まれている可能性があります。 これを確認するには、各列から5つのランダム・サンプルを出力する必要があります。
matching_percentage(BROOKLYN, ['YearBuilt', 'year_built'])
The columns have a high percentage (99.25%) of matching values, suggesting similarity.
列"YearBuilt"、"year_built"には同様の情報が含まれているため、列を削除してください。 データセットから「year_built」を削除します。
-
列の比較: ZipCodeおよびzip_code
matching_percentage(BROOKLYN, ['ZipCode', 'zip_code'])
The columns have a high percentage (98.72%) of matching values, suggesting similarity.
列名"ZipCode"と"zip_code"はよく似ており、同じ情報が含まれている可能性があります。 これを確認するには、各列から5つのランダム・サンプルを出力する必要があります。
z.show(BROOKLYN[['ZipCode', 'zip_code']].sample(n=5))
必要な列を選択してデータをフィルタ
より信頼性の高いデータに焦点を当てるには、1800sの後に構築された家のみがデータセットに含まれます。 これは、1800sより前に構築された家は、多くの場合、単一のYearBuilt値が0(欠落または不正確な情報を示す)であり、次のステップではさらに多くのことが説明されるためです。
BROOKLYN2 = BROOKLYN[(BROOKLYN['YearBuilt']>= 1800)][['building_class_at_sale', 'HealthCent', 'YearBuilt', 'ResidFAR',
'sale_date', 'building_class_category', 'GarageArea', 'CD', 'YearAlter1', 'ID', 'SchoolDist', 'SanitDistr', 'PolicePrct','address',
'CT2010', 'commercial_units', 'BldgArea','NumFloors', 'sale_price','AssessTot', 'ResArea','land_sqft','LotFront',
'LotArea','AssessLand', 'SHAPE_Area','year_of_sale', 'gross_sqft','XCoord','YCoord', 'SHAPE_Leng']]
# Dataframe dimension
BROOKLYN2.shape
(295356, 31)
機能エンジニアリングとビジュアライゼーション
ビジュアライゼーションから収集されたインサイトに基づいて、新しい列を作成し、既存の機能を変更します。 その後、新しく設計された機能がデータセットにマージされ、その品質とモデリングの準備性が向上します。
-
構築された期間とその数:
-
住宅が建設された期間の分布を分析し、データセット内で最も一般的でない期間を特定します。 列YearBuiltは、最初に最も近い整数値に丸められます。 これらの端数処理された値は、事前定義された間隔または保管棚に分類されます。 各ビン内のYearBuiltの数をカウントして、構築された期間の頻度分布を決定します。
built_period = (BROOKLYN2['YearBuilt'] // 10) * 10 + oml.Integer(BROOKLYN2['YearBuilt'] % 10 >= 5) * 10 bins_str = built_period.cut(bins=[1700,1800,1880,1900,1920,1940,1960,1980,2000,2020,2040]) bins = sorted(bins_str.drop_duplicates().pull()) z.show(pd.DataFrame({'Built Period':bins, 'Count':[oml.Integer(bins_str == b).sum() for b in bins]}))
-
構築された期間とそのカウントのビジュアライゼーション
# Data might be incomplete when DECADE_BUILT < 1900 Nbins = 141 n, bins, patches = plt.hist(built_period.pull(), Nbins) plt.xlabel('Built_Period') plt.ylabel('number of records') plt.yscale('log') p = plt.xlim(1795, 2025)
-
-
販売価格と棚卸をビニング別にプレビュー
-
住宅の販売価格の分布を分析し、データセット内で最も一般的な販売価格を特定します。 列sale_priceは端数処理され、事前定義された間隔(ビン)に分類されます。 各ビン内のsale_priceの数をカウントして、sale_priceの頻度分布を決定します。
Sale_Price=(BROOKLYN2['sale_price'].cut(bins=[-100000000,0,20000,40000,60000,80000,100000,1000000,10000000,500000000])) # bins_str = decade_built.cut(bins=[1700,1800,1880,1900,1920,1940,1960,1980,2000,2020,2040]) bins = sorted(Sale_Price.drop_duplicates().pull()) z.show(pd.DataFrame({'Sale Price':bins, 'Count':[oml.Integer(Sale_Price == b).sum() for b in bins]}))
-
対数販売価格分布の確認
# Most properties have 10^5 < sale_price < 10^6.5=3.2M Nbins = 101 n, bins, patches = plt.hist((BROOKLYN2[BROOKLYN2['sale_price']>0]['sale_price']).log(10).pull(), Nbins) plt.xlabel('log10(sale_price)') plt.ylabel('number of records') p = plt.xlim(3.9, 7.1)
-
-
建物区分カテゴリ、件数および件数パーセントのプレビュー
クロス集計を計算して、カテゴリ列building_class_categoryを分析します。 この表を降順にソートします。 最後に、各建物区分カテゴリの頻度を決定します。
build_category= BROOKLYN2.crosstab('building_class_category').sort_values('count', ascending=False) count_percentage= ((build_category['count'] / len(BROOKLYN2)) * 100).round(decimals=2) z.show(build_category.concat({'count_percentage':count_percentage}))
-
対数売上総額分布の確認
gross qft列の値は、ログ変換時に正規分布を近似します。
# Most properties have 10^2.9=800 < sale_price < 10^3.7=5000 Nbins = 201 n, bins, patches = plt.hist((BROOKLYN2[BROOKLYN2['gross_sqft']>0]['gross_sqft']).log(10).pull(), Nbins) plt.xlabel('log10(sale_price)') plt.ylabel('number of records') p = plt.xlim(2.5, 4.2)
機能設計
機能エンジニアリングは、データの基礎となるパターンを説明する既存のデータから新しい入力機能を作成するプロセスです。 これらの新しい機能は、モデルの予測可能性を向上させるのに役立ちます。
次の機能が設計されました:
- 作成期間: 家が建てられた期間。
built_period=(BROOKLYN2['YearBuilt'] // 10) * 10 + oml.Integer(BROOKLYN2['YearBuilt'] % 10 >= 5) * 10 BROOKLYN2=BROOKLYN2.concat({'Built_Period':built_period})
- Age_At_Sale: 販売中の家の年齢は、その建設から販売日までの年数です。
Age_At_Sale2 = abs(BROOKLYN2['year_of_sale'] - BROOKLYN2['YearBuilt']) BROOKLYN2= BROOKLYN2.concat({'Age_At_Sale2': Age_At_Sale2})
- 四半期: 住宅が建設された四半期を指します。
time_period = oml.Datetime.strptime(BROOKLYN2['sale_date'], format="MM/DD/YYYY") Quarter= (oml.Integer((time_period.month - 1)// 3 + 1))
データ・フレームのクリーンアップ
機能設計後に、分析に関与しなくなった列を削除し、値が欠落している行を削除します。
BROOKLYN2=BROOKLYN2.drop(['sale_date'])
BROOKLYN2=BROOKLYN2.dropna()
データをフィルタして、販売価格、総面積、および建設の10年が特定の関連範囲内にあるプロパティを含めます。
BROOKLYN3 = BROOKLYN2[(BROOKLYN2['sale_price']>=1.0e5) & (BROOKLYN2['sale_price']<=5.0e6) &
(BROOKLYN2['gross_sqft']>=800) & (BROOKLYN2['gross_sqft']<=5000) &
(BROOKLYN2['Built_Period']>=1900) & (BROOKLYN2['Built_Period']<=2010) ]
ログ変換を適用して列を正規化します。 その後、元の未変換の列が削除されます。
BROOKLYN3 = BROOKLYN3.concat({'log_gross_sqft': BROOKLYN3['gross_sqft'].log(10)})
BROOKLYN3=BROOKLYN3.drop(['gross_sqft'])
モデルのパフォーマンスを向上させるには、データをフィルタ処理して、特定の建物クラスおよびカテゴリに属する確率が高いプロパティにフォーカスします。
BROOKLYN4 = BROOKLYN3[(BROOKLYN3['building_class_at_sale']=='A1') | (BROOKLYN3['building_class_at_sale']=='A2')
| (BROOKLYN3['building_class_at_sale']=='A4') | (BROOKLYN3['building_class_at_sale']=='A5')
| (BROOKLYN3['building_class_at_sale']=='B1') | (BROOKLYN3['building_class_at_sale']=='B2')
| (BROOKLYN3['building_class_at_sale']=='B3') ]
BROOKLYN5 = BROOKLYN4[((BROOKLYN4['building_class_category']=='02 TWO FAMILY HOMES') | (BROOKLYN4['building_class_category']=='01 ONE FAMILY HOMES'))]
データ・フレーム・ディメンション
次のスクリプトを実行して、データ・フレーム・ディメンションを確認します:
BROOKLYN5.shape
(67083, 32)
親トピック: データの探索