プログラミング初心者がAidemyのプレミアムプランを受講してみた[Python/データ分析コース]

・自己紹介、受講に至った経緯

はじめまして。社会人4年目のサラリーマンです。
私が本講座の受講に至った経緯としましては、インプットの速さが独学だとかなり遅いことを危惧したからです。
具体的に体験したこととして、全くのプログラミング初心者が教材で独学しても引数等の理解に躓いてしまい、数時間同じページとにらめっこすることが何度かありました。
また、例えば教材通りにコードを書いてもなぜかうまく動かないことが多々あり、これも躓いてしまう要因となります。(スペルミスや空白が入っていることが多いです…)
このままだと、少しPythonに詳しいだけになる(業務に活かせない)と感じ、自身に価値をもたせるため、本講座を受講することを決めました。

・概要

1.どんな人に読んで欲しいか
プログラミングに興味があるも、習得できるか不安がある人。
自分のように、文系でかつ日常の業務でもプログラミングを使わない方。

2.この記事に書くこと、わかること
文系学部卒、金融専門職4年目の非IT系サラリーマンがゼロからどのように学習していったのか。

・Aidemyでの学習の振り返り
まず、3か月のコースを1か月半で終了する予定を立てました。
理由としては、自身の業務の繁忙が読めない(金融マーケットの動向により大きく変わる)点、復習する時間がほしかった点、期間中であれば他コースも受講できる点を考えたからです。
次に具体的にどのようなことをしたのか、期間を区切って記述します。

1.2週間目(11/09~11/22)
【受講した講座名】Python入門、Numpy,Pandas,Matplotlib,データクレンジング

2.2~4週間目(11/23~12/06)
【受講した講座名】データハンドリング、機械学習概論、教師あり学習、教師なし学習、時系列分析

3.4~6週間目(12/07~現在)
【受講した講座名】機械学習におけるデータ前処理、ディープラーニング基礎、株価予測、タイタニック号の生存率計算

3か月で講座を修了できるのか不安がありましたが、結論を申し上げると可能です。平均学習時間は平日1.5~2時間、土日3時間くらいかと思います。
各講座終了後の提出課題があり簡単ではありませんが、チャット機能を使うことによりアドバイスをいただけるので解けない問題はないです。


・作成したもの
上記の受講を終え、自分ができるようになったことを一部記載します。
基礎から様々なことを学びましたが、現在私が金融機関に勤めていることから、業務により精通しているという理由で下記のデータを出力するためのコードを作成します。
【目的】日経のツイート(@nikkei_market)を利用し、感情分析と株価分析を実行する


import tweepy
import csv
import matplotlib.pyplot as plt
import re
import pandas as pd
import numpy  as np
import MeCab

consumer_key = ''   
consumer_secret = ''    
access_token = '' 
access_secret = '' 

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)

# ツイート取得
tweet_data = []

for tweet in tweepy.Cursor(api.user_timeline,screen_name = "@nikkei_market",exclude_replies = True).items():
   tweet_data.append([tweet.id,tweet.created_at,tweet.text.replace('\n','')])

# csv出力
with open('./6050_stock_price_prediction_data/tweets_horie.csv', 'w',newline='',encoding='utf-8') as f:
   writer = csv.writer(f, lineterminator='\n')
   writer.writerow(["id","text","created_at"])
   writer.writerows(tweet_data)



df_tweets = pd.read_csv('./6050_stock_price_prediction_data/tweets_horie.csv', names=['id', 'date', 'text'], index_col='date')
df_tweets = df_tweets[['text']].sort_index(ascending=True)

# 辞書のデータフレームを作成.パスは適宜設定
pn_df = pd.read_csv('./6050_stock_price_prediction_data/pn_ja.csv', encoding='utf-8', names=('Word','Reading','POS', 'PN'))

# 各列の分割
word_list = list(pn_df['Word'])
pn_list   = list(pn_df['PN'])
pn_dict   = dict(zip(word_list, pn_list))

# MeCabインスタンスの作成.
m = MeCab.Tagger('')

#NANを排除
df_tweets = df_tweets.dropna()

# テキストを形態素解析し辞書のリストを返す関数
def get_diclist(text):
   parsed = m.parse(text)      # 形態素解析結果(改行を含む文字列として得られる)
   lines = parsed.split('\n')  # 解析結果を1行(1語)ごとに分けてリストにする
   lines = lines[0:-2]         # 後ろ2行は不要なので削除
   diclist = []
   for word in lines:
       l = re.split('\t|,',word)  # 各行はタブとカンマで区切られてるので
       d = {'Surface':l[0], 'POS1':l[1], 'POS2':l[2], 'BaseForm':l[7]}
       diclist.append(d)
   return(diclist)

# 形態素解析結果の単語ごとのdictデータにPN値を追加する関数
def add_pnvalue(diclist_old, pn_dict):
   diclist_new = []
   for word in diclist_old:
       base = word['BaseForm']        # 個々の辞書から基本形を取得
       if base in pn_dict:
           pn = float(pn_dict[base]) 
       else:
           pn = 'notfound'            # その語がPN Tableになかった場合
       word['PN'] = pn
       diclist_new.append(word)
   return(diclist_new)

# 各ツイートのPN平均値を求める
def get_mean(dictlist):
   pn_list = []
   for word in dictlist:
       pn = word['PN']
       if pn!='notfound':
           pn_list.append(pn)
   if len(pn_list)>0:
       pnmean = np.mean(pn_list)
   else:
       pnmean=0
   return pnmean

means_list = []
for tweet in df_tweets['text']:
   dl_old = get_diclist(tweet)
   dl_new = add_pnvalue(dl_old, pn_dict)
   pnmean = get_mean(dl_new)
   means_list.append(pnmean)
means_list = np.copy(means_list)
x_std = (means_list - means_list.mean()) / means_list.std()
df_tweets['pn'] = x_std
df_tweets = df_tweets.drop('text', axis=0)
df_tweets.index = pd.to_datetime(df_tweets.index)
df_tweets =  df_tweets.resample('D', how='mean')

import pandas as pd
from io import StringIO
import urllib

# 上記の関数を使い日経平均株価の時系列データを取得
url = "https://indexes.nikkei.co.jp/nkave/historical/nikkei_stock_average_daily_jp.csv"
def read_csv(url):
   res = urllib.request.urlopen(url)
   res = res.read().decode('shift_jis')
   df = pd.read_csv(StringIO(res) )
   # 必要のない最後の行を取り除く
   df = df.drop(df.shape[0]-1)
   return df

#dfというdataframeで保存し、出力
df = read_csv(url)
df["データ日付"] = pd.to_datetime(df["データ日付"], format='%Y/%m/%d')
df = df.set_index('データ日付')

# カラムから'始値', '高値', '安値'を取り除いて、日付が古い順に並べる
df = df.drop(['始値', '高値', '安値'], axis=1)
df = df.sort_index(ascending=True)

# dfとdf_tweetsの二つのテーブルを結合し、Nanを消去
df_tweets = pd.read_csv('./6050_stock_price_prediction_data/df_tweets.csv', index_col='date')
table = df_tweets.join(df, how='right').dropna()

# table.csvとして出力
table.to_csv("./6050_stock_price_prediction_data/table.csv")

# データを訓練用とテスト用に分ける
from sklearn.model_selection import train_test_split

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を日付、カラム名をpn値、終値にしてdf_train.csvという名前でdataフォルダ内に出力
df_train = pd.DataFrame(
   {'pn': X_train_std,
    '終値': y_train},
   columns=['pn', '終値'],
   index=table.index[:len(X_train_std)])
df_train.to_csv('./6050_stock_price_prediction_data/df_train.csv')

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

# test_feature_arr, test_label_arrを同様に作成。
rates_fd = open('./6050_stock_price_prediction_data/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['pn'][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)   # 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()

import numpy as np
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)  


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)))

・今後の活動
①現在の業務を効率化
業務においては必ずしも必要なく、あまり詳しいことは申し上げられませんが、データをCVS等に出力ができるため、それをNumpy,Pandas等で加工することで、自身の業務を効率化させたり、ミーティング等における自身の意見に説得力をもたせるためのデータ作成ができると考えております。

②キャリアアップ、転職
私が勤める現在の会社はPythonは言わずもがな、プログラミング言語を扱える社員は多くありません。
その中で、データセールスマーケティングの新設や今まで他社に委託していたものを自社で開発しようという動きが見られ、ニーズに応えられる能力をもった社員が不足しています。Pythonを扱えるようになることで、社内でも希少な能力をもった社員になることができ、自身の価値を高めることができると考えております。

③副業
会社で副業が禁止されているため具体的なプランはまだ考えておりませんが、将来多様化するであろう働き方において副業に活かせるのではないかと感じています。

・終わりに
データ分析コースを受講して、Pythonでできることのイメージが具体化されました。自身のPythonを学ぶ目的は、上記「今後の活動」にあるとおりなので、まずは現在の業務で使用しながら精進していきたいと考えております。
また、私の20代の1つの目標である、経験を積み重ねるという意味で、転職はもちろん、社内でも失敗するリスクをとってでも様々なことに挑戦していきたいと感じております。この経験を積み重ねるという目標が、今回本講座を受ける後押しとなりました。決して安くはない料金を払い、本当に未経験が一定のスキルを身に着けられるのか不安な部分がありましたが、終わってみれば受講して本当に良かったと思っています。


この記事が気に入ったらサポートをしてみませんか?