完成コード
transform.py
import re
import pandas as pd
import numpy as np
import codecs
import matplotlib.pyplot as plt
from sklearn import linear_model
with codecs.open(<自動車データ>, "r", "Shift-JIS", "ignore") as file: #http://qiita.com/niwaringo/items/d2a30e04e08da8eaa643
df = pd.read_table(file, delimiter=",")
dfx = df.copy()
dfx.iloc[:,5:] = dfx.iloc[:,5:].applymap(lambda x: re.sub(',','',x)).applymap(lambda x: re.sub('-','',x)).convert_objects(convert_numeric=True)
#FutureWarning: convert_objects is deprecated. Use the data-type specific converters pd.to_datetime, pd.to_timedelta and pd.to_numeric.
with codecs.open('可住地面積.csv', "r", "Shift-JIS", "ignore") as file:
df2 = pd.read_table(file, delimiter=",")
df2.iloc[:,3:] = df2.iloc[:,3:].applymap(lambda x: re.sub(',','',x)).applymap(lambda x: re.sub('-','',x)).convert_objects(convert_numeric=True)
nan = float('nan')
static_data=pd.DataFrame({
'人口_信号':[nan],
'面積_信号':[nan],
'都道府県':[nan],
'自動車_信号':[nan],
'可住地面積_信号':[nan],
'合成関数_人口_面積':[nan],
'合成関数_自動車_面積':[nan],
'合成関数_人口_可住地面積':[nan],
'合成関数_自動車_可住地面積':[nan]
}).dropna()
for iteritem in range(1,48):
iter_shape = df2[df2['都道府県コード']==iteritem]
iter_data = dfx[
(dfx['都道府県コード']==iteritem)
& (dfx['市区町村'].str.contains('市$') | dfx['市区町村'].str.contains('計$') | dfx['市区町村'].str.contains('町$') | dfx['市区町村'].str.contains('村$'))
& (dfx['業態'].str.contains('^計$'))
]
iter_data2 = iter_data.copy()
iter_data2.loc[:,'市区町村'] = iter_data2.loc[:,'市区町村'].apply(lambda x: re.sub(r'市計$','市',x))
iter_data2.loc[:,'市区町村'] = iter_data2.loc[:,'市区町村'].apply(lambda x: re.sub(r'^.*郡','',x))
merged = pd.merge(iter_shape,iter_data2,on='市区町村')
merged = merged.assign(
合成関数_人口=np.nan,
合成関数_自動車_面積=(merged['総合計']**(2/3))*(merged['総面積']**(1/3)),
合成関数_人口_面積=(merged['人口総数']**(2/3))*(merged['総面積']**(1/3)),
合成関数_自動車_可住地面積=(merged['総合計']**(2/3))*(merged['可住地面積']**(1/3)),
合成関数_人口_可住地面積=(merged['人口総数']**(2/3))*(merged['可住地面積']**(1/3)),
面積平方根=np.sqrt(merged['総面積']),
可住地面積平方根=np.sqrt(merged['可住地面積']),
信号推計 = np.around(0.0027*merged['総合計'].astype(np.float),0)
)
people_signal = linear_model.LinearRegression(fit_intercept=False)
car_signal = linear_model.LinearRegression(fit_intercept=False)
shape_signal = linear_model.LinearRegression(fit_intercept=False)
liveshape_signal = linear_model.LinearRegression(fit_intercept=False)
people_shape = linear_model.LinearRegression(fit_intercept=False)
car_shape = linear_model.LinearRegression(fit_intercept=False)
people_liveshape = linear_model.LinearRegression(fit_intercept=False)
car_liveshape = linear_model.LinearRegression(fit_intercept=False)
people = np.array(merged['総面積']).reshape(-1,1)
car = np.array(merged['総合計']).reshape(-1,1)
shape = np.array(merged['面積平方根']).reshape(-1,1)
liveshape = np.array(merged['可住地面積平方根']).reshape(-1,1)
peopleShape = np.array(merged['合成関数_人口_面積']).reshape(-1,1)
carShape = np.array(merged['合成関数_自動車_面積']).reshape(-1,1)
peopleLiveShape = np.array(merged['合成関数_人口_可住地面積']).reshape(-1,1)
carLiveShape = np.array(merged['合成関数_自動車_可住地面積']).reshape(-1,1)
y_data=np.array(merged['信号推計']).reshape(-1,1)
people_signal.fit(people,y_data)
car_signal.fit(car,y_data)
shape_signal.fit(shape,y_data)
liveshape_signal.fit(liveshape,y_data)
people_shape.fit(peopleShape,y_data)
car_shape.fit(carShape,y_data)
people_liveshape.fit(peopleLiveShape,y_data)
car_liveshape.fit(carLiveShape,y_data)
df_result=pd.DataFrame({
'人口_信号':[people_signal.score(people,y_data)],
'面積_信号':[shape_signal.score(shape,y_data)],
'都道府県':[merged['都道府県'][0]],
'自動車_信号':[car_signal.score(car,y_data)],
'可住地面積_信号':[liveshape_signal.score(liveshape,y_data)],
'合成関数_人口_面積':[people_shape.score(peopleShape,y_data)],
'合成関数_自動車_面積':[car_shape.score(carShape,y_data)],
'合成関数_人口_可住地面積':[people_liveshape.score(peopleLiveShape,y_data)],
'合成関数_自動車_可住地面積':[car_liveshape.score(carLiveShape,y_data)]
})
static_data = static_data.append(df_result)
static_data.to_csv('static_data.csv',encoding='shift_jis')
csvデータの読み込み
with codecs.open(<自動車データ>, "r", "Shift-JIS", "ignore") as file: #http://qiita.com/niwaringo/items/d2a30e04e08da8eaa643
df = pd.read_table(file, delimiter=",")
使用しやすい形に変更
hokkaido_data = df[(df['地方運輸局'].str.contains('北海'))
& (df['市区町村'].str.contains('市$') | df['市区町村'].str.contains('計$') | df['市区町村'].str.contains('町$') | df['市区町村'].str.contains('村$'))
& (df['業態'].str.contains('計')) ]
# 地方運輸局が 北海 を含む && (市区町村名が市で終わる | 市区町村名が郡を含む => 市区町村名が町、村で終わる | 町、村で終わる) && 業態が計
# 行末マッチ
結合用のテーブルの名前を揃える(検索、置換)
pandas では内部のデータ型が文字列 ( str もしくは unicode ) 型のとき、 str アクセサを使って データの各要素に対して文字列メソッドを適用することができる。str アクセサから使えるメソッドの一覧はこちら。
引用元:http://sinhrks.hatenablog.com/entry/2014/12/06/233032
ということで、str
アクセサをつけることによって文字列の一括処理が可能になる。
df[(df['地方運輸局'].str.contains('^北海'))].地方運輸局.str.replace(r'^北海道', '')
# 全ての"北海道運輸局"を"運輸局"に置換
3桁ごとにカンマ区切りで表された文字列を数値に変換する
dfx.iloc[:,4:] = # iloc()で抽出したものはスライスではないので直接値を変更可能
dfx.iloc[:,4:].applymap(lambda x: re.sub(',','',x))
.applymap(lambda x: re.sub('-','',x))
.convert_objects(convert_numeric=True)
・applymap
ではコピーが作成されてしまうため代入する。
・applymap
は全ての要素に引数の関数を適用する。
・re.sub(pattern, str, argument)
=> argument
の第一引数を第二引数で置換する
・lambda(x: x**2)=>無名関数
線形回帰
from sklearn import linear_model
lm = linear_model.LinearRegression(fit_intercept=False) # 切片を0にするオプション
x_data=merged['可住地面積']
y_data=merged['人口総数']
#sklearnはnumpyしか扱えないのでnumpy型に直す。また、行ではなく列の形にしなくてはならないのでreshapeする
x_data = np.array(x_data).reshape(-1,1)
y_data = np.array(y_data).reshape(-1,1)
lm.fit(x_data,y_data)
print(lm.coef_) # 偏回帰係数
print(lm.intercept_) #=> 0.0 当たり前、切片を0にするから
print(lm.score(x_data,y_data)) # 決定係数
参考
http://qiita.com/irs/items/4ebbfd8bef63db1892fb
http://qiita.com/__Attsun__/items/5af3efdc241aa2fd3959
http://sinhrks.hatenablog.com/entry/2015/01/28/073327
無名関数lambdaについて
http://www.lifewithpython.com/2013/01/python-anonymous-function-lambda.html