読み込むCSVファイルを指定してください(http://www15.plala.or.jp/vffuda/suumo_zscraper.html で作成してください)
scikit-learnを使用するには、Anacondaの開発環境パッケージを用いるのが簡単です。scikit-learnが含まれています。なお、Numpy、Scipy、Pandas等もインストールしてください。Anacondaの場合、conda install numpyでインストールできます。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from pandas.plotting import scatter_matrix
import math
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.optimizers import Adam
#時間計測
import time
# Read csv file 読み込むCSVファイルを指定してください
# suumo = pd.read_csv("suumo_higashiyama.csv", sep = "\t", encoding = 'utf-16')
# names = [] # マンション名
# addresses = [] # 住所
# locations0 = [] # 立地1つ目(最寄駅/徒歩~分)
# route0 = [] # 路線一つ目
# station0 = [] # 最寄り駅一つ目
# walk0 = [] # 駅徒歩1つ目(駅徒歩~分)
# locations1 = [] # 立地2つ目(最寄駅/徒歩~分)
# locations2 = [] # 立地3つ目(最寄駅/徒歩~分)
# ages = [] # 築年数(年)
# heights = [] # 建物高さ(階)
# floors = [] # 部屋のある階 メゾネットタイプは一律0、地下はマイナス
# rent = [] # 賃料(万円)
# admin = [] # 管理費(円)
# others = [] # 敷/礼/保証/敷引,償却
# laouts = [] # 間取り
# areas = [] # 専有面積(m2)
# detail_urls = [] # 詳細URL
# suumo.tail()
# 使うものだけを読み込む
COLUMNS = ('徒歩(分)', '築年数', '建物高(階)', '階層', '賃料(万円)', '管理費(円)', '間取り', '専有面積(m2)')
#suumo = pd.read_csv("suumo_minato.csv", sep = "\t", encoding = 'utf-16', usecols = COLUMNS)
#suumo = pd.read_csv("suumo_higashiyama.csv", sep = "\t", encoding = 'utf-16', usecols = COLUMNS)
#suumo = pd.read_csv("suumo_kyoto_minami.csv", sep = "\t", encoding = 'utf-16', usecols = COLUMNS)
#suumo = pd.read_csv("suumo_yamashina.csv", sep = "\t", encoding = 'utf-16', usecols = COLUMNS)
#suumo = pd.read_csv("suumo_hakata.csv", sep = "\t", encoding = 'utf-16', usecols = COLUMNS)
suumo = pd.read_csv("suumo_naha.csv", sep = "\t", encoding = 'utf-16', usecols = COLUMNS)
# カラム名変更
suumo = suumo.rename(columns =
{'徒歩(分)': 'walk',
'築年数': 'age',
'建物高(階)': 'height',
'階層': 'floor',
'賃料(万円)': 'rent',
'管理費(円)': 'admin',
'間取り': 'layout',
'専有面積(m2)': 'area'})
suumo.tail()
suumo.dtypes
#suumo["floor"] = suumo["floor"].astype(object) # 階数をint型からobject型へ
#suumo.dtypes
suumo.rent = suumo.rent + suumo.admin/10000 # 管理費も賃料に含める
suumo.drop("admin", axis=1, inplace=True) # 管理費を分析対象から外す
suumo.tail()
# class distribution
print(suumo.groupby('layout').size())
# 必要なデータだけ抽出
#suumo_df.query('layout in ["1DK", "1K", "1LDK", "1SDK", "1LK", "1SK", "1SLDK", "1room"]', inplace = True)
suumo_df = suumo.query("layout.str.contains('1')", inplace = True)
suumo_df = suumo.dropna() # NaNを取り除く
suumo.query("area <= 100", inplace = True) # 専有面積が100m2以上を除外
#suumo_df[suumo_df["area"] <= 100] # 専有面積が100m2以上を除外 うまくいかない
suumo.query("rent <= 40", inplace = True) # 賃料が40万円以上を除外
print(suumo_df.groupby('layout').size())
sns.lmplot(suumo.columns[6], suumo.columns[4], suumo, col="layout", line_kws={'color':'red'}) # なぜかカラム指定でないとうまくいかない area x rent
plt.show()
sns.lmplot(suumo.columns[0], suumo.columns[4], suumo, col="layout", line_kws={'color':'red'}) # なぜかカラム指定でないとうまくいかない walk x rent
plt.show()
# 駅からの距離でそれほど賃料に差がない?
sns.lmplot(suumo.columns[1], suumo.columns[4], suumo, col="layout", line_kws={'color':'red'}) # なぜかカラム指定でないとうまくいかない age x rent
plt.show()
# 築年数でそれほど賃料に差がない?
sns.lmplot(suumo.columns[2], suumo.columns[4], suumo, col="layout", line_kws={'color':'red'}) # なぜかカラム指定でないとうまくいかない height x rent
plt.show()
# マンションの高さでそれほど賃料に差がない?
sns.lmplot(suumo.columns[3], suumo.columns[4], suumo, col="layout", line_kws={'color':'red'}) # なぜかカラム指定でないとうまくいかない floor x rent
plt.show()
# 階層でそれほど賃料に差がない?
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
sns.scatterplot(suumo.area, suumo.rent, hue = suumo.layout) # 間取りごとに専有面積x賃料の散布図を作成
plt.subplot(1, 2, 2)
sns.scatterplot(suumo.walk, suumo.rent, hue = suumo.layout) # 間取りごとに徒歩x賃料の散布図を作成
plt.show()
#cmap = sns.cubehelix_palette(dark=.3, light=.8, as_cmap=True)
#cmap = sns.cubehelix_palette(reverse=True)
cmap = "jet" # hsv, winter, spring, summer, Pastel1, Blues, Set1, Set2, Set3, Paired, Set1, tab10, tab20, brg, jet
plt.figure(figsize=(10, 6))
plt.subplot(1, 2, 1)
sns.scatterplot(suumo.area, suumo.rent, hue = suumo.floor, size=suumo.floor, palette=cmap) # 階数ごとに専有面積x賃料の散布図を作成
plt.subplot(1, 2, 2)
sns.scatterplot(suumo.walk, suumo.rent, hue = suumo.floor, size=suumo.floor, palette=cmap) # 階数ごとに専有面積x賃料の散布図を作成
plt.show()
# box plot 箱ひげ図(最小値、第1四分位点、中央値、第3四分位点、最大値が表される。丸は外れ値。)
color = dict(boxes='DarkOrange', whiskers='DarkBlue', medians='DarkRed', caps='Gray')
suumo_df.plot(kind='box',subplots=True,layout=(3,2),sharex=False,sharey=False,color=color,sym='ro',figsize = (9,9)) # 軸をそれぞれ描く(共有しない)
plt.show()
# histograms
suumo_df.hist(bins = 20, figsize = (9,9)) # bins defalut 10 縦軸:物件数
plt.show()
sns.pairplot(suumo_df, kind="reg", hue='layout') # kind="reg" 線形回帰
pd.options.display.float_format = '{:.2f}'.format
suumo_df.describe(include='all') # suumoの統計情報表
#suumo.describe().apply("{:.2f}".format) # suumoの統計情報表
# データ間の相関係数を求める
corr_mat = suumo_df.corr(method = "pearson")
# ヒートマップで可視化
sns.heatmap(corr_mat, vmax=1, vmin=-1, center=0, annot=True, fmt=".1f")
plt.show()
sns.set() # seaborn style change
sns.pairplot(suumo_df, kind="reg", markers='.', plot_kws={'line_kws':{'color':'red'}}) # kind="reg"線形回帰線
plt.show()
# area(専有面積)と賃料のヒストグラムと散布図を表示
sns.pairplot(suumo_df[["area", "rent"]], kind="reg", markers='.', plot_kws={'line_kws':{'color':'red'}})
plt.show()
X = suumo_df.drop("rent", 1) # DataFrameから rent を取り除く
#X = X.drop("floor", 1) # DataFrameから floor を取り除く
X = X.drop("layout", 1) # DataFrameから layout を取り除く
y = suumo_df.rent
X.tail()
y.tail()
# 重回帰分析
linear_regression = LinearRegression()
# 学習
linear_regression.fit(X, y) # model.fit or clf.fit clf(classifier)
print(linear_regression.coef_)
coefficient = pd.DataFrame(linear_regression.coef_)
coefficient['coefficient'] = pd.DataFrame(linear_regression.coef_)
# データ分割(訓練、テスト)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
#学習
clf = LinearRegression() # 線形回帰モデルの呼び出し clf = classifier
clf.fit(X_train, y_train) # モデルの訓練
print(clf.coef_) # 回帰変数の表示
print(clf.intercept_) # 回帰直線の切片
print(clf.get_params()) # パラメータの取得
# scatter plot matrix
scatter_matrix(suumo, hist_kwds={'bins': 20}, color='g', figsize = (9,9))
plt.show()
forecast = clf.predict(X_test)
print(forecast) # 予測値の表示
print(y_test)
# 予測精度の算出
print("train: ", clf.score(X_train, y_train)) # 決定係数の表示
print("test: ", clf.score(X_test, y_test)) # 決定係数の表示
ERROR = (forecast - y_test) / y_test
print(np.mean(np.abs(ERROR))*100)
print(np.max(np.abs(ERROR))*100)
plt.hist(ERROR, bins=20, range=None, weights=None,
cumulative=False, bottom=None, histtype='bar',
align='mid', orientation='vertical', rwidth=None,
log=False, color=None, label=None, stacked=False)
#sns.set_style("darkgrid") # 背景暗、グリッドあり。デフォルト。
#sns.set_style("whitegrid")
#sns.set_style("dark")
#sns.set_style("white")
#sns.set_style("ticks")
sns.set_style("darkgrid", {"axes.facecolor": "lightgray"})
#sns.set_context("poster")
#sns.set_context("talk")
#sns.set_context("paper")
#sns.set_context("notebook")
#sns.catplot(data=suumo_df, kind='box')
sns.catplot(data=suumo_df, kind='violin')
plt.show()