SQLも書けてプログラミングもできるマーケ最強説

はじめまして!
9月にココナラに入社しました、マーケティンググループ兼開発グループの吉川です。

ココナラのマーケメンバーは こちらでも紹介されているように分析のために平気でSQLを書く者達の集まりです。入社前に話は聞いておりましたが、実際にこの目でその姿をみて驚いたのを覚えています。そんな中わたしは、マーケ専属エンジニアとして事業にコミットするべくココナラに参画しました。

マーケティンググループでは毎週勉強会が行われており、各々の専門分野に関する知識をメンバーに発信することで知見を広めたりスキル向上に励んでおります。

さてわたしは何を発信できるのだろうか・・・。

考えた結果、SQLも書けるマーケメンバーなのだからプログラミングもできてしまうのではないか

某大手企業では、SQLでは困難な複雑処理を行うときにプログラミングや機械学習を使って分析をしているというのをよく聞きます。

せっかくマーケ専属エンジニアとして在籍しているのだから、技術に関する情報をグループ内に発信することで分析の幅が広がるのではないかと考えました。幸いなことにマーケティンググループでは週次で勉強会が行われておりますので、まずはそこで興味を持ってもらえるように発信してみようと思います。

本日はそのネタを少しご紹介させていただければと思います。

プログラミングの鬼門、環境構築

エンジニアでも苦労する環境構築。鬼門ともいえるこの負担をなくす、うってつけのサービスがあります。

Googleが機械学習の教育や研究用に提供しているツールであるGoogle Colaboratory

公式ページにも説明されていますが、完全にクラウドで実行されるJupyterノートブック環境で、ブラウザからアクセスすれば環境構築はいりません。しかも無料で利用可能。

ココナラでは分析の元データをBigQueryに蓄積していますが、ColaboratoryはBigQueryからもデータを取得できるため、親和性もよさそうです。ちなみに現在サポートしている言語はPythonのみだそうです。

というわけでこちらを使って、プログラミングを活用したデータの可視化をしてみることにします。

Pythonでデータ分析してみよう

扱うデータは、1912年に沈没し多くの犠牲者がでたタイタニック号の乗客リスト。

これをseabornという可視化ライブラリを利用してグラフにしていきます。 まずはデータを取得します。

import seaborn as sns
# データ取得して先頭10件を表示
titanic = sns.load_dataset("titanic")
titanic.head(10)

f:id:coconala-lucky:20181102154612p:plain
10件だけ表示

それぞれの項目の意味

カラム名 意味 区分
survived 生死 0:死亡, 1:生存
pclass 客室クラス 1,2,3の順に高級クラスの客室
sex 性別 male:男性, female:女性
age 年齢
sibsp 兄弟および配偶者の数
parch 親もしくは子供の数
fare 運賃
embarked 乗船した港
class pclassの別名
who sexの別名
adult_male 成人男性か
deck 事故当時いたデッキの場所
embark_town 乗船した港(三箇所)
alive survivedの別名
alone 家族連れか単身者か

タイタニック号の乗客の年齢分布

取得したデータを元に、例えばタイタニック号の乗客の年齢分布を可視化してみます。

oldest_age = titanic['age'].max()

# 乗客全体の年齢分布
fig = sns.FacetGrid(titanic, aspect=3)
fig.map(sns.kdeplot, "age", shade=True)
fig.set(xlim=(0, oldest_age))

# 客室ごとの年齢分布
fig = sns.FacetGrid(titanic, hue="pclass",aspect=3)
fig.map(sns.kdeplot, 'age', shade= True)
fig.set(xlim=(0, oldest_age))
fig.add_legend()

f:id:coconala-lucky:20181102155448p:plain 乗客全体では20-30歳の乗客が多く、客室ごとに分類してみると1等客室の年齢層が2, 3等客室と比較して高いことがわかります。やはり富裕層が利用していたのでしょうか。

生死を分けた要因

やはり興味深いのは生死を分けた要因はなんだったのか少しだけ見ていきたいと思います。

映画を思い浮かべると、女性、子供を優先して救助ボートに乗せていくシーンを思い浮かべます。それがデータに現れているか見ていきます。データセットに「子供・女性・成人男性」の分類項目がないので、少しコードを書いてデータセットに追加します。

# 15歳以下を子供とする
def male_female_child(passenger):
    age, sex = passenger
    if age <= 15:
        return 'child'
    else:
        return sex
    
titanic['male_female_child'] = titanic[['age', 'sex']].apply(male_female_child, axis=1)
titanic.head(10)

f:id:coconala-lucky:20181102155710p:plain

一番右の列に子供・女性・成人男性(male_female_child)の項目が追加されました。 そして、生死を分けた要因はなんだったのか目星をつけるためにヒートマップを利用して各項目同士の相関係数をだしてみます。

sns.heatmap(titanic.corr(), cbar=True, annot=True, square=True, fmt='.2f' )

f:id:coconala-lucky:20181102160959p:plain

surviveの列をみると、成人男性(adult_male)が-0.56、客室(pclass)が-0.34と他と比較して強い相関関係が出ていることが分かりました。 女性、子供が優先されている仮説が少しずつデータから浮き彫りになってきました。

それでは客室ごとの生存者の割合を女性・子供・成人男性に分類して可視化してみましょう。

sns.factorplot('pclass','survived',hue='male_female_child',data=titanic, order=[1,2,3], aspect=2)

f:id:coconala-lucky:20181102161109p:plain

客室に関わらず、男性の死亡率が高く、女性・子供優先の考えが結果にあらわれているように見えます。しかし客室にばらつきがあるように見えます。

さらにこれを客室だけに絞って生存率をみてみました。すると…

sns.factorplot('pclass','survived',data=titanic, order=[1,2,3])

f:id:coconala-lucky:20181102165341p:plain

船客等級によってはっきりと差がでました。
3等客室の乗客の生存率が30%以下と極端に低い結果となりました。

等級の高い客室乗客を優先して救助されたのでしょうか…? 生死の要因はこれだけでは何も言及できません。救命ボートが1, 2等室側にだけあり3等室付近にはなく、遠くたどり着けなかった人が大勢いた可能性もあります。

データだけではなく実際の事故当時の状況も踏まえて分析していくともっと色々なことがわかってくるのですが、今回の趣旨ではないのでこれ以上の深掘りはやめておくことにします。

最後に

冒頭でも書きました通り、SQLでは困難な複雑処理を行うときにプログラミングや機械学習を使って分析することが当たり前になってきています。
データ活用を強化するアプローチの一つとしてプログラミングを活用した分析について、マーケティンググループ内に技術発信することでスキルアップに繋げ、さらにはココナラを利用してくださる方々へよりよいサービスを提供することに繋がればいいなと思います。


お知らせメール登録
よもやまブログの更新時にメールでお知らせします。