桐間紗路研究所日報

技術以外の話→ https://kirimasyaro.hateblo.jp

小売業の従業者数と売上の関係~東京都を事例として~ その1

 経営学かなって感じのタイトルをつけましたが実は地理の話です

 東京都のホームページに、町丁目(新宿三丁目、のような)の単位で、小売業の従業者数と売上を集計しているファイルを配っているところがあって、それをこの一年間くらい処理して遊んでいるのですが、遊んでいるだけでは非生産的なので、少しでも学術的に分析してみようと思い、今回の企画に至りました。

従業者数と売上の相関

f:id:copuy:20190726042215p:plain
図1

 こちらのグラフをご覧ください、各点が東京都の各町丁目で、横軸が売上、縦軸が従業者数となっています といっても単位はめちゃくちゃです。

 数学的な話をすると、数値を対数関数log10(x)に代入し、そこから偏差値を求めたのがこれですが、偏差値といっても50が平均に対応する一般的なあれではなく、標準偏差です。つまりσの何倍かというのを示しています。

 対数関数に代入した時点でちょっと恣意的に数値を加工してる感が否めないんですが、とりあえず綺麗に正の相関をしているグラフができたのでちょっと満足してます。おともだちのみなさんもきれいな相関だねって褒めてくれました。うれしい。

 きれいに相関するということは、やはり従業者数が多ければそれだけ売上も上がるということなんでしょうか。少ない人数で多く売り上げようなんていう都合のいい話はないんでしょうか。でもそれはこの恣意的加工しまくりのデータではよくわかんないです。じゃあ本当のところどうなのかという話はすぐには結論は出ません。とりあえずこれを放置して分析を続けます。

クラスタリング

 ここで、何を思ったのか、私はこの二次元のデータをクラスタリングしてみようと思いました、クラスタ数は3です。こんなことをしても意味がないと思います。良い子は絶対真似しないで。

 

f:id:copuy:20190726043025p:plain
図2

 クラスタリングしました。K-means法です。K-means法のこと実はよく知りません。重心を取っているんでしたっけ。上・中・下に三分割されてるだけでなんもおもしろくないですね。でも、上中下のうち中の部分がちょっと範囲狭めなのが面白いですね。

地図で可視化

 ここで、種明かしをするが如く、地図を出します。このクラスタリングの色に対応して、東京23区の地図を色分けします。

f:id:copuy:20190726043253p:plain
図3

 黄色、紫、緑、の順に、売上と従業者が多い地域、普通の地域、少ない地域、ということになる、はずです。東京駅や新宿駅の周辺が黄色なのは実感と離れていなくてわかりやすいです。しかし、高島平周辺が東京と同じクラスタなのがよくわからないです。高島平団地には大きなショッピングセンターでもあるのでしょうか。もし無いならこの分析は破綻している可能性があります。

雑なまとめ

 k-means法、matplotlibでの散布図の作成など、やりたいことがやれて、しかもなんかきれいな散布図と相関が作れたので面白かったです。でもこれやっぱり分析の方法間違ってるんじゃないかってなって一からやり直しになったら嫌だなあ。

 次は、町丁目の人口なども含めて多次元でクラスタリングやってみたいです。というかこっちが本命でこれは前座です。気力が続くと良いなあ

つづく

追記:この分析で書いたコード(雑)

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.cm as cm

%matplotlib inline
  
def syaro():
    df = pd.read_csv('../seika/uriage_jyugyosya_2.csv')
    xarray, yarray, codes = [], [], []
    for x, y, code in zip(df['uriage'], df['jyugyosya'], df['KEY_CODE']):
        if 0 not in [x, y]:
            xarray.append(np.log10(x)) 
            yarray.append(np.log10(y))
            codes.append(code)
    stdx, meanx = np.std(xarray), np.mean(xarray)
    stdy, meany = np.std(yarray), np.mean(yarray)
    xarray = [(x - meanx) / stdx for x in xarray]
    yarray = [(y - meany) / stdy for y in yarray]
    print(stdx, meanx, stdy, meany)

    plt.plot(xarray, np.poly1d(np.polyfit(xarray, yarray, 1))(xarray), color='black')
    rize(xarray, yarray, df, codes)
    
def rize(x, y, df, codes):
    from sklearn.cluster import KMeans
    
    features = np.array([[xx, yy] for xx, yy in zip(x, y)])
    kmeans_model = KMeans(n_clusters=3, random_state=10).fit(features)
    labels = kmeans_model.labels_
    plt.scatter(x, y, marker='.', c=labels)
    plt.grid()
    plt.show()
    df2 = pd.DataFrame(labels)
    df2['x'] = x
    df2['y'] = y
    df2['KEY_CODE'] = codes
    df2.to_csv('../downloads/out.csv', index=None)
    
syaro()

参考: https://qiita.com/ynakayama/items/1223b6844a1a044e2e3b