Avec e-Stat, vous pouvez utiliser une API pour acquérir diverses données statistiques fournies par le gouvernement en XML ou JSON.
Après avoir complété la demande d'inscription à l'API, vous pourrez vous connecter avec votre «adresse e-mail» et votre «mot de passe».
https://www.e-stat.go.jp/api/apiuser/php/index.php?action=login
https://www.e-stat.go.jp/api/apiuser/php/index.php?action=login
Dans la modification des informations utilisateur, vous pouvez modifier les données spécifiées au moment de l'enregistrement.
Si l'URL n'existe pas, entrez "http: // localhost /" etc. Vous pouvez émettre jusqu'à 3 appID.
Cela rend le "Formulaire de test de fonction API" et "Exemple" disponibles.
Vous pouvez vérifier la fonction de chaque API sur le formulaire de test de la fonction API. De plus, les spécifications de l'API peuvent être utilisées à partir de l'écran ci-dessous.
http://www.e-stat.go.jp/api/api-info/api-spec/
Il existe quatre types d'API pouvant être utilisés.
・ Acquisition d'informations de table statistique Obtenir les informations du tableau statistique fourni par le Compteur général des statistiques gouvernementales (e-Stat). Il est également possible d'acquérir des informations avec des conditions restreintes en spécifiant des paramètres de requête.
・ Acquisition de méta-informations Acquiert des méta-informations (éléments de table, éléments de classification, éléments régionaux, etc.) correspondant à l'ID de table statistique spécifié.
· L'acquisition des données Acquiert des données statistiques (données numériques) correspondant à l'ID de table statistique ou à l'ID d'ensemble de données spécifié. Il est également possible d'acquérir des informations avec des conditions restreintes en spécifiant des paramètres de requête. Ces données sont disponibles en XML et JSON.
・ Enregistrement de l'ensemble de données Enregistrez les conditions d'acquisition pour l'acquisition de données statistiques. Vous pouvez omettre les conditions d'acquisition en spécifiant les conditions de rétrécissement pour l'acquisition de données statistiques en tant qu '«ensemble de données».
・ Reportez-vous au jeu de données Reportez-vous aux conditions de filtrage de l'ensemble de données enregistré. Si l'ID de l'ensemble de données n'est pas spécifié, vous pouvez voir la liste des ensembles de données pouvant être utilisés par l'utilisateur.
L'utilisation de base est la suivante. Recherchez la table statistique avec «Obtenir des informations de table statistique», obtenez l'ID de la table statistique, obtenez les méta-informations avec «Obtenir des méta-informations», puis obtenez les données statistiques avec «Obtenir des données».
Ce script obtient les informations de la table statistique. Exécutez en spécifiant API_KEY, le type de données de recherche et le mot clé de recherche. Les types de données de recherche sont les suivants. ・ 1: informations statistiques (valeur par défaut) ・ 2: Petite zone / maillage régional ・ 3: Système social / démographique (préfectures / communes)
Exemple de code:
getStatsListSample.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import urllib2
from lxml import etree
import sys
import codecs
#Pour les fenêtres...
sys.stdout = codecs.getwriter('cp932')(sys.stdout)
def main(argvs, argc):
if argc != 4:
print ("Usage #python %s api_key search_kind key_word" % argvs[0])
return 1
api_key = argvs[1]
search_kind = argvs[2]
#Pour les fenêtres...
key_word = argvs[3].decode('cp932')
key_word = urllib.quote(key_word.encode('utf-8'))
url = ('http://api.e-stat.go.jp/rest/1.0/app/getStatsList?appId=%s&lang=J&searchKind=%s&searchWord=%s' % (api_key, search_kind, key_word))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
result = root.find('RESULT')
print ('RESULT==============')
print (result.find('STATUS').text)
print (result.find('ERROR_MSG').text)
print (result.find('DATE').text)
data_list = root.find('DATALIST_INF')
list_infs = data_list.xpath('.//LIST_INF')
for list_inf in list_infs:
print '--------------'
print (u'ID de la table statistique:%s' % (list_inf.get('id')))
stat_name = list_inf.find('STAT_NAME')
if stat_name is not None:
print (u'Nom des statistiques gouvernementales:%s %s' % (stat_name.get('code'), stat_name.text))
gov_org = list_inf.find('GOV_ORG')
if gov_org is not None:
print (u'Nom du créateur:%s %s' % (gov_org.get('code'), gov_org.text))
statistics_name = list_inf.find('STATISTICS_NAME')
if statistics_name is not None:
print (u'Nom statistique fourni et nom de classification fourni:%s' % (statistics_name.text))
title = list_inf.find('TITLE')
if title is not None:
print (u'Titre:%s %s' % (title.get('no'), title.text))
cycle = list_inf.find('CYCLE')
if cycle is not None:
print (u'Cycle de l'offre:%s' % (cycle.text))
survey_date = list_inf.find('SURVEY_DATE')
if survey_date is not None:
print (u'Date de l'enquête:%s' % (survey_date.text))
open_date = list_inf.find('OPEN_DATE')
if open_date is not None:
print (u'date de sortie:%s' % (open_date.text))
small_area = list_inf.find('SMALL_AREA')
if small_area is not None:
print (u'Attributs sous-régionaux:%s' % (small_area.text))
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
sys.exit(main(argvs, argc))
Exemple d'utilisation:
python getStatsListSample.py API_Emploi CLÉ 1
Résultat de sortie:
ID de la table statistique:0003059047
Nom des statistiques gouvernementales:00550100 Enquête de base du Ministère de l'économie, du commerce et de l'industrie sur les activités des entreprises
Nom du créateur:00550 Ministère de l'économie, du commerce et de l'industrie
Nom statistique fourni et nom de classification fourni:Enquête de base du ministère de l'Économie, du Commerce et de l'Industrie sur les activités des entreprises Tableau statistique - Liste confirmée (données)
Rapport de confirmation de l'enquête de base sur l'activité des entreprises 2010 - Résultats 2009-
Titre:1-8 Tableau statistique (Volume 1) [Tableau concernant l'organisation de l'entreprise] Tableau 8: Par industrie, nombre d'entreprises, organisation de l'entreprise
Nombre d'employés différents
Cycle de l'offre:Annuel
Date de l'enquête:201001-201012
date de sortie:2012-03-31
Attributs sous-régionaux:0
L'ID de table statistique "0003059047" est l'ID qui peut être utilisé pour l'acquisition de données.
Ce script obtient les méta-informations pour l'ID statistique spécifié. Les méta-informations sont acquises à l'aide de l'ID de table statistique qui était la recherche des informations de table statistique en tant que paramètre.
Exemple de code:
getMetaSample.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import urllib2
from lxml import etree
import sys
import codecs
#Pour les fenêtres...
sys.stdout = codecs.getwriter('cp932')(sys.stdout)
def get_meta_data(api_key, stats_data_id):
"""
Obtenir des méta-informations
"""
url = ('http://api.e-stat.go.jp/rest/1.0/app/getMetaInfo?appId=%s&lang=J&statsDataId=%s' % (api_key, stats_data_id))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
class_object_tags = root.xpath('//METADATA_INF/CLASS_INF/CLASS_OBJ')
class_object = {}
for class_object_tag in class_object_tags:
class_object_id = class_object_tag.get('id')
class_object_name = class_object_tag.get('name')
class_object_item = {
'id' : class_object_id,
'name' : class_object_name,
'objects' : {}
}
class_tags = class_object_tag.xpath('.//CLASS')
for class_tag in class_tags:
class_item = {
'code' : class_tag.get('code'),
'name' : class_tag.get('name'),
'level' : class_tag.get('level'),
'unit' : class_tag.get('unit')
}
class_object_item['objects'][class_item['code']] = class_item
class_object[class_object_id] = class_object_item
return class_object
def main(argvs, argc):
if argc != 3:
print ("Usage #python %s api_key stats_id" % argvs[0])
return 1
api_key = argvs[1]
stats_id = argvs[2]
ret = get_meta_data(api_key, stats_id)
for key in ret:
print ('======================')
print (key)
print ('name: %s' % ret[key]['name'])
for obj_code, obj in ret[key]['objects'].items():
print ('----------------------')
print ('code: %s' % obj_code)
print ('name: %s' % obj['name'])
print ('unit: %s' % obj['unit'])
print ('level: %s' % obj['level'])
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
sys.exit(main(argvs, argc))
Exemple d'utilisation:
python getMetaSample.py API_KEY 0003059047
Exemple de sortie:
======================
cat01
name: 22_1-8 Nombre d'entreprises, nombre d'employés par organisation commerciale
----------------------
code: 0011000
name:Nombre de salariés permanents (hors salariés détachés) Siège / siège Direction fonctionnelle Siège Autres
unit: None
level: 1
----------------------
code: 0029000
name:Nombre de salariés permanents (y compris les salariés détachés) Salariés détachés auprès d'autres entreprises, etc.
unit: None
level: 1
Dans les méta-informations, la catégorie utilisée par le tableau statistique pertinent et les valeurs pouvant être prises par cette catégorie sont affichées.
Cet exemple montre un échantillon qui génère un tableau statistique au format CSV. Si vous spécifiez l'ID de la table statistique et le chemin de sortie CSV, la table statistique spécifiée est sortie au format CSV.
Exemple de code:
export_csv.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import urllib2
from lxml import etree
import csv
def export_statical_data(writer, api_key, stats_data_id, class_object, start_position):
"""
Statistiques d'exportation
"""
url = ('http://api.e-stat.go.jp/rest/1.0/app/getStatsData?limit=10000&appId=%s&lang=J&statsDataId=%s&metaGetFlg=N&cntGetFlg=N' % (api_key, stats_data_id))
if start_position > 0:
url = url + ('&startPosition=%d' % start_position)
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
row = []
datas = {}
value_tags = root.xpath('//STATISTICAL_DATA/DATA_INF/VALUE')
for value_tag in value_tags:
row = []
for key in class_object:
val = value_tag.get(key)
if val in class_object[key]['objects']:
level = '';
if 'level' in class_object[key]['objects'][val]:
if class_object[key]['objects'][val]['level'].isdigit():
level = ' ' * (int(class_object[key]['objects'][val]['level']) - 1)
text = ("%s%s" % (level , class_object[key]['objects'][val]['name']))
row.append(text.encode('utf-8'))
else:
row.append(val.encode('utf-8'))
row.append(value_tag.text)
writer.writerow(row)
next_tags = root.xpath('//STATISTICAL_DATA/TABLE_INF/NEXT_KEY')
if next_tags:
if next_tags[0].text:
export_statical_data(writer, api_key, stats_data_id, class_object, int(next_tags[0].text))
def get_meta_data(api_key, stats_data_id):
"""
Obtenir des méta-informations
"""
url = ('http://api.e-stat.go.jp/rest/1.0/app/getMetaInfo?appId=%s&lang=J&statsDataId=%s' % (api_key, stats_data_id))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
class_object_tags = root.xpath('//METADATA_INF/CLASS_INF/CLASS_OBJ')
class_object = {}
for class_object_tag in class_object_tags:
class_object_id = class_object_tag.get('id')
class_object_name = class_object_tag.get('name')
class_object_item = {
'id' : class_object_id,
'name' : class_object_name,
'objects' : {}
}
class_tags = class_object_tag.xpath('.//CLASS')
for class_tag in class_tags:
class_item = {
'code' : class_tag.get('code'),
'name' : class_tag.get('name'),
'level' : class_tag.get('level'),
'unit' : class_tag.get('unit')
}
class_object_item['objects'][class_item['code']] = class_item
class_object[class_object_id] = class_object_item
return class_object
def export_csv(api_key, stats_data_id, output_path):
"""
Exporter les statistiques spécifiées au format CSV.
"""
writer = csv.writer(open(output_path, 'wb'),quoting=csv.QUOTE_ALL)
class_object = get_meta_data(api_key, stats_data_id)
row = []
for key in class_object:
title = class_object[key]['name']
row.append(title.encode('utf-8'))
row.append('VALUE')
writer.writerow(row)
export_statical_data(writer, api_key, stats_data_id, class_object, 1)
def main(argvs, argc):
if argc != 4:
print ("Usage #python %s api_key stats_data_id output_path" % argvs[0])
return 1
api_key = argvs[1]
stats_data_id = argvs[2]
output_path = argvs[3]
export_csv(api_key, stats_data_id, output_path)
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
sys.exit(main(argvs, argc))
Exemple d'utilisation:
python export_csv.py API_KEY 0003059047 output.csv
Exemple de sortie:
"22_1-8 Nombre d'entreprises, nombre d'employés par organisation commerciale","22_1-8 industries","VALUE"
"Nombre d'entreprises","2005","27677"
"Nombre d'entreprises","2006","27917"
"Nombre d'entreprises","2007","29080"
"Nombre d'entreprises","2008","29355"
"Nombre d'entreprises","2009","29096"
"Nombre d'entreprises","Total total","29096"
"Nombre d'entreprises","total","27871"
"Nombre d'entreprises","Exploitation minière, exploitation en carrière, récolte de gravier","36"
"Nombre d'entreprises","Industrie manufacturière","13105"
"Nombre d'entreprises","090 Industrie de la fabrication de produits alimentaires","1498"
"Nombre d'entreprises","091 Industrie de la fabrication d'aliments pour le bétail","285"
"Nombre d'entreprises","092 Industrie de la fabrication d'aliments pour la pêche","222"
"Nombre d'entreprises","093 Industrie de la meunerie et des céréales","37"
Les statistiques de maillage de surface divisent la zone en zones de maillage sans espaces en fonction de la latitude et de la longitude, et organisent les données statistiques dans chaque zone. La figure ci-dessous est illustrée.
Exemple de code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import urllib
import urllib2
from lxml import etree
import csv
from collections import defaultdict
import json
from matplotlib import pyplot
import numpy as np
from math import *
def draw_heatmap(data):
#dessiner
fig, ax = pyplot.subplots()
heatmap = ax.pcolor(data, cmap=pyplot.cm.Blues)
ax.set_xticks(np.arange(data.shape[0]) + 0.5, minor=False)
ax.set_yticks(np.arange(data.shape[1]) + 0.5, minor=False)
ax.invert_yaxis()
ax.xaxis.tick_top()
pyplot.savefig('image.png')
pyplot.show()
return heatmap
def get_meta_data(api_key, stats_data_id):
"""
Obtenir des méta-informations
"""
url = ('http://api.e-stat.go.jp/rest/1.0/app/getMetaInfo?appId=%s&lang=J&statsDataId=%s' % (api_key, stats_data_id))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
class_object_tags = root.xpath('//METADATA_INF/CLASS_INF/CLASS_OBJ')
class_object = {}
for class_object_tag in class_object_tags:
class_object_id = class_object_tag.get('id')
class_object_name = class_object_tag.get('name')
class_object_item = {
'id' : class_object_id,
'name' : class_object_name,
'objects' : {}
}
class_tags = class_object_tag.xpath('.//CLASS')
for class_tag in class_tags:
class_item = {
'code' : class_tag.get('code'),
'name' : class_tag.get('name'),
'level' : class_tag.get('level'),
'unit' : class_tag.get('unit')
}
class_object_item['objects'][class_item['code']] = class_item
class_object[class_object_id] = class_object_item
return class_object
def get_stats_list(api_key, search_kind, key_word):
key_word = urllib.quote(key_word.encode('utf-8'))
url = ('http://api.e-stat.go.jp/rest/1.0/app/getStatsList?appId=%s&lang=J&searchKind=%s&searchWord=%s' % (api_key, search_kind, key_word))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
ret = []
data_list = root.find('DATALIST_INF')
list_infs = data_list.xpath('.//LIST_INF')
for list_inf in list_infs:
item = {
'id': list_inf.get('id')
}
stat_name = list_inf.find('STAT_NAME')
if stat_name is not None:
item['stat_name'] = stat_name.text
item['stat_name_code'] = stat_name.get('code')
gov_org = list_inf.find('GOV_ORG')
if gov_org is not None:
item['gov_org'] = gov_org.text
item['gov_org_code'] = gov_org.get('code')
statistics_name = list_inf.find('STATISTICS_NAME')
if statistics_name is not None:
item['statistics_name'] = statistics_name.text
title = list_inf.find('TITLE')
if title is not None:
item['title'] = title.text
cycle = list_inf.find('CYCLE')
if cycle is not None:
item['cycle'] = cycle.text
survey_date = list_inf.find('SURVEY_DATE')
if survey_date is not None:
item['survey_date'] = survey_date.text
open_date = list_inf.find('OPEN_DATE')
if open_date is not None:
item['open_date'] = open_date.text
small_area = list_inf.find('SMALL_AREA')
if small_area is not None:
item['small_area'] = small_area.text
ret.append(item)
return ret
def _get_stats_id_value(api_key, stats_data_id, class_object, start_position, filter_str):
"""
Obtenez des statistiques
"""
url = ('http://api.e-stat.go.jp/rest/1.0/app/getStatsData?limit=10000&appId=%s&lang=J&statsDataId=%s&metaGetFlg=N&cntGetFlg=N%s' % (api_key, stats_data_id, filter_str))
if start_position > 0:
url = url + ('&startPosition=%d' % start_position)
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
ret = []
row = {}
datas = {}
value_tags = root.xpath('//STATISTICAL_DATA/DATA_INF/VALUE')
for value_tag in value_tags:
row = {}
for key in class_object:
val = value_tag.get(key)
if val in class_object[key]['objects']:
text = class_object[key]['objects'][val]['name']
row[key] = text.encode('utf-8')
else:
row[key] = val.encode('utf-8')
row['value'] = value_tag.text
ret.append(row)
return ret
def get_stats_id_value(api_key, stats_data_id, filter_str):
class_object = get_meta_data(api_key, stats_data_id)
return _get_stats_id_value(api_key, stats_data_id, class_object, 1, filter_str), class_object
def get_stats_id_list_value(api_key, stats_data_ids, filter):
filter_str = ''
for key in filter:
filter_str += ('&%s=%s' % (key, urllib.quote(filter[key].encode('utf-8'))))
ret = []
i = 0
for stats_data_id in stats_data_ids:
list, class_object = get_stats_id_value(api_key, stats_data_id, filter_str)
ret.extend(list)
i = i + 1
if i > 5:
break
return ret
def get_mesh_id(mesh_id, kind):
if kind == 1:
return mesh_id[0:4] + '0000'
elif kind == 2:
return mesh_id[0:6] + '00'
else:
raise Exception(mesh_id)
def collect_mesh_value(api_key, stats_data_ids, filter, kind):
filter_str = ''
for key in filter:
filter_str += ('&%s=%s' % (key, urllib.quote(filter[key].encode('utf-8'))))
ret = defaultdict(float)
i = 0
for stats_data_id in stats_data_ids:
list, class_object = get_stats_id_value(api_key, stats_data_id, filter_str)
sum = 0
for row in list:
key = get_mesh_id(row['area'], kind)
v = row['value']
if v.isdigit():
ret[key] += float(v)
i = i + 1
#if i > 5:
# break
return ret
def parse_mesh_to_num(mesh_id):
ret = {}
if len(mesh_id) == 4:
ret['p'] = float(mesh_id[0:2])
ret['u'] = float(mesh_id[2:4])
ret['q'] = 0.0
ret['v'] = 0.0
ret['r'] = 0.0
ret['w'] = 0.0
return ret
elif len(mesh_id) == 8:
ret['p'] = float(mesh_id[0:2])
ret['u'] = float(mesh_id[2:4])
ret['q'] = float(mesh_id[4])
ret['v'] = float(mesh_id[5])
ret['r'] = float(mesh_id[6])
ret['w'] = float(mesh_id[7])
return ret
else:
raise Exception(mesh_id)
def convert_mesh_to_num(mesh_id):
d1 = parse_mesh_to_num(mesh_id)
#La zone secondaire est 0-7, donc multipliez par 80
x1 = (d1['u'] * 80) + (d1['v'] * 10) + d1['w'];
y1 = (d1['p'] * 80) + (d1['q'] * 10) + d1['r'];
return x1, y1
def main(argvs, argc):
wd = u'Système national d'enquête sur le recensement mondial de 2010(Maille 1KM)20101001'
# API_KEY
api_key = 'API_KEY'
search_kind = '2'
stats_list = get_stats_list(api_key, search_kind, wd)
stats_ids = []
for stats in stats_list:
stats_ids.append(stats['id'])
#Filtrer par population totale
values = collect_mesh_value(api_key, stats_ids, {'cdCat01':'T000608001'}, 2)
ret = []
max_x = 0
min_x = 9999
max_y = 0
min_y = 9999
for key in values.keys():
x, y = convert_mesh_to_num(key)
x = x
y = y
if min_x > x:
min_x = x
if max_x < x:
max_x = x
if min_y > y:
min_y = y
if max_y < y:
max_y = y
size_x = int(max_x - min_x) / 10 + 1
size_y = int(max_y - min_y) / 10 + 1
buff = [[0.0 for i in range(size_x)] for j in range(size_y)]
for key in values.keys():
x, y = convert_mesh_to_num(key)
x = int(x - min_x) / 10
y = (size_y-1) - int(y - min_y) / 10
#Si vous ne prenez pas de journal, la différence entre Tokyo et les autres régions sera si grande que vous ne pourrez pas cartographier le Japon.
buff[y][x] = log10(float(values[key]))
#print ('%s\t%s %d %d' % (key,values[key],x,y))
draw_heatmap(np.array(buff))
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
sys.exit(main(argvs, argc))
La description: Sur cette figure, la population est agrégée pour chaque seconde zone et son logarithme régulier est affiché sous forme de carte thermique.
La raison d'utiliser le logarithme régulier est que la différence de population entre la région de Kanto et les autres régions est trop grande pour faire une carte décente.
Tenter d'afficher la troisième zone (maillage standard) à l'échelle nationale consomme une énorme quantité de mémoire. La carte est trop grossière dans la première zone.
Dans cet exemple, il faut énormément de temps pour tout afficher. Dans le prochain article, nous allons essayer d'améliorer l'efficacité du traitement en sauvegardant temporairement les données dans spatialite.
** Comment afficher le maillage régional du Government Statistics Office (eStat) dans un navigateur Web ** http://qiita.com/mima_ita/items/38784095a146c87dcd23
Caractéristiques et historique des statistiques régionales de maillage: http://www.stat.go.jp/data/mesh/pdf/gaiyo1.pdf
Carte thermique par Python + matplotlib http://qiita.com/ynakayama/items/7dc01f45caf6d87a981b