質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1718閲覧

pythonでdrop、論理演算子の使い方

nishibayashi

総合スコア9

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/08/07 10:42

編集2018/08/10 06:41

前提・実現したいこと

pandasのデータフレームの操作について
dropを用いる際に、論理演算子の&を使って、一つ目の条件式と二つ目の条件式を同時に満たしているデータ(外れ値)のみ削除したい。

エラーは起きないが、明らかに必要以上にデータをdropしてしまっている。

該当のソースコード

https://qiita.com/katsu1110/items/a1c3185fec39e5629bcb

上のURLの通りにプログラムしていった。

該当プログラム

Xmat = X_train
Xmat['SalePrice'] = y_train
Xmat = Xmat.drop(Xmat[(Xmat['TotalSF']>5) & (Xmat['SalePrice']<12.5)].index)
Xmat = Xmat.drop(Xmat[(Xmat['GrLivArea']>5) & (Xmat['SalePrice']<13)].index)

y_train = Xmat['SalePrice']
X_train = Xmat.drop(['SalePrice'], axis=1)

上のプログラムでデータを必要以上にdropしてしまう。

試したこと

Xmat.shapeを調べた。
drop前は(1460,31)
一回dropすると(172,32)
二回dropすると(15,32)
明らかに外れ値以外も削除している。

補足情報(FW/ツールのバージョンなど)

windows 10
anaconda,atom 最新アップデートを使用

  1. 各Featureとターゲットの関係を調べる

における、自分の実行結果を載せます。
イメージ説明

python

1import numpy as np 2import pandas as pd 3 4import matplotlib.pyplot as plt 5import seaborn as sns 6 7train = pd.read_csv(r'C:\Users\ringo\Documents\Python\House Prices\train.csv') 8test = pd.read_csv(r'C:\Users\ringo\Documents\Python\House Prices\test.csv') 9 10print(train.dtypes) 11train.shape 12test.shape 13 14from sklearn.preprocessing import LabelEncoder 15 16for i in range(train.shape[1]): 17 if train.iloc[:,i].dtypes == object: 18 lbl = LabelEncoder() 19 lbl.fit(list(train.iloc[:,i].values) + list(test.iloc[:,i].values)) 20 train.iloc[:,i] = lbl.transform(list(train.iloc[:,i].values)) 21 test.iloc[:,i] = lbl.transform(list(test.iloc[:,i].values)) 22 23import missingno as msno 24train.head(5) 25msno.matrix(df=train, figsize=(20,14), color=(0.5,0,0)) 26 27train_ID = train['Id'] 28test_ID = test['Id'] 29 30y_train = train['SalePrice'] 31X_train = train.drop(['Id','SalePrice'], axis=1) 32X_test = test.drop('Id', axis=1) 33 34Xmat = pd.concat([X_train, X_test]) 35Xmat = Xmat.drop(['LotFrontage','MasVnrArea','GarageYrBlt'], axis=1) 36Xmat = Xmat.fillna(Xmat.median()) 37 38Xmat['TotalSF'] = Xmat['TotalBsmtSF'] + Xmat['1stFlrSF'] + Xmat['2ndFlrSF'] 39 40X_train=Xmat[0:1460] 41X_test=Xmat[1460:2920] 42 43ax = sns.distplot(y_train) 44plt.show() 45 46y_train = np.log(y_train) 47ax = sns.distplot(y_train) 48plt.show() 49 50from sklearn.ensemble import RandomForestRegressor 51rf = RandomForestRegressor(n_estimators=80, max_features='auto') 52rf.fit(X_train, y_train) 53print('Training done using Random Forest') 54 55ranking = np.argsort(-rf.feature_importances_) 56f, ax = plt.subplots(figsize=(11, 9)) 57sns.barplot(x=rf.feature_importances_[ranking], y=X_train.columns.values[ranking], orient='h') 58ax.set_xlabel("feature importance") 59plt.tight_layout() 60plt.show() 61 62X_train = X_train.iloc[:,ranking[:30]] 63X_test = X_test.iloc[:,ranking[:30]] 64 65X_train["Interaction"] = X_train["TotalSF"]*X_train["OverallQual"] 66X_test["Interaction"] = X_test["TotalSF"]*X_test["OverallQual"] 67 68fig = plt.figure(figsize=(12,7)) 69for i in np.arange(30): 70 ax = fig.add_subplot(5,6,i+1) 71 sns.regplot(x=X_train.iloc[:,i], y=y_train) 72 73plt.tight_layout() 74plt.show() 75 76Xmat = X_train 77Xmat['SalePrice'] = y_train 78Xmat = Xmat.drop(Xmat[(Xmat['TotalSF']>5) & (Xmat['SalePrice']<12.5)].index) 79Xmat = Xmat.drop(Xmat[(Xmat['GrLivArea']>5) & (Xmat['SalePrice']<13)].index) 80y_train = Xmat['SalePrice'] 81X_train = Xmat.drop(['SalePrice'], axis=1)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/08/09 05:14

Atomのタグは関係ないので外して下さい。
guest

回答1

0

ベストアンサー

データ周りで何か違う状況になっているのではないでしょうか(上で違うことをした、ミスっている等)。

その記事の7) 各Featureとターゲットの関係を調べるでデータをプロットしているはずですから、記事のプロットと自分のプロットをよく見比べてください。一番上の行の左から2番目、4番目のグラフを見て外れ値と判断しているのだと思いますが。

投稿2018/08/07 20:50

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nishibayashi

2018/08/09 04:52

補足情報にも載せましたが、7) 各Featureとターゲットの関係を調べるでは、自分のプロットと記事のプロットには違いがないように見えます。図の順番が多少違いますが、それはアルゴリズムによる特徴量の重要度決定で、多少誤差があるからだと推測しています。
hayataka2049

2018/08/09 04:54

一番上の行の左から2番目、4番目のグラフで ずいぶんx軸のスケールが違うようですが、その理由に心当たりは?
nishibayashi

2018/08/09 04:58

違いがないように見えると言いましたが、明らかに違いがありますね… 原因を考えてみます。
nishibayashi

2018/08/09 05:35

4) 新しい列 (feature) を作る と 5) ターゲットが正規分布に従っているかチェックする の間で X_train=Xmat[0:1460] X_test=Xmat[1460:2920] というプログラムを自分で書いたのですが、何か影響ありますか? これがないと、X_train、X_testのデータが更新されないと思って、書いたコードですが、間違っていますか?
nishibayashi

2018/08/09 07:07

全コードを載せたので、見てほしいです。
hayataka2049

2018/08/09 07:18 編集

再編集で<code>ボタンを使って見た目を整えてください。 ```python ここにコードを入れる ``` ちょっと忙しいのですぐには見れません。数日中にはチェックしますが、質問者様ご自身で調査して原因がわかるか、他の方が回答する方が速い可能性が高いです。悪しからず。とりあえずは自分でコードの動作を追いかけて調べてみてくださいな
hayataka2049

2018/08/10 13:32 編集

理由がわかりました。そのページの作者さんがkaggleに上げているオリジナルのコードを見たら、標準得点に変換する処理を入れていました。In [14]:のところです。 https://www.kaggle.com/code1110/houseprice-data-cleaning-visualization/notebook qiitaに掲載する際、そこを省略してしまったようです。 qiitaの方の記事は抜粋のようなので、kaggleのnotebookの方を参照しながら進めた方が良いでしょう。
nishibayashi

2018/08/11 15:36

qiitaの記事が省略されていたのですね。hayataka2049さん、本当にありがとうございました。 ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問