俺のOneNote

俺のOneNote

データ分析が仕事な人のOneNote愛とか、分析小話とか。

レビュー:効果検証入門〜正しい比較のための因果推論/計量経済学の基礎

通読・写経終わったので備忘レビュー。

統計的因果推論を実務的に利用できるようまとめられた一冊でした。

私個人は、RCT・有意差検定や傾向スコアなど、断片的にしか理解しておらず、その利点・欠点なども明確に説明できない状態でした。 そんな自分にはピッタリの本でした。

RCTが実現できた場合の解析例、実現できない場合のバイアスの影響や取り除くための探索的な解析例、傾向スコアマッチング・重み付き推定、介入時期前後を解析するためのDIDなど、 実務家が直面しやすい施策検証・効果検証の場面のベストプラクティスを提供してくれます。

Rに習熟していなくても、処理内容を丁寧に解説してくれているので、仮にコードの読解ができなくとも内容は理解できるようになっています。 Pythonによる書き起こしをしているユーザーの方もいらっしゃいますので、Pythonしかわからない場合はそちらも参考にするといいかもしれません。

「効果検証入門」をPythonで書いた - Qiita

昨今は分析というと機械学習ディープラーニングによる推論精度あたりにフォーカスされることが多いですが、 こいうった仮説設定と探索的な因果推論、効果検証こそデータ分析の本質ではないかな、と思ったりします。

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、 そもそもの論理的思考能力をおろそかにしてはいけません。 データアナリストとして、論理的思考が崩壊してると、たぶんビジネスのテーブルに乗りづらくなると思います。
幸いにもいろんな良書があるので、自身のビジネス分野も踏まえつつ、一つは読んでみることをお勧めします。

コンサル一年目が学ぶこと

コンサル一年目が学ぶこと

マッキンゼー流 入社1年目問題解決の教科書

マッキンゼー流 入社1年目問題解決の教科書

統計的思考力を鍛える

論理的思考力と合わせ、統計データの読み方、導き出し方、統計指標の利点・欠点など必要最低限のことを叩き込みましょう。
記述・推測統計や確率分布、統計的仮説検定、基本的な多変量解析など、全く触れずにPythonとか、kaggleとかに走るのもどうかなー・・・と感じる次第です*2

僕自身、数えるのも無意味なほど恐ろしい大きさのデータを扱う毎日ですが、 意外と古典的な統計学的知見が必要なケースが多いです。(サンプリングとかABテストとか)

また、統計学を”ある程度”理解するためには基礎的な数学力もある程度必要です*3
特にディープラーニングベイズ推定などを理論面から理解しようとすると、解析学線形代数学は避けて通れません。
数学的教養がある方なら問題ないですが、数学を避けてきた方は必要性を見極めつつ、学ぶ必要があります。

統計学のための数学教室

統計学のための数学教室

  • 作者:永野 裕之
  • 発売日: 2015/09/11
  • メディア: 単行本(ソフトカバー)

技術者のための確率統計学 大学の基礎数学を本気で学ぶ

技術者のための確率統計学 大学の基礎数学を本気で学ぶ

  • 作者:中井 悦司
  • 発売日: 2018/09/18
  • メディア: 単行本(ソフトカバー)

表現力・プレゼンテーション力を鍛える

次に示す「実装力」とどっちを重視するか迷いましたが、より本質的なほう、ということでこちらを先に紹介。
論理的思考力とやや被る概念です。

データ分析結果は必ず誰かに見せることが必要になるはずです。
同じチームメンバー?上司?顧客?
分析結果はその分析が必要となっている「文脈」を見極め、それに合うように最適な形*4でアウトプットすることに善処することが必要になります。

僕はデータ分析の5W1Hと呼んでおりますが、その思想は会社公式ブログに書いたのでもし時間があればこちらもよろしくお願いします(宣伝!)

techblog.cccmk.co.jp

分析した結果を最大限活用してもらえるよう、効果的に伝える技術は学ばないといけません。

Google流資料作成術

Google流資料作成術

実装力を鍛える

さて、やっとたどり着いた実装力。
プログラミング言語とか、BIツールとか、SQL等の話です。

正直昨今のデータサイエンスブームにより、僕なんかよりも技術・経験が上な人がいっぱいな気がするのであんま偉そうなこと言えないですが・・・。

・RとPythonを学ぶ

RかPythonか?みたいな記事や、RなんかよりPython一択!みたいな言動もよく見られます。
が、どっちもやるべきです。
RにはPythonにはない豊富な統計ライブラリとアウトプットの潤沢さがあります。
一方のPythonはアプリケーション実装への汎用性の高さや主要な機械学習ライブラリがある程度画一化されておりシンプルであることが魅力です。
データアナリストを名乗る以上、どっちもある程度書けるようにしといたほうが仕事の幅が広がります。*5

Pythonで動かして学ぶ!あたらしい機械学習の教科書 第2版 (AI & TECHNOLOGY)

Pythonで動かして学ぶ!あたらしい機械学習の教科書 第2版 (AI & TECHNOLOGY)

  • 作者:伊藤 真
  • 発売日: 2019/07/18
  • メディア: 単行本(ソフトカバー)

Rではじめるビジネス統計分析

Rではじめるビジネス統計分析

  • 発売日: 2014/07/17
  • メディア: Kindle

Kaggleで勝つデータ分析の技術

Kaggleで勝つデータ分析の技術

・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図も理解できるようにしておきましょう。

+αを鍛える

あとは仕事内容や自信の興味関心に沿って、スキルを得ていく感じになるでしょう。
分析だけじゃなくて環境から作らないといけない場合はVMとかコンテナ技術が必要になるかと思われます。

Google Cloud Platformではじめる機械学習と深層学習

Google Cloud Platformではじめる機械学習と深層学習

  • 作者:吉川 隼人
  • 発売日: 2017/12/12
  • メディア: 単行本(ソフトカバー)

データエンジニア的な立ち回りも必要な場合はデータベース関連技術でしょうか。*7

ソーシャル分析とかWEB解析が必要ならWEB, クローリングや自然言語処理まわりの技術。

Rによるテキストマイニング入門

Rによるテキストマイニング入門

学ぶことに終わりはないのです・・・涙目。

appendix

大変私的かつ支離滅裂な内容になりましたが、
ここに書いてあることは僕も誇れるほどできてないし、まだまだ修行中です。
でも、ある程度仕事上の必要性を加味してさらっと学ぶことができれば、ビジネスの前線で貢献できるデータアナリストとして胸を張ることができると思います。

すべてはデータを利用して社会に価値提供できるようになるため、日々がんばっていきましょう。

*1:もちろん技術的に高度なことを覚えるのは重要だし、個人的にも一番頑張っているところ

*2:実装重視の機械学習エンジニア寄りの仕事なら無視してもいいのかもしれないですが

*3:統計検定1級に落ちた僕は”ある程度”も理解できていないのかもしれない・・・

*4:結果を捻じ曲げる、とかの意味ではありません

*5:それでも、どちらかに偏るのは仕方ないことですし、僕自身もPython偏重です

*6:いや、ダメかも・・・。僕も苦手なのでごめんなさい

*7:ここは読んだことある本がないので、これ良さそうだな~的なものだけpickup

レビュー:Pythonで学ぶネットワーク分析(オーム社 )

読了&写経が終わったので復習レビュー。

先般記事化した以下がやりたいために、ネットワーク分析に初めて手を出しました。

kopaprin.hatenadiary.jp

  • networkxを使うのが初めて
  • 数式・線形代数に抵抗がない

という場合に最適な本であり、僕自身もネットワーク理論初心者でありながら、
ネットワークで何が表現できるか?を俯瞰的に理解し、基本的なコードは実装できるようにはなったと思います。

数式・線形代数の知識が多少無いとつらい点もありますが、基本的に実装コードを用意いただいているため、
数式が理解できなくともやりたいことがコードで再現できるように配慮されています。

こちらの本はネットワーク分析で何ができるかがテーマであるため、
自分がやりたいことをnetworkxを使ってどうやって実装する?みたいなことはリファレンスで補完する必要もあります。

networkx.github.io

第6章のグループ分割の話や第8章の頂点類似度は商品購買アソシエーションや口コミ分析等で使ってみたいと思いました。 うまくいったらいずれ記事化したいです。

書籍後半は膨大なアルゴリズムや理論があるであろうテーマをさらっと内容とコードを紹介いただいている感じなので、 ネットワーク理論に既に精通されている方には不要なのかもしれません。

以上、私のようなネットワーク分析初心者にとっては大変価値の高い本でありました。

XKCDスタイルによるゆるふわPython Data Visualization

matplotlib の XKCDスタイルを適用して、ゆるふわVizを作ってみようというお話です。

XKCDについては以下をご参照ください。

matplotlib.org

xkcd.com

基本的に、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()

f:id:kopaprin:20200517142822p:plain

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

f:id:kopaprin:20200517143011p:plain

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

f:id:kopaprin:20200517143201p:plain

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

f:id:kopaprin:20200517143353p:plain

個人的に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)

f:id:kopaprin:20200517143539p:plain

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)

f:id:kopaprin:20200517143647p:plain

Grouped violinplots with split violins — seaborn 0.10.1 documentation

たまーに使ってみたくなる楽しげなstyleです。 多少のジョークがきくプレゼンや、資料に差し込んでみるのがよさそうです。

横浜市のテイクアウト情報をダッシュボード化してみた件。

f:id:kopaprin:20200509144006j:plain

地元横浜市を応援したいっていうことで、横浜市が展開している以下サイトのデータをTableauダッシュボード化してみました。

www.city.yokohama.lg.jp

処理コードなどはこちらにまとめております。

github.com

基本的に、公開CSVを多少処理して先般記事のとおりジオコーディングしているだけです。

ほんとは料理ジャンルとか駅名とかいろいろ前処理できるといいのかもですが、 あまりにもパターンが多いので挫折。

現状の完成品はこちらです。

※5/9現在、スマホレイアウトしか対応してません。
 Desktopレイアウトとの共存は余裕あれば対応(練習)してみたいと思います。

Google Map API を利用した Python によるジオコーディング

いろんなデータを漁ってると、住所だけの情報を扱うことがでてきます。
よほど整備されたデータでない限り、緯度・経度なんてついてないことが多い。。。

私は地理データが大変苦手なんですが、どうしても正確な位置情報をダッシュボード上にプロットする必要があったので、
Pythonでジオコーディングします。

ググってみると色々やり方はあるようなのですが、
既にエラーで出来ないコードも多かったので、確実なGoogle Map APIgooglemapsを使った方法にします。

Google Map API の使用

GCPでGeocoding APIを取得するだけの作業です。
ソースは以下のような詳しいサイトがたくさんあるので、これらに従えば大丈夫です。

nendeb.com

取得できたらAPIキーをコピっておきます。

f:id:kopaprin:20200508005450p:plain

Python

利用するのは googlemaps です。

github.com

試しにマイホームタウンの横浜市役所の住所をぶちこんでみます。

#!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"])

無事、緯度経度を取得できたようです。

f:id:kopaprin:20200508010312p:plain

実際に横浜市役所の位置か検証します。

先生!ばっちりでありんす!

これで適当にリストで住所をながせば、緯度経度情報が簡単に揃えられそうです。
APIの使用制限や料金はちゃんと検討しないと・・・。まだ詳しくないです。すみません。

ちょっとだけ、地理データと仲良くなれた気がしたデータ遊びでした。