都道府県データの前処理

#完成コード

```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データの読み込み

```python
with codecs.open(<自動車データ>, "r", "Shift-JIS", "ignore") as file:   #http://qiita.com/niwaringo/items/d2a30e04e08da8eaa643
    df = pd.read_table(file, delimiter=",")
```

#使用しやすい形に変更

```python
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://pandas.pydata.org/pandas-docs/stable/api.html#string-handling)。*

引用元：http://sinhrks.hatenablog.com/entry/2014/12/06/233032


ということで、`str`アクセサをつけることによって文字列の一括処理が可能になる。

```python
df[(df['地方運輸局'].str.contains('^北海'))].地方運輸局.str.replace(r'^北海道', '')
# 全ての"北海道運輸局"を"運輸局"に置換
```

３桁ごとにカンマ区切りで表された文字列を数値に変換する

```python
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)=>無名関数

#線形回帰

```python
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