2018年の歩行量調査データから地点別20か所の日別、種別(歩行者、自転車、バイク)とWi-Fiパケットのdwell_timeデー(全アドレス Wi-Fi, 固定アドレスのみWi-Fi0)の一覧
wifi及びwifi0のデータは、~raspimngr/wifi_csv/kofu/summary_kofu/count及びcount0より10時から20時未満のデータを総計
として加えてみた。(が、あまりよくないので下記では入れてみてない。)
import pandas as pd
import numpy as np
import matplotlib
pedes_data = pd.read_csv("handCount-WiFi0_reg_a.csv", sep=",")
pedes_data.head()
pedes_data["bike_total"] = pedes_data["bicycle"]+pedes_data["moterbike"]
pedes_data.head()
$$ Y = a_1 x_1 + a_2 x_2 + a_3 x_3 + c$$
$Y$として、Wi-Fi(全アドレス)あるいはWi-Fi0(固定アドレスのみ) $x_1$, $x_2$として、歩行者数(pedestrian), 自転車(bicycle)とバイク(bike)を採用
# sklearn.linear_model.LinearRegression クラスを読み込み
from sklearn import linear_model
clf = linear_model.LinearRegression()
Y = pedes_data['wifi0'].as_matrix()
df_X = pedes_data[["pedestrian","bicycle","moterbike"]]
X = df_X.as_matrix()
clf.fit(X,Y)
print(pd.DataFrame({"Name":df_X.columns,
"Coefficients":clf.coef_}).sort_values(by='Coefficients'))
print(clf.intercept_)
moterbikeの相関がわるい。→ バイク進入禁止の地点もあるためだろう
自転車とバイクの総和(bike_total)を説明変数としてみる。
df_X = pedes_data[["pedestrian","bike_total"]]
X = df_X.as_matrix()
clf.fit(X,Y)
print(pd.DataFrame({"Name":df_X.columns,
"Coefficients":clf.coef_}).sort_values(by='Coefficients'))
print(clf.intercept_)
こちらの方がよさそう。
$$ ({\rm wifi0}) = 0.72 * ({\rm bike\_total}) + 1.12 * ({\rm pedestrian}) + 1729 $$
つまり、スマホを持っていない人も含め歩行者はほぼ1回のパケット、バイクはほぼ0.7回のパケットを出しているというのはうなずける。 (約半数くらい?の人がWi-Fiをオンにした固定アドレス端末を持っているとして、歩行者は2回程度パケットを出す。)
定数項は周辺の家屋や滞在者と考える。(ちょっと多すぎる?)
R由来のstatmodelsを用いてみる。
P値など統計的な諸量が表示される。
標準では定数項(切片)をゼロにしてフィッティングを行うので、切片をゼロではいようにするため、データ列に全部1の列を入れる。→ add_constant()
import statsmodels.api as sm
X1 = sm.add_constant(X) # 1列めに1.0を入れるだけ
model = sm.OLS(Y,X1)
result = model.fit()
result.summary()
切片をゼロに取ってみると、(statmodels.formula.apiを利用)
# 切片無しで計算
import statsmodels.formula.api as smf
model = smf.OLS(Y,X)
result = model.fit()
result.summary()
P値はよいが、バイク・自転車のほうが係数が大きいのは解釈が困難。
Y1 = pedes_data['wifi'].as_matrix()
# 切片付きの計算
model = smf.OLS(Y1,X1)
result = model.fit()
result.summary()
全アドレスに対しては、歩行者の寄与が大きく、バイクの寄与は小さくなる。移動スピードの違いであると一応解釈できる。 しかし、p値はめちゃくちゃ悪い
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 10))
pedes_data["mixed_by_coef0"] = pedes_data["pedestrian"]*1.119 + pedes_data["bike_total"]*0.7216 + 1728.69
pedes_data["mixed_by_coef"] = pedes_data["pedestrian"]*3.2 + pedes_data["bike_total"]*0.33 + 2243.375
g = pedes_data.plot.scatter(x="mixed_by_coef0", y="wifi0", ax=axes[0])
g.set_xlabel("通行者(歩行者とバイク+自転車を回帰係数で補正)", fontsize=14)
g.set_ylabel("固定アドレス数", fontsize=14)
for k, v in pedes_data.iterrows():
g.annotate(v["short_name"], xy=(v["mixed_by_coef0"]+50,v["wifi0"]), size=12)
g2 = pedes_data.plot.scatter(x="mixed_by_coef", y="wifi", ax=axes[1])
g2.set_xlabel("通行者(歩行者とバイク+自転車を回帰係数で補正)", fontsize=14)
g2.set_ylabel("全アドレス数", fontsize=14)
for k, v in pedes_data.iterrows():
g2.annotate(v["short_name"], xy=(v["mixed_by_coef"]+50,v["wifi"]), size=12)
歩行者、バイク・自転車ともほぼ同じ係数なので、単純合計でもほぼ同じ散布図になる。
selected_data = pedes_data[pedes_data["sensorID"].isin(["kofu3","kofu9","kofu12","kofu23"])==False]
Y = selected_data['wifi0'].as_matrix()
df_X = selected_data[["pedestrian","bike_total"]]
# df_X = selected_data[["pedestrian","bicycle","moterbike"]]
X = df_X.as_matrix()
clf.fit(X,Y)
print(pd.DataFrame({"Name":df_X.columns,
"Coefficients":clf.coef_}).sort_values(by='Coefficients'))
print(clf.intercept_)
X1 = sm.add_constant(X)
model = smf.OLS(Y,X1)
result = model.fit()
result.summary()
バイクの係数が大きいのは解釈が困難だが、フィッティングはよい。(バイク・自転車の何倍かの車が計測されていると解釈することができるか?)
pedes_data["temp"] = pedes_data["pedestrian"]*1.244 + pedes_data["bike_total"]*1.69 # selected_dataはpedes_dataの"view"と解すべき
selected_data = pedes_data[pedes_data["sensorID"].isin(["kofu3","kofu9","kofu12","kofu23"])==False]
g = selected_data.plot.scatter(x="temp", y="wifi0", figsize=(10,10))
g.set_xlabel("通行者(歩行者とバイク+自転車を回帰係数で補正)", fontsize=14)
g.set_ylabel("固定アドレス数", fontsize=14)
for k, v in selected_data.iterrows():
g.annotate(v["short_name"], xy=(v["temp"],v["wifi0"]), size=12)
歩行者のみでの回帰
selected_data = pedes_data[pedes_data["sensorID"].isin(["kofu24","kofu13","kofu9"])==False]
Y = selected_data['wifi'].as_matrix()
df_X = selected_data[["pedestrian"]]
X = df_X.as_matrix()
clf.fit(X,Y)
print(pd.DataFrame({"Name":df_X.columns,
"Coefficients":clf.coef_}).sort_values(by='Coefficients'))
print(clf.intercept_)
X1 = sm.add_constant(X)
model = smf.OLS(Y,X1)
result = model.fit()
result.summary()
data1 = pedes_data[pedes_data["sensorID"].isin(["kofu3", "kofu9", "kofu17","kofu18","kofu21","kofu22","kofu23"])]
Y = data1['wifi0'].as_matrix()
df_X = data1[["pedestrian","bike_total"]]
X = df_X.as_matrix()
clf.fit(X,Y)
print(pd.DataFrame({"Name":df_X.columns,
"Coefficients":clf.coef_}).sort_values(by='Coefficients'))
print(clf.intercept_)
X1 = sm.add_constant(X)
model = smf.OLS(Y,X1)
result = model.fit()
result.summary()
車の影響及び屋内者(来店者・居住者)の影響を、現在の説明変数で組み込むことは困難だが、通行者と全アドレスとはかなりの相関があると言える。
g = pedes_data.plot.scatter(x="wifi", y="wifi0", figsize=(10,10))
g.set_xlabel("全アドレス数", fontsize=14)
g.set_ylabel("固定アドレス数", fontsize=14)
for k, v in pedes_data.iterrows():
g.annotate(v["short_name"], xy=(v["wifi"]+50,v["wifi0"]), size=12)
pedes_data["addr_ratio"] = pedes_data["wifi0"]/pedes_data["wifi"]
a = pedes_data[pedes_data["mon-day"]=="11-30"]["addr_ratio"].reset_index()["addr_ratio"]
b = pedes_data[pedes_data["mon-day"]=="12-01"]["addr_ratio"].reset_index()["addr_ratio"]
c = pedes_data[pedes_data["mon-day"]=="12-02"]["addr_ratio"].reset_index()["addr_ratio"]
name = pedes_data[pedes_data["mon-day"]=="11-30"]["short_name"].reset_index()["short_name"]
data = pd.DataFrame({"short_name": name, "11/30": a, "12/01": b.values, "12/02": c})
g = data.plot.bar(x="short_name", figsize=(10,5))
g.set_xlabel("地点", fontsize=12)
g.set_ylabel("固定アドレス数/全アドレス数", fontsize=12)