Avintonでは、インフラ~開発含め、様々なフィールドで活躍するエンジニアが集まっています。
ARoPは、普段関わりが少ないエンジニア同士が、月に一度集まりその月のテーマでハンズオンの講習、交流の場となっています。今回はある日のARoP活動内容について、リアルな参加レポートをさせていただきます。
レポートするのはこの方!未経験から今ではインフラ、開発ともあらゆる分野にて顧客課題に挑戦し続け、
入社1年ですさまじい成長を遂げている、DIY女子、Avintonが誇るかわいらしい女性エンジニアのFさんです。
ARoPとは
Avinton Road of Professional
志の高いAvintonメンバーがその道のプロを目指すために、会社として始めた取り組みです。
もちろん独学で学習を進めることは可能ですが、月に一度エンジニア同士が集まり交流しながらスキルを高めあう、刺激しあうことで、現在のプロジェクトの課題解決や今後のキャリアへの考えるきっかけとなったりと、意欲のあるメンバーが集まることで色々とプラスの効果が期待できるイベントとなっています。
今回のARoPテーマは「データ分析」について
講義内容や講師は月によってさまざまで、今回は常駐先でデータ分析の業務に携わられているIさんがデータ分析基礎について教えてくれました。
最近のARoPでは、講義パートと、実践パートに分かれていて、参加者は講義を聞いた後に
ハンズオンの課題をすすめながら勉強していくというスタイルです。
今回の講義パートはデータ分析のモデリングをする上で必要な前準備である、「EDA(探索的データ解析)と特徴量抽出について」、
実践パートは「ポケモンGOのデータを観察してみる」でした。
講義 : EDA(探索的データ解析)と特徴量抽出について
より詳しい講義内容は、講師を務めたIさんのブログ、
Avinton Exploratory Data Analytics(探索的データ解析) 勉強会で解説していますので要チェックです!
EDAについて
EDA(Explanatory Data Analysis)とは
データ操作の環境はpython3 + jupyter + pandas + matplotlibです。
まずはデータを読み込みます。
データの読み込みは以下のコードで完了です。
1 2 3 4 |
import pandas as pd url = 'https://raw.githubusercontent.com/thr3a/pokemon-stats/master/pokemon.csv' df = pd.read_csv(url, index_col=0) df.head() |
df.head()で表示されるのが以下の表です。
読み込んだデータの先頭だけ確認することができます。
次に基本統計量を確認します。
基本統計量とは
データの特徴を表す値のこと。ここでは総数、平均値、標準偏差、最小値、四分位数、最大値が表示されています。
標準偏差で各カラムを比較すると、それぞれの平均値にばらつきがあるため、認識しづらいので、
標準偏差を平均値で割って変動係数を算出すると数値の大小にとらわれずばらつきを比較することができるようです。
1 2 |
de <span class="token operator">=</span> df<span class="token punctuation">.</span>describe<span class="token punctuation">(</span> <span class="token punctuation">)</span> de<span class="token punctuation">.</span>loc<span class="token punctuation">[</span><span class="token string">'std'</span> <span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">]</span> <span class="token operator">/</span> de<span class="token punctuation">.</span>loc<span class="token punctuation">[</span><span class="token string">'mean'</span><span class="token punctuation">,</span> <span class="token punctuation">:</span><span class="token punctuation">]</span></code><code> |
1 2 3 4 5 6 7 8 |
h <span class="token number">0.378225</span> a <span class="token number">0.402559</span> b <span class="token number">0.414836</span> c <span class="token number">0.424404</span> d <span class="token number">0.391509</span> s <span class="token number">0.453524</span> <span class="token builtin">sum</span> <span class="token number">0.254456</span> dtype<span class="token punctuation">:</span> float64</code><code> |
データの前処理に必要なのが欠損値の確認です。
このデータでの欠損値はtype2だけでしたが、type2は欠損値が存在して正常なのでそのまま。
1 |
df<span class="token punctuation">.</span>isnull<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token builtin">any</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code><code> |
データの散布図を確認します。
点が線形状態になっているほど相関が強いとみることができます。
また、外れ値の存在もここで視覚的に確認することができます。
1 2 3 4 |
import matplotlib.pyplot as plt from pandas import plotting plotting.scatter_matrix(df.loc[:, 'h':'sum'], figsize=(10, 10)) plt.show() |
相関行列を確認します。
相関行列は相関が高いほど1で表記され、黄色になります。
ここではaとsumの相関が高いです。
1 2 3 |
import seaborn as sns cor = df.corr() sns.heatmap(cor, square=True, cmap='plasma', vmax=1,vmin=-1, annot=True) |
特徴量エンジニアリング
目的:データの品質を上げ、モデルの精度向上のため
主成分分析(PCA)
特徴量の次元削減に使われる手法です。
次元が多すぎる場合にモデルの精度を下げてしまう場合があるので、相関の高い多変数から新規に変数を作成する
新規に作成された変数への意味付けは人間が行う必要があります。
1 2 3 4 5 6 7 8 9 10 11 |
<span class="token keyword">from</span> sklearn<span class="token punctuation">.</span>decomposition <span class="token keyword">import</span> PCA pca <span class="token operator">=</span> PCA<span class="token punctuation">(</span><span class="token punctuation">)</span> pca<span class="token punctuation">.</span>fit<span class="token punctuation">(</span>df<span class="token punctuation">.</span>loc<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token string">'h'</span><span class="token punctuation">:</span><span class="token string">'s'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> feature <span class="token operator">=</span> pca<span class="token punctuation">.</span>transform<span class="token punctuation">(</span>df<span class="token punctuation">.</span>loc<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token string">'h'</span><span class="token punctuation">:</span><span class="token string">'s'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> plt<span class="token punctuation">.</span>figure<span class="token punctuation">(</span>figsize<span class="token operator">=</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">)</span> plt<span class="token punctuation">.</span>scatter<span class="token punctuation">(</span>feature<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> feature<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> alpha<span class="token operator">=</span><span class="token number">0.8</span><span class="token punctuation">)</span> plt<span class="token punctuation">.</span>xlabel<span class="token punctuation">(</span><span class="token string">'PC1'</span><span class="token punctuation">)</span> plt<span class="token punctuation">.</span>ylabel<span class="token punctuation">(</span><span class="token string">'PC2'</span><span class="token punctuation">)</span> plt<span class="token punctuation">.</span>grid<span class="token punctuation">(</span><span class="token punctuation">)</span> plt<span class="token punctuation">.</span>show<span class="token punctuation">(</span><span class="token punctuation">)</span></code><code> |
累積寄与率
主成分分析(PCA)で作成した変数の第1主成分から第k主成分までを足した累積寄与率を求める必要があります。
第1~第k主成分がデータ全体の中でどれだけの割合を占めるかを示します。
以下の例では第2主成分までで全体の60%のデータを説明付けることができるようです。
1 2 3 4 5 6 7 8 |
import matplotlib.ticker as ticker import numpy as np plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True)) plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o") plt.xlabel("Number of principal components") plt.ylabel("Cumulative contribution ratio") plt.grid() plt.show() |
ビニング
連続値をわざとカテゴリカルなグループデータに編集する手法で、精度が上昇する場合があるそうです。
(例) 身長は連続値で分析するのではなく、155-160などのグループに分ける
TargetEncoding
カテゴリ変数を数値に変換する目的で行われる手法です。
(機械学習は数値でないと学習できないから)
OneHotEncodingが一般的のようです。
トレンド除去
statsmodelsというライブラリを使用すると
時系列データをトレンド成分、季節成分、残差に分解することができるそうです。
pythonだとこんなことができるんですね・・!すごい・・
実践でポケモンGOのデータを観察してみる
さてここで実践パートです。
データを観察して強いポケモンを探したり、ポケモンGOでコスパの良いポケモンを探していきます。使用するコードは講義パートにあるもので十分ですので、皆さんもぜひ実践してみてください!
ポケモンGOのデータセット
MaxCPがポケモンGOでの強さの指標になっているようです。
Iさんの分析結果を一部以下に貼っておきます。
・伝説ポケモンの分布確認
・コスパの高いポケモンの調査
まとめ
以上、2月のARoPでした!
ARoPでは講義でインプットし、実践でアウトプットする流れの中で、躓きやすいアウトプットの時間に講義担当の方がそばにいるのでつかず離れずのサポートを受けることもできるのが1人で勉強することとの大きな違いです。
毎月いろんな分野で行われているので、ぜひ皆さんも参加してみてください!
ちなみに写真は参加特典のちらし寿司ランチ♪
終わったあとみんなでワイワイ雑談しつつ、次の予定のある人は次へ。
そのまま学習タイムに入る方、雑談を続ける方、、
ぜひ皆さんも、充実な週末をARoPから^^
Avintonはエンジニアの教育に力を入れています。Avintonアカデミーで最新技術を学びませんか?
採用に関してはこちら。未経験エンジニアも積極採用しています!