自分のキャリアをあれこれ考えながら、Pythonで様々なデータを分析していくブログです

(その2-1) エイムズ の住宅価格のデータ俯瞰

Data Analytics
Data Analytics

前回エイムズの住宅価格データセットの分析計画を練りました。

(その1) エイムズの住宅価格のデータセットの分析計画
住宅価格のデータセットは他に有名なものだとボストンの住宅価格のデータセットがあります。旧ブログで取り上げているのでご一緒にご確認ください。今回はエイムズの住宅価格のデータセットを分析していこうと思います。データマイニングプロセスについてこん...

今回はデータ俯瞰パートに入りたいと思います。

スポンサーリンク

エイムズの住宅価格のデータセットのダウンロード

# amesのデータセットをダウンロード
my-venv/bin/kaggle competitions download -c house-prices-advanced-regression-techniques

kaggleコマンドでダウンロードします。(KaggleのDataセクションから直接zipファイルをダウンロードしてもOKです。)

kaggleコマンドのインストールのやり方はこちらの記事にまとめています。

# amesフォルダに解凍
unzip house-prices-advanced-regression-techniques.zip -d ames
Out[0]
Archive:  house-prices-advanced-regression-techniques.zip
  inflating: ames/data_description.txt  
  inflating: ames/sample_submission.csv  
  inflating: ames/test.csv           
  inflating: ames/train.csv
スポンサーリンク

データの読み込み

import pandas as pd
# エイムズの住宅価格のデータセットの訓練データとテストデータを読み込み
df = pd.read_csv("/Users/hinomaruc/Desktop/blog/dataset/ames/train.csv")
df_test = pd.read_csv("/Users/hinomaruc/Desktop/blog/dataset/ames/test.csv")

テストデータも少しだけ確認したいので読み込んでいます。

スポンサーリンク

infoメソッドで俯瞰 (訓練データ)

# レコード件数、カラム数、欠損値の存在、データ型の確認
df.info()
Out[0]

    RangeIndex: 1460 entries, 0 to 1459
    Data columns (total 81 columns):
     #   Column         Non-Null Count  Dtype  
    ---  ------         --------------  -----  
     0   Id             1460 non-null   int64  
     1   MSSubClass     1460 non-null   int64  
     2   MSZoning       1460 non-null   object 
     3   LotFrontage    1201 non-null   float64
     4   LotArea        1460 non-null   int64  
     5   Street         1460 non-null   object 
     6   Alley          91 non-null     object 
     7   LotShape       1460 non-null   object 
     8   LandContour    1460 non-null   object 
     9   Utilities      1460 non-null   object 
     10  LotConfig      1460 non-null   object 
     11  LandSlope      1460 non-null   object 
     12  Neighborhood   1460 non-null   object 
     13  Condition1     1460 non-null   object 
     14  Condition2     1460 non-null   object 
     15  BldgType       1460 non-null   object 
     16  HouseStyle     1460 non-null   object 
     17  OverallQual    1460 non-null   int64  
     18  OverallCond    1460 non-null   int64  
     19  YearBuilt      1460 non-null   int64  
     20  YearRemodAdd   1460 non-null   int64  
     21  RoofStyle      1460 non-null   object 
     22  RoofMatl       1460 non-null   object 
     23  Exterior1st    1460 non-null   object 
     24  Exterior2nd    1460 non-null   object 
     25  MasVnrType     1452 non-null   object 
     26  MasVnrArea     1452 non-null   float64
     27  ExterQual      1460 non-null   object 
     28  ExterCond      1460 non-null   object 
     29  Foundation     1460 non-null   object 
     30  BsmtQual       1423 non-null   object 
     31  BsmtCond       1423 non-null   object 
     32  BsmtExposure   1422 non-null   object 
     33  BsmtFinType1   1423 non-null   object 
     34  BsmtFinSF1     1460 non-null   int64  
     35  BsmtFinType2   1422 non-null   object 
     36  BsmtFinSF2     1460 non-null   int64  
     37  BsmtUnfSF      1460 non-null   int64  
     38  TotalBsmtSF    1460 non-null   int64  
     39  Heating        1460 non-null   object 
     40  HeatingQC      1460 non-null   object 
     41  CentralAir     1460 non-null   object 
     42  Electrical     1459 non-null   object 
     43  1stFlrSF       1460 non-null   int64  
     44  2ndFlrSF       1460 non-null   int64  
     45  LowQualFinSF   1460 non-null   int64  
     46  GrLivArea      1460 non-null   int64  
     47  BsmtFullBath   1460 non-null   int64  
     48  BsmtHalfBath   1460 non-null   int64  
     49  FullBath       1460 non-null   int64  
     50  HalfBath       1460 non-null   int64  
     51  BedroomAbvGr   1460 non-null   int64  
     52  KitchenAbvGr   1460 non-null   int64  
     53  KitchenQual    1460 non-null   object 
     54  TotRmsAbvGrd   1460 non-null   int64  
     55  Functional     1460 non-null   object 
     56  Fireplaces     1460 non-null   int64  
     57  FireplaceQu    770 non-null    object 
     58  GarageType     1379 non-null   object 
     59  GarageYrBlt    1379 non-null   float64
     60  GarageFinish   1379 non-null   object 
     61  GarageCars     1460 non-null   int64  
     62  GarageArea     1460 non-null   int64  
     63  GarageQual     1379 non-null   object 
     64  GarageCond     1379 non-null   object 
     65  PavedDrive     1460 non-null   object 
     66  WoodDeckSF     1460 non-null   int64  
     67  OpenPorchSF    1460 non-null   int64  
     68  EnclosedPorch  1460 non-null   int64  
     69  3SsnPorch      1460 non-null   int64  
     70  ScreenPorch    1460 non-null   int64  
     71  PoolArea       1460 non-null   int64  
     72  PoolQC         7 non-null      object 
     73  Fence          281 non-null    object 
     74  MiscFeature    54 non-null     object 
     75  MiscVal        1460 non-null   int64  
     76  MoSold         1460 non-null   int64  
     77  YrSold         1460 non-null   int64  
     78  SaleType       1460 non-null   object 
     79  SaleCondition  1460 non-null   object 
     80  SalePrice      1460 non-null   int64  
    dtypes: float64(3), int64(35), object(43)
    memory usage: 924.0+ KB

・MSSubClassがint型になっているようです。
・Alley、FireplaceQu、PoolQC、Fence、MiscFeatureなどはかなりNULLが多そうです。

スポンサーリンク

データ型の確認 (テストデータ)

# レコード件数、カラム数、欠損値の存在、データ型の確認
df_test.info()
Out[0]

    RangeIndex: 1459 entries, 0 to 1458
    Data columns (total 80 columns):
     #   Column         Non-Null Count  Dtype  
    ---  ------         --------------  -----  
     0   Id             1459 non-null   int64  
     1   MSSubClass     1459 non-null   int64  
     2   MSZoning       1455 non-null   object 
     3   LotFrontage    1232 non-null   float64
     4   LotArea        1459 non-null   int64  
     5   Street         1459 non-null   object 
     6   Alley          107 non-null    object 
     7   LotShape       1459 non-null   object 
     8   LandContour    1459 non-null   object 
     9   Utilities      1457 non-null   object 
     10  LotConfig      1459 non-null   object 
     11  LandSlope      1459 non-null   object 
     12  Neighborhood   1459 non-null   object 
     13  Condition1     1459 non-null   object 
     14  Condition2     1459 non-null   object 
     15  BldgType       1459 non-null   object 
     16  HouseStyle     1459 non-null   object 
     17  OverallQual    1459 non-null   int64  
     18  OverallCond    1459 non-null   int64  
     19  YearBuilt      1459 non-null   int64  
     20  YearRemodAdd   1459 non-null   int64  
     21  RoofStyle      1459 non-null   object 
     22  RoofMatl       1459 non-null   object 
     23  Exterior1st    1458 non-null   object 
     24  Exterior2nd    1458 non-null   object 
     25  MasVnrType     1443 non-null   object 
     26  MasVnrArea     1444 non-null   float64
     27  ExterQual      1459 non-null   object 
     28  ExterCond      1459 non-null   object 
     29  Foundation     1459 non-null   object 
     30  BsmtQual       1415 non-null   object 
     31  BsmtCond       1414 non-null   object 
     32  BsmtExposure   1415 non-null   object 
     33  BsmtFinType1   1417 non-null   object 
     34  BsmtFinSF1     1458 non-null   float64
     35  BsmtFinType2   1417 non-null   object 
     36  BsmtFinSF2     1458 non-null   float64
     37  BsmtUnfSF      1458 non-null   float64
     38  TotalBsmtSF    1458 non-null   float64
     39  Heating        1459 non-null   object 
     40  HeatingQC      1459 non-null   object 
     41  CentralAir     1459 non-null   object 
     42  Electrical     1459 non-null   object 
     43  1stFlrSF       1459 non-null   int64  
     44  2ndFlrSF       1459 non-null   int64  
     45  LowQualFinSF   1459 non-null   int64  
     46  GrLivArea      1459 non-null   int64  
     47  BsmtFullBath   1457 non-null   float64
     48  BsmtHalfBath   1457 non-null   float64
     49  FullBath       1459 non-null   int64  
     50  HalfBath       1459 non-null   int64  
     51  BedroomAbvGr   1459 non-null   int64  
     52  KitchenAbvGr   1459 non-null   int64  
     53  KitchenQual    1458 non-null   object 
     54  TotRmsAbvGrd   1459 non-null   int64  
     55  Functional     1457 non-null   object 
     56  Fireplaces     1459 non-null   int64  
     57  FireplaceQu    729 non-null    object 
     58  GarageType     1383 non-null   object 
     59  GarageYrBlt    1381 non-null   float64
     60  GarageFinish   1381 non-null   object 
     61  GarageCars     1458 non-null   float64
     62  GarageArea     1458 non-null   float64
     63  GarageQual     1381 non-null   object 
     64  GarageCond     1381 non-null   object 
     65  PavedDrive     1459 non-null   object 
     66  WoodDeckSF     1459 non-null   int64  
     67  OpenPorchSF    1459 non-null   int64  
     68  EnclosedPorch  1459 non-null   int64  
     69  3SsnPorch      1459 non-null   int64  
     70  ScreenPorch    1459 non-null   int64  
     71  PoolArea       1459 non-null   int64  
     72  PoolQC         3 non-null      object 
     73  Fence          290 non-null    object 
     74  MiscFeature    51 non-null     object 
     75  MiscVal        1459 non-null   int64  
     76  MoSold         1459 non-null   int64  
     77  YrSold         1459 non-null   int64  
     78  SaleType       1458 non-null   object 
     79  SaleCondition  1459 non-null   object 
    dtypes: float64(11), int64(26), object(43)
    memory usage: 912.0+ KB

訓練データと同じです。当然ながら目的変数であるSalePrice変数はテストデータには存在しません。

スポンサーリンク

データ型の変換

pandasは自動でデータ型を推定してくれますが、一部想定していないデータ型が選択される場合があります。

今回、MSSubClassはint64になっています。データの説明を見ると数値型の区分値になっているようです。

数字の大小に意味があればint64のままでもいいですが、個人的にはあまり関係なさそうに思えるのでデータを明示的に文字列に変更しようと思います。

MSSubClass: Identifies the type of dwelling involved in the sale.
20 1-STORY 1946 & NEWER ALL STYLES
30 1-STORY 1945 & OLDER
40 1-STORY W/FINISHED ATTIC ALL AGES
45 1-1/2 STORY - UNFINISHED ALL AGES
50 1-1/2 STORY FINISHED ALL AGES
60 2-STORY 1946 & NEWER
70 2-STORY 1945 & OLDER
75 2-1/2 STORY ALL AGES
80 SPLIT OR MULTI-LEVEL
85 SPLIT FOYER
90 DUPLEX - ALL STYLES AND AGES
120 1-STORY PUD (Planned Unit Development) - 1946 & NEWER
150 1-1/2 STORY PUD - ALL AGES
160 2-STORY PUD - 1946 & NEWER
180 PUD - MULTILEVEL - INCL SPLIT LEV/FOYER
190 2 FAMILY CONVERSION - ALL STYLES AND AGES

# データ型を変更する。read_csvの時にやってもOK
df = df.astype({'MSSubClass': str})
df_test = df_test.astype({'MSSubClass': str})

これでMSSubClassは文字区分として認識されます。

スポンサーリンク

各カラムの欠損割合を確認 (訓練データ)

infoメソッドで確認済みですが、欠損割合を算出してみます。

# 欠損値割合の確認
chk_null = df.isnull().sum()
chk_null_pct = chk_null / (df.index.max() + 1)
chk_null_tbl = pd.concat([chk_null[chk_null > 0], chk_null_pct[chk_null_pct > 0]], axis=1)
chk_null_tbl.sort_values(by=1,ascending=False).rename(columns={0: "欠損レコード数",1: "欠損割合(missing rows / all rows)"})
Out[0]

欠損レコード数 欠損割合(missing rows / all rows)
PoolQC 1453 0.995205
MiscFeature 1406 0.963014
Alley 1369 0.937671
Fence 1179 0.807534
FireplaceQu 690 0.472603
LotFrontage 259 0.177397
GarageType 81 0.055479
GarageYrBlt 81 0.055479
GarageFinish 81 0.055479
GarageQual 81 0.055479
GarageCond 81 0.055479
BsmtExposure 38 0.026027
BsmtFinType2 38 0.026027
BsmtFinType1 37 0.025342
BsmtCond 37 0.025342
BsmtQual 37 0.025342
MasVnrArea 8 0.005479
MasVnrType 8 0.005479
Electrical 1 0.000685

可能な限り欠損値処理をしてあげたいところです。

PoolQCは99%欠損しているので使えるかどうか。。

スポンサーリンク

各カラムの欠損割合を確認 (テストデータ)

# 欠損値割合の確認
chk_null = df_test.isnull().sum()
chk_null_pct = chk_null / (df_test.index.max() + 1)
chk_null_tbl = pd.concat([chk_null[chk_null > 0], chk_null_pct[chk_null_pct > 0]], axis=1)
chk_null_tbl.sort_values(by=1,ascending=False).rename(columns={0: "欠損レコード数",1: "欠損割合(missing rows / all rows)"})
Out[0]

欠損レコード数 欠損割合(missing rows / all rows)
PoolQC 1456 0.997944
MiscFeature 1408 0.965045
Alley 1352 0.926662
Fence 1169 0.801234
FireplaceQu 730 0.500343
LotFrontage 227 0.155586
GarageCond 78 0.053461
GarageYrBlt 78 0.053461
GarageQual 78 0.053461
GarageFinish 78 0.053461
GarageType 76 0.052090
BsmtCond 45 0.030843
BsmtExposure 44 0.030158
BsmtQual 44 0.030158
BsmtFinType1 42 0.028787
BsmtFinType2 42 0.028787
MasVnrType 16 0.010966
MasVnrArea 15 0.010281
MSZoning 4 0.002742
BsmtFullBath 2 0.001371
BsmtHalfBath 2 0.001371
Functional 2 0.001371
Utilities 2 0.001371
GarageCars 1 0.000685
GarageArea 1 0.000685
TotalBsmtSF 1 0.000685
KitchenQual 1 0.000685
BsmtUnfSF 1 0.000685
BsmtFinSF2 1 0.000685
BsmtFinSF1 1 0.000685
Exterior2nd 1 0.000685
Exterior1st 1 0.000685
SaleType 1 0.000685

訓練データと似たような感じです。

スポンサーリンク

記述統計量を確認 (数値型)

# 記述統計量を確認(カラム数が多いので縦持ちに変換)
df.describe(percentiles=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.95,0.99]).transpose()

パーセンタイルの情報は詳細を含めました。通常オプションで指定しなければ四分位までしか出力してくれません。
欠損がなくても全部0になっている変数とかあればパーセンタイルを確認すれば分かります。異常値とかも99パーセンタイルと最大値を見れば分かると思います。

Out[0]

count mean std min 10% 20% 30% 40% 50% 60% 70% 80% 90% 95% 99% max
Id 1460.0 730.500000 421.610009 1.0 146.9 292.8 438.7 584.6 730.5 876.4 1022.3 1168.2 1314.1 1387.05 1445.41 1460.0
LotFrontage 1201.0 70.049958 24.284752 21.0 44.0 53.0 60.0 63.0 69.0 74.0 79.0 85.0 96.0 107.00 141.00 313.0
LotArea 1460.0 10516.828082 9981.264932 1300.0 5000.0 7078.4 8063.7 8793.4 9478.5 10198.2 11066.5 12205.8 14381.7 17401.15 37567.64 215245.0
OverallQual 1460.0 6.099315 1.382997 1.0 5.0 5.0 5.0 6.0 6.0 6.0 7.0 7.0 8.0 8.00 10.00 10.0
OverallCond 1460.0 5.575342 1.112799 1.0 5.0 5.0 5.0 5.0 5.0 5.0 6.0 7.0 7.0 8.00 9.00 9.0
YearBuilt 1460.0 1971.267808 30.202904 1872.0 1924.9 1947.8 1958.0 1965.0 1973.0 1984.0 1997.3 2003.0 2006.0 2007.00 2009.00 2010.0
YearRemodAdd 1460.0 1984.865753 20.645407 1950.0 1950.0 1961.8 1971.0 1980.0 1994.0 1998.0 2002.0 2005.0 2006.0 2007.00 2009.00 2010.0
MasVnrArea 1452.0 103.685262 181.066207 0.0 0.0 0.0 0.0 0.0 0.0 16.0 117.0 206.0 335.0 456.00 791.92 1600.0
BsmtFinSF1 1460.0 443.639726 456.098091 0.0 0.0 0.0 0.0 218.6 383.5 525.6 655.0 806.4 1065.5 1274.00 1572.41 5644.0
BsmtFinSF2 1460.0 46.549315 161.319273 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 117.2 396.20 830.38 1474.0
BsmtUnfSF 1460.0 567.240411 441.866955 0.0 74.9 172.0 280.0 374.6 477.5 604.4 736.0 896.0 1232.0 1468.00 1797.05 2336.0
TotalBsmtSF 1460.0 1057.429452 438.705324 0.0 636.9 755.8 840.0 910.0 991.5 1088.0 1216.0 1391.2 1602.2 1753.00 2155.05 6110.0
1stFlrSF 1460.0 1162.626712 386.587738 334.0 756.9 848.0 915.7 1000.2 1087.0 1182.0 1314.0 1482.4 1680.0 1831.25 2219.46 4692.0
2ndFlrSF 1460.0 346.992466 436.528436 0.0 0.0 0.0 0.0 0.0 0.0 455.4 672.0 796.2 954.2 1141.05 1418.92 2065.0
LowQualFinSF 1460.0 5.844521 48.623081 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 360.00 572.0
GrLivArea 1460.0 1515.463699 525.480383 334.0 912.0 1066.6 1208.0 1339.0 1464.0 1578.0 1709.3 1869.0 2158.3 2466.10 3123.48 5642.0
BsmtFullBath 1460.0 0.425342 0.518911 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.00 2.00 3.0
BsmtHalfBath 1460.0 0.057534 0.238753 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.00 1.00 2.0
FullBath 1460.0 1.565068 0.550916 0.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 2.0 2.00 3.00 3.0
HalfBath 1460.0 0.382877 0.502885 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.00 1.00 2.0
BedroomAbvGr 1460.0 2.866438 0.815778 0.0 2.0 2.0 3.0 3.0 3.0 3.0 3.0 3.0 4.0 4.00 5.00 8.0
KitchenAbvGr 1460.0 1.046575 0.220338 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.00 2.00 3.0
TotRmsAbvGrd 1460.0 6.517808 1.625393 2.0 5.0 5.0 6.0 6.0 6.0 7.0 7.0 8.0 9.0 10.00 11.00 14.0
Fireplaces 1460.0 0.613014 0.644666 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 2.00 2.00 3.0
GarageYrBlt 1379.0 1978.506164 24.689725 1900.0 1945.0 1957.0 1965.0 1973.0 1980.0 1993.0 1999.0 2004.0 2006.0 2007.00 2009.00 2010.0
GarageCars 1460.0 1.767123 0.747315 0.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0 2.0 3.0 3.00 3.00 4.0
GarageArea 1460.0 472.980137 213.804841 0.0 240.0 295.6 384.0 440.0 480.0 516.0 560.0 620.2 757.1 850.10 1002.79 1418.0
WoodDeckSF 1460.0 94.244521 125.338794 0.0 0.0 0.0 0.0 0.0 0.0 100.0 144.0 192.0 262.0 335.00 505.46 857.0
OpenPorchSF 1460.0 46.660274 66.256028 0.0 0.0 0.0 0.0 0.0 25.0 40.0 57.0 83.2 130.0 175.05 285.82 547.0
EnclosedPorch 1460.0 21.954110 61.119149 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 112.0 180.15 261.05 552.0
3SsnPorch 1460.0 3.409589 29.317331 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 168.00 508.0
ScreenPorch 1460.0 15.060959 55.757415 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 160.00 268.05 480.0
PoolArea 1460.0 2.758904 40.177307 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 0.00 738.0
MiscVal 1460.0 43.489041 496.123024 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.00 700.00 15500.0
MoSold 1460.0 6.321918 2.703626 1.0 3.0 4.0 5.0 6.0 6.0 7.0 7.0 8.0 10.0 11.00 12.00 12.0
YrSold 1460.0 2007.815753 1.328095 2006.0 2006.0 2006.0 2007.0 2007.0 2008.0 2008.0 2009.0 2009.0 2010.0 2010.00 2010.00 2010.0
SalePrice 1460.0 180921.195890 79442.502883 34900.0 106475.0 124000.0 135500.0 147000.0 163000.0 179280.0 198620.0 230000.0 278000.0 326100.00 442567.01 755000.0

LowQualFinSF、BsmtHalfBath、3SsnPorch、PoolArea、MiscValなどの変数は大半が0で占められているようです。

スポンサーリンク

記述統計量を確認 (名義型)

レコード数(count )、ユニーク数(count distinct )、最頻値、最頻値の出現数を確認しようと思います。

# 名義型の変数の統計量を確認。
df.describe(include=['O']).transpose()
Out[0]

count unique top freq
MSSubClass 1460 15 20 536
MSZoning 1460 5 RL 1151
Street 1460 2 Pave 1454
Alley 91 2 Grvl 50
LotShape 1460 4 Reg 925
LandContour 1460 4 Lvl 1311
Utilities 1460 2 AllPub 1459
LotConfig 1460 5 Inside 1052
LandSlope 1460 3 Gtl 1382
Neighborhood 1460 25 NAmes 225
Condition1 1460 9 Norm 1260
Condition2 1460 8 Norm 1445
BldgType 1460 5 1Fam 1220
HouseStyle 1460 8 1Story 726
RoofStyle 1460 6 Gable 1141
RoofMatl 1460 8 CompShg 1434
Exterior1st 1460 15 VinylSd 515
Exterior2nd 1460 16 VinylSd 504
MasVnrType 1452 4 None 864
ExterQual 1460 4 TA 906
ExterCond 1460 5 TA 1282
Foundation 1460 6 PConc 647
BsmtQual 1423 4 TA 649
BsmtCond 1423 4 TA 1311
BsmtExposure 1422 4 No 953
BsmtFinType1 1423 6 Unf 430
BsmtFinType2 1422 6 Unf 1256
Heating 1460 6 GasA 1428
HeatingQC 1460 5 Ex 741
CentralAir 1460 2 Y 1365
Electrical 1459 5 SBrkr 1334
KitchenQual 1460 4 TA 735
Functional 1460 7 Typ 1360
FireplaceQu 770 5 Gd 380
GarageType 1379 6 Attchd 870
GarageFinish 1379 3 Unf 605
GarageQual 1379 5 TA 1311
GarageCond 1379 5 TA 1326
PavedDrive 1460 3 Y 1340
PoolQC 7 3 Gd 3
Fence 281 4 MnPrv 157
MiscFeature 54 4 Shed 49
SaleType 1460 9 WD 1267
SaleCondition 1460 6 Normal 1198

Utilitiesはほとんどが同じ区分(AllPub)で占められているようです。このような変数は予測モデルには使えないですね。。
freqが1400以上の変数(Street、Condition2、Heatingなど)はほとんど意味がなさそうです。

スポンサーリンク

各変数の分布をグラフで視覚的に確認

視覚化した方が分かりやすいという方はグラフで確認することをおすすめします。

数値や文字で把握するのが分かりやすい人とグラフで視覚的に把握するのが得意な人がいるかと思います。

今までの経験上、だいたい視覚化した方が分かりやすいという方が多かったかなという印象です。(8~9割くらい?)

事前に描画用の設定をする
import seaborn as sns
# 描画設定
sns.set_style("whitegrid")
from matplotlib import rcParams
rcParams['font.family'] = 'Hiragino Sans' # Macの場合
#rcParams['font.family'] = 'Meiryo' # Windowsの場合
#rcParams['font.family'] = 'VL PGothic' # Linuxの場合
rcParams['xtick.labelsize'] = 12       # x軸のラベルのフォントサイズ
rcParams['ytick.labelsize'] = 12       # y軸のラベルのフォントサイズ
rcParams['axes.labelsize'] = 18        # ラベルのフォントとサイズ
rcParams['figure.figsize'] = 18,8      # 画像サイズの変更(inch)
# 数値型変数と名義型変数それぞれに限定したデータフレームを作成
import matplotlib.pyplot as plt
numerical_df = df.select_dtypes(exclude=['object']).copy()
obj_df = df.select_dtypes(include=['object']).copy()

目的変数(SalePrice)の分布を確認

エイムズの住宅価格の分布を確認します。目的変数となる重要な変数なので単独で確認します。

色分けは2種類試しています。

SaleCondition(販売条件)はグラフとして分かりやすそうだったのと、MSSubClassは何となく傾向がでるかな?という予測の元選びました。

# 目的変数の分布を確認

# 色分け=SaleCondition
sns.histplot(data=df, x="SalePrice", hue="SaleCondition",bins=20,stat="percent",multiple="stack",palette=sns.color_palette(n_colors=6))

# 色分け=MSSubClass
sns.histplot(data=df, x="SalePrice", hue="MSSubClass",bins=20,stat="percent",multiple="stack",palette=sns.color_palette(n_colors=15))

png

png

SalePrice=Partialは低い金額にはならないのかな?とかMSSubClass=30(1-STORY 1945 & OLDER)は低い金額になるんだなとか何となく見えてきます。

分布自体も飛び抜けて大きい値はありますが、だいたい100000~200000のレンジが中央値かなとかが分かります。(describeメソッドの50パーセンタイルではSalePriceの中央値は163000ドルであることが確認できます。)

数値型変数の中身をヒストグラムで確認

# 分布確認
fig = plt.figure(figsize=(18,50))

for index in range(len(numerical_df.columns)):
    plt.subplot(10,4,index+1)
    sns.histplot(data=numerical_df.iloc[:,index].dropna(),bins=20)
fig.tight_layout(pad=1.0)

png

subplotでまとめて見れるので楽です。大量データでやるとどうなるのかは気になります。

名義型変数の中身を区分値ごとのカウントで確認

# 分布確認
fig = plt.figure(figsize=(18,50))

for index in range(len(obj_df.columns)):
    plt.subplot(11,4,index+1)
    data=obj_df.iloc[:,index]
    sns.countplot(x=data)
    plt.xticks(rotation=90)
fig.tight_layout(pad=1.0)

png

UtilitiesやHeatingなどの分布など確認して見てください。ほとんどが同じ値で占められていることが視覚的に理解出来ます。

スポンサーリンク

まとめ

ざっくりデータの中身を基礎俯瞰してみました。

次回は予測モデルを作成するにあたり、相関係数や目的変数と他の変数の関係性を深掘りしていこうと考えています。

スポンサーリンク

参照

https://www.kaggle.com/code/ashvanths/complete-eda-and-feature-engineering
https://inria.github.io/scikit-learn-mooc/python_scripts/datasets_ames_housing.html

タイトルとURLをコピーしました