俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

エピソード3-8: 説明変数の追加で精度を向上する。(KaggleでKickstarter Projectsに挑戦する。)

「Kaggle」のデータセットKickstarter Projects」にて、更に精度を向上させるためにほかの説明変数についても検討します。

これまでの流れは以下にまとめてあるのでご参照ください。

oregin-ai.hatenablog.com

1.【仮説1】'country' によって成功、失敗が変わる。

 国別によって成功率が変わると仮説を立ててみました。

まずはヒストグラムを見てみます。

#成功と、失敗でデータを分ける。
df_f18_S = df_f18_SorF[df_f18_SorF['state']==1]
df_f18_F = df_f18_SorF[df_f18_SorF['state']==0]

#それぞれを'country'についてヒストグラムを書いてみる
plt.hist([df_f18_S["country"], df_f18_F["country"]], stacked=False)
plt.show() 

 

 

国ごとに成功率が違うことが確認できました。

さっそく、国ごとの成功率を列に追加します。

#'country'ごとにグループ化し、平均をとったデータフレームを作成する
df_f18_gb_ct = df_f18_SorF.groupby('country',as_index=False)
df_f18_gb_ct_mn = df_f18_gb_ct.mean()

#'state'は成功が'1',失敗が'0'なので、'country'毎の'state'の平均は
#その国の成功する割合(確率)と等価なので名称変更
df_f18_gb_ct_mn = df_f18_gb_ct_mn.rename(columns={'state': 'country_rate'}) 
display(df_f18_gb_ct_mn[['country','country_rate']])

#元のデータフレームに、国ごとの成功する確率を結合
df_f18_SRate = pd.merge(df_f18_SorF, df_f18_gb_ct_mn[['country','country_rate']], on='country')
plt.hist([df_f18_S["country"], df_f18_F["country"]], stacked=False)
plt.show() 

国ごとにグループ化してその後、平均をとることで成功する確率を求めました。

それを、 もとのデータフレームに追加します。

2.【仮説2】'main_category','category' によって成功、失敗が変わる。

 カテゴリーによっても成功率が変わると仮説を立ててみました。

まずはヒストグラムを見てみます。

#成功と、失敗でデータを分ける。
df_f18_S = df_f18_SorF[df_f18_SorF['state']==1]
df_f18_F = df_f18_SorF[df_f18_SorF['state']==0]

#それぞれについてヒストグラムを書いてみる
plt.hist([df_f18_S["category"], df_f18_F["category"]], stacked=False)
plt.show()

plt.hist([df_f18_S["main_category"], df_f18_F["main_category"]], stacked=False)
plt.show() 

f:id:kanriyou_h004:20190518164705p:plain

f:id:kanriyou_h004:20190518164742p:plain

カテゴリーにも成功率に違いがあることがわかりました。

'country'と同様に成功率を列に追加します。

まずは、'main_category'を追加します。

#"main_category"ごとにグループ化し、平均をとったデータフレームを作成する
df_f18_gb_mc = df_f18_SorF.groupby("main_category",as_index=False)
df_f18_gb_mc_mn = df_f18_gb_mc.mean()

#'state'は成功が'1',失敗が'0'なので、'main_category'毎の'state'の平均は
#そのメインカテゴリーの成功する割合(確率)と等価なので名称変更
df_f18_gb_mc_mn = df_f18_gb_mc_mn.rename(columns={'state': 'main_category_rate'}) 
display(df_f18_gb_mc_mn[['main_category','main_category_rate']])

#元のデータフレームに、国ごとの成功する確率を結合
df_f18_SRate = pd.merge(df_f18_SRate, df_f18_gb_mc_mn[['main_category','main_category_rate']], on='main_category')

 続いて、'category'も追加します。

#"category"ごとにグループ化し、平均をとったデータフレームを作成する
df_f18_gb_cg = df_f18_SorF.groupby("category",as_index=False)
df_f18_gb_cg_mn = df_f18_gb_cg.mean()

#'state'は成功が'1',失敗が'0'なので、'category'毎の'state'の平均は
#そのカテゴリーの成功する割合(確率)と等価なので名称変更
df_f18_gb_cg_mn = df_f18_gb_cg_mn.rename(columns={'state': 'category_rate'}) 
display(df_f18_gb_cg_mn[['category','category_rate']])

#国別の成功率を追加したデータフレームに、カテゴリーごとの成功する確率を結合
df_f18_SRate = pd.merge(df_f18_SRate, df_f18_gb_cg_mn[['category','category_rate']], on='category')

これで、カテゴリーごとの成功率の列も追加できました。

 

3.【仮説3】期間の長さによって成功、失敗が変わる。

今度は、'launched':開始と'deadline':期限に着目して、それぞれ単独では成功、失敗に関連していなくても、差し引きした期間の長さという観点では相関があるのではないかと仮定しました。

まずは、期間を求めます。

# 'deadline' 'launched' の項目をdatetimeに変更
df_f18_SorF['deadline'] = pd.to_datetime(df_f18_SorF['deadline'], errors = 'coerce')
df_f18_SorF['launched'] = pd.to_datetime(df_f18_SorF['launched'], errors = 'coerce')
# 'deadline' 'launched' の間の期間を示す'period'を作成 df_f18_SorF['period'] = df_f18_SorF['deadline'] - df_f18_SorF['launched'] #'period'の日数を'days'に抽出 days = [] 
for i in df_f18_SorF.index: days.append(df_f18_SorF['period'][i].days) #元のデータフレームに'days'の列を追加 df_f18_SRate['days'] = days

 

では、'days'について、成功、失敗のヒストグラムを見てみます。

#成功と、失敗でデータを分ける。
df_f18_S = df_f18_SorF[df_f18_SorF['state']==1]
df_f18_F = df_f18_SorF[df_f18_SorF['state']==0]

#それぞれを'days'についてヒストグラムを書いてみる
plt.hist([df_f18_S["days"], df_f18_F["days"]], stacked=False)
plt.show()

f:id:kanriyou_h004:20190518170922p:plain

期間が長いほど成功率が上がっていることがわかりました。

 

 

これまでの検討から、新たに作成した以下を説明変数を追加します。

'country_rate','main_category_rate','category_rate','days' 

 

 4.'country_rate','main_category_rate','category_rate','days'を追加してロジスティック回帰で分類してみる。

 追加した説明変数を加えてロジスティック回帰で分類してみます。

#********************************************************************
#.ロジスティック回帰で分類してみる。
#「goal」「backers」「days」「country_rate」
#「main_category_rate」「categoryrate」を説明変数とする。
#********************************************************************
#目的変数'state'を正解としてyに格納
y = df_f18_SRate['state'].values
#説明変数'goal','backers'を入力としてXに格納
X = df_f18_SRate[['goal', 'backers','days','country_rate','main_category_rate','category_rate']].values

#ロジスティック回帰で学習
clf = SGDClassifier(loss='log', penalty='none', max_iter=10000, fit_intercept=True, random_state=1234)
clf.fit(X, y)

#********************************************************************
#.識別精度を確認する
# 混同行列を作成し、Accuracy、Recall、Precisionを求める
#********************************************************************
# 学習した結果を使って説明変数を入力して予測
y_est = clf.predict(X)
#混同行列を作成
tn, fp, fn, tp = confusion_matrix(y, y_est).ravel()
print(fn, fp)
print(tn, tp)
#'Accuracy、Recall、Precisionを求めて表示
print('Accuracy = {:.3f}%'.format(100 * (tn+tp)/(tn+fp+fn+tp)))
print('Recall = {:.3f}%'.format(100 * (tp)/(fn+tp)))
print('Precision = {:.3f}%'.format(100 * (tp)/(fp+tp)))

4235 14040
109182 79532
Accuracy = 91.171%
Recall = 94.944%
Precision = 84.996%

説明変数を追加することで、Accuracyが88.938%から、91.171%まで上昇しました!!!

Recallが、96.423%から94.944%に下がっているのは気になるところですが、まずは性能が上がったといえるのではないでしょうか。

今後もさらなる向上を目指して頑張ります!

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 

 

 

エピソード3-7: KaggleでKickstarter Projectsに挑戦する。(ロジスティック回帰実装まとめ。)

「Kaggle」のデータセットKickstarter Projects」にて、ロジスティック回帰で分類するところまできたので、とりあえず実装コードをまとめておこうと思います。

これまでの流れは以下の記事をご参照ください。

oregin-ai.hatenablog.com

 1.ロジスティック回帰での実装まとめ。

これまでの検討から、実装コードをまとめました。

ざっくりの流れとしては以下の通りです。

1)データを読み込む
2)欠損値がある行はなくしてみる
3)成功、と失敗の行に絞ってみる
4)カテゴリ変数から数値化してみる
5)「goal」「backers」を説明変数としてロジスティック回帰で分類してみる
6)予測精度を確認してみる(Accuracy,Recall,Rrecisionを求める)

 では、実装コードです。

#********************************************************************

# pandas,numpy,matplotlib,codecs,sklearnの各ライブラリをインポート

#********************************************************************



%matplotlib inline

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import codecs as cd

from sklearn.preprocessing import LabelEncoder

from sklearn.linear_model import SGDClassifier

from sklearn.metrics import log_loss, accuracy_score, confusion_matrix

import seaborn as sns



#********************************************************************

#.該当課題のデータを読み込む

#********************************************************************

#201801のデータを読み込んでみる

df_f18 = pd.read_csv('ks-projects-201801.csv')



#********************************************************************

#.欠損値がある行は、とりあえずなくしてみる

#********************************************************************

#1個でも欠損値がある行はとりあえず削除してみる。

df_f18_dna = df_f18.dropna(how='any')



#********************************************************************

#.成功('successful')と失敗('failed')に絞って考える。

#********************************************************************

#成功だけを抽出したDFと失敗だけを抽出したDF

df_f18_success = df_f18_dna[df_f18_dna['state']=='successful']

df_f18_failed =  df_f18_dna[df_f18_dna['state']=='failed']

#両方を結合

df_f18_SorF = pd.concat([df_f18_success,df_f18_failed])



#********************************************************************

#.'state'をカテゴリ変数(文字列)から数値化してみる。

#********************************************************************

#LabelEncoderのインスタンスを生成

le = LabelEncoder()



#stateに出てくるカテゴリを覚えて

#stateを数値に変換

le = le.fit(df_f18_SorF['state'])

df_f18_SorF['state'] = le.transform(df_f18_SorF['state'])



#********************************************************************

#.ロジスティック回帰で分類してみる。

# 「goal」、「backers」を有効そうな説明変数とする。

#********************************************************************

#目的変数'state'を正解としてyに格納

y = df_f18_SorF['state'].values

#説明変数'goal','backers'を入力としてXに格納

X = df_f18_SorF[['goal', 'backers']].values



#ロジスティック回帰で学習

clf = SGDClassifier(loss='log', penalty='none', max_iter=10000, fit_intercept=True, random_state=1234)

clf.fit(X, y)



#********************************************************************

#.識別精度を確認する

# 混同行列を作成し、Accuracy、Recall、Precisionを求める

#********************************************************************

# 学習した結果を使って説明変数を入力して予測

y_est = clf.predict(X)



#混同行列を作成

tn, fp, fn, tp = confusion_matrix(y, y_est).ravel()

print(fn, fp)

print(tn, tp)



#'Accuracy、Recall、Precisionを求めて表示

print('Accuracy  = {:.3f}%'.format(100 * (tn+tp)/(tn+fp+fn+tp)))

print('Recall    = {:.3f}%'.format(100 * (tp)/(fn+tp)))

print('Precision = {:.3f}%'.format(100 * (tp)/(fp+tp)))
 

 

とりあえず、一つモデルがつくれたので、ほかの項目も掘り下げて検討してさらなる精度向上を目指していきたいと思います。

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 

 

 

エピソード3-6: KaggleでKickstarter Projectsに挑戦する。(ロジスティック回帰で分類する。)

現在取り組み中の「Kaggle」のデータセットKickstarter Projects」にて、分類に採用する説明変数を選択したので、ロジスティック回帰で分類していきたいと思います。

0.これまでの続きなので、ライブラリのインポートや、データ読み込み、データの前処理が実施されている前提です。これまでをご覧になっていない方は、以下をご参照ください。

oregin-ai.hatenablog.com

 1.ロジスティック回帰で分類してみる。

 これまでの検討から、目的変数「state」を'successful''false'に分類するために、説明変数として「goal」と「backers」を利用して分類してみることにしました。

#目的変数'state'を正解としてyに格納
y = df_f18_SorF['state'].values
#説明変数'goal','backers'を入力としてXに格納
X = df_f18_SorF[['goal', 'backers']].values

#ロジスティック回帰で学習
clf = SGDClassifier(loss='log', penalty='none', max_iter=10000, fit_intercept=True, random_state=1234)
clf.fit(X, y)
 
sklearn.linear_modelのSGDClassifire()(確率的勾配降下法を用いた分類)の引数に以下を指定して、分類モデルのインスタンスを作成します。
  • loss : 損失関数 今回は'log'を指定
  • penalty:過学習を防止するための正則化項 今回は'none'を指定。
  • max_iter:トレーニングデータを何回使用するか 今回は10000を指定
  • fit_intercept:切片を推定するかどうか 今回はTrueを指定
  • ranom_state:データシャッフル時の乱数の種 今回は1234を指定
fit()メソッドの引数に目的変数(y)と説明変数(X)を指定して、確率論的勾配降下法で線形モデルを近似します。

2.識別精度を確認してみる。

# 学習した結果を使って説明変数を入力して予測
y_est = clf.predict(X)

#混同行列を作成
tn, fp, fn, tp = confusion_matrix(y, y_est).ravel()
print(fn, fp)
print(tn, tp)

#'Accuracy、Recall、Precisionを求めて表示
print('Accuracy  = {:.3f}%'.format(100 * (tn+tp)/(tn+fp+fn+tp)))
print('Recall    = {:.3f}%'.format(100 * (tp)/(fn+tp)))
print('Precision = {:.3f}%'.format(100 * (tp)/(fp+tp))) 

 

 2996 19902

103320 80771

Accuracy = 88.938%
Recall = 96.423%
Precision = 80.231%

それぞれの指標で、80%以上と、それなりの精度がでているようです。
 

f:id:kanriyou_h004:20190506201314j:plain

 

前回までに検討した、「goal」と「backers」を説明変数として採用することで、訓練データにおいては、それなりの精度が出せる分類を行うことができるようになりました。

ほかの項目も掘り下げて検討してさらなる精度向上を目指していきたいと思います。

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 

 

 

エピソード3-5: KaggleでKickstarter Projectsに挑戦する。(採用する説明変数の選択)

前回から取り組み始めた「Kaggle」の過去問「Kickstarter Projects」にて、分類に採用する説明変数を選択していきたいと思います。

0.前回の続きなので、ライブラリのインポートや、データ読み込み、データの前処理が実施されている前提です。前回をご覧になっていない方は、以下をご参照ください。

oregin-ai.hatenablog.com

1.散布図行列を描いてみます。

# まず、201801の散布図行列を書いてみる
pd.plotting.scatter_matrix(df_f18_SorF, figsize=(30,30))
plt.show()

f:id:kanriyou_h004:20190504225616j:plain

散布図行列から「state」と相関がありそうなのは、「goal」、「pledged」、「backers」、「usd pledged」、「usd_pledged_real」、「usd_goal_real」にみえるのですが、「pledged」、「usd pledged」、「usd_pledged_real」は、結果として得られる数値なので、予測には使えません。 実質、「goal」、「backers」、「usd_goal_real」の3つが予測には使えると判断し、さらなる分析を実施する。

2.「goal」と「usd_goal_real」の関係を見てみる。

#成功と、失敗でデータを分ける。
df_f18_S = df_f18_SorF[df_f18_SorF['state']==1]
df_f18_F = df_f18_SorF[df_f18_SorF['state']==0]

#それぞれをプロットしてみる
plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.plot(df_f18_F["usd_goal_real"], df_f18_F["goal"], 'o', color='C1', label='false')
plt.plot(df_f18_S["usd_goal_real"], df_f18_S["goal"], 'o', color='C0', label='successful')
plt.legend(loc='best')
plt.show()

 

f:id:kanriyou_h004:20190506184805j:plain

原点周りで重なっていてうまくわかれていなさそうです。

両方の対数をとってみます。

plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.plot(np.log(df_f18_F["usd_goal_real"]), np.log(df_f18_F["goal"]), 'o', color='C1', label='false')
plt.plot(np.log(df_f18_S["usd_goal_real"]), np.log(df_f18_S["goal"]), 'o', color='C0', label='successful')
plt.legend(loc='best')
plt.show()

 f:id:kanriyou_h004:20190506185203j:plain

はやり重なってしまっているので、どちらかの説明変数で十分そうです。
「goal」を採用することにします。

 

3.「goal」と「usd_goal_real」の関係を見てみる。

#成功と、失敗でデータを分ける。
df_f18_S = df_f18_SorF[df_f18_SorF['state']==1]
df_f18_F = df_f18_SorF[df_f18_SorF['state']==0]

#それぞれをプロットしてみる
plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.plot(df_f18_S["backers"], df_f18_S["goal"], 'o', color='C0', label='successful')
plt.plot(df_f18_F["backers"], df_f18_F["goal"], 'o', color='C1', label='false')
plt.legend(loc='best')
plt.show

f:id:kanriyou_h004:20190506163636j:plain

なんとなく、オレンジと青が分かれていることが見えてきた。

オレンジ、青ともに大きくなるほど分散しているように見えるので、対数をとってみることにします。 

#Log(0)対策
delta=1

#「goal」、「backers」の対数の関係を見てみる。
plt.grid(which='major',color='black',linestyle=':')
plt.grid(which='minor',color='black',linestyle=':')
plt.plot(np.log(df_f18_S["backers"]+delta), np.log(df_f18_S["goal"]+delta), 'o', color='C0', label='successful')
plt.plot(np.log(df_f18_F["backers"]+delta), np.log(df_f18_F["goal"]+delta), 'o', color='C1', label='false')
plt.legend(loc='best')
plt.show()

f:id:kanriyou_h004:20190506163909j:plain

さらに分かれている感が出てきました。

「goal」と「backers」は、説明変数として使えそうです。

 

 

ここまでの関係の調査から、目的変数「state」を'successful''false'に分類するためには、説明変数として「goal」と「backers」が使えそうだということがわかってきました。

次回は、この2つの説明変数を使って分類モデルを作っていきたいと思います。

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 

 

 

エピソード3-4: KaggleでKickstarter Projectsに挑戦する。(データの前処理編)

前回、「Kaggle」のアカウントを作成したものの、何から手をつけていいかわからないので、まずは、知り合いの勧めで「Kickstarter Projects」に挑戦したいと思います。

0. まずは、「Kaggle」のホームページにアクセスする。

f:id:kanriyou_h004:20190430221539j:plain

 1.検索窓に「Kickstarter Projects」を入力して検索する。

f:id:kanriyou_h004:20190430221515j:plain

検索窓に「Kickstarter Projects」と入力すると候補にすぐ出てくるので選択します。

2.「Kickstarter Projects」にアクセスする。

f:id:kanriyou_h004:20190430222219j:plain

検索で選択した「Kickstarter Projects」が表示されます。

 3.何はともあれ、データCSVをダウンロードしてみる。

f:id:kanriyou_h004:20190430222725j:plain

まずは、メニューから「Data」を選択し、Data Sourcesから2つのファイルをダウンロードして解凍します。

4.データを読み込む準備として、もろもろライブラリをインポートする。

%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import codecs as cd
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import log_loss, confusion_matrix
import seaborn as sns
データを扱うためにpandas,もろもろ計算するためにnumpy,グラフを書くためmatplotlib,seaborn,コード変換のためにcodecs,各種機械学用にsklearnの各種モジュールをインポートします。

5.データを読み込んで、概要を確認する。

#201801のデータを読み込んでみる
df_f18 = pd.read_csv('ks-projects-201801.csv')
#最初の五行を表示してみる。 display(df_f18.head())

f:id:kanriyou_h004:20190504165126j:plain

最初の5行を表示して、おおよそどのような列があり、どのような値が入っているかを把握します。

 6.統計値と、欠損値、各列のデータタイプを確認する。

#統計値を表示してみる。
display(df_f18.describe())
#欠損値がある行数を数えてみる。
display(df_f18.isnull().sum())
#各列のデータタイプを確認してみる。
display(df_f18.dtypes)

f:id:kanriyou_h004:20190504165644j:plain

統計値から、データの個数や、平均、標準偏差、最大値、最小値など大まかなデータを把握します。カテゴリ変数の列は数値化されていないため表示されていません。
「usd pledged」には2373件の欠損があります、ほかの項目も欠損があります。
データタイプからは、数値データか、それ以外かの大まかな情報が得られます。数値データ以外は、何らかの方法で数値化する必要があります。

7欠損値がある行は、いったん除外してみる。

#1個でも欠損値がある行はとりあえず削除してみる。
df_f18_dna = df_f18.dropna(how='any')
#欠損値がある行数を数えてみる。
display(df_f18_dna.isnull().sum())

dropna()を利用して、引数にhow='any'を指定することで、1項目でも欠損がある行は除外します。なお、すべて欠損している場合にのみ除外する場合は、how='all'を指定します。

f:id:kanriyou_h004:20190504170848j:plain

無事、すべての列で欠損値がなくなりました。 

8.成功(successful)と失敗(failed)の行に絞って考えてみる。 

#stateの要素の個数を数えてみる。
df_f18_dna['state'].value_counts()

f:id:kanriyou_h004:20190504171647j:plain

8割以上が、失敗(failed)か成功(Successful)なので、成功と失敗の行に絞って考えてみることにします。

#成功だけを抽出したDFと失敗だけを抽出したDF
df_f18_success = df_f18_dna[df_f18_dna['state']=='successful']
df_f18_failed =  df_f18_dna[df_f18_dna['state']=='failed']
#両方を結合
df_f18_SorF = pd.concat([df_f18_success,df_f18_failed])
#stateの要素の個数を数えてみる。
df_f18_SorF['state'].value_counts()

成功の行を抽出したデータフレームと、失敗の行を抽出したデータフレームを抽出し、concat()の引数に、両方のデータフレームを渡すことで、結合したデータフレーム(df_f18_SorF)を取得します。

f:id:kanriyou_h004:20190504172316j:plain

無事、成功と失敗の行に絞ったデータフレームが作成できました。 

9.カテゴリ変数は、文字列から数値に変換してみる。

#LabelEncoderのインスタンスを生成
le = LabelEncoder()
#categoryに出てくるカテゴリを覚えて #categoryを数値に変換 le = le.fit(df_f18_SorF['category']) df_f18_SorF['category'] = le.transform(df_f18_SorF['category'])
#main_categoryに出てくるカテゴリを覚えて #main_categoryを数値に変換 le = le.fit(df_f18_SorF['main_category']) df_f18_SorF['main_category'] = le.transform(df_f18_SorF['main_category']) #currencyに出てくるカテゴリを覚えて #currencyを数値に変換 le = le.fit(df_f18_SorF['currency']) df_f18_SorF['currency'] = le.transform(df_f18_SorF['currency']) #stateに出てくるカテゴリを覚えて #stateを数値に変換 le = le.fit(df_f18_SorF['state']) df_f18_SorF['state'] = le.transform(df_f18_SorF['state']) #countryに出てくるカテゴリを覚えて #countryを数値に変換 le = le.fit(df_f18_SorF['country']) df_f18_SorF['country'] = le.transform(df_f18_SorF['country']) df_f18_SorF.head()

f:id:kanriyou_h004:20190504171647j:plain

sklearnのLabelEncoderのインスタンスを作成して、fit()の引数にカテゴリ変数となっている列を渡すことで、その列に出てくる変数の種類を覚えさせて、transform()の引数に当該カテゴリ変数の列を渡すことで、カテゴリ変数の文字列を数値に更新します。(特定の列だけ更新するなといったような警告がでますが、今回は、無視しました。)

f:id:kanriyou_h004:20190504173852j:plain

最初の五行を表示させたところ、無事にカテゴリ変数が数値化されていることが確認できました。 

これで、データを整理したりグラフ化するために、データの前処理ができました。

このデータを使って、引き続き分析を進めていきたいと思います。

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 

 

 

 

エピソード3-3: KaggleでKernelsを使ってみる。

以前、「Kaggle」のアカウントを作成したものの、何から手をつけていいかわからず放置していたので、まずは、「Kernels」を使ってみたいと思います。

パソコンよりも高性能だと聞いているので、楽しみです。

 

0. まずは、「Kaggle」にログインして、「Kernels」を選択。

 

f:id:kanriyou_h004:20190411221451p:plain

ホームサイトの上部のメニューから「Kernels」を選択する。

 

1.右上の「New Kernel」を選択する。

 

f:id:kanriyou_h004:20190411221705p:plain

Kernels画面が表示されるので、右上の「New Kernel」を選択します。

 

2. 「Select Kernel Type」と表示されるので、「Script」か「Notebook」を選択する。

f:id:kanriyou_h004:20190411221935p:plain

「Script」か「Notebook」か選択することができます、今回は、今までもパソコン上で利用していて使い勝手が良いので、「Notebook」を選択します。

3. 「Notebook」が立ち上がります。

f:id:kanriyou_h004:20190411222413p:plain

いつもパソコンで使っている画面が表示されました。

すでに、numpyとpandasがインポートされるようになっているのが、親切ですね。

 

これで、Kaggle上でKernelsが使えるようになりました。

こちらでもPythonの練習をして行きたいと思います。

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

エピソード2-14: DataFrameから情報を取得する〜 E資格への道〜

今回は、pandasでDataFrameから情報を取得してみます。

前回は、DataFrameを作成しましたが、今度は、DataFrameから色々な情報を取得する処理を確認していきます。

では、早速試してきます。

 

 0. まずは、numpyライブラリとpandasライブラリをimport。

f:id:kanriyou_h004:20190414183749p:plain
「import numpy as np」とすることで、「np」にて参照し、各種関数や定数を呼び出すことができます。

「import pandas as pd」とすることで、「pd」にて参照し、各種データを扱う関数を呼び出すことができます。

「from pandas import DataFrame,Series」とすることで、DataFrame,Seriesが扱うことができます。 

 

 

1. DataFramemのdescribe()メソッドで統計値を取得する。

f:id:kanriyou_h004:20190414213813p:plain

サイコロを2個1,000回投げた時の出目をarrayをDataFrameに格納します。

DataFrameのhead()メソッドで列名(columns)と最初の5行(レコード)が表示できます。

f:id:kanriyou_h004:20190414214344p:plain

DataFrameのdescribe()メソッドで、count(レコード数)、mean(平均)、std(標準偏差)、min(最小値)、25%(25%値)、50%(中央値)、75%(75%値)、max(最大値)といった統計値が取得できます。

DataFrameの作成については、過去記事もご参照ください。

oregin-ai.hatenablog.com

2.  DataFrameから特定の列をSeriesとして取得する。

f:id:kanriyou_h004:20190414215636p:plain

f:id:kanriyou_h004:20190414215531p:plain

DataFrameのindexに特定の列名(columns名)を指定することで、指定した列を取得することができます。

f:id:kanriyou_h004:20190414215846p:plain

f:id:kanriyou_h004:20190414215918p:plain

DataFrameの属性に特定の列名(columns名)を指定することでも、同様に、指定した列を取得することができます。

 

3. DataFrameから複数の列をDataFrameとして取得する。

f:id:kanriyou_h004:20190414220539p:plain

f:id:kanriyou_h004:20190414220552p:plain

DataFrameのindexに、複数の列名(columns名)を指定することで、指定した列を取得することができます。
indexに渡すのは、列名('列名','列名',....)ではなく列名のリスト(['列名','列名',....])であることに注意が必要です。

 

f:id:kanriyou_h004:20190414221522p:plain

f:id:kanriyou_h004:20190414221550p:plain

DataFrameのindexに1項目のリスト['列名']を渡すことで、単一の列もSeriesではなく、DataFrameで取得することができます。

 4. DataFrameからスライス記法で行を取得する。

f:id:kanriyou_h004:20190414222250p:plain

DataFrameから[開始行のindex,終了行のindex+1]を指定することで、開始行から終了行までを取得できます。

 

 5. DataFrameから条件を指定して行を取得する。

f:id:kanriyou_h004:20190414223059p:plain

f:id:kanriyou_h004:20190414223119p:plain

DataFrameのindexに条件(今回は、一個めのサイコロの目が1だった場合)を指定することで、条件にあった行だけを取得できます。

 

 

6. DataFrameから列と行を取得する。

f:id:kanriyou_h004:20190414224037p:plain

f:id:kanriyou_h004:20190414224056p:plain

DataFrameのixメソッドで、行と列を指定して取得できます。

行は、スライス記法で指定し、列は列名を指定します。

 

今回は、DataFrameから情報を取得する処理を一通り使ってみました。

SQLによる、データベースの処理に似た処理ができるので、結構理解がしやすかったです。

では、引き続き、頑張って勉強していきたいと思います。

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com