データ分析が出来るようになるには

データの統計分析ができるようになりたいと思い、日々分析コンペに手を出してみたり、本を読んだり、ネットで情報を漁り、勉強している毎日です。
ただ、統計学を体系的に勉強したことがない自分にとって、正直どこから手をつけていいのかがわからず、足元で使える手法を具体例として調べ手を動かしつつも、自分にあった勉強方法も模索しています。


バックグラウンド、現状、目標

理論物理を修士までやっており、多少なりとも数学の手法や統計力学の周辺知識があります。
現状の業務では、いわゆる探索的な分析(グラフ化、相関性の高い変数の抽出、簡単な線形回帰モデル化等)を行っている程度です。
あとは、個人的なアレで恐縮ですが、3月中旬より、念願だった部署移動が叶い、研究/データ分析の部署に行けることになりました。今の環境とはガラッと変わり、より自分がやりたいことに集中できるようになると思います。
目指したい姿として、分析屋さんになりたいというよりは、まずは分析が出来ることで食いっぱぐれないようになること、そして、人工知能が今のパソコンくらいのレベルで当たり前に普及した近未来で不自由なく人工知能を使いこなせるようになること、膨大なデータ量の中から独自の価値を見つけることができるようになることくらいが今の目標です。


分析が出来るということ

「分析が出来るようになりたい」と言う前に、その分析とはなんぞやということなのですが、一口に「分析」と言っても幅広く、とりあえずwikipediaを引用してみると、

分析(ぶんせき、希: ἀνάλυσις、羅、英: Analysis、 独、仏: Analyse)は、
1. ある物事を分解して、それらを成立している成分・要素・側面を明らかにすること。
2. 物質の鑑識・検出、また化学的組成を定性的・定量的に鑑別すること。
3. 概念の内容を構成する諸徴表を各個別に分けて明らかにすること。
4. 証明するべき命題から、それを成立させる条件へ次々に遡っていくやり方。

とあります。

自分の考えている分析は、1と3と4を含んでいますが、抽象的すぎてこの場合あまり得るものがありません。
もっとわかりやすく一言で言うと、「データから特徴を抽出し、事象を理解すること。」だと思っています。
特にオンライン上で起きている様々な事象は、そもそも今までは認識すらされていなかったと思っていて、それが、データを保存し分析できるようになってきて初めて研究の対象として認識されてきているのが現状だと思っています。また、今後IOT、VRなどが商用サービスとして発達してくるにつれて、ますますデータ量が増え、そこで何が起きているのかを理解し認識することに価値が出てくると思います。このような世界で、自分の望む方向に少しでも世界を動かしていけたらいいなと考えています。


というのがまず、大きな概念の話。
具体的にそれらが実現できる、もしくはそれらに関係のある「分析」とは、下記だと思っていて、今は主に「統計的な分析」と、「機械学習を使った分析」について勉強しているという状況です。

  1. 統計的な分析
  2. 機械学習を使った分析
  3. ディープラーニングを使った分析

統計学は所詮方法論

ネットだけだとほとんどの情報が断片的で散らばりすぎていて、初心者が学んでいくには少しハードルが高いです(それでもそうしていくしかないのですが)。
また、教科書だと、半分くらいはすでに知っている情報だったり、今取り組んでいる問題とはほとんど関係ない情報だったりするので、これも一般的に社会人が統計学を学ぶスタイルとしては効率が悪い(それでも教科書を改めて読み込むべきフェーズがなくはないのですが)。

そもそも統計学は、理論物理学とは違い、方法論であり、ツールとしての先人たちの知恵でしかない。これを「体系的に」と言っている時点で間違っているのかもしれません。本来、別の研究したいテーマや分野があって、その評価の方法が各分野で共通で使えるというものに過ぎない。全てを知っていなくてもよく、正しく使えれば良い。その正しく使えるラインは、当然自分の研究したいテーマによって違うので、誰かに教えてもらうのではなく自分で決めるべきものなはず。
だから、データ分析(とその背景にある統計学の知識)は、実データをいじりながら、学ぶべきだという結論に至り、そのようなスタイルで勉強できる環境を探しています。さらにいうと、やっぱり最低ライン押さえておくべき基本的なポイントは、「データ分析が出来るようになるため」というざっくりしたレベルにおいても共通してあり、ここをちゃんと押さえて、(かつできれば効率的に)学習できるWebコンテンツがあればベターです。

手を動かしながら、ざっくり体系的にかつ、必須のポイントを押さえられて勉強出来るというのは、なかなか難しいのですが、先述の下記の記事で紹介している情報サイトや、Codecademy、HackerRankなどの学習サイト、あとはKaggleとかのデータ分析コンペサイト、大学の授業がオンラインで受けられるCourseraなんかを使いこなして、学んでいくのが一番近道かなぁと思ったりしています。

データ分析の勉強方法 - サイバースイッチ


これらを学ぶ中で、統計的な分析、機械学習を使った分析、ディープラーニングを使った分析、これらがどういう位置づけでそれぞれどういうものなのか、出来るだけポイントを整理してここに書いていきたいと思います。

numpyのndarray、pandasのSeriesとDataFrameの使い分け

分析する元データをcsvファイルとして取り込む際、pandasのDataFrameをよく使います。

大体、下記のような感じでとりあえずcsvファイルをDataFrame型変数に格納し、可視化や成型を行なっていきます。

import pandas as pd
df_train = pd.read_csv("___.csv")
df_train.head()


このDataFrame以外にも、同じようなデータ構造を持つクラスはいくつかあるのですが、正直それぞれの違いが整理できてなかったので、調べて整理してみます。


numpyのndarray

まず、ライブラリであるnumpyが持つクラス、ndarrayがあります。
このndarrayは、正確にいうと、多次元配列を扱うクラスです。
import numpy as npでライブラリを読み込んだ後、np.array(引数:多重リストか多重タプル)で作成するのが慣例です。

import numpy as np
a = np.array([1, 2, 3])
print(a)
print(type(a))
# 出力結果
#[1 2 3]


ndarrayには以下のルールがあります。

  1. 配列内要素の型は全て同じ
  2. 配列長は固定 (固定長配列)
  3. 配列の各次元の要素数は同じ

ちなみに、配列内要素のルールについて、いわゆる数字の型でなくてもよいみたいです。その点、上記のルールに漏れがないかと思ったのですが特にstring型の除外ルールとかは不要で、stringとかでもちゃんと定義できました。演算の挙動が気になりますが、ちょっと今回の内容からそれてしまうのでここでは深入りしません。

ndarrayの使い所

ListがネストされたList(要素がListのList、多重リスト)でも同じ配列は作れるのですが、numpyのndarrayはC言語で実装されており、Listよりも早く処理ができるという点が優れています。さらに、ndarray用の便利な関数が多く用意されており、多重リストよりも安易で高速な行列演算処理が可能です。

また、多重リストとndarrayの具体的な違いは下記です。

  1. 多重リストは動的に変更可能ですが、ndarrayは全体の削除、再生成が必要
  2. 多重リストはリスト内でその要素の型が違ってもよいが、ndarray内の要素の型は全て同じである必要がある
  3. 多重リストはネストされているListの要素数はバラバラでもよいが、ndarrayは行毎に列数が異なるようなことは許されない
  4. ndarrayは要素の型や要素数を揃えて固定してしまうことで行列演算用の関数を持つことができ、これを使うことで計算が楽になる

 
 
 
 

pandasのSeries

次にpandasライブラリの持つSeries。こちらはndarrayやDataFrameに比べるとあまり見かけないマイナーな印象。
このSeriesは、一次元の配列です。また、indexというラベルをつけることができます。
import pandas as pdでライブラリを読み込んだ後、pd.Series(引数[data]:dictionary、ndarray、スカラー値など)で作成するのが慣例です。
引数には、dataの他にindexも指定でき、これが値のラベルになります(dictionaryみたいに)。
あと、dictionaryと同じように、このSeriesとDataFrameも要素には数値型だけでなく、stringなども入れることができます。
 
 
このように書きます。
 

s = pd.Series(data, index=index)

 
 
 
■dictionaryを引数とする場合

import pandas as pd
d = {'a' : 1, 'b' : 2, 'c' : 3}
print(pd.Series(d))
# 出力結果
#a    1
#b    2
#c    3
#dtype: float64

 
 
 
■ndarrayを引数とする場合(indexなし)

import numpy as np
import pandas as pd
a = np.array([1, 2, 3])
print(pd.Series(a))
# 出力結果
#0    1
#1    2
#2    3
#dtype: int64

※自動で0,1,2のラベルが付与されている。



■ndarrayを引数とする場合(indexあり)

import numpy as np
import pandas as pd
a = np.array([1, 2, 3])
print(pd.Series(a,index=['a', 'b', 'c']))
# 出力結果
#a    1
#b    2
#c    3
#dtype: int64

※indexによりラベルを指定。



スカラー値を引数とする場合(indexは必須)

import pandas as pd
print(pd.Series(3,index=['a', 'b', 'c']))
# 出力結果
#a    3
#b    3
#c    3
#dtype: int64
Seriesの使い所

Seriesは、dnarrayとほぼ同じようにnumpyの関数の引数として扱えます。
また、1次元配列にラベルがついているという点でdictionaryと似ていますが、Seriesは順序を保存し、その点がdictionaryとの相違点です。よって、文字列のラベルをしていても、整数値で要素にアクセスすることが可能となっています。

import numpy as np
import pandas as pd
a = np.array([1, 2, 3])
s = pd.Series(a,index=['a', 'b', 'c'])
print(s['b'])
# 出力結果
#2
print(s[1])
# 出力結果
#2

Seriesだけだとそれほど便利というわけではないです。たぶん。。。「numpyのndarrayにラベルがつけられるようになったもの」という理解でよいかと。


pandasのDataFrame

冒頭に記載したように、分析だと、大体csvファイルをとりあえずこのDataFrameにぶち込んで、色々いじります。
DataFrameはカラムごとに異なる型の値を持つことができる2次元のラベル付けされたデータ配列です。sqlのテーブルやスプレッドシートのイメージです。



このように書きます


df = pd.DataFrame(data, index=index, columns=columns)


基本的には、List(もしくはSeries)を値とするdictionaryから生成できます。Listの場合は同じ要素数でないとダメなのですが、Seriesであれば、indexが行名となり、あるindexに値が入っていないSeriesでは、そのindexの要素を自動でNanにしてくれるため、要素数は気にしなくてよいです。
具体的な定義例は下記のような感じ。下記ではまず、dというdictionaryを定義します。このdは、ラベル(c_1とか)と、それに紐付く要素(pd.Series)で構成されます。このdを、pd.DataFrameの引数にすると、dのラベルがcolumnsに対応し、dの要素のpd.Seriesの要素([1,2,3])とそのラベルが、それぞれdataとindexに対応します。
各Seriesが各カラム毎の中身を表しており、indexは行を表しています。

d = {'c_1' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 'c_2' : pd.Series(['aaa', 'bbb', 'ccc', 'ddd'], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
# 出力結果
#   c_1   c_2
#a	1.0	aaa
#b	2.0	bbb
#c	3.0	ccc
#d	NaN	ddd

c_1とc_2がcolumnsのラベルの指定になっています。


DataFrameの使い所

ズバリ、sqlのテーブルをpythonでそのまま扱いたい場合。
ただ、一般的なデータ加工は基本的にsqlで加工した方が早いと思います。sqlpythonの業務分担は好みだったり、状況や案件次第だったりもするのですが、pythonsqlライクなことまでやってしまったほうが楽という場合には、pandasのDataFrameを使えばよいと思います。



まとめ

numpyのndarrayは、行列演算をするときに使う。
pandasのSeriesはDataFrameの1カラムを表し、DataFrameはsqlのテーブルをpythonでそのまま扱えるので、簡易的な(探索的な)分析におけるデータの可視化時に便利。
だと思いました。
 
 
 
特に情報がまとまっていた参照元
NumPy 配列の基礎 — 機械学習の Python との出会い
NumPy / pandas | hydroculのメモ

Google Adsenseの住所確認

Google Adsenseの管理画面にログインしたら、赤い帯状の注意文が表示されているのに気付きました。



どうやら、最近初めて広告収入が1000円を超えたので、住所確認のPINコードが郵便で送られてきていたらしいのですが、
アカウント情報に昔の住所が登録されたまま更新していなかったため古い住所にPINコードが送られていたため気づかず、ずっとスルーしてしまっていたようです。
最初のPINコード発行から4ヶ月間以内にPINコードを入力しないと広告が表示されなくなるらしく、自分の場合、気付いた時にはすでに表示されなくなっていたので、4ヶ月以上スルーしていたみたいです(^^;


急いで新しい住所を設定し、PINコード再送付を依頼したのですが、数週間待っても一向に音沙汰なし。
海外から送付されてくるらしく結構時間かかるものらしいのですが、それにしても連絡がないので再送ボタンをポチり、また数週間待ち先日ついにGoogleから郵便が!


こんな感じの封筒が郵送されてきました。
PIN メールのサンプル - AdSense ヘルプ


実はこの前日にも、待ちくたびれて再送ボタンを押そうか迷っていたのですが踏みとどまっていて助かりました。
そして、PINを入力して翌日にはちゃんと広告が表示されるようになりました!




住所設定はちゃんと更新するのを忘れずに。
あと、PINコードは海外から送られてくるので、気長に待ちましょう。