2016年3月26日土曜日

Pythonでデータサイエンス入門〜クロス集計:どの属性の顧客が離脱しているのか

ビジネス活用事例で学ぶデータサイエンス入門 (SBクリエイティブ)では、Rでコーディングされたプログラムを使ってデータ分析を行っています。これをPythonでやるとどうなるのか、Python初心者、データサイエンス初心者がやってみました。
コーディングの環境はminiconda3でインストールしたSpyderを使ってます。

今回は第4章「どの属性の顧客が離脱しているのか?」(クロス集計)をPythonでコーディングします。

# -*- coding: utf-8 -*-
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

"""
ファイル読込
"""
current_dir = os.getcwd()
data_dir = "data"
dau_file = "section4-dau.csv"
userinfo_file = "section4-user_info.csv"
# DAU
dau = pd.read_csv(os.path.join(current_dir, data_dir, dau_file))
print(dau.head())
# User Info
userinfo = pd.read_csv(os.path.join(current_dir, data_dir, userinfo_file))
print(userinfo.head())
"""
ファイルを結合 : merge
"""
dau_userinfo = pd.merge(dau, userinfo,
                        how="left",
                        on=["user_id", "app_name"])
print(dau_userinfo.head())
"""
セグメント分析 : 性別でクロス集計
"""
dau_userinfo["log_month"] = dau_userinfo.log_date.str[0:7]
cross_gender = pd.crosstab(dau_userinfo.log_month, dau_userinfo.gender)
print(cross_gender)
"""
セグメント分析 : 年代でクロス集計
"""
cross_generation = pd.crosstab(dau_userinfo.log_month, dau_userinfo.generation)
print(cross_generation)
"""
セグメント分析 : 性別 x 年代で集計
"""
pivot_gender_generation = pd.pivot_table(dau_userinfo,
                                        values="user_id",
                                        index=["log_month"],
                                        columns=["gender", "generation"],
                                        aggfunc=np.count_nonzero)
print(pivot_gender_generation)
"""
セグメント分析 : デバイスのクロス集計
"""
cross_device = pd.crosstab(dau_userinfo.log_month, dau_userinfo.device_type)
print(cross_device)
"""
セグメント分析の結果を可視化する
"""
# 日付、デバイス別にユーザー数を算出する
dau_userinfo_device_summary = dau_userinfo.groupby(
                                    by=["log_date", "device_type"],
                                    as_index=False
                                    ).user_id.count()
dau_userinfo_device_summary.columns = ["log_date", "device_type", "dau"]
# log_dateを日付型に変換する
dau_userinfo_device_summary.log_date = pd.to_datetime(dau_userinfo_device_summary.log_date)
print(dau_userinfo_device_summary)
# 時系列のトレンドグラフを描画する
xy_android = dau_userinfo_device_summary[
                    dau_userinfo_device_summary.device_type =="Android"
                    ][["log_date", "dau"]]
xy_ios = dau_userinfo_device_summary[
                    dau_userinfo_device_summary.device_type =="iOS"
                    ][["log_date", "dau"]]
plt.plot(
        xy_android.log_date,
        xy_android.dau,
        linestyle="--",
        marker="o",
        markersize=10,
        color="pink",
        label="Android"
        )
plt.plot(
        xy_ios.log_date,
        xy_ios.dau,
        linestyle="-",
        marker="^",
        markersize=10,
        color="skyblue",
        label="iOS"
        )
plt.axis(facecolor="black")
plt.ylim(ymin=0)
plt.xlabel("log date")
plt.ylabel("dau")
plt.subplots_adjust(right=0.86)
plt.legend(title="device type", loc="right", bbox_to_anchor=(1.32,.5))
plt.show()

セグメント分析:時系列

0 件のコメント:

コメントを投稿