僕がデータ分析者として覚醒するまで

しがない会社員がデータ分析者として覚醒するまでのブログ

Dark Skyを使用した天気予測をCSV化する

qiita.com

概要

  • 建築物のエネルギーデータを予測するにあたって、空調機の消費電力量が与える影響は非常に大きい。
  • 外乱のあるデータを予測するには単変量解析では限界がある。多変量にすべき?
  • 翌日の外気温度使えば空調機の消費電力量の予測精度ってもっと上がるかも?と思ったので手軽に集める方法を実装した。

手法

実装

DarkSkyのアカウントはここからつくります。FAQ大事! 以下のような感じで、設定値ファイルを作って、諸々の情報を読み込みます。 (それぞれのパラメータはconfigparserでパースします。) 経度・緯度指定じゃなくて、都市名で指定したかった。(今後の課題)

[darksky]
APIKEY = hogehoge
LONGITUDE = hoge経度
LATITUDE = hoge緯度
UNITS = si
EXCLUDE = currently,minutely,daily,alerts,flags

get_forecastを呼び出して、出てきたjsonをパースします。jsonの内容はここに書かれています。 jsonに格納されている予測のタイムスタンプはUNIXtimeで書かれているので、JSTに直さないとダメでした。

import json
import urllib.request
import datetime
import time
import configparser

inifile = configparser.ConfigParser()
inifile.read('../etc/init.txt')
APIKEY = inifile['darksky']['APIKEY']
LONGITUDE = inifile['darksky']['LONGITUDE']
LATITUDE = inifile['darksky']['LATITUDE']
UNITS = inifile['darksky']['UNITS']
EXCLUDE = inifile['darksky']['EXCLUDE']

#print (APIKEY)

def get_forecast():
    try:
        url = 'https://api.darksky.net/forecast/' + APIKEY + '/' + LONGITUDE + ',' + LATITUDE + '?' + 'units=' + UNITS + '&exclude=' + EXCLUDE
        res = urllib.request.urlopen(url)
        # json_loads() でPythonオブジェクトに変換
        data = json.loads(res.read().decode('utf-8'))
        print(r'dataの取得を完了しました。')
    except urllib.error.HTTPError as e:
        print('HTTPError: ', e)
    except json.JSONDecodeError as e:
        print('JSONDecodeError: ', e)

    return data

def convert_Unix_to_JST(date):
    try:
        ans = datetime.datetime.fromtimestamp(date)
        # print('UnixからJSTに変換しました。')
        return ans

    except:
        print('なんかエラー')

dataはAPI叩いて得たjson,itemlistは['date','温度']を突っ込んでいます。 タイムスタンプと温度以外は必要なかったので決め打ちです。 下記は、取ってきたjsoncsvに整形して出力しています。

import numpy as np
import pandas as pd
import Utils.API_Control as apcon


def combine_data(data, itemlist):
    df = pd.DataFrame(columns=itemlist)
    for icnt in np.arange(0, len(data['hourly']['data']), 1):
        add_weather_forecastser = pd.Series([str(apcon.convert_Unix_to_JST(data['hourly']['data'][icnt]['time'])),
                                             data['hourly']['data'][icnt]['temperature']],
                                            index=df.columns)
        df = df.append(add_weather_forecastser, ignore_index=True)

    df.index = df['date']
    df = df.drop('date', axis=1)

    return df

出来上がったものがこちら

今後の予定

  • 天気予測データを得たうえで、予測精度向上のためにどうやって組み込むか。
  • せっかく天気予報データ得られたし、天気予報を通知するLINEBOTを練習で作る。
  • 実測したデータと各社の予測値(外気温度)がどの程度の精度をもっているか検証

Memo:[Django]バージョンによるurls.py内のincludeの仕様の違い

概要

Urlディスパッチャの記述でハマった。

問題

DjangoのTutorialでは、下記のようにしなければならなかった。

urlpatterns = [
    url(r'^testapp/', include('testapp.urls', namespace='testapp')),
]

新しいDjango上記を写経すると下記のエラーがでる。(Django==2.0.3を使用)

    url(r'^testapp/', include('testapp.urls', namespace='testapp')),
  File "C:\Users\****\PycharmProjects\Tutorial\venv\lib\site-packages\django\urls\conf.py", line 39, in include
    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: 
Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

'Specifying a namespace in include() without providing an app_name '
Googleさん:'app_nameを指定せずにinclude()で名前空間を指定する'

解決策

Django(Django==2.0.3)では、下記のようにすることでエラーをはかなくなった。
要するに、namespaceでapp_nameを指定するのではなく、2-タプルで渡してね。ってことみたい。

urlpatterns = [
    url(r'^testapp/', include(('testapp.urls', 'testapp'),)),
]

中心極限定理

中心極限定理

  • 中心極限定理とは、簡単に言うと母集団からたくさんの標本平均サンプルをとってくると、その標本集団は正規分布に従うというもの

これを実務に活かせないか考えてみた。   思いつかない。。。ある本には中心極限定理はすごく強力なツールだと書いていたけど、どういった場面で活躍するのかわからない。 下記の例だと、2回振ったサイコロの平均値は、大量にサンプルを取ると正規分布に従うみたいだけど、、、どうやって役立てたらいいんだろうか。

bellcurve.jp

あぁ、実務に絡められるアイディアがほしい。 はやく統計検定2級とりたい。。。

標準化

標準化

標準化するにためには、下記の式を用いて、標準化得点(Z値)を求めて評価を行うらしい。 具体的には、異なる値(あるテストの数学の得点と国語の得点)を同じ土俵で評価するために、単位なくすために下記の式を用いる。

\begin{align*} z = \frac{X-μ}{σ} \end{align*}

僕の場合、仕事ではエネルギーデータを扱っているが、標準化を使って異なる値を評価したことがない。データ分析(特にエネルギーデータ)を行っている方々は普段統計的手法を使っているのだろうか。

不偏推定量

ブログを書き始めたころに、覚えたはずの不偏推定量。 今日統計検定2級の問題を解いていて、不偏推定量の意味が分からず、悶絶。 ブログに記録したことは覚えてたのに記憶に定着していなかった。。。 下記のURLのような意味なんだけど、結局のところ自分で書き換えられないと覚えたことにはならないよなぁ。。。 bellcurve.jp

そもそも、確率分布におけるE[X],V[X]とかの意味がすっと出てこない時点でだめだなぁ。。。

層化抽出法

層化抽出法とは

  • 母集団をあらかじめいくつかの層(グループ)に分けておき、各層の中から必要な数の調査対象を無作為に抽出する方法

bellcurve.jp

統計検定2級の試験問題に出てきたんだけど、母集団をいくつかのグループに分ける必要がある。その分けるグループは当然ながら偏った性質を持っていてはいけない。

各層はランダムかつ母集団とよく似た性質にわけるようにする。 実際に標本集団を作るときは偏った性質の層を作らないようにする必要がある。

はやく統計検定2級受けたい。。。

自己相関関数と偏自己相関関数

コレログラム

コレログラムは、時系列データにおいて、周期性や自己相関がどの時点にあるかを 判断できるグラフである。
時系列データを分析する上で、どこに相関があるかは重要で、ARモデルなどで係数を推定するために必要なものである。

自己相関

自己相関関数は、原系列に対して、遅れのあるデータを作成し、それらの1次遅れ・2次遅れ・・・n次遅れのデータを作成し、それぞれ相関をとることで周期性や何次遅れのデータが原系列にとって相関があるかを知ることができる。
bellcurve.jp

偏自己相関

偏自己相関は、自己相関が時系列データのn次遅れのデータそれぞれに行うに対して、偏自己相関は自己相関係数から、時間によって受ける影響を除去した自己相関となる。

r_{xy\cdot z} = \frac{r_{xy} - r_{xz}r_{yz}}
{\sqrt{1 - r_{xz}^2} \sqrt{1 - r_{yz}^2}}