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

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

統計検定2級_適合度検定

適合度検定

適合度検定は、χ2分布に従う。らしい。

bellcurve.jp

リンク先の例題だと、クロス集計表を使った適合度検定をしているけど、 クロス集計表の場合、自由度は(行数-1)×(列数-1)だよね? 中間の説明がないと、なぜ自由度がn-1なのか疑問だわ。。。

χ2統計量は、理論値と実測値の差分を2乗したものを理論値で割ったものを合算したらでるらしい。 理論値を期待値で表現してる文章もどこかでみたけど、結局のところ理論値=期待値になるって理解したつもり。

実務だと、ものすごく大きいクロス集計表に対して有意を示すのに使えるのだろうか。

統計検定2級_ベルヌーイ試行

ベルヌーイ試行

  • 結局のところ0/1で表せることができる試行
  • どの確率が欲しいかによって分布が異なる。

初めて成功するときに使う分布

  • 幾何分布

bellcurve.jp

ちょうどn回成功するときに使う分布

  • 二項分布

bellcurve.jp

試行回数がすごく多くて、起こる確率がすごく少ないやつの分布

ポアソン分布

bellcurve.jp

たぶんこの覚え方であってるはず。 明日もう1回復習しよう

エネルギーデータを4年分析してわかったこと

概要

 私は建築物の消費エネルギーのデータ分析(省エネ分析)を4年行ってきました。
大学・病院・事務所ビルなど 様々な建物のエネルギーデータの分析をさせていただきました。
4年分析してきてわかったことを書きます。

  1. お客様はそれほど分析内容に興味がない(結果には興味がある)
  2. お客様はデータがあればデータ分析は簡単にできると思っている(簡単ではない)
  3. データ分析は楽しい(楽しい!!)

1. お客様はそれほど分析内容に興味がない

cost_cut_sakugen_samurai.png

  • 建物のオーナーサイドは、ほぼ分析内容に興味はありません。(90%ぐらいのオーナーは興味を示しませんでした。)
    当然といえば当然ですが、お金に換算できるものには興味を示されます。オーナーサイドとしては当然かと思います。
    ただ、ご依頼のあった報告書(両面100ページ程度)を全くご覧にならずに、別途ただ働き作成させていただいたA3用紙1枚のコスト削減量しか記載していないグラフのみで打ち合わせをされたときは絶句しました。

  • 逆に建物の管理を委託されている方々は、分析内容に比較的興味を持たれているようでした。
    当然といえば当然ですが、委託された側からすると余計な業務(データ提供など)が増えるので、 最初はものすごーくめんどくさそうにされることも多々あります。

2. お客様はデータがあればデータ分析は簡単にできると思っている

business_marunage.png

  • 過去1年分のデータあるし、データ分析なんて簡単だよね?(簡単ではない)
    建築業界のエネルギーデータをご覧になったことはあるでしょうか?
    現場とデータ分析の部署が分かれていることが多く、現場サイドでデータのカラム名や最終的なデータの精度を決めてることが多いのです。
    時系列データなのでindexはタイムスタンプにはなっており、基本的にindexは問題ありません。(1sec~1yearまで様々) 

問題は、
1. カラム名が重複している。
2. 重複しているのに全く違うデータが入っている。
3. 指示したカラム名が存在しない。。。etc

言い始めたらきりがない、これはひどい
「データが正しい状態で保存されている≠データが存在している」と理解している人が社外だけでなく社内ですら少ない。
この業界だけですか?ほかの業界はもっと違うんですかね?

3. データ分析は楽しい  

データの前処理は泥臭くて、課題解決できなけりゃ文句を言われて、社内外に敵が多いデータ分析の楽しい要素
business_man_macho.png

  1. 課題解決のプロセスは、オープンワールド謎解きゲームをしてる感じで楽しい!
    • 解決に至るプロセスが複数ある!(マルチエンディングだけど、すべてバッドエンドの場合もあるぞ!)
    • ダミーの手掛かりがあったり、なかったり!(ダミーを選択しないようにしよう!)
    • 仲間と協力することで解決がスムーズにいく場合が多いぞ!(ソロプレイはリアルオンラインゲームでは不利だ!)
    • クリアの証は、ニーズのあるところにもっていかないとだめだぞ!(依頼者がクリアの証を欲しがってるとは限らないぞ!)
  2. データ分析は、料理のようでたのしい!
    • 下ごしらえが大事(データの前処理、精度の担保)
    • 工程が大事(セオリーがあるなら、先にセオリーを)
    • 盛り付けも大事(いい結果を出せても可視化してわかりにくければ×)
    • コンビニ弁当が好きな人に高級料理を出してもダメ(ニーズにあったものを提供しないと理解してもらえない)

おわりに

つらいこともあるけど楽しいこともあるデータ分析。
今後もデータ分析していきたいなと考えている今日この頃。
ビッグデータに疎い建築業界の僕にこの先生き残る道は残されているのか!
ライフはまだ残ってる。ここを耐えれば、この荒波に勝てるんだから!
次回!@snuow死す!デュエルスタンバイ!

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*}

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