【重要な見落としに気づかず😢】食欲の秋!…なら食費が1番高い!?
秋になりましたね。
と言うより、秋になってました💦
1年がだんだん短く感じるように
なってきました、とら良です🐯
今回の0.9%にウケる話は…
食欲の秋なら食費が一番高い!?
(…もう11月になりますが😥 )
今回も政府が公開している
e-Stat政府統計の総合窓口より
”金沢市”のデータ頂きました。
【データの内容】
- 金沢市のみ
- 2019年の2人以上の世帯
- 支出の中でも食費関係
2019年_金沢市の集計結果(食費)
12月がダントツですね
9月は第2位
10月、11月は平均以下
9月だけは食欲の秋と言えそうです🍴
(重要な見落としに気付いていない)
食費の内訳
各項目の
「平均」「最小」[最大」「標準偏差」
【気付いたこと】
- 9月に多いのは穀類、酒類
- 12月に多いのは穀類、魚介類、菓子類、調理食品、外食
- 乳卵類は1年通して変動が少ない
【9月の推測】
- お祭り多い?▶お酒を買う?
- お米の収穫時期▶新米を買う?
傾向が見えても”ナゼ”が見えて来ない😅
まだまだ勉強不足です🤔
(まだ気づいていません…)
【12月の推測】
- 帰省で人が集まる
- 1年お疲れさまでした
- 少し贅沢(刺し身とか)
結果:食費が増える(特に外食)
確かに子供のとき年末は
刺し身(魚介類)や
オードブル(調理食品)
をよく食べてました💡
そして…ここまで来てやっと
”重要な見落とし”に気づいた‼️
(分析中マジで気付かなかった)
2019年10月に増税があった😨
9月に穀類と酒類の支出が多いって
ただの買いだめじゃん😰
「食欲の秋」関係ないじゃん😵
前提や背景の確認は本当に重要
前提や背景の確認は
データ分析において当たり前
知ってる”つもり” に
なっていたことを痛感しました💦
(なんて低レベルな…)
一応なぜ”食欲の秋”と
呼ばれるのか調べてみました
- 食欲の秋は”旬の食材”が多い
- 新米が美味しくなる
と言った根拠があるようです🎑
【反省点:もっと結果がでるやり方をしないと】
- 勉強とはいえデータを可視化(グラフ化)すること自体が目的になり過ぎていた
- 2019年だけでなく他の年のデータも用意すべきだった
”これも勉強”と考えて今後の燃料に。
”0.9%の方にウケる話”
はここまでとなります。
今回は不甲斐ない結末でしたが、
今後もこのような感じで
続けていきますので
また読んで頂けますと幸いです😌
よろしければ、
過去記事も御覧ください
金沢市のネタではありますが😅
お時間頂きありがとうございました😖
これ以降は実際に使用したコードを
載せますので興味のある方はどうぞ。
独学でのコードのため
アドバイス頂けますと幸いです😣
実際に使用したコード
※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§ionHeaderFlg=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 2019年1月 金沢市 食料 79283 2 2019年2月 金沢市 食料 76109 3 2019年3月 金沢市 食料 83968 4 2019年4月 金沢市 食料 83028 5 2019年5月 金沢市 食料 88738 ... ... ... ... ... 152 2019年8月 金沢市 外食 17593 153 2019年9月 金沢市 外食 16100 154 2019年10月 金沢市 外食 14763 155 2019年11月 金沢市 外食 17402 156 2019年12月 金沢市 外食 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'],:] # 小数点第一位までで出力
出力結果
食費を折れ線グラフで表示
#まずは食費を折れ線グラフで表示 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')
出力結果
(食費の)
内訳の折れ線グラフを一元化
#食料以外の出費を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)
出力結果
これで本当の本当に最後となります。
最後までご覧頂きありがとうございます。