0.9%の人にウケる話(多分)

"もしかしたら"話のネタになるかもです

【重要な見落としに気づかず😢】食欲の秋!…なら食費が1番高い!?

秋になりましたね。
と言うより、秋になってました💦
1年がだんだん短く感じるように
なってきました、とら良です🐯

今回の0.9%にウケる話は…

食欲の秋なら食費が一番高い!?

(…もう11月になりますが😥 )


今回も政府が公開している
e-Stat政府統計の総合窓口より
金沢市”のデータ頂きました。

【データの内容】

  • 金沢市のみ
  • 2019年の2人以上の世帯
  • 支出の中でも食費関係


2019年_金沢市の集計結果(食費)

f:id:toraii:20201027053603p:plain

12月がダントツですね
9月は第2位
10月、11月は平均以下
9月だけは食欲の秋と言えそうです🍴

(重要な見落としに気付いていない)

食費の内訳

f:id:toraii:20201027052827p:plain

各項目の
「平均」「最小」[最大」「標準偏差f:id:toraii:20201027053655p:plain

【気付いたこと】

  • 9月に多いのは穀類、酒類
  • 12月に多いのは穀類、魚介類、菓子類、調理食品、外食
  • 乳卵類は1年通して変動が少ない


【9月の推測】

  • お祭り多い?▶お酒を買う?
  • お米の収穫時期▶新米を買う?

傾向が見えても”ナゼ”が見えて来ない😅
まだまだ勉強不足です🤔

(まだ気づいていません…)


【12月の推測】

  • 帰省で人が集まる
  • 1年お疲れさまでした
  • 少し贅沢(刺し身とか)

結果:食費が増える(特に外食)

確かに子供のとき年末は
刺し身(魚介類)や
オードブル(調理食品)
をよく食べてました💡

そして…ここまで来てやっと
”重要な見落とし”に気づいた‼️
(分析中マジで気付かなかった)

2019年10月に増税があった😨

9月に穀類と酒類の支出が多いって
ただの買いだめじゃん😰

「食欲の秋」関係ないじゃん😵

前提や背景の確認は本当に重要

前提や背景の確認は
データ分析において当たり前
知ってる”つもり” に
なっていたことを痛感しました💦
(なんて低レベルな…)


一応なぜ”食欲の秋”と
呼ばれるのか調べてみました

  • 食欲の秋は”旬の食材”が多い
  • 新米が美味しくなる

と言った根拠があるようです🎑

【反省点:もっと結果がでるやり方をしないと】

  • 勉強とはいえデータを可視化(グラフ化)すること自体が目的になり過ぎていた
  • 2019年だけでなく他の年のデータも用意すべきだった

”これも勉強”と考えて今後の燃料に。

”0.9%の方にウケる話”
はここまでとなります。

今回は不甲斐ない結末でしたが、
今後もこのような感じで
続けていきますので
また読んで頂けますと幸いです😌


よろしければ、
過去記事も御覧ください
金沢市のネタではありますが😅

toraii.hatenablog.com


お時間頂きありがとうございました😖


これ以降は実際に使用したコードを
載せますので興味のある方はどうぞ。

独学でのコードのため
アドバイス頂けますと幸いです😣

実際に使用したコード

※GoogleColaboratoryを使用しています
※今回APIにチャレンジしました
APIのID入手方法などは割愛しています

グラフに日本語表示出来るように

#日本語対応matplotlib
!pip install japanize-matplotlib


APIのIDを使用してデータのお取り寄せ

import urllib.request
import json

# e-stat APIのappId
appId =  '申請したAPIのID'
# APIのリクエストurl
# コピーしておいたURLのhttpをhttpsにしておく
url = 'https://api.e-stat.go.jp/rest/2.1/app/getStatsData?cdTime=2019000101%2C2019000202%2C2019000303%2C2019000404%2C2019000505%2C2019000606%2C2019000707%2C2019000808%2C2019000909%2C2019001010%2C2019001111%2C2019001212&cdCat01=060%2C061%2C066%2C071%2C074%2C078%2C083%2C086%2C089%2C090%2C093%2C097%2C098&cdCat02=03&cdArea=01003%2C02003%2C03003%2C04003%2C05003%2C06003%2C07003%2C08003%2C09003%2C10003%2C11003%2C12003%2C13003%2C14003%2C15003%2C16003%2C17003%2C18003%2C19003%2C20003%2C21003%2C22003%2C23003%2C24003%2C25003%2C26003%2C27003%2C28003%2C29003%2C30003%2C31003%2C32003%2C33003%2C34003%2C35003%2C36003%2C37003%2C38003%2C39003%2C40004%2C41003%2C42003%2C43003%2C44003%2C45003%2C46003%2C47003%2C14004%2C14150%2C22004%2C27004%2C40003&appId=&lang=J&statsDataId=0002070001&metaGetFlg=Y&cntGetFlg=N&sectionHeaderFlg=1'

url=url.replace('/app/', '/app/json/')
request_url =url.replace('appId=', 'appId=' + appId)

with urllib.request.urlopen(request_url) as f:
        res = json.loads(f.read().decode('utf8'))


データフレーム化▶データ加工

import regex
import pandas as pd
from pandas.io.json import json_normalize
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
 
%matplotlib inline
sns.set_style("darkgrid")
sns.set(font="IPAexGothic") #日本語フォント

item = {}
pref = {}
ym = {}
cate = {}

for obj in res['GET_STATS_DATA']['STATISTICAL_DATA']['CLASS_INF']['CLASS_OBJ']:
    # 分類などの出力
    #if isinstance(obj['CLASS'],dict): # dict
        #print(obj['@id'],obj['@name'],obj['CLASS']['@name'])
    if isinstance(obj['CLASS'],list): # list
        id = obj['@id']
        cate[('@' + obj['@id'])]=obj['@name']
        for cat in obj['CLASS']:
            #print(id,obj['@name'],cat['@name'],cat['@code'])
            if id =='cat01':
                item[cat["@code"]] = cat['@name']
            elif id == 'area':
                pref[cat['@code']] = cat['@name']
            elif id == 'time':
                ym[cat['@code']] = cat['@name']

#jsonをDataFraneに変換
df = json_normalize(res['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE'])
#必要なカラムのみ抽出
df = df.loc[:,['@time','@area','@cat01','$']]

cate['$'] = '金額'

#prefから地名の前にある数字を削除
p = regex.compile(r'\p{Script_Extensions=Han}+|\p{Script=Hiragana}+')
for i in pref:
    pref[i]=''.join(p.findall(pref[i]))
pref

df = df.replace({'@area':pref,'@cat01':item,'@time':ym})
df = df.rename(columns = cate)

# 【注意】下部で'金沢'で部分抽出してから「object▶int」では値が正常に変換されなかった
# そのため抽出前のデータで「object▶int」
df['金額'] = df['金額'].astype(int) # 金額をobject▶int変換

#時間軸がobjectなので▶datetimeに・・・実は不要だった
#df['時間軸(月次)'] = df['時間軸(月次)'] .astype(str)+ '1日'
#df['時間軸(月次)'] = pd.to_datetime(df['時間軸(月次)'],format = '%Y年%m月%d日')

df_k = df[df['地域区分'].str.contains('金沢')] # 地域区分から金沢を部分一致で抽出
df_k.reset_index(drop=True,inplace=True) # インデックスを0から振り直す
df_k.index = df_k.index + 1 # インデックスを1からスタートにする(一般的感覚での可読性をあげる)
print(df_k.info()) # 各要素のデータ型を確認▶金額がobjectだった
#df_k["金額"] = df['金額'].astype(int) # 不要だった部分
df_k.groupby('用途分類').describe().round(1) #用途分類ごとに基本統計量を取る。小数点第一位まで
df_k

出力結果

/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:35: FutureWarning: pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 156 entries, 1 to 156
Data columns (total 4 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
 0   時間軸(月次)  156 non-null    object
 1   地域区分     156 non-null    object
 2   用途分類     156 non-null    object
 3   金額       156 non-null    int64 
dtypes: int64(1), object(3)
memory usage: 5.0+ KB
None
時間軸(月次)   地域区分    用途分類    金額
1  20191月   金沢市   食料  79283
2  20192月   金沢市   食料  76109
3  20193月   金沢市   食料  83968
4  20194月   金沢市   食料  83028
5  20195月   金沢市   食料  88738
... ... ... ... ...
152    20198月   金沢市   外食  17593
153    20199月   金沢市   外食  16100
154    201910月  金沢市   外食  14763
155    201911月  金沢市   外食  17402
156    201912月  金沢市   外食  21007
156 rows × 4 columns


基本統計量の確認

#ピボットテーブルにしてみる▶こっちのほうが見やすい
df_k_t=df_k.pivot_table(values='金額',index='時間軸(月次)',columns='用途分類') # ピボットテーブルの作成
df_k_t=df_k_t.reindex(columns=list)
df_k_t.describe().round().loc[['mean','min','max','std'],:] # 小数点第一位までで出力

出力結果 f:id:toraii:20201027053655p:plain

食費を折れ線グラフで表示

#まずは食費を折れ線グラフで表示
df_k[df_k['用途分類']=='食料'].plot(x='時間軸(月次)',linewidth=5,xticks=[],table=True,figsize = (20,6),alpha=0.8,color='C3')
plt.xlabel("",size=0)
plt.title('食費が一番高いのは12月!!! 9月は第2位',loc="left",fontsize=20,color='BLACK')
plt.hlines(df_k[df_k['用途分類']=='食料'].mean(),0,11,'C3',linestyles='dashed')

出力結果 f:id:toraii:20201027053603p:plain

(食費の)
内訳の折れ線グラフを一元化

#食料以外の出費をseabornで複数グラフに
grid = sns.FacetGrid(df_k[df_k['用途分類']!='食料'],col='用途分類',hue="用途分類",col_wrap=4,size=5)
grid.set_xticklabels(rotation=45)
grid.map(sns.pointplot,'時間軸(月次)','金額')
grid.fig.suptitle('9月で一番高くなるのは「酒類」',x=0.2,y=1.035,fontsize=30,color='BLACK',alpha=0.8)

出力結果 f:id:toraii:20201027052827p:plain



これで本当の本当に最後となります。
最後までご覧頂きありがとうございます。