#author("2024-02-29T01:22:36+00:00","","") #author("2024-02-29T01:23:10+00:00","","") [[引き継ぎ(中島)]] 目次 #contents ---- *目標 [#oc8698fa] ・財務系のデータを増やした分析の実施 *用いたプログラムとデータ [#ude0e1ea] #ref(flask (1).zip,,flask (1).zip) #ref(data1-20240222T042151Z-001.zip,,data1-20240222T042151Z-001.zip) #ref(scraping2.ipynb,,scraping2.ipynb) *データの収集 [#m903716d] scraping2.ipynbで行う.~ スクレイピングを行い,日本銀行時系列統計データ検索サイトから政府預金収支のデータを集めた. service = Service(executable_path='C:/Users/tn011/Desktop/flask (1)/flask/driver/chromedriver.exe') chromedriverのパスを自分のものに置き換える. flask(1)のflaskの中にdriverというフォルダを作成して,その中にchromedriver.exeを入れる. #ref(0229_22.png,,70%) 下はそのコードの一部. #ref(0229_1.png,,50%) 上のコードを実行すると,日本銀行時系列統計データ検索サイトから財政関連→財政預金収支→政府預金収支のデータが入ったcsvファイルのダウンロードが行われる. #ref(0229_24.png,,50%) #ref(0229_25.png,,50%) #ref(0229_26.png,,50%) #ref(0229_2.png,,50%) #ref(0229_2.png,,50%) #ref(0229_2.png,,50%) #ref(0229_2.png,,50%) *集めたデータの変換 [#k0530739] data1-20240222T042151Z-001.zipの中にあるdata_fusion.ipyndで行う.~ まず始めに,スクレイピングしてダウンロードしたcsvファイルをzaisei.csvという名前にしてdata1-20240222T042151Z-001の中に置く. #ref(0229_23.png,,50%) ①&br; 元々あるデータにスクレイピングして得た財政のデータを追加する.データの一行目を削除して新しく名前を定める.いらないデータを削除する.df_monthに元あるデータと追加したデータを合わせて組み込む.それを表示すると下のようになる. #ref(0229_4.png,,50%) ②&br; データの中にある欠損値NANを消すために欠損値NANを含む行全てを削除する.これでdf_monthを欠損値のないデータフレームにすることができる. #ref(0229_5.png,,50%) 下の写真は欠損値が除去されたdf_monthです. #ref(0229_9.png,,70%) ③&br; そして次に月足のデータを日足のデータにする.指定されたCSVファイル('tukasi.csv')からデータを読み込み,各行の'日付'列を日付型に変換しています。その後、各行ごとに取引カレンダーを参照.その際に,土日と祝日は削除する.2021年以降の取引日だけを抽出して新しいDataFrame(df_2021_onwards)を作成しています.最終的に,'日付'列を文字列に変換して結果を表示しています。 #ref(0229_6.png,,50%) #ref(0229_7.png,,50%) ④&br; tests.csvからデータを読み取り,df_kabuを作成.'日付'列を'Day'にリネーム.df_kabutdf_2021_onwardsを結合し,df_fusionを作成する.そのDataFrameの'データ日付'列を削除,欠損値を含む行を削除.最終的なDataFrameを'fusion_data_forVARLiNGAM.csvとして保存する. #ref(0229_8.png,,50%) ~ *VARLiNGAMの実装 [#hbb7a25c] flask(1)の中のVARLiNGAMフォルダの中にあるVAR_LiNGAM_True_latest.ipynbで行う.~ ①&br; データ分析,因果探索,可視化のために必要なライブラリのインポートを行う. #ref(0229_10.png,,50%) ②&br; 集めたデータの変換で最後にできたfusion_data_forVARLiNGAM.csvを読み取り,そのデータをdf_firstに書き込む.書き込まれた内容が下に表示される. #ref(0229_11.png,,50%) ③&br; 'MinMaxScaler'オブジェクト('scaler')を作成.'fit_transform'メソッドを使用して,元のデータフレーム('df_first')の各列の値を最小値0,最大値1の範囲にスケーリングします.結果は'normalized_df'として得られる.正規化されたデータを新しいcsvファイルに保存.正規化されたデータフレーム('normalized_df')に元のデータフレーム('df_first')のインデックスを設定.最後に正規化されたデータフレームを表示. #ref(0229_12.png,,50%) ④&br; 因果検出を実行するために,VARLiNGAM(ベクトルオートレッシュ回帰モデルを用いた因果関係推定手法)のモデルを構築し,'fit'メソッドを使用して,指定されたデータ('df_first')に対して学習を行っている.'lags=2'はラグの数を指定し,'prune=True'は因果関係を整理するオプション. #ref(0229_13.png,,50%) ⑤&br; 'adjacency_matrices_'プロパティを使用して,VARLiNGAMモデルによって推定された係数行列を取得.結果は,因果関係の強さや方向表す係数行列が表示される. #ref(0229_14.png,,50%) ⑥&br; 'lingam.VARLiNGAM()'を使用してVAR-LiNGAMのモデルインスタンスを生成.~ 'bootstrap'メソッドを呼び出して,ブートストラップ法により因果関係の推定を行う.'normalized_df'は正規化されたデータを指定し,'n_sampling=100'はブートストラップサンプルの数を指定.~ 'result'には,ブートストラップ法によって得られた因果関係の推定結果が格納される. #ref(0229_15.png,,50%) ⑦&br; 一番上のコードは,'get_error_independence_p_values'メソッドを使用して,各変数のエラー項が互いに独立であるかどうかの検定を行い,その結果のp値を取得.~ p値は'p_values'に格納され,'print'で表示される.~ ~ 次のコードでは,objectが返されるので,メソッドで抽出した因果方向の順位付けを得ることが出来る.コードでは,optionを上位8位の因果方向,optionを係数0.3以上の因果方向に限定している.~ ~ その下のコードでは,効用関数で結果の確認が出来る.'print_casual_directions'関数を使用して,因果関係の方向性のカウントを表示.'cbc'は先に取得した因果関係の方向性のカウント結果.'100'は表示する上位の数を指定.表示されるのは上位100の因果関係の方向性.'labels'は変数のラベルを指定.このラベルは変数名などの情報を含んでおり,結果の解釈を容易に.~ #ref(0229_16.png,,50%) ⑧&br; このコードは,因果探索アルゴリズムによって推定された複数の有向非巡回グラフ(DAG)の構造と因果効果の強さを表示するもの.~ 'result.get_directed_acyclic_graph_counts()' は因果探索結果から有向非巡回グラフ (DAG) の構造を取得.~ 'n_dags=3' は表示する DAG の数を指定.この場合,上位3つのDAGが表示される.~ 'min_casual_effect=0.2'は表示するDAGに含まれる因果関係の最小値を指定. 0.2より大きい因果関係を持つエッジのみ表示される.~ 'split_by_casual_effect_sign=True'は因果関係の符号でグラフを分割するオプション.正の因果効果と負の因果効果を別々に表示.~ 'print_dagc()'は取得したDAGの構造と因果効果の強さを表示.'dagc'は取得したDAGの情報.'100'は表示する上位の数を指定.表示されるのは上位100の因果関係.'labels=labels'は変数のラベルを指定. #ref(0229_17.png,,50%) ⑨&br; 'display_max_rows'はDataFrameの表示時に表示される最大行数を指定.表示される行数は10行に制限される.~ 'display_max_columns'はDataFrameの表示時に表示される最大列数を指定.表示される列数が10列に制限される.~ 次のコードは,因果探索結果から得られた因果効果の情報を表示.~ 'result_get_total_casual_effects()'は因果探索結果から全ての因果効果を取得.~ 'min_casual_effect=0.01'があるので,0.01より大きい因果効果を持つエッジの情報のみを取得.~ 'pd.DataFrame(causal_effects)' は取得した因果効果を DataFrame に変換.~ 'df['from']' および' df['to'] 'に対して、'labels 'を用いて変数のラベルに変換.これにより、変数名が表示される. #ref(0229_18.png,,50%) ⑩&br; 'Network'クラスのインスタンスを作成.ここでは,ネットワークの高さ,幅,背景色,フォントの色,ノートブックの表示,有向グラフの指定などが設定.~ csvファイルからデータを読み込み,必要な列('from','to','effect')を抽出.~ ネットワークのノードとエッジを定義.'unique_nodes'は一意なノードの集合を取得.~ 'nodes'はノードのリストを作成.各ノードはid,label,titleを持つ.~ 'edges'はエッジのリストを作成.各エッジはfrom,to,color,label,arrowsを持つ.~ エッジの色は影響が正か負かによって決まる.~ ノードとエッジをJSON形式に変換.~ 最後に,HTMLコードを作成.ノードのダブルクリックや選択時のイベントに対するアクションも組み込まれている. #ref(0229_19.png,,50%) #ref(0229_20.png,,50%) #ref(0229_21.png,,50%) ⑪&br; VAR-LiNGAMの実装結果 #ref(your_network.png,,50%)