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

セグメント分析:時系列

2016年3月12日土曜日

Pythonでデータサイエンス入門 〜 ヒストグラム:なぜ売上は減少しているのか?

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

今回は第3章「なぜ売上は減少しているのか?」(ヒストグラム)をPythonでコーディングします。

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

"""
ファイル読込
"""
current_dir = os.getcwd()
# DAU
dau = pd.read_csv(os.path.join(current_dir, "data", "section3-dau.csv"))
# DPU
dpu =  pd.read_csv(os.path.join(current_dir, "data", "section3-dpu.csv"))
# INSTALL
install = pd.read_csv(os.path.join(current_dir, "data", "section3-install.csv"))
"""
ファイルを結合(merge)
"""
dau_install = pd.merge(dau, install,
                       how="left",
                       on=["user_id", "app_name"])
dau_install_payment = pd.merge(dau_install, dpu,
                               how="left",
                               on=["log_date", "app_name", "user_id"])
#dau_install_payment.to_csv("merged_file.csv")
"""
非課金ユーザの課金額をゼロにする
"""
dau_install_payment.payment[dau_install_payment.payment.isnull()] = 0.0
print(dau_install_payment.head())
"""
月次集計
"""
# 月カラムを追加する
dau_install_payment["log_month"] = dau_install_payment.log_date.str[0:7]
dau_install_payment["install_month"] = dau_install_payment.install_date.str[0:7]
# グループ化して集計する
mau_payment = dau_install_payment.groupby(
                by=["log_month", "user_id", "install_month"],
                as_index=False
                )["payment"].sum()
print(mau_payment.head())
"""
新規ユーザー/既存ユーザーでの集計
"""
# 新規ユーザー/既存ユーザーの区分を追加する
mau_payment["user_type"] = np.where(mau_payment["install_month"] == mau_payment["log_month"],
                                    "install",
                                    "existing")
print(mau_payment.head())
# 集計
mau_payment_summary = mau_payment.groupby(
                        by=["log_month", "user_type"],
                        as_index=False
                        )["payment"].sum()
mau_payment_summary.columns = ["log_month", "user_type", "total_payment"]
print(mau_payment_summary.head())
"""
グラフ表示
"""
#月別ユーザ数(新規/既存) : 棒グラフ
x_ticks = mau_payment_summary.log_month[
            ~mau_payment_summary.log_month.duplicated()
            ]
x = np.array(range(x_ticks.size))
y_existing = mau_payment_summary[mau_payment_summary.user_type == "existing"].total_payment
y_install = mau_payment_summary[mau_payment_summary.user_type == "install"].total_payment
plt.bar(x, y_existing,
        color="pink",
        label="existing",
        align="center",
        linewidth=0,
        width=0.6)
plt.bar(x, y_install,
        bottom=y_existing,
        color="skyblue",
        label="install",
        align="center",
        linewidth=0,
        width=0.6)
plt.subplots_adjust(right=0.68)
plt.xticks(x, x_ticks)
plt.xlabel("log month")
plt.ylabel("total payment")
plt.legend(bbox_to_anchor=(1.42,1))
plt.show()
#月別新規ユーザー課金額 : ヒストグラム
hdata = mau_payment[(mau_payment.payment > 0) & (mau_payment.user_type == "install")]
payment06 = hdata[hdata.log_month == "2013-06"].payment
payment07 = hdata[hdata.log_month == "2013-07"].payment
plt.hist(x=[payment06, payment07],
        color=["pink", "skyblue"],
        label=["2013-06", "2013-07"],
        linewidth=0)
plt.xlabel("payment")
plt.ylabel("count")
plt.legend(title="log month")
plt.show()

月別ユーザ数(新規/既存) : 棒グラフ
月別新規ユーザー課金額:ヒストグラム