住宅データを使用してデータ分析をしよう!!
csv データを取り込む
csvファイルの読み込みは上記を参考に取り込んだ。
"""
pandas を使用するので pandas をインポート
csv ファイルを読み込む。またcsvファイルは事前にDLしておく
read_csv() の引数にcsvファイル名を指定する
"""
import pandas as pd
X = pd.read_csv('train.csv')
X
データの事を知ろう
KaggleのOverviewページや、Dataページの「Data fields」などを読みながらデータの調査を行う。
今回使用するデータは下記を参考にしている。
https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data
データの型を確認する方法
.dtypes というメソッド?を使用すると全ラベル(カラム)のデータ型が確認できる。
"""
各特徴量がどういったものかを見る。(数値データか文字データなど)
.dtypesというメソッドを使用すると各列のデータ型が確認できる!
"""
X.dtypes
特徴量の平均や最大値、最小値の一覧を出す!
これは前もやったな^ - ^;
X.describe()
欠損値の対応
欠損値というものが存在している。詳細は今は未調査。
以前はisnull()というメソッドで対応したが今回は、
- 1.何パーセント含まれるか?
- 2.5個以上欠損がある特徴量があったら削除
- 3.欠損値があるサンプルは削除する
などをしてみる。
さらに今回はmissingno というライブラリを使用して対応する!!^^
import missingno as msno
msno.matrix(X)
とりあえずこれで欠損値の有無状態が確認出来る。
それと一応こんな情報も出来る。
# それぞれどれ位欠損しているかを確認する
X.isnull().sum()
pandasの欠損値について下記のリンクが参考になった。
https://note.nkmk.me/python-pandas-nan-dropna-fillna/
https://qiita.com/taka000826/items/e859622583dc2ab78fea#3-%E6%AC%A0%E6%90%8D%E5%80%A4%E3%81%A8%E3%81%84%E3%81%86%E5%80%A4%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%81%86
1.何パーセント含まれるか?
関数を使うと直ぐに求められた!!
ここの情報は綺麗にまとめられていて勉強になりました〜。
2.5個以上欠損がある特徴量があったら削除
https://deepage.net/features/pandas-manipulate-na.html
5個以上というのはひとまず無視して、欠損値のある列を削除する
X.dropna(axis=1) #nullが含まれる行を削除する
5個以上のカラムを確認して?やれば力技でできる??(ってか列の話か?)
# 正常値をthreshオプションに代入する。今回は5つの欠損値があったら削除するので全体から欠損値分の5を引いてthreshに代入しています。
n_thresh = df.shape[0] - 5 # 欠損値分引いてる
n_thresh
X_col = X.dropna(thresh=n_thresh, axis=1)
3.欠損値があるサンプルは削除する
同じdropnaを使用して、axisを使用すると、行、列を選択できる!!
"""
欠損値があるサンプル(行)は削除する。
dropna()メソッドを使うと出来る!!
axis=0,how='any'を指定すると欠損値を含む全ての列を削除する!
"""
X_col.dropna(axis=0,how='any')
尖度と歪度について調査してみた!!!
尖度(せんど)
尖度(せんど、英: kurtosis)は、確率変数の確率密度関数や頻度分布の鋭さを表す数字である。
正規分布と比べて、尖度が大きければ鋭いピークと長く太い裾を持った分布を持ち、
尖度が小さければより丸みがかったピークと短く細い尾を持った分布であるという事が判断できる。
歪度(わいど)
「歪度」とは、分布の歪み度合いを示すものです。
正規分布のように左右対称であるのか、それとも片方の裾だけだ伸びたような歪んだ分布なのか、その度合いを示します。
これを歪度(または歪度係数)といって、歪度が0 よりも大きければ右の裾が長い分布、
歪度が0 よりも小さければ左の裾が長い分布となります。
分布の確認、
seaborn を使って目的変数の分布を表示させて尖度と歪度を表示させてみる!
"""
seabornのsns.distplot()を使い目的変数の分布を表示し、「尖度」と「歪度」も算出する。
http://pynote.hatenablog.com/entry/seaborn-histogram
調査して簡単なやり方が見つかったのでとりあえずサンプルを見つけた
seaborn をインポートして .distplot() 関数を使うイメージ
sns.distplot(X)ってやったらエラー。
カラム名を入れる必要があった。dfを突っ込んだからどのカラムか分からないでコケたと推察。
"""
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns, numpy as np
sns.distplot(X.SalePrice)
目的変数に対して対数変換を行う!
そもそも対数変換ってなに??というのを調査したが分からなかった。。
とりあえずなんか変換するって所で今は理解しておく。^^;
"""
目的変数に対して対数変換を行う。
そもそも対数変換ってなに??w対数変換するもよく分からなかったけど、やり方は分かった。
https://qiita.com/ynakayama/items/2c3782c82317f21596ba
"""
import pylab as pl
# pl.hist(X.SalePrice)
Xh = X.SalePrice.apply(np.log)
Xh
対数変換した値を、再度分布図にして尖度と歪度を表示させる。
"""
対数変換したものに対して分布を表示し、「尖度」と「歪度」も算出する。
上記の Xh を元に分布を作成する。
また、「尖度」と「歪度」も算出する。これはさっきのsns.distplot(X.SalePrice)で出せそう。
あれ?Xhの「尖度」と「歪度」を出せば終わりじゃない??
"""
sns.distplot(Xh)
対数変換をしたら正規分布の形に近づいた。