コンペチュートリアル データハンドリング 前処理 可視化 機械学習

kaggle:House Price チュートリアル(EDA探索的データ解析)

投稿日:

概要説明

本記事は、機械学習を始めて基本的な操作を覚え、次に精度を上げるために何をすればよいのか?という悩みを持つ方たちのために、機械学習のコンペサイトkaggleの練習問題をベースに事例を紹介していきたいと思います。

本記事では、kaggleのPedro Marcelinoさんのスクリプトを参考にしています。
https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python

このカーネルは、機械学習のモデリングの構想を練るために重要な、データを知るというステップを解説したものです。 データサイエンスで最も難しいとまでは言わないいませんが、ある程度の経験と作業工数が必要です。 データを包括的ですが、徹底的すぎない程度にデータ探索を行います。

データ探索の流れ

  1. 問題理解:各変数の探索により、この問題の意味と重要性を理解する
  2. 単変量分析:目的変数と各変数単体の関係を探ることで、目的変数との関係の理解を深める
  3. 多変量分析:目的変数と特徴量の依存関係を理解する
  4. 前処理:データ、外れ値、カテゴリカル変数を処理する
  5. 仮説検証:機械学習や統計解析を行うにあたって必要な条件を満たしているか検証する

ライブラリインポート

データの読み込み

kaggleでは、trainデータで学習し、testデータについて予測を行い、その予測の精度がどれだけ高いかを競います。
データについては、こちらからダウンロードしてください。

IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilitiesLotConfigLandSlopeNeighborhoodCondition1Condition2BldgTypeHouseStyleOverallQualOverallCondYearBuiltYearRemodAddRoofStyleRoofMatlExterior1stExterior2ndMasVnrTypeMasVnrAreaExterQualExterCondFoundationBsmtQualBsmtCondBsmtExposureBsmtFinType1BsmtFinSF1BsmtFinType2BsmtFinSF2BsmtUnfSFTotalBsmtSFHeatingCentralAirElectrical1stFlrSF2ndFlrSFLowQualFinSFGrLivAreaBsmtFullBathBsmtHalfBathFullBathHalfBathBedroomAbvGrKitchenAbvGrKitchenQualTotRmsAbvGrdFunctionalFireplacesFireplaceQuGarageTypeGarageYrBltGarageFinishGarageCarsGarageAreaGarageQualGarageCondPavedDriveWoodDeckSFOpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice
0160RL65.08450PaveNaNRegLvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520032003GableCompShgVinylSdVinylSdBrkFace196.0GdTAPConcGdTANoGLQ706Unf0150856GasAYSBrkr85685401710102131Gd8Typ0NaNAttchd2003.0RFn2548TATAY0610000NaNNaNNaN022008WDNormal208500
1220RL80.09600PaveNaNRegLvlAllPubFR2GtlVeenkerFeedrNorm1Fam1Story6819761976GableCompShgMetalSdMetalSdNone0.0TATACBlockGdTAGdALQ978Unf02841262GasAYSBrkr1262001262012031TA6Typ1TAAttchd1976.0RFn2460TATAY29800000NaNNaNNaN052007WDNormal181500
2360RL68.011250PaveNaNIR1LvlAllPubInsideGtlCollgCrNormNorm1Fam2Story7520012002GableCompShgVinylSdVinylSdBrkFace162.0GdTAPConcGdTAMnGLQ486Unf0434920GasAYSBrkr92086601786102131Gd6Typ1TAAttchd2001.0RFn2608TATAY0420000NaNNaNNaN092008WDNormal223500
3470RL60.09550PaveNaNIR1LvlAllPubCornerGtlCrawforNormNorm1Fam2Story7519151970GableCompShgWd SdngWd ShngNone0.0TATABrkTilTAGdNoALQ216Unf0540756GasAYSBrkr96175601717101031Gd7Typ1GdDetchd1998.0Unf3642TATAY035272000NaNNaNNaN022006WDAbnorml140000
4560RL84.014260PaveNaNIR1LvlAllPubFR2GtlNoRidgeNormNorm1Fam2Story8520002000GableCompShgVinylSdVinylSdBrkFace350.0GdTAPConcGdTAAvGLQ655Unf04901145GasAYSBrkr1145105302198102141Gd9Typ1TAAttchd2000.0RFn3836TATAY192840000NaNNaNNaN0122008WDNormal250000

データ項目からの考察

データを理解するためには、それぞれの変数を見ながら、各変数の問題や関係性を理解する必要がある。この作業にはとても時間がかかるが、データ理解には欠かせない作業。

分析にある程度の規律を持たせるために、エクセル等により以下の項目で変数を整理する。
この工程で、データの全体像へのイメージがもてるはず。

  • 変数:変数名
  • データ型:データの型式。ここでは、数値型とカテゴリカルの2つに分類
  • セグメント:特徴量を「建物」「空間」「立地」の3つに分類。
  • 影響度:目的変数への期待影響度。「高」「中」「低」
  • 結論:変数の重要性の結論
  • 備考:補足コメント

上記は以下の観点で埋めていく

  • 家を購入するときこの特徴量を考慮するか?
  • もし考慮するなら、その程度は?
  • 似たような特徴量はなかったか?

この作業を通じて、データセットに対するイメージや仮説がもてたようになったはずです。
未知のデータを分析する際には有効なステップです。

この工程を通じて、SalePriceへの影響どの高そうな項目として、以下4つを考えた。

  1. GrLivArea:リビングのサイズ
  2. TotalBsmtSF:地下室総面積
  3. OverallQual:材料と仕上がりの品質
  4. YearBuilt’:建設年

この項目とSalePriceとの関係を確認する。

SalePriceの分析

ヒストグラムで分布の可視化

Skewness: 1.882876

このヒストグラムから、
ピークを示しているが、正規分布から外れ、正方向に歪みがある事がわかる。
歪度(skewness)が1.88程度ある。

数値変数との関係

SalePriceへの影響が高いと考えられる数値変数GrLivArea(リビングのサイズ)、TotalBsmtSF(地下室総面積)に対して、SalePriceとの散布図により関係を可視化する。

SalePriceとGrLivAreaは正の線形な相関がある

TotalBsmtSFは強い線形性(指数関数?)の関係がある

カテゴリカル変数との関係

SalePriceへの影響が高いと考えられるカテゴリカル変数 OverallQual(材料と仕上がりの品質)、 YearBuilt(建設年) に対して、SalePriceとのボックスプロットにより関係を可視化する。

OverallQual

OverallQual(材料と仕上がりの品質)が上がるほど価格も上昇している

YearBuilt(建設年)

強い傾向ではないが、「SalePrice」は古い建物よりも新しい建物の方が高額になる傾向がある。
注:「SalePrice」が定価であるかどうかはわからない。定価はインフレの影響で価格が変動してしまっている。「SalePrice」が定価でない場合は、単純に比較が可能となる。
ここでは、低下ではない前提で進める。

まとめ

  • GrLivAreaとTotalBsmtSFはSalePriceに対して正の相関がある。特にTotalBsmtSFはSalePriceに強い影響を与えている。
  • OverallQualとYearBuiltもSalePriceに対して影響を与えている。特にOverallQualの影響が大きい。

多変量解析

この章では、相関が強いと予想していた特徴量だけでなく、全変数に対して関係性を理解する。

進め方は以下の通り

  1. 相関行列により全体の相関性を把握
  2. SalePriceと相関の強い特徴量に絞る
  3. 散布図で関係を確認

相関行列

全データでの相関行列を作成

可視化により、明らかに相関が高い組み合わせとして、「TotalBsmtSF」-「1stFlrSF」および
「GarageCars」-「GarageCars」が見つけられる。
項目の意味からも相関の強さは明らかで、これらの項目は多重共線性の問題を引き起こすことは明らか。
ヒートマップはこの種の状況を検出するのに最適であり、特徴量選択が重要となる問題では、不可欠なツールとなる。

また、SalePriceとの相関の強い特徴量は、前章で確認した特徴量以外にも存在し、それらについても確認が必要であることがわかる。

SalePriceと相関の強い特徴量の抽出

この結果から以下の点が読み取れる

  • OverallQual、GrLivArea、TotalBsmtSFはSalePriceと強い相関がある
  • GarageCarsとGarageAreaは強い相関があり、多重共線性の点から一つに絞る必要がある
  • TotalBsmtSFと1stFloorは強い相関があり、多重共線性の点から一つに絞る必要がある
  • FullBathもSalePriceに相関がある
  • YearBuiltもSalePriceに相関がある。時系列解析を使えば、より効果的な特徴量に変える事ができるかもしれないが、ここでは行わないことにする。

ペアプロット

この図から以下の点が考察できる

  • 「TotalBsmtSF」と「GrLiveArea」のグラフでは、点が直線を描き、境界線のように機能している。これは、地下は地上のリビングと同じサイズにすることは可能だが、リビングよりも大きな地下室を作ることはできないためと考えられる。
  • SalePriceとYearBuiltのグラフを見ると、現在に近づくにつれて、指数関数的に増加しているがわかる。

欠損値

欠損値を考えるときに重要な点

  • 欠損値の全体に占める比率は?
  • 欠損値はランダムかパターンがあるか?

これらの観点は、欠損しているデータを削除するとサンプル数が減少してしまったり、補完の仕方を間違えるとデータに偏りができてしまったり、するため考慮する必要がある。

TotalPercent
PoolQC14530.995205
MiscFeature14060.963014
Alley13690.937671
Fence11790.807534
FireplaceQu6900.472603
LotFrontage2590.177397
GarageCond810.055479
GarageType810.055479
GarageYrBlt810.055479
GarageFinish810.055479
GarageQual810.055479
BsmtExposure380.026027
BsmtFinType2380.026027
BsmtFinType1370.025342
BsmtCond370.025342
BsmtQual370.025342
MasVnrArea80.005479
MasVnrType80.005479
Electrical10.000685
Utilities00.000000

欠損値補完の方針

  • 15%以上欠損している特徴量は削除する。該当する変数は、「PoolQC」、「MiscFeature」などだが、これらは外れ値の原因となっていないため削除しても大きな問題はないと考えられる。
  • GarageXX変数は削除する。理由は全体の5%程度であることと、GarageXXはGarageCarsがあれば網羅できると考えられ、GarageCarsは欠損していないため。またBsmtXXも同様の処理を行う。
  • MasVnrAreaとMasVnrTypeについては、YearBuiltとOverallQualと強く相関しているため、YearBuiltとOverallQualを特徴量に入れれば削除しても大きな影響はないと考えられる。
  • Electricalに関しては、欠損値は1つしかないため、特徴量ではなく、欠損しているデータ(レコード)を削除する

0

外れ値

外れ値はモデルに著しく影響する可能性があり、
貴重な情報源になる可能性があるため、分析する必要がある。
ここでは、「SalePrice」の標準偏差と散布図を使用して、簡単な分析を行う。

ここでの課題は、外れ値を判別する閾値を決めること。そのために、まずはデータを標準化(平均0、標準偏差1)する。

outer range (low) of the distribution: [[-1.83820775] [-1.83303414] [-1.80044422] [-1.78282123] [-1.77400974] [-1.62295562] [-1.6166617 ] [-1.58519209] [-1.58519209] [-1.57269236]]

outer range (high) of the distribution: [[3.82758058] [4.0395221 ] [4.49473628] [4.70872962] [4.728631 ] [5.06034585] [5.42191907] [5.58987866] [7.10041987] [7.22629831]]

  • Low rangeについてはいずれも0付近にある
  • High rangeについては0から離れた値が多く、最大値は7以上となっている。これは明らかに大きい

この段階では、まだ外れ値とはみなさないが注意が必要。

2変量分析

再びGrLivAreaとSalePriceの散布図を作成し、外れ値を評価する。

  • 「GrLivArea」の大きなグラフ右下の2点は、明らかにデータ群から逸脱している。これは、田舎に位置しておりそれが価格に影響しているのかもしれないが、原因がデータ殻では特定できないため、この2点は削除することにする。
  • 右上の2点もデータ群からは逸脱しているが、GrLivAreaとSalePriceの傾向に従っている用に見えるため削除はしないことにする。

同様に、TotalBsmtSFとSalePriceの散布図を作成し、外れ値を評価する。

いくつか、気になる点はあるが、ここでは外れ値として除外はしないことにする。

データ検証

ここでは、これまでのデータ補正の結果、機械学習や統計解析に必要な要件が満たされているかを検証する。以下4つの検定を検討する

  1. 正規性:正規性とは分布が正規分布にしたがっていること。統計検定は正規分布を前提にしているものが多く存在するため、正規性を確認する必要がある。ここではSalePriceに対する単変量正規性をチェックする(多変量正規ではない)
    2.同相性:同相性とは、特徴量の値の変化に対して、目的変数の分散が一定であること。重回帰分析などはこの特徴を前提にしている。
  2. 線形性:散布図などで可視化することで、確認することができる。線形出ない場合、データ変換などにより補正することが可能。今回のデータでは不要。
    2.相関誤差:相関誤差はある誤差が別の誤差と相関があるときに発生する。今回のデータでは行わない。

正規性

SalePriceの正規性を確認する。
方法は、ヒストグラムで尖度と歪度を、
Q-Qプロットで対角線上に分布が乗っているかを確認する。
Q-Qプロット

確かに、正規分布に近づいている。

GrLivAreaについても確認してみる

同様の歪みを持っているので、対数変換を行う。

同様にTotalBsmtSF

値が0のデータが多い。これは地下室がない場合0となるためである。値が0のとき、対数変換を行うことができない。
よって、TotalBsmtSF = 0とTotalBsmtSF != 0のに分類し、TotalBsmtSF != 0のデータだけに対数変換をかける。
※この方法は正攻法ではないので注意。対処法としてYeo-Johnson変換などがある。

同層性

最適な評価方法は、散布図である。 同層性が担保されていなければ、グラフの片側で小さな分散、反対側で大きな分散になっているなど、ひと目で確認できる。

「SalePrice」と「GrLivArea」から始める

対数変換の効果もあり、GrLivAreaに依存することなく分散は概ね一定のように見える。

同様に「TotalBsmtSF」と「SalePrice」

TotalBsmtSFの値に関わらず、SalePriceは一定の分散となっている。

ダミー変数化

-コンペチュートリアル, データハンドリング, 前処理, 可視化, 機械学習

執筆者:


comment

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

関連記事

no image

pythonのpandasを使ったデータ処理2

pythonのpandasを使ったデータ処理1からの続き。 データは有名なタイタニックデータを使います。 データはこちらkaggleコンペページのリンクです。 左上の「data」からデータをダウンロー …

no image

教師なし学習 クラスタリング

  辛さ 重厚 スパイシー 果実味 コク 酸味 落ち着き 香り 華や …

no image

Pandas/DataFrame/ダミー変数(get_gummies)

ダミー変数とは、カテゴリカルデータのように数値でないデータに対して、0と1の 2値型に変換し数量化すること。 具体的には、血液型、職業など pythonのpandasではget_dummiesを主に利 …

no image

学習データとテストデータの分割

学習データとテストデータの分割法の備忘録として載せておきます。 Contents1 非時系列データ2 時系列データ 非時系列データ 非時系列データの場合は、ランダムに分割すれば良い。sklearnモジ …

no image

kaggle:House Price チュートリアル(住宅価格の予測)

Contents1 概要説明1.1 作業の流れ2 ライブラリインポート3 データの読み込み4 前処理4.1 外れ値4.2 目的変数4.3 特徴量エンジニアリング4.3.1 欠損値4.3.2 データ相関 …