Dossiri - Kamaeru

建築・都市・生活の領域に関する知識の体系化、技術に対する考察、書籍レビュー等

多方面からダウンロードした地物データをPythonでJSON(GeoJSON)に揃えてみた

 

地理データ処理の勉強中なのですが、ArcGISを持たず、QGISは機能が多すぎて自分のしたいことがどの機能でやれるのかサッパリ分からぬと日々ぼやいています

あくまで備忘録的に、試行錯誤してやれたことを公開して、数年後に振り返って、自分が何に興味を持っていたのか振り返っていきたいと思っています(初学者なので理論的な部分や基礎的な事項の欠落に関してはご容赦ください)

 

Python触ったことある人向け。

 

【目標】

①地理上の境界データを空間データとして扱える形にして、本来テーブルデータとして与えられている数値情報をオブジェクトに結び付けたい (→データベースの構築)

②そのうえで、オブジェクトの包含関係、交差関係、面積や周長や空間距離に関する基本的な演算をできるようになりたい (→データベースの幾何演算)

③その演算結果と、テーブルデータとの間で処理を行い、オブジェクトの可視化の際にヒートマップやカラーメッシュマップ、等高線マップ、点の分布、マップ上の文字およびグラフ表現、などの方法で表現したい (→便利な描画フォーマットでの可視化)

 
 

【データの入手先】

国土交通省国土政策局国土情報課GISホームページ:国土数値情報ダウンロードサービス

・e-Stat 政府の総合窓口:地図で見る統計(統計GIS)/境界データダウンロード

 

基本的に境界データが手に入るのは上の二つ。

 

OpenStreetMap

CSIS

こちらはまだ利用したことがないので、踏み込みません。

 

【座標系】

世界測地系(緯度経度)と、②平面直角座標系(XY座標)と③その他(メルカトル図法など)があります。

それぞれに対し、EPSGコードという4桁くらいの数字コードが付与されています。

JGD座標系とEPSGの一覧表 | OpenなGISのこと

GISのための測地成果、測地系、楕円体、投影座標系、EPSGコードのまとめ - 自然環境保全のための周辺技術

e-Statでは①と②の両方が入手できます。

直観的に分かりやすいのは①ですが、GISの先生に聞いたところ、地域分析をする際には②にそろえた方がいいようです(ユニバーサル横メルカトルでもOKらしいが③なので手間が多い)。②は、全国の地方ごとに座標系が異なるので、必要な座標系にあわせて①を変換する必要があります。今回はまだ物理距離(km)に突っ込むわけではないのでとりあえず、全部①に合わせます。

 

 

 

【今回扱うデータ】

〈DID境界データ〉

国交省での配布(2015年度版の場合A16-15_01といった名前)

■拡張子:shp・dbf・shx , geojson , xml

■座標系:JGD2011(srsName="JGD2011 / (B, L)" frame="GC / JST")

 

・ geojsonはデータベース形式としてかなり整っている。

"features"という名のリストの中に全オブジェクトが格納されおり、各オブジェクトのプロパティとジオメトリを取得することができる。

xmlにおける緯度経度データは gml:Curve.gml:segments.gml:LineStringSegment.gml:posListに格納されている。gml:Curveそれぞれに対して緯度経度情報リストを取得すればよさそう。

 

▶e-Statでの配布(2015年度版の場合h27_did_01といった名前)

■拡張子:shp・dbf・shx , gml・xsd

■座標系:

世界測地系緯度経度(ddmw)でDLした場合(srsName="EPSG:4612" srsDimention="2") 

世界測地系平面直角座標系(xymw)でDLした場合(srsName="EPSG:24○○" srsDimention="2")

 

e-StatではJGD2000を使用されている模様。国交省のほうはJGD2011なので、どちらかに合わせる方がいいようです。

 

 

〈小地域(国勢調査)境界データ〉

▶e-Statでの配布(2015年度版の場合h27ka01といった名前)

■配布拡張子:shp・dbf・shx , gml・xsd

■座標系:

世界測地系緯度経度(ddmw)でDLした場合(srsName="EPSG:4612" srsDimention="2") 

世界測地系平面直角座標系(xymw)でDLした場合(srsName="EPSG:24○○" srsDimention="2")

 

こちらもJGD2000。 

gmlにおける緯度経度データはgml:featuremember.fme:h27ka○○○○○.gml:surfaceProperty.gml:Surface.gml:patches. gml:PolygonPatch.gml:exterior.gml:LinearRing.gml:posListに格納されている。

 

国交省での配布

今のところ見つかりません

 

 

〈都市地域〉

国交省での配布(作成2005年、公表2006年が最新。A09-06_01といった名前)

配布拡張子:xmlのみ

座標系:JGD2000

 

国交省GISホームページで配布されているデータには、JGD2000(特に緯度経度なのでEPSG:4612)で配布されているものとJGD2011(特に緯度経度なのでEPSG:6668)で配布されているものが混ざっているようです。

 

・こちらのxmlファイルはgmlという名前空間を利用していない。jps:GM_Curveやjps:GM_Surfaceというオブジェクトをとっています。

 

(例えば、DID境界データのxmlは、曲線オブジェクトにおけるポリラインの頂点を<gml:posList>の中に一括して、緯度経度の位置数値情報を格納しています。それに連なる形で、サーフェスオブジェクトの境界定義でこの曲線を参照する…というかたちをとっているのでとても見やすい。

一方で、この都市地域のxmlは、手間がひとつ多い定義の仕方をしています。

1. 曲線オブジェクトの始点・終点になる点を定義する

2. 曲線オブジェクトでこの点を始点・終点として参照しつつ、他の位置数値情報をポリラインの頂点点として直接定義して、その点の配列を<jps:GM_PointArray>の中に一括して格納することで曲線を定義

3. この曲線をサーフェスオブジェクトの境界定義の中で参照する

…といった様子。

全部の点オブジェクトを定義してから曲線オブジェクトを書き始め、全曲線オブジェクトを定義してからサーフェスオブジェクトを書き始める…というふうな記述方法が、とても見づらい…全体の構造としては見やすいけど、参照関係が見づらい…)

 

 

Pythonで編集】

今回は、この3つの地物データを、一番読解性のすぐれる国交省配布DID人口データのGeoJSONのデータ形式に統一しようと思います。とりわけ、市街化区域の冗長な境界データを簡潔な形にしたい…

GMLXMLベースの言語なので、全部XMLです。PythonXMLを読み取りするxml.etree.ElementTreeモジュールを利用して、データの処理ができます。

 
〈都市地域〉→ GeoJSON

今回は北陸地域の某県のデータを用います。

メタデータを省けば、本体データの構造としては、オブジェクトの容器の中に、①点、②曲線、③有向曲線、④サーフェス、⑤サーフェスに付与される区分コード、の順に並んでいます。

ksj:OBJ jps:GM_Point id="n00001"
jps:GM_Curve id="c00001"
jps:GM_OrientableCurve
jps:GM_Surface id="a00001"
ksj:BA01 id="BA01_00001"

①のGM_Pointと②のGM_Curveに全位置座標が入っているので、これをまず取得します。 そして、位置の文字列データをfloat型に変えたうえで経度・緯度の順に格納し、jsonファイルの形式に変更させます。

GM_Curveの位置座標を規定する部分に関しては、間接指定と直接指定が混在している仕様になっているようなので、この部分だけは注意して抽出します。例えば下図のように、開始点と終着点だけがGM_Pointの緯度経度を参照しています。GM_PointArrayひとつごとに、リング状のサーフェス境界ひとつを表現しているようです。

jps:GM_PointArray jps:GM_PointArray.column jps:GM_Position.indirect GM_PointRef.point idref = "n00001"
jps:GM_PointArray.column jps:GM_Position.direct <DirectPosition.coordinate>緯度 経度
jps:GM_PointArray.column jps:GM_Position.direct <DirectPosition.coordinate>緯度 経度
   
jps:GM_PointArray.column jps:GM_Position.direct <DirectPosition.coordinate>緯度 経度
jps:GM_PointArray.column jps:GM_Position.indirect GM_PointRef.point idref = "n00001"

 

 

以下使用したコードです。 

import xml.etree.ElementTree as ET
import json

def main():
    tree = ET.parse('A09-06_16.xml') 
    root = tree.getroot()
    
    posLists = []
    pointList = []
    i=0
    for obj in root[1][0][0][1]:
        if("GM_Point" in obj.tag):
            posLists.append([])
            pointList.append(obj[0][0][0].text)
        if("GM_Curve" in obj.tag):
            for coordinate in obj[4][0][1][0]:
                if not(coordinate[0][0].text == None):
                    posLists[i].append(coordinate[0][0].text)
                else:
                    posLists[i].append(pointList[i])
            i += 1
    
    dic = {}
    dic["type"] = "FeatureCollection"
    dic["features"] = []  

    for posList in posLists:
        f = {}
        f["type"] = "feature"
        f["geometry"] = {"type":"Polygon"}
        f["geometry"]["coordinates"] = [[]]
        for postr in posList:
            dd = postr.split(" ")
            pos = [float(dd[1]),float(dd[0])] 
            #geojsonは経度→緯度の順番
            f["geometry"]["coordinates"][0].append(pos)
        dic["features"].append(f)
        
    with open('A09-06_16.json', 'w') as f:
        json.dump(dic, f, ensure_ascii=False)
    
if __name__ == '__main__':
    main()

※ただこれだけだと、領域を定義する輪状の曲線のオブジェクトしか存在しないため、2つの問題が出てきます。

サーフェス定義に利用された外周用のGM_Curveと穴部分のGM_Curveの分類情報が抜け落ちている。

②都市地域/市街化区域/市街化調整区域/その他地域の分類情報が抜け落ちている。

実際にこのjsonファイルをそのまま利用する前に、上の2つの処理を必要に応じて追加する必要があります。これはフォーマットに合わせて、手動で加工したほうが早い気がしたので逐次加工しました。

GeoJSON フォーマット仕様

 

 

そして、この処理で作成されたJSONファイルはかなり自由にプロパティ情報を統合することができます。

ただし、以下の限界点に関しては、

・情報が古い。国交省の配布しているデータが2006年。東日本大震災前。

・このポリゴンデータで得られるのは、都道府県のマスタープランで定まる都市計画区域界と、区域区分界(線引き)、非線引き地域の用途地域区域の区分界。一方で、地域生活拠点や都心区域の指定、都市機能誘導区域や居住誘導区域といった立地適正化計画による詳細な区分の境界データは存在しない。

 

これについては、都道府県ページで得られる最新の都道府県マス、都市マス、立地適正化計画などを見て、修正点をアップデートしていくようにして、位置情報の細かいずれは諦める方針でいくしかなさそう…

 

〈小地域(国勢調査)境界データ〉→GeoJSON

最後に、こっちも同じ要領でやってしまいましょう。某県某市の小地域境界データ(GML形式)を、e-StatでDLします。他の二つに合わせるため、緯度経度の座標系を用います。

 

# -*- coding: utf-8 -*-

import xml.etree.ElementTree as ET
import json
import codecs

def main():
    tree = ET.parse('h27ka16201.xml') 
    root = tree.getroot()
    
    dic = {}
    dic["type"] = "FeatureCollection"
    dic["features"] = []

    
    for obj in root:
        if(obj.tag == "{http://www.opengis.net/gml}featureMember"):
            f={}
            f["type"] = "feature"
            f["properties"] = {}
            f["geometry"] = {"type":"Polygon"}
            f["geometry"]["coordinates"] = []
            
            idnum = int(obj[0].attrib["{http://www.opengis.net/gml}id"][2:])
            for prop in obj[0]:
                if(prop.tag == "{http://www.safe.com/gml/fme}KEY_CODE"):
                    f["properties"]["KEY_CODE"] = prop.text
                    f["properties"]["市町村名称"] = "△△市"
                    f["properties"]["小地域符号"] = idnum
            for prop in obj[0]:
                if(prop.tag == "{http://www.safe.com/gml/fme}JINKO"):
                    f["properties"]["人口"] = int(prop.text)
            for prop in obj[0]:
                if(prop.tag == "{http://www.safe.com/gml/fme}AREA"):
                    f["properties"]["面積"] = float(prop.text)
            f["properties"]["調査年度"] = 2015
            for prop in obj[0]:
                if(prop.tag == "{http://www.opengis.net/gml}surfaceProperty"):
                    for RingNum in range(len(prop[0][0][0])):
                        ddstr = str(prop[0][0][0][RingNum][0][0].text)
                        c = 0
                        ido=[]
                        keido=[]
                        for dd in ddstr.split(" "):
                            if(c%2 == 0):
                                ido.append(float(dd))
                            if(c%2 == 1):
                                keido.append(float(dd))
                            c +=1
                        f["geometry"]["coordinates"].append([])
                        for x in range(len(ido)):
                            f["geometry"]["coordinates"][RingNum].append([keido[x],ido[x]])
                            #RingNumが1を超える=interiorBoundaryが存在する
            
            dic["features"].append(f)  
            

    file = codecs.open('h27ka16201.json', 'w','utf-8')
    json.dump(dic, file, ensure_ascii=False, indent=2)

 
if __name__=='__main__':
    main()

※こちらの方では、穴部分のデータの抜け落ちが生まれないように書きました。

 コード普段書いてる人に見せたら唖然とされるくらいにはコードが汚いけれども、とりあえずこれで、JSONファイルにそろえることができたので、できます(?)

 

【〆】

目標①~③のうち、①のデータ変換を2つやってみました。

GeoJSONのいいところは、shpとdbfなら別々に扱っている地物の情報を、プロパティやジオメトリのカテゴリを含む地物オブジェクトでまとめて表現できるところだと思っています。

次以降の流れですが、このオブジェクトは一つのJSONの中に統合できるので、各種演算が容易にできそうです。これを次は、やってみるのと同時に、小地域データに小地域集計のCSVファイルから得られる年齢別人口などの情報を加えたいので、それをやってみます。

 

 

 

 

精進します!

 

追記:

 

結局、修論GIS関係の知識を使うことになりました。

知識はどこで生きてくるのかわからないから、面白いことをやることには意味があるんですね。

 

 

 

 

 

〈ヤン・ゲールを読む〉 ―デザインの次元、都市の空間の素描

f:id:skddiploma:20190808030832j:plain

《地上高1.4m,水平方向に,時速5㎞で体験されるための都市をデザインせよ》

Jahn Gehl "Cities for People" 

 


 

 

ジェイコブズ(Jane Jacobs)が建築分野において人気があるのは、人間の「生」に根差した空間を語り、空間を創出する視野が、(文化・歴史のロマンチックな懐古趣味を喚起しつつ、)新しい都市政策のなかで説得力を持ったという点が一因としてあるのではないだろうか。

 

過去と未来の接続-その困難さは、経済と社会のダイナミクスから生まれる慢性的なストレスとして、建築と都市の論考を緩やかに押しつぶそうとしている。

もはや、現在と過去の二項対立的な闘争は存在しない。アーバン・デザインの命題は、多様化する市民と組織のニーズを統合し、導いていく点に重点が置かれるようになっている。あらゆる立場が相対化するなかで、デザイナーは指揮者としての役割を求められるようになっている。

 

1960年代の都市の動きは、C.アレグザンダー(1965)やJ.ジェイコブズ(1961)らによる「都市計画の解体」的運動により特徴づけられるだろう。この時代から、既に50年が経過している。

彼らの考えのドラスティックさには通時代的な価値が認められうる一方で、しかしながら、その「賞味期限」が迫っていることに気づかされる。つまり、これらの「最後の都市論」を作ろうとした世代の活動は、1972年のストックホルム宣言よりも前の活動なのだ。

指摘できるのは、ポスト・ジェイコブズの議論だけではない。グローバリゼーション、ジェネリックシティ、金融と投資のオーバードライブ、全地球的な移民の流動、新たなナショナリズムの台頭。あらゆる断絶と接続が、同じ地球上の各所で同時多発的に発生している。

 

人間のための都市を作ることは、今やかつてないほどに難しく、先進国と後進国では相異なる問題にさらされている。

歴史はあらたな市場と「観光へのまなざし」に曝される中で、そのオーセンティシティを語ること自体の意義が問われている。都市領域において、地域の風土は、身体との交流を失って久しい。

公園やパブリックスペースは、警備をせざるを得ないという合意のもとに、その警備をコミュニティの外部に委託するようになっている。これはすなわち、地域にとって「守りやすい街」の追求が空間論から組織論に移行するという事だ。つまり、警備費用の発生のために、公共空間には一元的なモラリティと限定的な機能性が持ち込まれるようになる。

こういった、目に見えない経済的排除の構造が、都市の公共空間を支配している。以上の事は、いわゆる「元気な」まちづくりに成功している地域で生じている現象であり、それ以外の「元気に」なれなかった地域は、今でもなお、かつてパブリックスペースだった場所を固くフェンスで閉ざしている。

再度言おう。人間のための都市を作ることは、今や、かつてないほどに難しい。

 

こうした中で、「人間の街」と題されるJahn Gehlの邦訳書が、2014年に出版された。彼は、メルボルンコペンハーゲンのような都市の政策に関わり、新しい指標に基づく継続的な調査の重要性を主張してきた。

彼は、現代における、アーバン・デザインの第一人者であるといえよう。

こういった経緯で私は、この本を読むことになった。目的は単純で、都市と空間を結びつけて考えることに、もう一度注目するためである。

 

 

 

 

論敵は「自動車」である。これは現代の多くの都市論とヤン・ゲールの論において、共通している。この点においては、間違いなくゲールはジェイコブズの正当な継承者だろう。

 

もちろん、自動車を都市から「締め出す」立場に対しては、いくつかの反論がある。

まず、それが現実的でないこと。モータリゼーションを巻き戻ししようという考えが時代錯誤であるという立場。

次に、流通を都市基盤として評価するマーケット主義。都市のオンデマンドなサービス産業は自動車の技術に支えられ、消費者の消費もまた自動車による自由な移動に支えられているという立場。

第三に、技術主義。自動車の排出するCO2の問題はエコ効率の向上、そして代替する燃料の普及によって解決すべきだという考え。

第四に、「自動車の中」こそが新たな都市空間要素であるべきとする考え。自動車が、文化の様相を構築してきたという支持。

第五に、自動車は、街路を共用するその外部の人間(=歩行者)を危険に曝すが、一方で自動車の「中」に安全をもたらし、安全な移動手段を提供するという考え。

第六に、自動車が、新たな「スマートさ」を持つことにより、現在の課題を解決する形で都市空間を再統合するという考え。

 

ゲールが本書で、こういった考えに一つ一つ反論しているか、といえば、けしてそんなことはない。彼は、この不毛な論争に参加し、それに終始する気はない。

彼の目的は、自動車のない空間に「都市活動」を呼び起こし、定着させるための都市空間の「質」の追求にある。

 

遊歩、ふれあい、偶発性

 

歩きやすい都市空間を支持し得る、最も「政治的な」理由は、その健康効果にあるだろう。やはり、歩行する都市市民が多い都市において健康寿命は拡大し、それらが福祉・医療の税支出を抑える可能性が示唆されている。

 

だが、歩きやすい都市空間では、建築学的な、〈人 ー 人〉と〈人 ー 空間〉のインタラクションが発生する点にこそ、注目がなされるべきであろう。

ゲールは、遊歩(ぶらぶらと歩く)、ふれあい(偶発的な出会いに始まる共通行動)、そしてその「偶発性」にこそ価値があると考える。そのように都市を味わうことを、ひとびとの「余暇」として復興させようとしている。

この古くて新しいアーバン・ルネサンスの現実性と実効性については議論の余地があるが、少なくとも、その体験の魅力については、語るまでもない。建築家らは、数多くの建築論・都市論を通して、繰り返しその都市の魅力を素描してきたのだ。

 

ウォーカビリティは、空間の質に対する投資により向上できる。ストリートファニチャー、景観の美しさ、人々を収容する街路空間のスケール・デザイン、Proxemicsに基づいた空間のパースペクティブの調和。…これらは漏れなく、日本の街路空間に欠如しているものである。

 

日本の近年の都市施設は確かに、(ドバイ的な意味での)象徴的な形態への強迫観念から解放されており、 ある意味でビジネステイストな建物が多い。遠景からの美しさに建築家が動員されることは減っており、かわりにヒューマンスケールのデザインに建築家が動員されている。

都市空間への投資は、街路ではなく駅前、すなわち「線から点へ」向かっている。線を作ろうとする試みは、やはり難しいようだ。

例えば地方都市では、「歩行空間の再生」のためのストリートファニチャーは置物と化しており、なぜか「立ち止まる気にはなれない」空間が生産されている。それが、都市計画の敗北の結果であることには、市民は気づいていない。退屈なまちの姿の原因を「地方であること」だと考えている。そうした無力感の果てに、まちづくり活動に屈辱的な負の烙印が押されるのならば、それはあまりに悲しいことだ。

観光者からみても、街路に対する印象は同様である。エデンサーが言うように、組織化された旅行(パッケージツアー)と、非組織化された旅行(バックパック)があるが、前者において観光の様態は「飛び地のツーリスト空間」を迅速に移動するのみであり、地方都市において駅前は乗換えのための空間に過ぎない。

国内の都市では、本書で掲げられるような[ポーザビリティ=立ち止まりやすさ]や[滞留性]があまりにも不足した街路の空間に、ホームレスの利用を拒絶する「寝ころびづらい椅子」が設けられ、これが街路空間の整備だと宣われている現状がある。

そういった都市空間では、微気候の気持ちよさは感じられず、並木下の空間や建物の小さなくぼみがないため、人々の拠り所も逃げ場もない。真夏の熱い中、高齢者や子供夫婦が、こうしたコンクリートに覆われた裸の街路を歩く気には到底なれない。

彼らの歩行機会へのフラストレーションは、別の場所 - 例えば、郊外のショッピング・モールやカフェの商業空間 - に回収される。

そうして、都市空間から人々の姿が消えていく。

 

つまり、日本の街路空間において欠如しているアーバンデザインの方法論の「いろは」を、ヤン・ゲールはまさに教えてくれているのだ。

私が思うに、日本の国内事情に照らし合わせて考えれば、単に公共交通政策をもって歩行者の暮らしを快適にすることはできない。アーバンデザイナーにとって、論敵は自動車ではなく、国土の全域で敷設されてきた、のっぺりとした道路空間そのものではないか。

 

アクティビティ

 

遊歩性とは別に、人々のふれあいにはアクティビティが必要だ。

アクティビティ創出には、塚本由晴の都市のビヘイビアを考察する〈ふるまい学〉の視点も重要であるし、それとは別に社会的・経済的に動機づけられた「活動」の目的的視点も重要である。

都市で発生するアクティビティを確保するために、コンテンツの確保のみに走ってしまってはいけない。その場合、試みは、すぐさま商業主義に回収されてしまうか、あるいは持続可能性の乏しい「まちづくりイベント」の単発性により消耗してしまう。持続的なシステムと、都市空間、文化の領域から複合的にアプローチしなければ、アクティビティを捉えることは難しいだろう。

 

都市構造は、人々を拡散させないための限定性と、ひとびとに快適さをもたらす開放性の両面を確保し、かつ追求しなければいけない。これを、コンパクションのジレンマと私は呼んでいる。

地理面積あたりの人口を高密度にするマンション開発は、「同じ目線の高さにあるひとびと」による薄いアクティビティの積層にすぎず、ゲールはこれを否定している。

都市の利用率を、どのように高めるか。都市に存在する膨大な空間の供給プールを、どのように運用するか。そして、そのために、プロパティの質をどう高め、媒介する都市空間をどうデザインするか。それらは、コンパクションのジレンマの解決に寄与する一連の命題であるはずだ。

一方で、それに対するアイデアケーススタディは、依然、不足している。

 

アクティビティを醸成するためには、都市に求心性が必要であり、それは都市の創出する「機会」の価値そのものに左右される。

私たちが持つスマートフォン・携帯端末の上では入手できない「機会」を、果たして都市が提供できるのだろうか?これは、現代都市の困難な課題の一つだ。

 

都市の中の柔らかい【エッジ】

 

アクティビティに関して言えば、「都市は劣化する」。美しい経年変化を持つ一方で、どうしても言い繕えない劣化もある。

コミュニティや人間関係に移ろいがあるように、都市における住民、市民の公的活動と私的活動の変化、住宅の中に格納される世帯構造の変化、住民の高齢化、施設の老化がある。しかし、その議論には深く立ち入らない。ゲールは、普遍的に都市の死と生が最も表現されている、街路の【エッジ】について考察する。

エッジとは、ここではK.リンチ的意味の都市のエッジのことではなく、街路と私的空間とのエッジのことである。【エッジ】とは、住宅の接地部分、街路と最も近い部分であり、植木鉢・ショーウィンドウ・カフェのオープンテラス・その他様々な「半私的活動」が表出するインターフェースの部分のことである。

 

間口・戸口・凹凸性・透明性・植物・その他様々な面で、【エッジ】をどのように柔らかくすれば、都市のアクティビティに寄与してくれるのかを、彼は考察する。

この視点が指摘したいのは、Jacobs的に「ハードな環境によってソフトな都市活動が提供される」ことではない。

彼は、「人は人のいるところにやってくる」と述べる。人の滞留をまず最初に生み出すのは、人である。半公共半私的空間であるエッジでの滞留をまず喚起するのは、私的空間側の、私的な活動にいそしむひとびとである。

つまり、ここにおいてもマンションのビルディングタイプは否定されている。1階部分に、如何に私的な活動を創出するか、という建築側の責任が、ここに発生する。そのためにはまず、1階部分を(その建物の)居住者に「開放」しないといけないのだ。あるいは、チェーン店のような非住民的な商業活動を1階にテナント貸しするのも完全な正解ではない。

ゲールの指摘を踏まえれば、社会的混交は、この【エッジ】にこそ表出されるのだと考えられる。

 

都市の柔らかい【エッジ】は、特にアーバンビレッジをコンセプトとする職住近接の都市モデルを追求する都市において、デザインの肝となる考え方ではないだろうか。

同時に、その持続性の観点から見る困難さについては、昨今の国内の商店街地域を見れば明らかである。確かに「人は人のいるところにやってくる」のだが、新規住民にとっての柔らかいエッジを確保することができなければ、彼らの土地への愛着は育まれない。

近年では、「表出」自体に着目する論考も生まれている。引き続きこの点においては、商業的課題(サービス、バリアフリー、イメージ、経営)からも商業的課題以外(住民の所得、社会層、生活様式など)からも、検討がなされるべきである。

 

国内都市において、「まちなみ」が完全に失われ、都市が断片化してしまえば、同時に都市の街路性は失われる。

職人の町や漁民の町では、人材の分散が生じるとともに産業が衰退し、かつての「まちなみ」と呼応する形で成立していた「街路への営みの表出」はもはや消失しつつある。西陣などにみられるこの現象は、まちのイメージの地理空間的断片化である。こういった現象も同様に、都市のアクティビティを減少させているのかもしれない。

 

街に新たなアクティビティを - ランニングブーム、自転車、都市の新たな速度

 

都市において、遊歩性のある都市構造(すなわち、回遊都市)が困難になる中で、都市のアクティビティにおける有力なキーワードが、〈移動〉となっていることは否めないだろう。

健康ブームと結びつく形で、自転車を通勤手段として選択するビジネスマン層や、ランニング層が拡大している。都市が、多くの速度に開かれることが、新しいニーズとなっている。

 

こうした動きが、スマートモビリティや自動車より小さな移動手段による移動が拡大することと呼応し、さらにはアクティブシニアにとっての歩行空間の議論がそこに加わることで、街路の「自動車一強時代」を新しい情勢に変えていく可能性がある。

自動車によって駆逐されていた街路の安全性と活動性が、再び戻ってくるかもしれないという小さな希望を、ゲールは示唆している。その可能性は、道路空間の今後の「リ・デザイン」的な再整備が、成功するかどうかに左右されるだろう。

 

21世紀の新しい広場

 

広場空間の良き実例は、まだ国内で言えるものは少ない。富山市のグランドプラザはアクティビティの持続的な創出に成功している点でよい事例とはいえるが、その継続的評価を行うには多少の判断の保留が必要であると考えている。

本書では、特にコペンハーゲンメルボルンを紹介しているが、私はこの本の中でもポートランドのPioneer Courthouse SquareやノルウェーオスロのThe Norwegian National Opera & Balletが近年の事例として紹介されていることに驚いた。かなり現代の良事例であることに変わりはないが、都市に対する大規模な投資の事例をここで挙げることには一般性がないように感じられたためだ。

ここでは、広場空間のスケールの適切さ、アクティビティの存在、開発としての成功性、生み出された建築・都市の美しさが評価されていると感じる。

 

www.portlandoregon.gov

www.visitoslo.com

 

 

都市において必要なもの : 思慮・心遣い・共感

 

メガシティはじめ、第3世界の急激に成長する都市にも、ゲールは触れている。その中で、彼は最貧の人々による自己表現の手段としての街路の役割に注目している。この視点は本書でも有数の鋭さを持つ視点だ。

自己表現・遊び・運動は、同時に社会的活動・「生」の本質・最も素朴な公共(政治の場)への参加、である。しかし、公園が駐車場に改造され、路上空間における保健性が失われ、エンジンを吹き鳴らす車や軽自動車による交通の混雑が路上の安全を脅かしている。それはすなわち、屋外のアクティビティの消失、あるいは屋内への撤退を表す。

最貧の人々は、都市が前進するほどに、撤退を強いられているのだ。

対策をすべき都市計画者は、緊急性・財源の少なさ・取り組みにかかる時間の長さ・問題の多方面さにおいて、困難を強いられている。

 

彼は、ケープタウンの「尊厳の場」プロジェクトを紹介している。

プロジェクトの重要な点は、人々の隔離をなくし、人の集まれる公共の都市空間を生み出し、彼らの日常生活を支え、勇気づけることである。そこで計測されるのは都市の成長や整備の実施、商業や様々な規模ではなく、人々の生活状態であり、幸福度である。

地域にそのまま生きてきた人々が、参加し、自己表現を行える都市空間を再生することの重要性は、まさに第3世界から先進国に発するメッセージだ。補注すれば、このことは第3世界において重要な命題なのではなく、世界的な新しい潮流となっているかもしれない。数々の制約の中での都市に対するアプローチの可能性を詳細に記述した、『タクティカル・アーバニズム』(Mike Lydon, Anthony Garcia, 2015)については、次に是非読み込みたいと考えている。

 

建築家ラルフ・アースキンは2000年に取材を受けたとき、よい建築家になるためには何が必要かを質問されて次のように答えた。

「よい建築家になるには、人を愛することが必要です。なぜなら建築は応用芸術であり、人びとが生活するための枠組みをつくるものだからです」。

(本著,p238)

 

最後に:アーバンデザインの射程、都市空間の素描

 

都市空間において、もっとも重要なのは人間であり、人間の認知感覚、人間にとってのスケール、人間の身体活動、人間の自己表現だった。

サステナビリティパラダイム以降、都市空間の主題は再度、脱人間中心主義的になる危険をはらんでいる。それは、これから予測され得る「大きな計画」主義のリバイバルである。

これは、気候変動、モビリティの極大化、人工知能のシンギュラリティ、金融破綻などから生まれる大規模なカタストロフィが引き金となるだろう。そのとき、大規模な人間の居住空間・生活にたいする統制、あるいは誘導が入るように、私たちは今後の計画を見直さざるを得ない。

 

アーバンデザインの可能性は、まさにその中で何度も参照されるべき人間主義にある。

 

「人間のための都市」をつくる大きな戦略は、今後あまり期待できないのではないか、と不安に思う一方で、その小さな試みは普遍的に継続するように感じられる。

断片化した都市戦略が、都市を少しずつ変えてゆく。人間のための都市は、断片をつなぎ合わせ、そのつながりを邪魔しないという新しい「点から線へ」の在り方を、街路という線レベルの戦略と組み合わせて構築する。

その時、「デザインはいずれの次元で行うべきか」と問うことは、陳腐化する。なぜならば、人々こそが、最も基本的な要素となるが、同時に人々なるものはすべての次元にまたがっているからだ。

都市空間においては、その複層性のうち、アクティビティを描き出すことが特に重要になるだろう。

 

2019/08/08

書評

Jahn Gehl "Cities for People"

ヤン・ゲール『人間の街 公共空間のデザイン』(北原 理雄 訳)

 

f:id:skddiploma:20190808023440j:plain

 

「かち」と「か」を英語で考える

indicator と index はもともとin(中に)-dico(言う):指し示す、という由来がある。

「指示」の受け渡しとは何か。基本的に、「呼ぶ・話す・会う」の社会プロセスを通して行われる命名の連鎖によって、語は意味を獲得する。これが受け渡しである。

この連鎖の果てでは、必ずしも、話し手がその名前のみで名の「指示」する対象を特定している必要はない。なぜならば、話し手は名の意味の使われ方を社会に確認することができ、それによって対象を明瞭化させることができるからだ。

この、意味の受け渡し過程において、遺伝子の継承と同じように意味のエラーが入り込む。名前の伝え手と受け手において同一の対象を「指示」できればいいのだが、その対面関係だけでエラーを取り除くことは難しく、社会の手助けがあって初めて「指示」の受け渡しが生じる。

 

さて、indicator(指標)はvalue(かち)を対象とするvariable(変数)やform(かたち)が話し手によって命名されるという関係がある。ここにおいて、variableないしformは、valueを「指示」する名である。valueの伝達を助けるのが、社会という合意の基盤である。

一方で、value(かち)はcept(か)を「指示」する。ceptはcapere(つかむ)に由来する。話し手はvalueを語るが、受け手はvalueが指示するceptを想像することしかできない。ceptの伝達を、社会が手助けすることは難しい。

言ってしまえば、ceptはvariableやformの対極にある。ceptは、コンテクストの総体であり、もっとも情報量が多いが、その情報の集合のうちどれだけの部分をvalueが「指示」できるかは、受け手の個人に依存する。

con-ceptは受胎されたもの、というアポステオリな認識があるが、実際には「共同で」つかみ取ったものであるというのが本来の考え方だ。「受ける」よりも「つかみ取る」とみることは、能動性を意味する。つまり、cept(か)は、(しばしばある循環過程のもとで)valueに依存しない。それはすなわち、valueがceptを指示している名に過ぎないことと同義である。ceptは、最も深い位置にある。

 

では、Indicatorではなく、どのような「指示」が、valueとceptとの関わりを表すのだろう。

ここで、ceptと「原理principle」と比較してみよう。

principleは言ってしまえば、form・variable "への" 単線的指示過程に重点を置き、ceptはform・variable "からの" 単線的指示過程に重点を置いている。 両者を統合した(ある)循環過程においては、このceptとprincipleのすり合わせが起きる。しかし、前述したようにceptはコンテクストの総体としての本質である一方で、principleはコンテクストの根源としての本質を意味する。principleのモチーフはツリーである。それは、prim-が、系統の存在を前提とした源への遡行にあるからだ。

ceptとvalueの関係は、こういった思考ではなく、コンテクストの総体としての本質の「結晶化」にある。生成的であるが、generativeではない。つまり、世代という順序関係や時間に対する判断をここでは留保している。

このような「指示」関係を適切に表現する言葉は見あたらないが、direction的「指示」であると言える。コンテクストの総体であるceptを、ある種valueが「ある方向に導くかたちで指示している」と考えることもできるためだ。valueが名であり、ceptが対象である指示関係は、もしform・variable "への" 動きであるという立場をとってしまえば、form・variableそのものを参照しない、間接参照(indirection)であるともとれるからだ(この考えは、創造の循環過程においてあまりに一面的ではあることが課題だ)。

 

研究も建築も、循環過程におけるform・variable "への" 動きだけでは成り立たず、form・variable "からの" 動きだけでも成り立たない。これは(「かち」を加えた拡張的な)代謝建築論で主張されている点に対する私なりの解釈だ。しかし、その「指示」に対する視点があいまいであってはいけない。なぜならば、研究はアプローチを明示的に説明する必要があるからだ。建築は、思考の跳躍を、身体や他者や偶然を含めたあらゆるアプローチを利用できるし、それが明示的である必要は必ずしも存在しない。そこには「遊戯」と「妄想」が介在する。しかし、研究は違う。研究は、人を説得する過程そのものが活動であり、approach-orientedである。

 

form・variableとは、在り方そのものである。私がここで一つ指摘できるのは、いくつかの研究手法…indicator-based framworkやprinciple-based frameworkは、「か-かた-かたち-かち-か」の循環過程においてどの「指示」に焦点化したかという点で分類可能である、ということだ。つまり、既存のアプローチはその循環過程のいずれかに位置づけられる。しかし、ある位置にあるということは、反対側の位置があるという事をも意味する。例えばいままでindicator-based framworkが多く使用されてきた都市形態論において、「か-かた」 の「指示」について焦点を当てたフレームワークをメインアイデアに据えることは難しい。その一因である可能性として、「か-かた」の「指示」はフィジビリティや政治に依存する点が推測される。加えて、これについては研究者のセンスとして片づけられることが多いために、知見としての市民権が与えられていないのかもしれない。

 

また、私は少なくとも、formとvariableの相互翻訳そのものに意義はないと思っている。したがって、GIS研究などは、相互翻訳をコンテンツと認めてしまう研究は研究として何をしたかったのか問われることになるだろう。その場合、相互翻訳というトピックの循環過程を見出し、その中で「cept(か)」を見つけるところまでいかないと意味がない。以上が自身の所見である。院生として私が行う際にも、こういったことには気を付けないといけない、と感じている。

 

 

 

 

 

「議論が何よりコンパクトでない。」

自由に書く

コンパクトシティとかいって、沢山の人が同じ方向を向いて頑張っている。それはいいことだ。

地球規模の問題提起に対して、ほとんどの人はリアリティをもたない。しかし、ある一つのテーマを掲げ、そういったものに対して、いろいろな人がそれぞれのリアリティをもって取り組めるのならば…その小さな動きの集積は、新しい都市の動きになるかもしれない。(もちろん、個人的な思いもあります。「流行り言葉に対して、斜に構えるのではなく真正面からぶつかったならば、そこにわたしは飲み込まれるのか、それとも突き抜けるのか?」知りたいのです)

 

コンパクトシティは、もともとは建築家が提唱した言葉だ。そしてそのうち、「いろいろなこと」がこの概念にまとわりついていくこととなった。その経緯については、ここでは省略するが…結局、日本と海外の事情の違い、「コンパクト」の取り扱いの違いに着目することは、さほど重要ではないと思う。しかしそれでもなお、海外事例は背景化してしまい、今やコンパクトシティを語ることは、国土論を語ることと同義といえるほどに、「コンパクト」はキーワードとして肥大化している。スマートコミュニティやらスマートシティやら一連の横文字と同じように。

 

 

コンパクトシティ」をざっくり説明すると、公共交通機関へ徒歩でアクセスすることを想定し、その狭域の内に市街地を集約した都市構造である。日本において当概念に関する議論が活発化したのは00年代初頭であり、海道(2001)著『コンパクトシティ』などで海外の都市概念が包括的に取り上げられた。

 

一方で、国土レベルの戦略としてコンパクトシティがみられるようになったのは2007年以降である。2007年の社会資本整備審議会「新しい時代の都市計画はいかにあるべきか(第二次答申)」の内容は『集約型都市構造の実現に向けて』としてとりまとめられたことが挙げられる。

今現在、2014年『国土のグランドデザイン2050』や改正都市再生特別措置法などに代表されるように、コンパクトシティは、〈コンパクトシティ+ネットワーク〉なまちづくりという概念に発展している。全国的に見ても、コンパクトシティの善し悪しの議論よりも、むしろどのようにコンパクトシティを実践していくかの議論に重心が傾いているようだ。

 

※今までに、国内で次世代都市のモデル都市指定を受けた自治体を整理した。

平成12年(2000年3月) 「歩いて暮らせる街づくり」関係省庁連絡会議 「歩いて暮らせる街づくり」モデルプロジェクト地区 20地区
平成20年(2008年7月) 内閣官房 地域活性化統合事務局 環境モデル都市 6都市
平成20年(2008年7月) 内閣官房 地域活性化統合事務局 環境モデル候補都市 7都市
平成23年(2011年12月) 内閣官房 地域活性化統合事務局 環境未来都市 11団体
平成24年(2012年6月) OECD Compact City Policies: A Comparative Assessment ケーススタディ都市 5都市
平成25年(2013年3月) 内閣官房 地域活性化統合事務局 環境モデル都市(追加) 7都市
平成26年(2014年3月) 内閣官房 地域活性化統合事務局 環境モデル都市(追加) 3都市
平成29年(2017年5月) コンパクトシティ形成支援チーム会議 コンパクト・プラス・ネットワークのモデル都市第1弾 10 都市
平成30年(2018年3月) 国土交通省 地方再生コンパクトシティのモデル都市 32都市
平成30年(2018年4月) OECD SDGs推進に向けた世界のモデル都市」 6都市
平成30年(2018年6月) コンパクトシティ形成支援チーム会議 コンパクト・プラス・ネットワークのモデル都市第2弾 11 都市
平成30年(2018年6月) 内閣府 地方創生推進室 自治体SDGsモデル事業 10自治
平成30年(2018年6月) 内閣府 地方創生推進室 SDGs未来都市 29都市

特にOECDに取り上げられた富山市北九州市は、よく耳にするのではないか。

他にも、先進都市として注目すべきなのは、横浜市金沢市鶴岡市水俣市など。尼崎市も頑張っている。

 

上のモデル都市評価は受けていないが、他にも以下のような自治体の動きには注目しておきたい。

青森市比較的早期にコンパクトシティ構想を自治体として打ち出していた中心市街地の活性化をコンパクト・シティと結びつけて行おうとした自治体であり、06年新中活法のもと07年に中心市街地活性化基本計画認定第1号を受けている。「中心市街地」の話をしようとしたら絶対この市の話題が出てくる。

夕張市:極度に財政事情が厳しい自治体の代表例。(都市のシュリンクという意味で)コンパクト化を進めている。これはこれで、相当なノウハウが積みあがっているために注目すべき事例。

 

こういった例に挙げられるように、コンパクトシティは少し話が入り混じっている節がある。

郊外化&モータリゼーションが進んだここ2,30年の都市において、そのつけを見ることになったのは、道路水道をメンテナンスし続けなければいけない行政主体と、衰退した中心市街地の当事者(特に商工関係)、空き家問題の当事者である地域住民、そして都市から排出されるCO₂やエネルギー消費のしわ寄せにあう「どこかのだれか」である(当然、それは私たち自身と思っていいですよね)。

だから、本来「歩きやすいまち」「持続可能なまち」の両構えでスタートしたコンパクトシティ理念なのに、「中心市街地が良くならない」という批判を浴びる。何でも解決できる万能薬のような面構えをしているコンパクトシティだが、実はそれひとつで何かを解決できる力は持っていないことを忘れているのではないか…?

中心市街地活性化の苦悩については、小林(2017)著『都市計画変革論 ―ポスト都市化時代の始まり―』などにも書いてある。特に、ポリシーミックスの重要性について。

(ある問題を抱え、さらにそのことについて解決のニーズがあることが分かっている都市において、そちらを後回しにしてコンパクトシティ化にお金やエネルギーを費やしているのならば、その地域は悲しい結末をたどってもまあ仕方ないでしょう。)

 

先進的な=コンパクトな、ではないし、エコな=コンパクトな、でもない。

創造的な=コンパクトな、でもない。

コンパクトシティ志向は都市再編の考え方であり、ある課題に対してその改善効果はあれども、解決する保証はない。実際、その解離性を指摘し、ギャップを埋める方法を考えるのも都市計画屋の仕事だ。

 

特に、都市のウォーカビリティの向上と市街地コンパクト化を混同すると痛い目に合う。大きい人の動きをつくるコンパクトシティ指向は、歩行環境を、圏域で考えるのは得意だ。しかし、実際に「歩きやすい街」をつくるための思考は苦手だ。

 

以上のようなことを踏まえて、論考のフレームワークを作る必要がある。キーとなるのは、問題解決型思考を脱却し、トレードオフパラドックス、ある種の対立関係、そのなかでの意思決定に着目すること。コンパクトシティ指向は、かならず内側にそういったものを含んでいるはずなのだ。これは、コンパクトシティの分析を必要とするが、分析には注意を要さないといけない。完全に部分に分解してしまうとそういったトレードオフが見えなくなるばかりかコンパクトシティの枠組みの意義さえ見失ってしまう。

横断的概念としてのコンパクトシティは、私たちの都市学的アプローチにある種の座標を描き出す。任意のアプローチがコンパクトシティを通して相対化されてしまうのならば、ある意味それは私たちを自由にしてくれるかもしれない。

 

まちのクラスタリングをやりたい(2)

全国都市クラスタリング可視化マップ作ってみました。
「全国の都市が、都市相互でどのような近隣関係を持つのか」を可視化することがテーマ。図には「都市名:人口」がマークされています。

f:id:skddiploma:20190522214318p:plain
まずは北海道・青森の図
北海道は青森の3都市と強い結びつきがありました。北海道の中でも道央地域には、札幌などの中都市が固まっています。
札幌の都市圏は、道東・道北の都市とつながりつつ、青森方向にも繋がりがあることが分かります。 青森・函館・札幌という拠点都市以外にはそれほど都市は存在しませんね。
f:id:skddiploma:20190522214446p:plain
三陸は岩手・宮城の繋がりが強い。山形市などはむしろ福島の都市と近いことが分かる

続いて、首都圏。

f:id:skddiploma:20190522214626p:plain
太田宇都宮圏、前橋高崎圏、水戸圏くらいまでが目で追える。このぐちゃぐちゃ具合が、首都圏の都市密度が他の地方と比べ圧倒的に高いことを示している。

この東京圏の図を解像度高く見やすくしたものは、また別に作ったので、機会があれば。
まあこんな感じで、甲信越~北陸~名古屋~近畿と作っていきました。

f:id:skddiploma:20190522214802p:plain
中国四国の図。
f:id:skddiploma:20190522214844p:plain
九州は西九州・東九州・南九州と分化した。これは西九州の地図。

以上のような成果物ができましたとさ。

…作り方は以下のように進めていきました。

①人口情報と、経度緯度情報の結合 ward4,ward5 → ward.6 とりあえず人口5万人以上の都市について、市区町村の名前をキーにして、経度緯度データを結合する

df = open('ward3.txt', 'r', encoding='shift_jis')

string = df.readlines()
a=[]
for x in string:
    a.append(x.split('\t'))

print(a)

df2 = open('ward4.txt', 'r', encoding='shift_jis')

string2 = df2.readlines()
a2=[]
for x in string2:
    a2.append(x.split('\t'))

print(a2)
    

for i in a2:
    k = 0
    for j in a:
        if(i[0] == j[0]):
            if(i[1] == j[1] or i[1] == j[2]):
                i.append([j[3],j[4],j[5]])
                k = 1        
    if(k == 0):
        print("NO NAME")
        print(i[2])
        
pprint.pprint(a2)

②複数の区をもつ市は、複数の経度緯度のデータを持つようになる。その場合、すべての区の重心を求めて代表点とする ward6 → List Object

df = open('ward6.txt', 'r', encoding='shift_jis')

string = df.readlines()
a=[]
for x in string:
    a.append(x.split('\t'))

b = []
m = ''
n = ''
for i in a:
    if(i[0]) == str('['):
        c = 1
        lng = float(i[5])
        lat = float(i[6])  
        tdfk = i[1]
        city = i[2]
        popl = i[3]
    if(i[0] == str('')):
        c += 1
        lng += float(i[5])
        lat += float(i[6])
    if(i[8] == str(']]\n')):
        m = str(round(lng / c, 6))
        n = str(round(lat / c, 6))
        b.append([tdfk,city,popl,m,n])

pprint.pprint(b)

とりあえず出力されたものがこちら

[['[神奈川県]', '[横浜市]', 3724844, '35.453767', '139.5838'],
['[大阪府]', '[大阪市]', 2691185, '34.671937', '135.50801'],
['[愛知県]', '[名古屋市]', 2295638, '35.14962', '136.926371'],
['[北海道]', '[札幌市]', 1952356, '43.052385', '141.364933'],
['[福岡県]', '[福岡市]', 1538681, '33.585779', '130.38472'],
['[兵庫県]', '[神戸市]', 1537272, '34.685926', '135.148421'],
['[神奈川県]', '[川崎市]', 1475213, '35.580315', '139.614373'],
['[京都府]', '[京都市]', 1475183, '34.999513', '135.754851'],
['[埼玉県]', '[さいたま市]', 1263979, '35.896661', '139.63885'],
['[広島県]', '[広島市]', 1194034, '34.407758', '132.463318'],
['[宮城県]', '[仙台市]', 1082159, '38.266032', '140.887951'],

人口100万人以上までコピペしたけど、こういった調子で人口5万人前後の都市(最後尾は滋賀県高島市)まで続く。
(ついでに言うと、自分が扱っているデータは、1次データでないし計測年月も確認してないから、数値として当てにしない方がいいです)

③データの階層クラスリングを実行 (重みづけ有のWard法)

INTA = []
for i in b:
    INTA.append([[i[0]+i[1],i[2],float(i[3]),float(i[4])]])


def DSfor(C):
    x = 0.0
    y = 0.0
    c = 0.0
    for i in C:
        x = x + i[2]
        y = y + i[3]
        c = c + 1.0
    xmean = x/c
    ymean = y/c
    Ax = 0.0
    Ay = 0.0
    for i in C:
        Ax = Ax + (i[2] - xmean)**2.0
        Ay = Ay + (i[3] - ymean)**2.0
    return (56.25) *Ax + (126.5625) *Ay    
        
def J(g,h,U):
    C = U[g]+U[h]
    RevS = []
    DSRev = 0.0
    
    d = 0
    for i in U:
        if(not (d == g or d == h)):
            RevS.append(d)
            DSRev = DSRev + DSfor(i)
            
        d = d + 1
    DSsum = DSRev + DSfor(C)
    return DSsum
    
def updateU(U):
    minDS = J(0,1,U)
    ug1 = 0
    ug2 = 1
    for i in range(len(U)):
        for j in range(len(U)):
            if(not i == j):
                if(J(i,j,U) < minDS):
                    minDS = J(i,j,U)
                    ug1 = i
                    ug2 = j
    print(ug1,ug2,minDS)
    V = []
    for i2 in range(len(U)):
        if(not (i2 == ug1 or i2 == ug2)):
            V.append(U[i2])
    V.append(U[ug1]+U[ug2])
    return V
           

for i in range(519):
    c = updateU(c)
    pprint.pprint(c[-1])

すると、こういうデータになる


50 80 407.2156215596323
[['[福岡県][宗像市]', 96516, 33.805431, 130.540718],
['[福岡県][福津市]', 58781, 33.786866, 130.469886],
['[福岡県][古賀市]', 57959, 33.728787, 130.469987],
['[福岡県][福岡市]', 1538681, 33.585779, 130.38472],
['[福岡県][春日市]', 110743, 33.532571, 130.470281],
['[福岡県][大野城市]', 99525, 33.536307, 130.478641],
['[福岡県][筑紫野市]', 101081, 33.496342, 130.515657],
['[福岡県][太宰府市]', 72168, 33.512799, 130.523906]]
40 141 413.8777469799072
[['[香川県][丸亀市]', 110010, 34.289506, 133.797706],
['[香川県][坂出市]', 53164, 34.316319, 133.86051],
['[岡山県][倉敷市]', 477118, 34.585013, 133.772084],
['[岡山県][総社市]', 66855, 34.672807, 133.746528],
['[岡山県][岡山市]', 719474, 34.644351, 133.953009],
['[岡山県][玉野市]', 60736, 34.491943, 133.945987]]
37 48 420.5537239345434
[['[富山県][南砺市]', 51327, 36.557513, 136.875336],
['[石川県][金沢市]', 465699, 36.561325, 136.656205],
['[石川県][白山市]', 109287, 36.514427, 136.565892],
['[石川県][野々市市]', 55099, 36.519704, 136.609971]]

   重み、クラスターのまとまりからなるセット。 このデータを編集して作成した次のtxtデータをもとに、クラスターの座標点(N>=3)に対する凸包の多角形を求め、ひもづける。

import copy

df = open('ward7.txt', 'r', encoding='shift_jis')

string = df.readlines()
a=[]
for x in string:
    a.append(x.split('\t'))
    
def det(p,q):
    return (p[0]*q[1]-p[1]*q[0])

def sub(p,q):
    return (p[0]-q[0],p[1]-q[1])

def get_convex_hull(set_points):
    points = copy.deepcopy(set_points)
    n = len(points)     
    points.sort()  #素直にsortすると各配列の先頭要素をkeyとしてsortします
    size_convex_hull = 0
    ch = []
    if n == 2:
        ch.append((points[0][0],points[0][1]))
        ch.append((points[1][0],points[1][1]))
        ch.append((0,0))
    
    else:
        for L in range(n):
            while size_convex_hull > 1:
                v_cur = sub(ch[-1], ch[-2])
                v_new = sub(points[L], ch[-2])
                if det(v_cur, v_new) > 0:
                    break
                size_convex_hull -= 1
                ch.pop()
            ch.append((points[L][0],points[L][1]))
            size_convex_hull += 1
    
        t = size_convex_hull
        for L in range(n-2,-1,-1):
            while size_convex_hull > t:
                v_cur = sub(ch[-1], ch[-2])
                v_new = sub(points[L], ch[-2])
                if det(v_cur, v_new) > 0:
                    break
                size_convex_hull -= 1
                ch.pop()
            ch.append((points[L][0],points[L][1]))
            size_convex_hull += 1
    
    return ch[:-1]
    
    
k=[]
j=[]
for i in a:
    if(not i[0] == ''):
        if(not j==[]):
            j.append(get_convex_hull(j[1]))
            k.append(j)
        j=[]
        j.append(i[0])
        j.append([])
    else:
        i[4] = float(i[4])
        i[5] = float(i[5])
        i[6] = float(i[6].split(']')[0])
        j[1].append((i[5],i[6],i[4],i[2]))
    
    
pprint.pprint(k)

QGISにもちこむために、Well known text(WKT)形式にジオメトリ定義を変更したcsvファイルを作成しようとするが、挫折

⑤ここで、Matplotlibで可視化する方針に変えて、テキストデータをきちんと構造的に読み取るプログラム作る

#!/usr/bin/python
# coding: UTF-8
import pprint
import os



os.chdir('C:\\Users\\leafh\\Desktop')

df = open('ward8.txt', 'r', encoding='shift_jis')

string = ""
for i in df.readlines():
    string += i

df.close()

a = "".join(string)
b = []


for i in a:
    b.append(i)

    
c=[]
iL=[]

def read_list(stl,start_sym = '[', end_sym =']', param = "JOINING", excp_syms = ('(',")"), remv_syms = ('\n'," ")):

    i = 0
    while True:        
        if not type(stl) == list:
            print("ERROR? : This type is not the list-type")
            break #case1
            
        if i > len(stl)-1:
            break #case2
            
        elif stl[i] == str(start_sym):
            c.append(i)
            i += 1    #case3-A

            
        elif stl[i] == str(end_sym):
            if c == []:
                print("ERROR? : start symbol-end symbol is not matched.")
                print(i,iL)
                i += 1
            else:
                nl,_ = (c[-1],0)
                nh,_ = (i,0)
                STL = list(stl[nl+1:nh])
                stl = stl[:nl] + [STL] + stl[nh+1:]
                c.pop()
                iL.append(nl)
                stl[nl] = read_list(stl[nl],start_sym,end_sym,param,excp_syms,remv_syms)
                i,_ = iL[-1],0
                iL.pop()
                i += 1    #case3-B
            
        elif type(stl[i]) == str:
            if (param == False):
                i += 1
            else:
                if stl[i] in excp_syms:
                    i += 1    #case4-A
                elif stl[i] in remv_syms:
                    stl.pop(i)    #case4-B: count doesnot proceed by removing
                    
                elif (param == "NOT JOINING"):
                    i += 1                                    
                elif i > len(stl)-2:
                    i += 1
                elif not(type(stl[i+1]) == str):
                    i += 1                
                else:              
                    if ((stl[i+1] == str(start_sym)) or (stl[i+1] == str(end_sym))):
                        i += 1    #case4-A
                    else:                           
                        if stl[i+1] in excp_syms:
                                i += 1    #case4-A
              
                        elif stl[i+1] in remv_syms:
                            stl.pop(i+1)    #case4-B: count doesnot proceed by removing
                            
                        else:
                            stl[i] = stl[i]+stl[i+1]
                            stl.pop(i+1)    #case4-C: count doesnot proceed by join&pop
                    
                    
        elif type(stl[i]) == list:
            iL.append(i)
            stl[i] = read_list(stl[i],start_sym,end_sym,param,excp_syms,remv_syms)
            i,_ = iL[-1],0
            iL.pop()
            i += 1
            
        
        else:
            i += 1
            
    return stl


b2 = read_list(b,start_sym ='(', end_sym =')', param = "JOINING", excp_syms = ['[',"]",',',"'"],remv_syms = ['\n'," "])

b3 = read_list(b2,start_sym ='[', end_sym =']', param = "JOINING", excp_syms = [',',"'"],remv_syms = ['\n'," "])

b4 = read_list(b3,start_sym ='*', end_sym ='*', param = "NOT JOINING", excp_syms = [],remv_syms = [',',"'"])
pprint.pprint(b4)

これで、たとえば第406項を取ると、

In :
b4[0][406]

...

Out :

['602.5981908',
 [['36.042126', '139.399959', '91437.0', ['埼玉県'], ['東松山市']],
  ['35.95717', '139.402905', '101679.0', ['埼玉県'], ['坂戸市']],
  ['35.934515', '139.393098', '70255.0', ['埼玉県'], ['鶴ヶ島市']],
  ['35.852942', '139.412213', '152405.0', ['埼玉県'], ['狭山市']],
  ['35.835766', '139.391058', '148390.0', ['埼玉県'], ['入間市']],
  ['35.855731', '139.327734', '80715.0', ['埼玉県'], ['飯能市']],
  ['35.907796', '139.339026', '56520.0', ['埼玉県'], ['日高市']],
  ['35.666339', '139.315806', '577513.0', ['東京都'], ['八王子市']],
  ['35.705755', '139.353548', '111539.0', ['東京都'], ['昭島市']],
  ['35.787996', '139.27583', '139232.0', ['東京都'], ['青梅市']],
  ['35.72892', '139.294119', '80954.0', ['東京都'], ['あきる野市']],
  ['35.738451', '139.326932', '58395.0', ['東京都'], ['福生市']],
  ['35.767222', '139.310944', '55833.0', ['東京都'], ['羽村市']],
  ['35.799672', '139.46861', '340386.0', ['埼玉県'], ['所沢市']],
  ['35.754597', '139.468489', '149956.0', ['東京都'], ['東村山市']],
  ['35.728577', '139.477456', '190005.0', ['東京都'], ['小平市']],
  ['35.710335', '139.463191', '122742.0', ['東京都'], ['国分寺市']],
  ['35.637004', '139.446307', '146631.0', ['東京都'], ['多摩市']],
  ['35.683885', '139.44138', '73655.0', ['東京都'], ['国立市']],
  ['35.671337', '139.394926', '186283.0', ['東京都'], ['日野市']],
  ['35.754861', '139.387399', '71229.0', ['東京都'], ['武蔵村山市']],
  ['35.714014', '139.407843', '176295.0', ['東京都'], ['立川市']],
  ['35.745369', '139.426593', '85157.0', ['東京都'], ['東大和市']]],
 [['35.637004', '139.446307'],
  ['35.666339', '139.315806'],
  ['35.72892', '139.294119'],
  ['35.787996', '139.27583'],
  ['36.042126', '139.399959'],
  ['35.799672', '139.46861'],
  ['35.728577', '139.477456']]]

となる。この各項は各クラスターグループの情報を表し、
b4[0][406][0]がクラスターの偏差二乗和値、
b4[0][406][1]がクラスターに含まれるグループ、
b4[0][406][2]がクラスターの凸包多角形の頂点座標の一順を記述するリスト。

⑥Matplotlibで可視化

plt.figure(figsize=(35,35), dpi = 450)
ax = plt.gca()
​
ax.set_xlim(137,141)
ax.set_ylim(34,38)
​
plys=[]
for p in b5[0]:
    if len(p[2])>2:
        poly = Polygon(xy = p[2], fc='orange', ec='k', alpha = 0.15, linewidth =0.05)
        plys.append(poly)
    p[1]
for p in plys:
    ax.add_patch(p)
    
plt.text(135,40,"North Center(135,40)",fontsize=1)
for spot_id in range(len(Xbox)):
    if Pbox[spot_id] < 200000:
        plt.text(Xbox[spot_id],Ybox[spot_id], Nbox[spot_id]+":"+str(int(Pbox[spot_id])), fontsize=2, alpha =0.3)
    elif Pbox[spot_id] < 500000:
        plt.text(Xbox[spot_id],Ybox[spot_id], Nbox[spot_id]+":"+str(int(Pbox[spot_id])), fontsize=5, alpha =0.8)
    else:
         plt.text(Xbox[spot_id],Ybox[spot_id], Nbox[spot_id]+":"+str(int(Pbox[spot_id])), fontsize=7)
plt.text(135,35,"The Center(135,35)",fontsize=1)
    
​
plt.axis('scaled') 
ax.set_aspect('equal')
    
plt.savefig('JapanTokyo.png')
​

部分拡大して取り込みたければ、plt.axis('scaled') の部分をなくしてあげると良い。

⑦改善点

横浜市大阪市などは、「区」が重要になってくるのだけれどもそれを省いて今回はクラスタリングしています。
・本来だったら、クラスターに制限をかけて、ある一定範囲の面積内にするとか、人口をカウントしたうえで、大きい人口の場所が小さい人口の場所を取り込むようにした方がいい気もする
・愛媛の宇和島市、岐阜の高山市のような、5~10万人規模の都市で「近隣都市」と呼べるような周囲の都市が存在しない都市があり、あるていどクラスタリングが進んだ後の地域間のクラスタリングに影響を与えている
・静岡浜松は愛知との結びつきの方が強いイメージだが、関東圏としてクラスタリングされている
・山陰地方の扱いが雑い。山陰の中での結びつきが軽視されている。やはり2次元座標だと、山間部かどうかを考慮していないから?

今回初めて、何かしらのデータを可視化することに挑戦してみました。データ自体の信頼性とかは二の次で、一通りのフローを達成できたので満足です。
それにしても難しいね。

【画像投稿テスト】パワーポイントとA4文書とで互換性のある資料を作るための寸法表

 

f:id:skddiploma:20190512230242j:plain

テスト1

ひとつのまとまった規格のなかにどれだけのコンテンツを詰め込めるかをざっくり捉えるために作った参考画像。

もともと学科のときはA2~A0のフォーマットや、寸法自由のプレゼンボード(1500~8000mm*1500~2500mm)でモノを表現していたのに、院生になったとたんビジネスフォーマットにがらりとアウトプットが変わった。

ポートフォリオがあったからまだ良かったけれど、学生活動でパワポを使う経験をしてこなかったので表現の仕方が分からなくて困っている。

 

 

じぶんは慣例的に書類レイアウトはイラレで行うが、印刷するときのことを考えて余白外周7㎜とっている。理由は一応あって、①自分の使っている印刷機で、きれいに印刷できる余白幅だから ②仮に冊子止めしたりキンコーズで製本するときに使いやすい余白幅だから ということだ

 

A4の中にざっくり入るコンテンツ量は、多くて2500字程度とみていいだろう。

 

A4を、縦3分割、横4分割すると、約65㎜×約94㎜の計12個の領域に分けられる

この1領域を、文字で埋め尽くすとすれば、以下のようになる。(いずれも遊ゴ調べ)

最小印刷可能文字:6pt … 18行、約500字

中見出し文字: 14pt  …   8行、約100字

大見出し文字: 17.5pt  …    6行、約50字

つまり、虫のような字でガンガンに詰めたら6000字はいるし、見出し文字だけでパワポのボードみたいに制作すれば1200字になる。

 

まわしの利く資料を作りたいなら、エクセルやワードとの互換を考え、ある程度行間・字間を広くした方が易読になるだろう。イラレでいえば字間+70~+150がおススメ

 

パワーポイントのボードは、8.5pt・14pt・17.5ptの文字の大きさでおおよそのメインコンテンツは制作できる。このポイント数をイラレのpt値と共通化させたいならば、ボードの大きさは 【280㎜*210㎜】にするとよい。

こうすることで、文字・写真だけでなく、細かい地図資料を縮尺整理しながらパワポ資料に乗せたりできる。

その際の細かい大きさ関係は、上のフォーマットで比較できるようになっている。

 

以上です。

せっかく頑張って積めた資料でも、

小さい文字は誰も読んでくれないのを感じる今日この頃。

まちのクラスタリングをやりたい(1)

「【まち】を北から順に網羅的に整理したいな」

 

ということで、いろいろ試してみることにした。

 

・まず、都道府県レベルで。データ元はこちら。

uub.jp

 

これを見た感じでは、「東京の位置」を妥当に示しているのは、北端だけということになる。ということで、北端の緯度経度を採用。

経度順位   経度 緯度
1 北海道 148.75222 45.55722
2 岩手県 141.6825 40.45055
3 宮城県 141.50861 39.00277
4 青森県 140.91166 41.55611
5 秋田県 140.87694 40.51111
6 茨城県 140.58611 36.94527
7 福島県 140.28 37.97666
8 栃木県 139.95277 37.155
9 千葉県 139.78666 36.10388
10 山形県 139.55055 39.20861
11 新潟県 139.54944 38.55333
12 神奈川県 139.13361 35.67277
13 埼玉県 139.12972 36.28333
14 群馬県 139.09694 37.05861
15 東京都 139.01833 35.89833
16 長野県 138.52361 37.03027
17 山梨県 138.37305 35.97166
18 静岡県 138.22833 35.64583
19 富山県 137.635 36.98027
20 岐阜県 137.27888 36.465
21 愛知県 136.99 35.425
22 石川県 136.92194 37.85527
23 三重県 136.52833 35.25777
24 福井県 136.24416 36.29555
25 滋賀県 136.17472 35.70361
26 奈良県 135.71138 34.78138
27 和歌山県 135.62 34.38444
28 大阪府 135.35166 35.05138
29 京都府 135.22361 35.77916
30 兵庫県 134.76472 35.67472
31 徳島県 134.60583 34.25194
32 鳥取県 134.37 35.61444
33 香川県 134.34666 34.56472
34 岡山県 133.99777 35.35277
35 高知県 133.64416 33.88333
36 愛媛県 133.27472 34.30166
37 広島県 132.88833 35.10555
38 島根県 131.865 37.24416
39 宮崎県 131.76666 32.83888
40 大分県 131.66777 33.74055
41 山口県 131.13083 34.79861
42 熊本県 131.05972 33.19527
43 鹿児島県 130.25027 32.31055
44 福岡県 130.11194 34.25
45 佐賀県 129.8625 33.61916
46 長崎県 129.45694 34.7275
47 沖縄県 128.22222 27.88555

経度順に、東→西に並べた*1

北海道地域→東北と関東→中央高地と東海と北陸→近畿圏→四国中国→九州と並んでいるような気もする。

せっかくだからまとまりも見ておこう

久しぶりにプログラミング言語を利用する

 

#!/usr/bin/python
# coding: UTF-8
import os
os.getcwd()

os.listdir('C:\\Users\\*****\\Desktop')

バックスラッシュを2つにしなかったら、エスケープと間違えられて怒られた。自分の開きたいファイルがあることを確認。

 

os.chdir('C:\\Users\\*****\\Desktop')

 

f = open('ward.txt', mode='r', encoding='utf-8')

text = f.readlines()
print(text)

 

ここでデコードエラー。仕方のないので調べて、

 

import pandas as pd
import codecs

with codecs.open("****.txt", "r", "Shift-JIS", "ignore") as file:
df = pd.read_table(file, header=None)
print(df)

 

反応した。おけ。

パンダのオブジェクトを、普通のリストに戻す。

 

dfstr=str(df)
d = dfstr.split('\n')

 

a=
for x in d:
    a.append(x.split())

 

a.pop(0)
print(a)

 

これで、出てきたプリントが、

[['0', '[北海道]', '148.75222', '45.55722'], ['1', '[岩手県]', '141.68250', '40.45055'], ['2', '[宮城県]', '141.50861', '39.00277'], ['3', '[青森県]', '140.91166', '41.55611'], ['4', '[秋田県]', '140.87694', '40.51111'], ['5', '[茨城県]', '140.58611', '36.94527'], ['6', '[福島県]', '140.28000', '37.97666'], ['7', '[栃木県]', '139.95277', '37.15500'], ['8', '[千葉県]', '139.78666', '36.10388'], ['9', '[山形県]', '139.55055', '39.20861'], ['10', '[新潟県]', '139.54944', '38.55333'], ['11', '[神奈川県]', '139.13361', '35.67277'], ['12', '[埼玉県]', '139.12972', '36.28333'], ['13', '[群馬県]', '139.09694', '37.05861'], ['14', '[東京都]', '139.01833', '35.89833'], ['15', '[長野県]', '138.52361', '37.03027'], ['16', '[山梨県]', '138.37305', '35.97166'], ['17', '[静岡県]', '138.22833', '35.64583'], ['18', '[富山県]', '137.63500', '36.98027'], ['19', '[岐阜県]', '137.27888', '36.46500'], ['20', '[愛知県]', '136.99000', '35.42500'], ['21', '[石川県]', '136.92194', '37.85527'], ['22', '[三重県]', '136.52833', '35.25777'], ['23', '[福井県]', '136.24416', '36.29555'], ['24', '[滋賀県]', '136.17472', '35.70361'], ['25', '[奈良県]', '135.71138', '34.78138'], ['26', '[和歌山県]', '135.62000', '34.38444'], ['27', '[大阪府]', '135.35166', '35.05138'], ['28', '[京都府]', '135.22361', '35.77916'], ['29', '[兵庫県]', '134.76472', '35.67472'], ['30', '[徳島県]', '134.60583', '34.25194'], ['31', '[鳥取県]', '134.37000', '35.61444'], ['32', '[香川県]', '134.34666', '34.56472'], ['33', '[岡山県]', '133.99777', '35.35277'], ['34', '[高知県]', '133.64416', '33.88333'], ['35', '[愛媛県]', '133.27472', '34.30166'], ['36', '[広島県]', '132.88833', '35.10555'], ['37', '[島根県]', '131.86500', '37.24416'], ['38', '[宮崎県]', '131.76666', '32.83888'], ['39', '[大分県]', '131.66777', '33.74055'], ['40', '[山口県]', '131.13083', '34.79861'], ['41', '[熊本県]', '131.05972', '33.19527'], ['42', '[鹿児島県]', '130.25027', '32.31055'], ['43', '[福岡県]', '130.11194', '34.25000'], ['44', '[佐賀県]', '129.86250', '33.61916'], ['45', '[長崎県]', '129.45694', '34.72750'], ['46', '[沖縄県]', '128.22222', '27.88555']]

 

いい感じ。

 

ward法の実装は少し困ったけど、以下のようにやった

 

def DSfor(C):
    x = 0.0
    y = 0.0
    c = 0.0
    for i in C:
        x = x + i[2]
        y = y + i[3]
        c = c + 1.0
    xmean = x/c
    ymean = y/c
    Ax = 0.0
    Ay = 0.0
    for i in C:
        Ax = Ax + (i[2] - xmean)**2.0
        Ay = Ay + (i[3] - ymean)**2.0
    return (Ax,Ay)

 

def J(g,h,U):
    C = U[g]+U[h]
    RevS =
    DSRevX = 0.0
    DSRevY = 0.0
    d = 0
    for i in U:
        if(not (d == g or d == h)):
            RevS.append(d)
            DSRevX = DSRevX + DSfor(i)[0]
            DSRevY = DSRevY + DSfor(i)[1]
            d = d + 1
    DSsumX = DSRevX + DSfor(C)[0]
    DSsumY = DSRevY + DSfor(C)[1]
    return (DSsumX,DSsumY)

 

inta =
for i in a:
    inta.append([i[0],i[1],float(i[2]),float(i[3])])
print(inta)

・型がstrのままだったので、少数に直す。

INTA =
for i in inta:
    INTA.append([i])
print(INTA)

・Jの定義に合わせて、一段階リストを深くする。

 

def updateU(U):
    minDS = J(0,1,U)
    ug1 = 0
    ug2 = 1
    for i in range(len(U)):
        for j in range(len(U)):
            if(not i == j):
                if(J(i,j,U) < minDS):
                minDS = J(i,j,U)
                ug1 = i
                ug2 = j
                print*2
    print(minDS)
    V = []
    for i2 in range(len(U)):
        if(not (i2 == ug1 or i2 == ug2)):
            V.append(U[i2])
            V.append(U[ug1]+U[ug2])
    return V

 

ここまでで実装。あとはデンドログラムを描くために何度もクラスターをまとめ上げていく。

import pprint
b = INTA
for i in range(46):
    b = updateU(b)
    pprint.pprint(b)

 

クラスター分析の結果。。

 

【北海道】北海道
【東北東日本】岩手・宮城・青森・秋田・茨城・福島
【関東】山形・新潟・栃木・千葉・東京・群馬・神奈川・埼玉
【東海】長野・山梨・静岡
【中部】愛知・石川・富山・岐阜
【近畿】三重・福井・滋賀・奈良・和歌山・大阪・京都
【中国四国】鳥取・香川・兵庫・徳島・岡山・高知・愛媛・広島
【九州中国】大分・島根・宮崎・山口・熊本
【九州】長崎・佐賀・鹿児島・福岡
【沖縄】沖縄

 

なるほど、九州と中国のあたりが地域的に混濁してる。

鹿児島の北端の獅子島が、長崎の方に近いので、西九州として佐賀・長崎に括られるのか。

茨城→東北クラスター、山形→関東クラスターなども、地図上では新鮮。

 

 

ここで、北端の位置座標ではなく、他のデータで同じようにクラスタリングをしてみる。

 

・都道府県庁の、所在地の経度緯度を利用したクラスタリング

都道府県庁の緯度経度は、以下のサイトより引用。

【みんなの知識 ちょっと便利帳】都道府県庁所在地 緯度経度データ - 各都市からの方位地図 - 10進数/60進数での座標・世界測地系(WGS84)

 

とりあえずやってみる。

【北関東北陸】茨木・群馬・栃木・石川・富山・長野
【首都山陰筋】埼玉・福井・千葉・東京・山梨・岐阜・鳥取・神奈川・島根
【南東北】宮城・山形・福島・新潟
【北海道】北海道
【北東北】青森・岩手・秋田
【沖縄】沖縄
【南九州】宮崎・鹿児島
【北九州】長崎・熊本・佐賀・大分・愛媛・高知・福岡
【瀬戸内】徳島・和歌山・山口・広島・香川
【近畿筋】三重・兵庫・大阪・奈良・岡山・愛知・静岡・滋賀・京都

 

すると、東北がかなり独立する。また、緯度が同じに推移している首都圏と山陰が同じグループになっている。明らかにおかしなクラスターができてしまった。

 

…なんかプログラムかアルゴリズムかどっちかミスってそう。

確認してみると、偏差平方和の定義がおかしくなっていることに気づいた。

そこでDSfor の出力をAx+Ayにする。緯度経度は単位長がほぼ同じなので、標準化する必要もないと判断。合わせて他の部分も調整した。

 

結果、修正版。

【北海道】北海道
【北部東北】青森・岩手・秋田
【南部東北】宮城・山形・福島
【関東】東京・埼玉・神奈川・千葉・茨城・栃木
【東海】山梨・静岡
【信越】新潟・群馬・長野
【中部】愛知・岐阜・三重・石川・富山・福井
【近畿】滋賀・京都・大阪・奈良・兵庫・和歌山
【瀬戸内】岡山・香川・徳島・鳥取・島根
【中国四国】広島・愛媛・高知・山口・大分
【九州北】福岡・佐賀・熊本・長崎
【九州南】宮崎・鹿児島
【沖縄】沖縄

かなり常識的なクラスタリングに近づいた。今までのは、直感的に違和感のあるクラスタリングだったが、今回はかなり納得度が高い。

 

ここまできて、このやり方で一応妥当な括り方はできると感じた。

もちろん課題は残っている。

・xyパラメータで考えているため、山間部・海上・平野部の地形的重みづけができていない。国土に割と道路が張り巡らされているために何とかなっているが、単純距離は改良の余地あり。

・理想でいうならば、国土交通網からなるグラフを描き、グラフ理論のやり方でクラスター分析したい、、、が、そのような形式のデータは準備できていない

・鉄道情報でも同様のことがいえる。

 

まあこれらの課題は置いておく。

次にやりたいのは、都道府県庁所在地となっているまち(N=47)から、人口5万人以上の都市(N=543)への拡張だ。

 

これは次の記事で扱う。

 

 

 

*1:ここに脚注を書きます

*2:i,j