40代プログラム初心者がAidemy Premium Plan(データ分析コース)を受講してみた。

プログラム初心者である私がAidemyでプログラミング(データ分析コース)を受講しました。最終的にはデータ分析プログラムまで作成しましたので、その経緯を紹介します。

その前に軽く自己紹介します。

 

自己紹介・受講のきっかけ

40代の中年サラリーマンです。
私が本講座の受講に至った経緯は、DX(データトランスファー)元年といわれる2021年に、以前から勉強していたPythonを本格的に学習して業務に取り入れてみようと思ったからです。ちなみに、当方、宇宙開発の機械系出身エンジニアです。
以前から独学で学習していましたが、DX元年中にPythonを本格的に習得したい思いが強くなりましたので、場所を選ばずプログラミングが学べる本講座を知り、申し込みをしました。

どんな人に読んで欲しいか

1.どんな人に読んで欲しいか
40代で新しいことにチャレンジすることに二の足を踏んでいる方。プログラミングを学習していても、中々習得に時間がかかっている方。

2.この記事に書くこと、わかること
40代でもプログラム初心者でどのように/どの程度習得できるようになっていったか。

Aidemyでの学習の振り返り


まず、受講期間が3ヶ月の短期間コースで、しかも3月初旬から5月末までという忙しい年度末〜年度始め跨いだ時期を選択したため、受講する時間を検討しました。そこで、アイデミーでは、モバイル、PC、タブレットなど端末を選ばず、オンライン形式で隙間時間で受講できることに注目しました。

そのため、平日の会社の昼休み時間や、就寝前の携帯を眺める時間、休日には家で妻が中国ドラマを見てテレビを占拠されている時間、出先で時間が空いた時、色んな隙間時間を見つけて、サイトにアクセスして受講しました。

 

大凡、平均学習時間は平日1.5~2時間、土日3時間くらいかと思います。ちなみにアイデミーでは、興味があれば、予め決められた必修の講座以外にも受講することができます。当方はデータベースや、PythonExcelの自動化、アジャイル関連の授業も興味ありましたので、そちらも受講しました。



○ 1ヶ月目
【受講した講座名】データベース入門、Numpy、機械学習概論、Pandas、AIマーケター育成コース

○ 2ヶ月目
【受講した講座名】Python入門、データクレンジング、Matplotlib、データハンドリング、教師あり学習(分類/回帰)、教師なし学習自然言語処理基礎


○ 3ヶ月目
【受講した講座名】PythonによるExcelの自動化、機械学習におけるデータ前処理、時系列解析Ⅰ、ディープラーニング基礎、株価予測、タイタニック号の生存率計算、DX時代のアジャイル適用術

 

プログラミング

ここから本題のプログラミングです。

今回は、各年の梅雨入りと日経平均株価終値の相関関係を分析してみました。

開発環境

 

Python3(PyCharm)
Macbook Pro 
Chrome 

データの取得

 

まずは、気象庁から梅雨入りのデータをダウンロードして、日経プロフィルから年次の日経平均株価終値を取得して予測しております。

梅雨入り、梅雨明けデータの中身

期間:1951年~2020年
場所:東北北部、東北南部、北陸地方関東甲信地方、東海地方、近畿地方、中国地方、四国地方、九州北部地方、九州南部、奄美地方、沖縄地方

今回はこの中から、沖縄地方の梅雨入りを予測します。

 

データソースは気象庁の以下リンクから入手しました。

気象庁

https://www.data.jma.go.jp/fcd/yoho/baiu/index.html

 

ダウンロードしたときのデータの状態

 

f:id:yellowbagman:20210524124953j:plain

上記のように、日本語が列タイトルに入っているため、英語への変換します。

データ前処理

ダウンロードしたCSVデータをエクセルで開いて、日本語をローマ字か英語に編集します。(平年のデータは、インポート用に1900年としました)

f:id:yellowbagman:20210524145804p:plain


 

headをCSVの上の5行だけ出力してどんな状態か確認します。

import pandas as pd
Start_toyou = pd.read_csv('./tsuyu_iriake_eigo_henkanfinal.csv', engine='python', header=1,index_col=0,encoding = 'shift_jis')
print(Start_toyou.head())

 

出力結果

f:id:yellowbagman:20210524151559p:plain

 

上記から、沖縄の梅雨入りのデータを抽出しXLSX形式で保存します。

f:id:yellowbagman:20210526123814p:plain


 

 

 

そして、Matplotlibを使用してグラフ化します。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdates


def main():
# Start of date input
fnameR = 'start_okinawa.xlsx'
df = pd.read_excel(fnameR, sheet_name='data', engine='openpyxl')
ss = []
for sd, sm, sy in zip(df['dd'], df['mm'], df['yy']):
s1 = '{0:0>2d}'.format(sd)
s2 = '{0:0>2d}'.format(sm)
s3 = '{0:0>4d}'.format(sy)
ss = ss + [s1 + '/' + s2 + '/' + s3]
df.index = pd.to_datetime(ss, format='%d/%m/%Y')

fsz = 12
plt.figure(figsize=(10, 6), dpi=200, facecolor='w')
plt.rcParams['font.size'] = fsz
sxmin = '1900-04-01'
sxmax = '1900-07-31'
xmin = datetime.datetime.strptime(sxmin, '%Y-%m-%d')
xmax = datetime.datetime.strptime(sxmax, '%Y-%m-%d')
plt.ylim([xmin, xmax])
plt.xlim([1950, 2020])
plt.ylabel('Date')
plt.xlabel('Year')
plt.grid(which='major', axis='both', color='#999999', linestyle='--')
plt.plot(df['Year'], df.index, '-', color='#ff0000', label='Start of Date')
qs = 165.0;
spot = '1900-05-31'
dsp = datetime.datetime.strptime(spot, '%Y-%m-%d')
ss = '31/05/2016\n{0:.0f}L/min'.format(qs)
plt.legend(loc='lower right', fontsize=fsz)
# plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
plt.gca().yaxis.set_major_formatter(mdates.DateFormatter('%d-%b'))
fnameF = 'fig_startofdate.jpg'
plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.1)
plt.show()


#==============
# Execution
#==============
if __name__ == '__main__': main()

 

出力結果

 

上記プログラムから、実施した結果が以下のグラフです。

年別梅雨入りの日程の推移が表示されたグラフとなっております。

 

 

(梅雨入りの推移@沖縄地方)

f:id:yellowbagman:20210525223532p:plain


同様に、梅雨明けの推移もグラフ化しました。

 

(梅雨明けの推移@沖縄地方)

f:id:yellowbagman:20210525223554p:plain

 

 

日経平均

 

今度は、日経平均の年次推移のデータを取得します。

取得した先は下記サイトです。

 

日経プロフィル

https://indexes.nikkei.co.jp/nkave/archives/data?list=annually

 

f:id:yellowbagman:20210528003831j:plain

 

分析のために、年をインデックスにしてマージします。

 

import pandas as pd
import datetime

# dfを梅雨入りデータとして定義する。
df = pd.read_csv("start_okinawa.csv")
df = df.set_index('year')
df['データ日付'] = pd.to_datetime(df['データ日付'])

# df_nikkeiを日経平均終値として定義する。
df_nikkei = pd.read_csv('nikkei_nenji_owari.csv')
df_nikkei = df_nikkei.set_index('year')

# カラムから'dd', 'mm', 'yy'を取り除く。
df = df.drop(['dd', 'mm', 'yy'], axis=1)

# dfとdf_nikkeiの二つのテーブルを結合する。
table = df_nikkei.join(df, how='right').dropna()

# table.csvとして出力する。
table.to_csv("table.csv")
print(table)

 

実行すると、下記のようなマージデータが作成されます。

 

f:id:yellowbagman:20210528225613j:plain

 

 出力されたcsvを元にして、過去三年間の日経平均株価終値の変化と梅雨入りの日程の変化を特徴量にして次の年の梅雨入りの予測を行います。訓練データとテストデータを2つに分けて、訓練データを標準化した後に、訓練データの平均と分散を用いて、テストデータの標準化を行います。

 

以下が、分析パートのコードです。

(プログラム上、データ日付の列ラベルをDATEに変更して実施しました。)

 

from sklearn.model_selection import train_test_split
import pandas as pd

table = pd.read_csv("table.csv",index_col='DATE')

X = table.values[:, 0]
y = table.values[:, 1]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, shuffle=False)
X_train_std = (X_train - X_train.mean()) / X_train.std()
X_test_std = (X_test - X_train.mean()) / X_train.std()

# df_trainというテーブルを作りそこにindexをyear、カラム名をデータ日付、終値にしてdf_train.csvという名前でdataフォルダ内に出力する。
df_train = pd.DataFrame(
{'year': X_train_std,
'終値': y_train},
columns=['year', '終値'],
index=table.index[:len(X_train_std)])
df_train.to_csv('./df_train.csv')

# テストデータについても同様にdf_testというテーブルを作り、df_test.csvという名前でdataフォルダ内に出力する。
df_test = pd.DataFrame(
{'year': X_test_std,
'終値': y_test},
columns=['year', '終値'],
index=table.index[len(X_train_std):])
df_test.to_csv('./df_test.csv')


# 2

rates_fd = open('./df_train.csv', 'r')
rates_fd.readline() #1行ごとにファイル終端まで全て読み込む。
next(rates_fd) # 先頭の行を飛ばす。

exchange_dates = []

pn_rates = []
pn_rates_diff = []

exchange_rates = []
exchange_rates_diff = []

prev_pn = df_train['year'][0]
prev_exch = df_train['終値'][0]

for line in rates_fd:
splited = line.split(",")
time = splited[0] # table.csvの1列目日付
pn_val = float(splited[1]) # table.csvの2列目PN値
exch_val = float(splited[2]) # table.csvの3列目株価の終値
exchange_dates.append(time) # 日付

pn_rates.append(pn_val)
pn_rates_diff.append(pn_val - prev_pn) # データ日付の変化

exchange_rates.append(exch_val)
exchange_rates_diff.append(exch_val - prev_exch) # 株価の変化

prev_pn = pn_val
prev_exch = exch_val
rates_fd.close()
print(pn_rates_diff)
print(exchange_rates_diff)

# 3

import numpy as np

rates_fd = open('./df_train.csv', 'r')
rates_fd.readline() # 1行ごとにファイル終端まで全て読み込む。
next(rates_fd) # 先頭の行を飛ばす。

exchange_dates = []

pn_rates = []
pn_rates_diff = []

exchange_rates = []
exchange_rates_diff = []

prev_pn = df_train['year'][0]
prev_exch = df_train['終値'][0]

for line in rates_fd:
splited = line.split(",")
time = splited[0] # table.csvの1列目日付
pn_val = float(splited[1]) # table.csvの2列目PN値
exch_val = float(splited[2]) # table.csvの3列目株価の終値
exchange_dates.append(time) # 日付

pn_rates.append(pn_val)
pn_rates_diff.append(pn_val - prev_pn) # データ日付の変化

exchange_rates.append(exch_val)
exchange_rates_diff.append(exch_val - prev_exch) # 株価の変化

prev_pn = pn_val
prev_exch = exch_val
rates_fd.close()

INPUT_LEN = 3
data_len = len(pn_rates_diff)
tr_input_mat = []
tr_angle_mat = []

for i in range(INPUT_LEN, data_len):
tmp_arr = []
for j in range(INPUT_LEN):
tmp_arr.append(exchange_rates_diff[i - INPUT_LEN + j])
tmp_arr.append(pn_rates_diff[i - INPUT_LEN + j])
tr_input_mat.append(tmp_arr) # i年目の直近3年間の株価とネガポジの変化

if exchange_rates_diff[i] >= 0: # i年目の株価の上下、プラスなら1、マイナスなら0
tr_angle_mat.append(1)
else:
tr_angle_mat.append(0)
train_feature_arr = np.array(tr_input_mat)
train_label_arr = np.array(tr_angle_mat)

# train_feature_arr, train_label_arrを表示して上のコードの概要を把握する。
print(train_feature_arr)
print(train_label_arr)

# 4

# test_feature_arr, test_label_arrを同様に作成する。
rates_fd = open('./df_test.csv', 'r')
rates_fd.readline() #1行ごとにファイル終端まで全て読み込む。
next(rates_fd) # 先頭の行を飛ばす。

exchange_dates = []

pn_rates = []
pn_rates_diff = []

exchange_rates = []
exchange_rates_diff = []

prev_pn = df_test['year'][0]
prev_exch = df_test['終値'][0]

for line in rates_fd:
splited = line.split(",")
time = splited[0] # table.csvの1列目日付
pn_val = float(splited[1]) # table.csvの2列目PN値
exch_val = float(splited[2]) # table.csvの3列目株価の終値
exchange_dates.append(time) # 日付

pn_rates.append(pn_val)
pn_rates_diff.append(pn_val - prev_pn) # データ日付の変化

exchange_rates.append(exch_val)
exchange_rates_diff.append(exch_val - prev_exch) # 株価の変化

prev_pn = pn_val
prev_exch = exch_val
rates_fd.close()
INPUT_LEN = 3
data_len = len(pn_rates_diff)
test_input_mat = []
test_angle_mat = []

for i in range(INPUT_LEN, data_len):
test_arr = []
for j in range(INPUT_LEN):
test_arr.append(exchange_rates_diff[i - INPUT_LEN + j])
test_arr.append(pn_rates_diff[i - INPUT_LEN + j])
test_input_mat.append(test_arr) # i年目の直近3年間の株価とネガポジの変化

if exchange_rates_diff[i] >= 0: # i年目の株価の上下、プラスなら1、マイナスなら0
test_angle_mat.append(1)
else:
test_angle_mat.append(0)
test_feature_arr = np.array(test_input_mat)
test_label_arr = np.array(test_angle_mat)

# train_feature_arr, train_label_arr,test_feature_arr, test_label_arrを特徴量にして、予測モデル(ロジスティック回帰、SVM、ランダムフォレスト)を構築し予測精度を計測してください。
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

for model in [LogisticRegression(), RandomForestClassifier(n_estimators=200, max_depth=8, random_state=0), SVC()]:
model.fit(train_feature_arr, train_label_arr)
print("--Method:", model.__class__.__name__, "--")
print("Cross validatin scores:{}".format(model.score(test_feature_arr, test_label_arr)))

 

分析の結果

 

上記分析の結果は以下のようになりました。 

f:id:yellowbagman:20210530005101j:plain

 

f:id:yellowbagman:20210530005002j:plain



 

 

今後の活動

 
①現在の業務を効率化
業務では目下DXの流れが来ており、社内外の承認のシステム化、書類のデータベース化が図られています。そこに講座で得られたPythonExcel、データベースの知識から実現できる効率化を持ち込み、また各種データベースに集約されるだけであったデータ類を用いて、データ分析を取り込んで行きたいです。

②キャリアアップ
当方の企業でもプログラミング可能な社員は多くなく、DX化に頭を抱えたり、できれば避けたいと考える方も多く存在します。
その中で、自ら新たに必要な知識を学び、取り込んでいくことで、社内(社外も含めた)周囲の環境が変わるきっかけを作れればと考えています。特に当方よりも若い社員にもこの流れを繋いでいき、既存業務に囚われない、新しい事業の開拓をしていきたいです。