LoginSignup
2
1

More than 5 years have passed since last update.

都道府県データの前処理

Last updated at Posted at 2017-01-12

完成コード

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1