実践データ分析　ノック21~30

#ノック21:データの読み込み
```ノック21.py
#ジムの利用履歴データ
import pandas as pd
uselog=pd.read_csv("/content/use_log.csv")
print(len(uselog))
uselog.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/75b98be1-1d7b-a589-a16e-495e4c48462e.png)

```ノック21.py
#2019年3月末時点での会員データ
customer=pd.read_csv("/content/customer_master.csv")
print(len(customer))
customer.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/d6f5d1a0-3397-6177-1fb1-cdf4a0627cd0.png)

```ノック21.py
#会員区分データ（オールタイム、デイタイム、ナイト）
class_master=pd.read_csv("/content/class_master.csv")
print(len(class_master))
class_master.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/2ac7d35d-6163-5caf-6cf6-f20302d7c42c.png)

```ノック21.py
#キャンペーン区分データ（入会費無料等）
campaign_master=pd.read_csv("/content/campaign_master.csv")
print(len(campaign_master))
campaign_master.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/15e393d4-12f1-7f21-2b01-97bf25e0d6db.png)

データの長さを見て、主とするデータはcustomer(顧客データ),uselog(利用履歴)をするのがいい！
まず、データ数の少ないcustomer(顧客データ)から主に考えていく！

#ノック22:顧客データを整形
```ノック22.py
#customerを元に、class列,campaign_id列を軸に、カラム名を増やす！
customer_join=pd.merge(customer,class_master,on="class",how="left")
customer_join=pd.merge(customer_join,campaign_master,on="campaign_id",how="left")
customer_join.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/180f8804-02e0-a96a-84e5-9a1718dbc67d.png)

```ノック22.py
#欠損値の確認
customer_join.isnull().sum()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/b53a3d7b-fc8a-5302-30ae-5deb38a8a2dd.png)

元のcustomer(顧客データ)…customer_id,name,class,gender,start_date,end_date,campaign_id,is_delete
以外の**class_name,price,campaign_name**がカラムに追加されていることが確認できる！

#ノック23:顧客データの基礎集計
```ノック23.py
#どの会員に属しているかの数を調べる
customer_join.groupby("class_name").count()["customer_id"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/4276ec50-11a2-dc57-b5cb-b4291bf71b2b.png)

```ノック23.py
#どのキャンペーンで入会したかの数を調べる
customer_join.groupby("campaign_name").count()["customer_id"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/ce6a843c-0eb6-a6a9-5a19-c8c2d71991d2.png)

```ノック23.py
#男女の数を調べる
customer_join.groupby("gender").count()["customer_id"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/69e3cf6d-0f4f-7d26-4464-444f225ffe76.png)

```ノック23.py
#ジムを退会した数を調べる
customer_join.groupby("is_deleted").count()["customer_id"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/196147b2-6061-c1b1-e91c-ed4bfc11c7cb.png)

```ノック23.py
#2018年4月1日～2019年3月31日
customer_join["start_date"]=pd.to_datetime(customer_join["start_date"])
customer_start=customer_join.loc[customer_join["start_date"]>pd.to_datetime("20180401")]
print(len(customer_start))
>>>1361
```
**2018年4月1日～2019年3月31日の入会会員は1361人、退会会員は1350人と全体の会員数はあまり変わってないことが分かる！**

#ノック24:最新顧客データの基礎集計
```ノック24.py
#2019年3月時点において在籍している会員数を調べる
customer_join["end_date"]=pd.to_datetime(customer_join["end_date"])
customer_newer=customer_join.loc[(customer_join["end_date"]>=pd.to_datetime("20190331")) | (customer_join["end_date"].isna())]#isna()はNanの時、Trueを返す
print(len(customer_newer))
customer_newer["end_date"].unique()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/b667abe2-9f15-f5f4-75ec-3e9929c855ca.png)

```ノック24.py
#2019年3月時点において在籍している,どの会員に属しているかの数を調べる
customer_newer.groupby("class_name").count()["customer_id"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/c2d96c20-9051-fbc2-f5ef-d14fc607c6e9.png)

```ノック24.py
#2019年3月時点において在籍している,どのキャンペーンで入会したかの数を調べる
customer_newer.groupby("campaign_name").count()["customer_id"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/f7bd8a00-919e-c431-afb2-a457ac55bc51.png)

```ノック24.py
#2019年3月時点において在籍している,男女の数を調べる
customer_newer.groupby("gender").count()["customer_id"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/03dd2cc1-57b1-c092-4567-7c4af3d61b72.png)

***出力結果を見ると、会員区分、性別は全体で集計した時とあまり変化はない。
しかし、キャンペーン区分に関しては若干違いがある（通常入会72％→81%）
つまり、入会キャンペーンは何かしらの硬貨を生んでいることが分かる。***

#ノック25:利用履歴データを集計する
```ノック25.py
uselog["usedate"]=pd.to_datetime(uselog["usedate"])#datetime型変換
uselog["年月"]=uselog["usedate"].dt.strftime("%Y%m")#年、月のみ取得
uselog_months=uselog.groupby(["年月","customer_id"],as_index=False).count()
uselog_months.rename(columns={"log_id":"count"},inplace=True)
del uselog_months["usedate"]
uselog_months.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/e947935e-a165-aa21-343b-183805ca3c5d.png)

**注意！**

```ノック25.py
uselog["usedate"]=pd.to_datetime(uselog["usedate"])#datetime型変換
uselog["年月"]=uselog["usedate"].dt.strftime("%Y%m")#年、月のみ取得
uselog_months=uselog.groupby(["年月","customer_id"]).count()
uselog_months.rename(columns={"log_id":"count"},inplace=True)
del uselog_months["usedate"]
uselog_months
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/d0882b40-b31a-9fc1-13af-155482a09f42.png)


```ノック25.py
uselog_customer=uselog_months.groupby("customer_id").agg(["mean","me
dian","max","min"])["count"]#平均値、中央値、最大値、最小値
uselog_customer=uselog_customer.reset_index(drop=False)
uselog_customer
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/13c8b316-48b6-a096-8dd5-a01eacc7885d.png)

**注意！**
**drop=Trueにしたらどうなる？**

```ノック25.py
uselog_customer=uselog_months.groupby("customer_id").agg(["mean","me
dian","max","min"])["count"]#平均値、中央値、最大値、最小値
uselog_customer=uselog_customer.reset_index(drop=False)
uselog_customer
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/3fa873ba-fc0c-3fad-a04f-b8a29672b81c.png)


#ノック26:利用履歴データから定期利用フラグ作成
```ノック26.py
#年月だけでなく曜日も特定する
uselog["weekday"]=uselog["usedate"].dt.weekdayy#0月曜、1火曜、２水曜、3木曜、4金曜、5土曜、6日曜
uselog_weekday=uselog.groupby(["customer_id","年月","weekday"],as_index=False).count()[["customer_id","年月","weekday","log_id"]]
uselog_weekday.rename(columns={"log_id":"count"},inplace=True) #inplaceは元のデータを更新するか否か（Trueの時更新）
uselog_weekday.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/c41a5376-8816-cdb1-4340-f4b387591936.png)


```ノック26.py
uselog_weekday=uselog_weekday.groupby("customer_id",as_index=False).max()[["customer_id","count"]]
uselog_weekday["routine_flg"]=0
uselog_weekday["routine_flg"]=uselog_weekday["routine_flg"].where(uselog_weekday["count"]<4,1)
uselog_weekday.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/a0baaf39-1ac9-8b6c-0466-02ac9591a344.png)

#ノック27:顧客データと利用履歴データを結合
```ノック27.py
#customer_joinとuselog_customerを合体、customer_joinとuselog_weekdayを合体
customer_join=pd.merge(customer_join,uselog_customer,on="customer_id",how="left")
customer_join=pd.merge(customer_join,uselog_weekday[["customer_id","routine_flg"]],on="customer_id",how="left")
customer_join.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/543ec515-61f2-6ec1-e90f-0740516bb263.png)
**medianやroutine_flgがカラム列に加わった！**

```ノック27.py
customer_join.isnull().sum()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/54b5ac7d-461f-5a15-5de2-b2fbe8b6a771.png)

#ノック28:会員期間を計算
```ノック28.py
from dateutil.relativedelta import relativedelta
customer_join["calc_date"]=customer_join["end_date"]
customer_join["calc_date"]=customer_join["calc_date"].fillna(pd.to_datetime("20190430"))
customer_join["membership_period"]=0
for i in range(len(customer_join)):
  delta=relativedelta(customer_join["calc_date"].iloc[i],customer_join["start_date"].iloc[i])
  customer_join["membership_period"].iloc[i]=delta.years*12+delta.months
customer_join.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/b8dd9c7a-095c-6478-323f-525f5f58e8d8.png)

#ノック29:顧客行動の各種統計量を把握
```ノック29.py
customer_join[["mean","median","max","min"]].describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/cc90b519-b570-6fdb-8bbe-b8490df2c30a.png)

```ノック29.py
customer_join.groupby("routine_flg").count()["customer_id"]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/0a82ba84-4c50-1df2-a09d-56e9daa3f7e9.png)

```ノック29.py
import matplotlib.pyplot as plt
%matplotlib inline
plt.hist(customer_join["membership_period"])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/b5f0dec3-1667-8b92-542f-ae26bb8da995.png)

#ノック30:大会ユーザーと継続ユーザーの違いを把握
```ノック30.py
customer_end=customer_join.loc[customer_join["is_deleted"]==1]
customer_end.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/11b0040f-928b-1db0-ee8a-29883bd45d7b.png)

```ノック30.py
customer_stay=customer_join.loc[customer_join["is_deleted"]==0]
customer_stay.describe()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/513db465-9358-6b46-02c2-3414c2d5492c.png)