レビュー:効果検証入門〜正しい比較のための因果推論/計量経済学の基礎
通読・写経終わったので備忘レビュー。
統計的因果推論を実務的に利用できるようまとめられた一冊でした。
私個人は、RCT・有意差検定や傾向スコアなど、断片的にしか理解しておらず、その利点・欠点なども明確に説明できない状態でした。 そんな自分にはピッタリの本でした。
読了した。RCTや傾向スコア他、統計モデルの活用方法を実務目線で大いに学べたと思います。
— koba@DataAnalyst (@h_kobayashi1125) 2020年6月30日
分析というと、機械学習・深層学習で高精度を!という風潮もありますが、個人的にはこれこそ分析!という感じです。
効果検証入門〜正しい比較のための因果推論/計量経済学の基礎 https://t.co/MqOyHZuD5V
RCTが実現できた場合の解析例、実現できない場合のバイアスの影響や取り除くための探索的な解析例、傾向スコアマッチング・重み付き推定、介入時期前後を解析するためのDIDなど、 実務家が直面しやすい施策検証・効果検証の場面のベストプラクティスを提供してくれます。
Rに習熟していなくても、処理内容を丁寧に解説してくれているので、仮にコードの読解ができなくとも内容は理解できるようになっています。 Pythonによる書き起こしをしているユーザーの方もいらっしゃいますので、Pythonしかわからない場合はそちらも参考にするといいかもしれません。
昨今は分析というと機械学習・ディープラーニングによる推論精度あたりにフォーカスされることが多いですが、 こいうった仮説設定と探索的な因果推論、効果検証こそデータ分析の本質ではないかな、と思ったりします。
R と Python よく出るテーブル処理対応表
RとPythonのよくやるテーブル処理の操作覚書。
#python import pandas as pd pd.__version__ # '1.0.3'
#R library("tidyverse") packageVersion("tidyverse") # ‘1.3.0’
- 厳密にはアウトプットの内容が完全に一致するものを並べているわけではありません。
- 単純な関数・メソッドで、似たような目的の処理ができるものの対比です。
- 同じ目的で並べてる関数・メソッドで、返り値や型が一致しないものもあります。
- R, Pythonともに不自由なので、他にもっとよい関数等が存在すると思います。ご容赦ください。
- 自分自身の覚書なので随時更新するかもです。
テーブルデータ(csv)の読み込み
内容 | R | Python |
---|---|---|
csv読み込み(ヘッダー付き) | read.csv("hoge.csv") |
pd.read_csv("hoge.csv") |
csv読み込み(ヘッダー無し) | read.csv("hoge.csv", header = F ) |
pd.read_csv("hoge.csv", header=None) |
テーブルデータの概略確認
内容 | R | Python |
---|---|---|
行列数の確認 | dim(df) |
df.shape |
データ型の確認 | str(df) |
df.dtypes |
先頭行の確認 | head(df) |
df.head() |
要約統計量の確認 | summary(df) |
df.describe(include="all") |
行列の抽出
内容 | R | Python |
---|---|---|
カラム名を指定 | df$hoge df[,"hoge"] |
df["hoge"] df.loc[:,"hoge"] |
カラム番号を指定 | select(df, c(1:3)) |
df.iloc[:,range(0,3)] |
条件指定行を抽出 | filter(df, hoge == "abc" ) |
df[df["hoge"]=="abc"] |
新規列挿入
内容 | R | Python |
---|---|---|
新しい列を挿入 | mutate(df, hoge = 10) |
df["hoge"] = 10 |
集計
内容 | R | Python |
---|---|---|
groupbyで集計 | group_by(df, col) %>% summarise(hoge = sum(values)) |
df.groupby("col").sum()["values"] |
Merge
内容 | R | Python |
---|---|---|
inner join | inner_join(df1 , df2 ,by="hoge") |
pd.merge(df1, df2, on='hoge', how='inner') |
left outer join | left_join(df1 , df2 ,by="hoge") |
pd.merge(df1, df2, on='hoge', how='inner') |
データアナリストを目指したい人のために個人的な道案内をしてみる
コロナ影響による陰りがありつつ、データサイエンス人気は依然として高そうです。
僕自身も、データサイエンス・データアナリティクスは引き続きビジネスにあたって、なくてはならない技術でありつづける気はしています。
(コレだけでは食っていけなくなる危機感もある)
データアナリストを名乗る底辺な私ではありますが、これから目指したいと思っている学生やキャリアチェンジ組の方、新卒でデータアナリストになってこれから頑張ろうとしている人に、自分の経験を元にした至極私的な道案内をしてみます。
※なんかamazonリンクばっかで大変アフィリエイトっぽい感じですが、一切リンクないので安心してご閲覧ください!爆
私はどんな人?
そもそも私はこんな感じです。
・10年ぐらいコンサル兼データアナリスト、転職後2年ぐらいデータアナリスト専業
・R、Python等のプログラミング言語ちょっと。Power BI , TableauなどBIツールちょっと
・機械学習・ディープラーニング実装できるけど教科書レベル(kaggleとかは勝てない)
上記のとおり、今をときめくkagglerとは程遠く、機械学習エンジニア寄りではありません。
どちらかといえばコンサルティング・マーケティング寄りのデータアナリストだと思います。
なので、データサイエンティスト(機械学習エンジニア寄り)になりたいって方は戻るボタンを押すのが賢明です。
あくまでフロントに立ちつつ、現場で必要になるデータ分析をするような人間になるため
に何が必要になるか(というか、自分がこんなこと大事にしていきたい)ということを書きます。
フロント意識を鍛える
これは職場環境やポジションによるのかもしれませんが、ビジネスの先にいるお客様のことを考えることが何より大事なんだろうな、と思っています。
「バックオフィス」みたいな意識を持ってしまうと、どうしても「お客様」ではなく、対峙する営業の人や上司が「どう考えるか?」を前提にしてしまいます。
「お客様」と接することができる立場にある場合は積極的にフロントに出ること。
フロントに出れない場合でも、分析・提供した結果、「お客様」にどんなメリットがあるかを考えたアウトプットを心がけることが大切であると感じております。
コンサルティング力・論理的思考力を鍛える
論理的思考力はデータ分析以上に重要で価値創出につながる基礎になります。
超先進的で高度なデータ分析技法を利用したとしても、論理的な課題選定と仮説立案・結論のためのExcel集計に勝てないケースもあるのではないでしょうか?
昨今、データサイエンスブームと演算速度の向上やクラウド技術の発達にあわせて技術的な要素が非常に重視されていますが*1、
そもそもの論理的思考能力をおろそかにしてはいけません。
データアナリストとして、論理的思考が崩壊してると、たぶんビジネスのテーブルに乗りづらくなると思います。
幸いにもいろんな良書があるので、自身のビジネス分野も踏まえつつ、一つは読んでみることをお勧めします。
- 作者:大嶋 祥誉
- 発売日: 2013/04/25
- メディア: 単行本
- 作者:永田 豊志
- 発売日: 2008/11/29
- メディア: 単行本
統計的思考力を鍛える
論理的思考力と合わせ、統計データの読み方、導き出し方、統計指標の利点・欠点など必要最低限のことを叩き込みましょう。
記述・推測統計や確率分布、統計的仮説検定、基本的な多変量解析など、全く触れずにPythonとか、kaggleとかに走るのもどうかなー・・・と感じる次第です*2。
僕自身、数えるのも無意味なほど恐ろしい大きさのデータを扱う毎日ですが、 意外と古典的な統計学的知見が必要なケースが多いです。(サンプリングとかABテストとか)
また、統計学を”ある程度”理解するためには基礎的な数学力もある程度必要です*3。
特にディープラーニングやベイズ推定などを理論面から理解しようとすると、解析学・線形代数学は避けて通れません。
数学的教養がある方なら問題ないですが、数学を避けてきた方は必要性を見極めつつ、学ぶ必要があります。
- 作者:永野 裕之
- 発売日: 2015/09/11
- メディア: 単行本(ソフトカバー)
- 作者:中井 悦司
- 発売日: 2018/09/18
- メディア: 単行本(ソフトカバー)
スバラシク実力がつくと評判の微分積分キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!
- 作者:馬場 敬之
- 発売日: 2017/09/01
- メディア: 単行本
表現力・プレゼンテーション力を鍛える
次に示す「実装力」とどっちを重視するか迷いましたが、より本質的なほう、ということでこちらを先に紹介。
論理的思考力とやや被る概念です。
データ分析結果は必ず誰かに見せることが必要になるはずです。
同じチームメンバー?上司?顧客?
分析結果はその分析が必要となっている「文脈」を見極め、それに合うように最適な形*4でアウトプットすることに善処することが必要になります。
僕はデータ分析の5W1Hと呼んでおりますが、その思想は会社公式ブログに書いたのでもし時間があればこちらもよろしくお願いします(宣伝!)
分析した結果を最大限活用してもらえるよう、効果的に伝える技術は学ばないといけません。
- 作者:コール・ヌッスバウマー・ナフリック
- 発売日: 2017/02/16
- メディア: 単行本
- 作者:山口 周
- 発売日: 2012/10/19
- メディア: 単行本
実装力を鍛える
さて、やっとたどり着いた実装力。
プログラミング言語とか、BIツールとか、SQL等の話です。
正直昨今のデータサイエンスブームにより、僕なんかよりも技術・経験が上な人がいっぱいな気がするのであんま偉そうなこと言えないですが・・・。
・RとPythonを学ぶ
RかPythonか?みたいな記事や、RなんかよりPython一択!みたいな言動もよく見られます。
が、どっちもやるべきです。
RにはPythonにはない豊富な統計ライブラリとアウトプットの潤沢さがあります。
一方のPythonはアプリケーション実装への汎用性の高さや主要な機械学習ライブラリがある程度画一化されておりシンプルであることが魅力です。
データアナリストを名乗る以上、どっちもある程度書けるようにしといたほうが仕事の幅が広がります。*5
Pythonで動かして学ぶ!あたらしい機械学習の教科書 第2版 (AI & TECHNOLOGY)
- 作者:伊藤 真
- 発売日: 2019/07/18
- メディア: 単行本(ソフトカバー)
- 発売日: 2014/07/17
- メディア: Kindle版
・BIを学ぶ
BIツールはここ数年でかなりの会社に浸透してきているのではないかと思います。
Power BI , Tableau , Google Data Portal , Domoなど、多くのツールがあふれています。
どれを学ぶか?は職場に応じて決まるはずです。
アナリストである以上、機械学習の精度を突き詰めることもいいかもしれないですが、可視化によって多くの人がインサイトを得ることを支援することも大事でしょう。
もし、職場でBIなんて導入していない!という場合は、
無料で始められる Power BI , Tableau Public ,Google Data Portalなどを私的に利用・学習すると良いと思います。
それぞれ、得意・不得意などがありますが、BIによるデータ集計&可視化の概念はどれも似たり寄ったりです。
BIの集計・可視化概念はどれで遊んでも習得できます。
・SQLを学ぶ
R・Pythonのようなプログラミング言語、BIのような可視化ツール、これとともに学ぶべきは、データ抽出・集計の基礎になるSQLでしょう。
Python, Rで分析する以前に、データを必要な形で抽出できるようSQLを書く場面は必ずあります。
BIにおいてもSQLやデータベースの概念を理解しておくと集計が大変理解しやすい場面もあります。
ほんとにシンプルなjoinや, サブクエリが書けるだけでもいいと思います。*6
ER図も理解できるようにしておきましょう。
10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く (Informatics &IDEA)
- 作者:青木 峰郎
- 発売日: 2015/06/30
- メディア: 単行本
+αを鍛える
あとは仕事内容や自信の興味関心に沿って、スキルを得ていく感じになるでしょう。
分析だけじゃなくて環境から作らないといけない場合はVMとかコンテナ技術が必要になるかと思われます。
Google Cloud Platformではじめる機械学習と深層学習
- 作者:吉川 隼人
- 発売日: 2017/12/12
- メディア: 単行本(ソフトカバー)
プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化
- 作者:WINGSプロジェクト阿佐 志保
- 発売日: 2018/04/11
- メディア: Kindle版
データエンジニア的な立ち回りも必要な場合はデータベース関連技術でしょうか。*7
ソーシャル分析とかWEB解析が必要ならWEB, クローリングや自然言語処理まわりの技術。
Pythonクローリング&スクレイピング[増補改訂版] -データ収集・解析のための実践開発ガイド
- 作者:加藤 耕太
- 発売日: 2019/08/10
- メディア: 単行本(ソフトカバー)
- 作者:石田 基広
- 発売日: 2017/06/28
- メディア: 単行本
学ぶことに終わりはないのです・・・涙目。
appendix
大変私的かつ支離滅裂な内容になりましたが、
ここに書いてあることは僕も誇れるほどできてないし、まだまだ修行中です。
でも、ある程度仕事上の必要性を加味してさらっと学ぶことができれば、ビジネスの前線で貢献できるデータアナリストとして胸を張ることができると思います。
すべてはデータを利用して社会に価値提供できるようになるため、日々がんばっていきましょう。
レビュー:Pythonで学ぶネットワーク分析(オーム社 )
読了&写経が終わったので復習レビュー。
Pythonで学ぶネットワーク分析: ColaboratoryとNetworkXを使った実践入門
- 作者:剛志, 村田
- 発売日: 2019/09/15
- メディア: 単行本
先般記事化した以下がやりたいために、ネットワーク分析に初めて手を出しました。
networkx
を使うのが初めて- 数式・線形代数に抵抗がない
という場合に最適な本であり、僕自身もネットワーク理論初心者でありながら、
ネットワークで何が表現できるか?を俯瞰的に理解し、基本的なコードは実装できるようにはなったと思います。
数式・線形代数の知識が多少無いとつらい点もありますが、基本的に実装コードを用意いただいているため、
数式が理解できなくともやりたいことがコードで再現できるように配慮されています。
こちらの本はネットワーク分析で何ができるかがテーマであるため、
自分がやりたいことをnetworkx
を使ってどうやって実装する?みたいなことはリファレンスで補完する必要もあります。
第6章のグループ分割の話や第8章の頂点類似度は商品購買アソシエーションや口コミ分析等で使ってみたいと思いました。 うまくいったらいずれ記事化したいです。
書籍後半は膨大なアルゴリズムや理論があるであろうテーマをさらっと内容とコードを紹介いただいている感じなので、 ネットワーク理論に既に精通されている方には不要なのかもしれません。
以上、私のようなネットワーク分析初心者にとっては大変価値の高い本でありました。
XKCDスタイルによるゆるふわPython Data Visualization
matplotlib の XKCDスタイルを適用して、ゆるふわVizを作ってみようというお話です。
XKCDについては以下をご参照ください。
基本的に、matplotlibオブジェクトの描写コードをwith
構文内に仕込めむだけの単純作業です。
import matplotlib.pyplot as plt import seaborn as sns import numpy as np import pandas as pd sns.set() df = sns.load_dataset("titanic")
普通の描写だと
idx = df["embark_town"].value_counts().index val = df["embark_town"].value_counts().values width = 0.6 plt.figure(figsize=(8,4),facecolor="white") plt.barh(idx, val, width) for x, y in zip(val, idx): plt.text(x, y, x, ha='left') plt.ylabel('Embark town') plt.title('Record counts by embark town') plt.show()
XKCDスタイルを適用してみます。
with plt.xkcd(): width = 0.6 plt.figure(figsize=(8,4),facecolor="white") plt.barh(idx, val, width) for x, y in zip(val, idx): plt.text(x, y, x, ha='left') plt.ylabel('Embark town') plt.title('Record counts by embark town') plt.show()
seabornの統計グラフでもきちんと機能します。
with plt.xkcd(): plt.figure(figsize=(8,5),facecolor="white") sns.distplot(df[df["survived"]==1]["age"]) sns.distplot(df[df["survived"]==0]["age"]) plt.legend(["survived : 1","survived : 0"]) plt.title("Age distribution by survived") plt.show()
scatter plot系はそんなに変わり映えしません。
np.random.seed(19680801) N = 100 r0 = 0.6 x = 0.9 * np.random.rand(N) y = 0.9 * np.random.rand(N) area = (20 * np.random.rand(N))**2 c = np.sqrt(area) r = np.sqrt(x ** 2 + y ** 2) area1 = np.ma.masked_where(r < r0, area) area2 = np.ma.masked_where(r >= r0, area) with plt.xkcd(): plt.figure(figsize=(6,6),facecolor="white") plt.scatter(x, y, s=area1, marker='^', c=c) plt.scatter(x, y, s=area2, marker='o', c=c) theta = np.arange(0, np.pi / 2, 0.01) plt.plot(r0 * np.cos(theta), r0 * np.sin(theta)) plt.show()
個人的にbox plot、violin plotの描写が可愛らしくてすきです。
with plt.xkcd(): f, ax = plt.subplots(figsize=(7, 6)) ax.set_xscale("log") planets = sns.load_dataset("planets") sns.boxplot(x="distance", y="method", data=planets, whis=[0, 100], palette="vlag") sns.swarmplot(x="distance", y="method", data=planets, size=2, color=".3", linewidth=0) ax.xaxis.grid(True) ax.set(ylabel="") sns.despine(trim=True, left=True)
Horizontal boxplot with observations — seaborn 0.10.1 documentation
sns.set(style="whitegrid", palette="pastel", color_codes=True) tips = sns.load_dataset("tips") with plt.xkcd(): plt.figure(figsize=(6,4)) sns.violinplot(x="day", y="total_bill", hue="smoker", split=True, inner="quart", palette={"Yes": "y", "No": "b"}, data=tips) sns.despine(left=True)
Grouped violinplots with split violins — seaborn 0.10.1 documentation
たまーに使ってみたくなる楽しげなstyleです。 多少のジョークがきくプレゼンや、資料に差し込んでみるのがよさそうです。
Google Map API を利用した Python によるジオコーディング
いろんなデータを漁ってると、住所だけの情報を扱うことがでてきます。
よほど整備されたデータでない限り、緯度・経度なんてついてないことが多い。。。
私は地理データが大変苦手なんですが、どうしても正確な位置情報をダッシュボード上にプロットする必要があったので、
Pythonでジオコーディングします。
ググってみると色々やり方はあるようなのですが、
既にエラーで出来ないコードも多かったので、確実なGoogle Map APIとgooglemaps
を使った方法にします。
Google Map API の使用
GCPでGeocoding APIを取得するだけの作業です。
ソースは以下のような詳しいサイトがたくさんあるので、これらに従えば大丈夫です。
取得できたらAPIキーをコピっておきます。
Python
利用するのは googlemaps
です。
試しにマイホームタウンの横浜市役所の住所をぶちこんでみます。
#!pip install googlemaps import googlemaps googleapikey = 'ここにAPIキーを入れる' gmaps = googlemaps.Client(key=googleapikey) gmap_list = gmaps.geocode("横浜市中区港町1-1") ll = gmap_list[0]["geometry"]["location"] print("Latitude : ",ll["lat"]) print("Longitude : ",ll["lng"])
無事、緯度経度を取得できたようです。
実際に横浜市役所の位置か検証します。
先生!ばっちりでありんす!
これで適当にリストで住所をながせば、緯度経度情報が簡単に揃えられそうです。
※APIの使用制限や料金はちゃんと検討しないと・・・。まだ詳しくないです。すみません。
ちょっとだけ、地理データと仲良くなれた気がしたデータ遊びでした。