投資のためのデータサイエンス

個人の投資活動に役立つデータ分析にまつわる話題を綴ります。

データサイエンスのおすすめオンライン記事(3月4日付)

欧州で戦争勃発など慌ただしい中、首都圏ではマンボウも延長されたが、街の賑わいは春を迎える準備を進めているように感じられる。新年早々は興味深いデータサイエンスの記事が少なかったが、春を告げるかのごとく最近一気に面白い記事が増えてきた。しかし今回も昨年末位に発表された記事が中心となっている。

2022年によりよいデータサイエンティストになるための22の習慣
towardsdatascience.com
「コーディングの標準スタイルを取り入れる」「常に変化に前向きでいる」「コードをシンプルに」などを説いている。

ごく少数のプログラマーしか知らないPythonの5つの利用事例
levelup.gitconnected.com
Pythonによるモバイルアプリ制作」「ブラウザ上でPythonを走らせる」「シェルスクリプトを書くためのPython」「Python風ハイブリッドデスクトップアプリを構築する」「短時間でCommand Line Interfaceプログラムを作り出す」について簡単に解説している。

最適なスクレイピング技術:CSSセレクタ, XPath, RegEx
www.datasciencecentral.com
スクレイピングはほとんどの場合HTMLドキュメントに対してなされるが、さらに上級を目指すなら XPathRegExも知っておいた方がいいとしている。

PythonとScrapyを用いてGoogle検索データをスクレイピングする
www.datasciencecentral.com
Googleの検索結果ページをスクレイピングすることは、自社製品のレビュー情報を収集する場合などに有効である。ここではPythonのScrapyライブラリを用いている。

2022年に知っておくべき全ての機械学習アルゴリズム
towardsdatascience.com
「アンサンブル学習」「説明的(回帰)」「クラスタリング」「次元縮約」「類似性」の5つのタイプの機械学習アルゴリズムについて概要と代表的アルゴリズムを解説している。

データサイエンスのおすすめオンライン記事(2月11日付)

米国の名門エール大学でデータサイエンスを学ぶ学生でもあるフィギュアスケートのネイサン・チェン選手が下馬評通りの強さで冬季五輪金メダルを獲得した。
apnews.com
当方は日本でのイベントでチェン選手を間近に見ていたので感慨深いものがある。一見華奢に見える体でどうしてあんな豪快な4回転ジャンプが跳べるのか不思議である。
さて今回も主に昨年末に出てきた興味深い記事を紹介する。

数学の美しさを新しい方法で探求する
deepmind.com
人間の直感をAIで支援することにより、純粋数学研究のフロンティアを切り開く。著者らが科学雑誌Natureに投稿した論文の内容の紹介。

2022年に知っておくべき50個のデータサイエンス・プロジェクトのアイデア
www.mltut.com
初級、中級、上級に分けて、データサイエンスの実務が習得できるプロジェクトがリストアップされている。datacampへの入会登録(無料)が前提となる模様。

ガウス過程 - 入門から
peterroelants.github.io
機械学習でも用いられるガウス過程のチュートリアルPythonコード付き)。残り2記事へのリンクは当該記事の下のほうにある。

PyCaretによる異常検知入門
towardsdatascience.com
Pythonによるローコードの異常検知(教師なし学習)ライブラリPyCaretの入門チュートリアル

Q&A: 異常検知とドリフト検知の違いは何か?
evidentlyai.com
ドリフトとは特徴量の全体的な構造が変化してしまってモデルの予測精度が落ちてしまうことである。本記事では通常の異常検知との違いを丁寧に解説している。

図解データサイエンス特集

ツイッターの投稿には、他サイトへのリンクではなく一枚の「ポンチ絵」的な画像が投稿される場合も多い。これまで本ブログでは有用と思われるデータサイエンスに関するオンライン記事のみを紹介し、画像1枚のみのツイッター投稿はスキップしていた。しかしここのところ有用で興味深いデータサイエンスの一枚画像投稿が幾つかあったので、特集として紹介する(各々の図の出典に関してはタイトルのリンクを参照)。

データサイエンスの一般的なプロセス
f:id:nicjps230:20220201111725j:plain
典型的なデータサイエンスの作業プロセスをツリー状の図で表している。実務でプロジェクトを計画する際に参考になる。

AIに関する興味深い事実
f:id:nicjps230:20220201111840j:plain
細かい字がつぶれて見にくいが、AIが我々の実生活にどのように役立っているかを図解している。

練達したデータサイエンティストの5つの基本スキル
f:id:nicjps230:20220201111947j:plain
これからデータサイエンティストになるにはどういうスキルを身に着けるべきかを知るのに役立つ。

AIのさまざまな用途
f:id:nicjps230:20220201112049j:plain
これも細かい字がつぶれて見にくいが、AIの適用分野がひと目でわかり、執筆やアイデア出しの際に役立つ。

サイバー攻撃のタイプ
f:id:nicjps230:20220201112206j:plain
サイバー攻撃にはどのようなものがあるかがひと目でわかる。

AIに必要な数学
f:id:nicjps230:20220201112310j:plain
AIのアルゴリズムの原理を理解するために必要となる数学がまとめられている。

SQL対NoSQL: AWS ,Azure, Google Cloud利用のガイド
f:id:nicjps230:20220201112416j:plain
データの特性に適した主要インフラのサービスがわかる。これもデータ実務のプランを練る場合に役立つ図である。

データサイエンスのおすすめオンライン記事(Python機械学習ライブラリ特集)

Python機械学習ライブラリについては、これまで断片的に引用したり紹介したりしてきたが、包括的なまとめはしてこなかった。今回は、有名なライブラリについて順を追って学習できるチュートリアルサイトをとりまとめて紹介する。

scikit-learnのチュートリアル
scikit-learn.org
scikit-learnはPythonの基礎的な機械学習ライブラリで、Pythonで(統計的)機械学習プログラミングを行う場合、世界的にもデファクトスタンダードになっている。本ページはその英文公式チュートリアル集。

Tensorflow 2.0 コーディング・ワークショップ・ノートブック
www.datasciencecentral.com
TensorFlowはGoogleが開発したオープンソース機械学習ライブラリである。本記事はTensorFlowのチュートリアルコードを紹介したもので、リンクから直接Google Colaboratoryのページに飛ぶ。

Kerasのコード例の一覧
keras.io
KerasはPythonで書かれた高レベルのニューラルネットワーク向けの効果的なAPIでである。ディープニューラルネットワークを使った高速な実装ができるように設計されており、CNTK、Tensorflow、Theanoなどがバックエンドとして動作する。本ページはさまざまな目的のためのコーディングのデモ集で、やはりリンクをクリックするとGoogle Colaboratory上のコードが表示され、順を追って学習できる。

PyTorch公式チュートリアル
pytorch.org
PyTorchは、Facebookが開発を主導したPython向けの機械学習ライブラリである。本ブログの2021/4/1付けで紹介した記事にあるように、いくつかの有名企業はPyTorch利用に乗り換えている。本チュートリアルサイトについてもGoogle Colaboratory環境で利用しやすい。

(番外編)Pythonによるテキスト分類
towardsdatascience.com
本記事はニュース記事をジャンルに自動分類する問題を扱っているが、スクレイピング機械学習・実装という一連の工程を全てカバーしたチュートリアルプロジェクトになっている。付属のGitHubリポジトリのコードが非常に有用で、筆者も活用させてもらった。

データサイエンスのおすすめオンライン記事(1月12日付)

年が明けてオミクロン株への感染が急拡大している。しかしこれは多くの識者が予測していたことであり、重症化率は低いので、再び過剰な行動規制をして経済を痛めつけるべきでないとの意見が多い。年末年始は繁華街の活気が戻ったと実感したが、これが再び沈み込むことがないことを願いたい。
今回は年頭恒例の「今年の展望」物の記事を中心に紹介する。

オーバーフィットとアンダーフィットの原理
towardsdatascience.com
データへのモデルのあてはめで必ず問題となるオーバーフィットとアンダーフィットについてのわかりやすい解説記事。

2022年のIoTの5大トレンド
www.forbes.com
ここでは、1)ヘルスケアのIoT, 2)セキュリティ, 3)エッジIoT, 4)ビジネスと産業におけるIoT, 5)復旧の早い組織になるためのIoT についての今後の見通しが論じられている。

AI・データサイエンス・機械学習技術の2021年の主な進展と2022年の主要トレンド
www.kdnuggets.com
本サイトでは恒例となっている、Kirk Borne氏を含む9名の専門家による総括とトレンド予測。

Pythonによるグラフ機械学習(その1)(その2)
towardsdatascience.com

towardsdatascience.com
グラフネットワークの基礎から機械学習への適用例までを2回シリーズで丁寧に解説している。

データサイエンスのおすすめオンライン記事(1月2日付)

明けましておめでとうございます。様々な事業主体においてデータを活用して効率化を図ったり戦略的な意思決定に役立てるための科学的アプローチへのニーズはますます高まっています。本年もデータの統計的分析やデータサイエンスに携わる皆さんに少しでも役立つような記事を投稿していく所存です。

再急降下法の仕組み
towardsdatascience.com
「再急降下法」は機械学習で損失関数を最小化するために用いられるアルゴリズムだが、その仕組みをわかりやすく解説している(数式あり)

全てのデータサイエンティストが知っておくべきデータエンジニアリングの4つの基本事項
www.analyticsvidhya.com
データの分析やモデル化の前段階としてデータの獲得・整形といった「データエンジニアリング」の作業が必要になる。ここでは1)データウェアハウスとデータレイク, 2)データの抽出・変換・装填のパイプライン, 3)データのガバナンスと品質, 4)データの規制と倫理, について解説している。

貴方のPythonコードを改善する4つのコツ
betterprogramming.pub
Pythonのプログラムコードの可読性と処理効率を高めるためのコツ。多重代入や条件分岐を1行で表すなど。

機械学習モデルを実装する3つの方法
towardsdatascience.com
ビジネス現場ではモデルを構築したらいかに実装するかが重要となる。ここでは1)Webサービス, 2)バッチ予測, 3)エッジデバイスへの実装, について実例コードで紹介している。

PyHard: データセットの品質を評価し、分類困難なインスタンスを同定するツール
www.datasciencecentral.com
「データの何処が分類精度を下げているのか」や「アルゴリズムの効率がよくなるデータセットの領域はどこか」を知るうえで役立つ新しいPythonライブラリについての解説。

解釈可能な予測・ナウキャストモデルを構築する:DeepXFの概要
www.datasciencecentral.com
予測やナウキャストに適用できるローコードPythonライブラリDeepXFについての紹介。詳細は上部のリンクからGitHubのページを参照する。

Python Dashによるダッシュボードの構築(改訂版)

【注記】最初に投稿したコードはGoogle Colaboratoryでは動作しますが、Dockerではエラーで動作しないものでした。ダッシュボードはデプロイしなければほとんど意味がなく、現状ではDocker環境がデプロイには最もよい方法と考えらるため、Dockerでエラーなく動いたコードに全面的に置き換えました。

(2023-09-15) docker-compose.ymlに不要な記述があったため修正しました。

一か月以上前にPythonのdashライブラリを用いたインタラクティブなデータテーブルの表示のコードについて投稿しました。それからさらに発展し、今度はいくつかのデータテーブルとグラフを組み合わせたダッシュボードの作成に挑戦します。
前回と同じくDashライブラリを用います。ダッシュボードの作成にはdash_bootstrap_components(dbc)を用います。出力されるhtml画面レイアウトの見た目をよくするためには様々なパラメータを指定する必要があります。幸いdbcを用いたダッシュボードの画面設計については数多くのチュートリアルYouTubu動画があり、ここでもそのうちの一つを参考にしました。
前回と同様に、全国都道府県の様々な指標を収録したエクセルファイルからデータを入力して、各種指標をダッシュボードに表示させます。

# ライブラリのインポート
from dash.dependencies import Output, Input, State
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html
import plotly.express as px
from flask import Flask
import pandas as pd
import dash
import numpy as np
import dash_table
import plotly.graph_objects as go
from dash_table import FormatTemplate
from dash.dash_table.Format import Format

まず最初に、appという「箱」を作ります。これをサーバー上で走らせることになります。

server = Flask(__name__)
app = dash.Dash(server=server, external_stylesheets=[dbc.themes.FLATLY])
app.title = 'Dashboard'

次に、原データのExcelファイルを読み込み、データ整形用の補助変数を作成します。

#データファイルを読み込む
df1 = pd.read_excel('都道府県各種指標.xlsx',sheet_name='data')
df1 = df1.assign(ch_year = df1['年度'].apply(lambda x: str(x)+'年'))
df1 = df1.assign(id_pref = df1['地域コード']+df1['都道府県'])
df1.sort_values('ch_year',ascending=True,inplace=True)
#表示候補の列名のリストを作成する
my_list = df1.columns
to_remove = ['年度','地域コード','都道府県','ch_year','id_pref']
remained_list = [i for i in my_list if i not in to_remove]


次に、データテーブルの作成に関する記述を行っておきます。

# 表示する列を定義する
columns1 = [
    dict(id='都道府県',name='都道府県'),
    dict(id='2007年', name='2007年度'),
    dict(id='2008年', name='2008年度'),
    dict(id='2009年', name='2009年度'),
    dict(id='2010年', name='2010年度'),
    dict(id='2011年', name='2011年度'),
    dict(id='2012年', name='2012年度'),
    dict(id='2013年', name='2013年度'),
    dict(id='2014年', name='2014年度'),
    dict(id='2015年', name='2015年度'),
    dict(id='2016年', name='2016年度'),
    dict(id='2017年', name='2017年度'),
    dict(id='2018年', name='2018年度')
]
# データテーブルを描画する関数を定義する
def create_dash_table(df):
    return dash_table.DataTable(
        data=df.to_dict('records'),
        columns=columns1,
        style_cell={'fontsize':20, 'font-family':'IPAexGothic'},
        style_cell_conditional=[{'if':{'column_id':c},'textAlign':'left'} for c in ['都道府県']],
        style_data={'color':'black','backgroundColor':'white'},
        style_data_conditional=[{'if':{'row_index':'odd'},'backgroundColor':'rgb(220,220,220)'}],
        style_header={'backgroundColor':'rgb(210,210,210)','color':'black','fontWeight':'bold'} )

さて、ここからいよいよ山場であるレイアウトの記述です。基本的に行(dbc.Row)を切った後その中に列(dbc.Col)を切っていきます。

# レイアウトの定義
app.layout = dbc.Container([ 
    dbc.Row(
        dbc.Col(
            html.H2("日本の都道府県の各種指標"), width={'size': 12, 'offset': 0, 'order': 0}), 
        style = {'textAlign': 'center', 'paddingBottom': '1%'}),
    dbc.Row(
        dbc.Col(
            dcc.Loading(
                children=[
                    html.Div(
                        dcc.Dropdown(id='dropdown1-kpi',options=[{'label':i,'value':i} for i in remained_list],value='総人口'),
                        style={'width':'30%','display':'inline-block','margin-right':10}),
                    html.Div(
                        dcc.Dropdown(id='dropdown1-plot',options=[{'label':i,'value':i} for i in ['箱ひげ図','散布図','バイオリン']],value='箱ひげ図'),
                        style={'width':'30%','display':'inline-block','margin-right':10}),
                    dcc.Graph(id='box-plot')
                    ],color='#000000',type='dot',fullscreen=True ))),
    dbc.Row(
        dbc.Col(
            dcc.Loading(
                children=[
                    html.Div(
                        dcc.Dropdown(id='dropdown2-pref',options=[{'label':i,'value':i} for i in df1['都道府県'].unique()],value='東京都'),
                        style={'width':'30%','display':'inline-block','margin-right':10}),
                    html.Div(
                        dcc.Dropdown(id='dropdown2-kpi',options=[{'label':i,'value':i} for i in remained_list],value='総人口'),
                        style={'width':'30%','display':'inline-block','margin-right':10}),
                    html.Div(
                        dcc.Dropdown(id='dropdown2-plot',options=[{'label':i,'value':i} for i in ['棒グラフ','折れ線グラフ']],value='棒グラフ'),
                        style={'width':'30%','display':'inline-block','margin-right':10}),
                    dcc.Graph(id='basic-plot')
                    ],color='#000000',type='dot',fullscreen=True ))),
    dbc.Row(
        dbc.Col(
            dcc.Loading(
                children=[
                    html.Div(
                        dcc.Dropdown(id='dropdown3-kpi',options=[{'label':i,'value':i} for i in remained_list],value='総人口'),
                        style={'width':'30%','display':'inline-block','margin-right':10}),
                    html.Div(id='datatable-paging',children=[])
                    ],color='#000000',type='dot',fullscreen=True )))
])

次に、コールバックと実行関数の記述です。
一番目に分布グラフについての記述です。

# グラフ1(分布グラフ)のコールバックと実行関数の記述
@app.callback(
    Output('box-plot','figure'),
    [Input('dropdown1-kpi','value'),Input('dropdown1-plot','value')])
def update_figure(inval1,inval2):
    filtered_df=df1
    if inval2 == '箱ひげ図':
        fig=px.box(filtered_df,x='ch_year',y=inval1,hover_name='都道府県')
        fig.update_layout(transition_duration=500)
        return fig
    elif inval2 == '散布図':
        fig=px.scatter(filtered_df,x='ch_year',y=inval1,hover_name='都道府県')
        fig.update_layout(transition_duration=500)
        return fig
    else:
        fig=px.violin(filtered_df,x='ch_year',y=inval1,hover_name='都道府県')
        fig.update_layout(transition_duration=500)
        return fig
    return

二番目に基本グラフについての記述です。

# グラフ2(基本グラフ)のコールバックと実行関数の記述
@app.callback(
    Output('basic-plot','figure'),
    [Input('dropdown2-pref','value'),Input('dropdown2-kpi','value'),Input('dropdown2-plot','value')])
def update_figure(inval1,inval2,inval3):
    filtered_df=df1[df1['都道府県']==inval1]
    if inval3 == '棒グラフ':
        fig=px.bar(filtered_df,x='ch_year',y=inval2)
        fig.update_layout(transition_duration=500)
        return fig
    else:
        fig=px.line(filtered_df,x='ch_year',y=inval2)
        fig.update_layout(transition_duration=500)
        return fig

続いてデータテーブルについてのコールバックと実行関数の記述です。

# グラフ3(データテーブル)のコールバックと実行関数の記述
@app.callback(
    Output('datatable-paging','children'),
    [Input('dropdown3-kpi','value')])
def update_table(inval1):
    df502=df1.pivot(index='id_pref',columns='ch_year',values=inval1)
    df502.reset_index(inplace=True)
    df502=df502.assign(都道府県=df502['id_pref'].apply(lambda x: x[6:]))
    return create_dash_table(df502)

最後にサーバを起動します。Docker環境で実行する場合、docker-compose.ymlなどによりポート番号の指定を行います。ブラウザから指定ポートへアクセスして動作を確認します。

if __name__=='__main__':
    app.run_server()


各グラフ要素のドロップダウンリストを変更すると対応する図も変更されます。本コードは、現行のDocker Desktop for Windowsで動作します。またAWS上にデプロイして動作することも確認しています。
尚、Dockerで必要になるdocker-compose.ymlは以下のようにしています。

version: '3.7'
services:
 
  dashboard:
    build: 
      context: ./
    container_name: dash-app_dashboard
    restart: always
    ports:
      - 8050:80