《数据分析实战》--第三章 python实现
在商业数据分析流程中主要介绍分析流程以及每个过程的具体含义。这一章主要利用合并汇总来剖析企业销售额下降的原因。主要利用python中的pandas、matplotlib模块完成书中分析。
1、读取数据、合并数据
可以采用如下方式先设置工作路径至数据表放在位置,然后利用 os.getcwd() 来查看当前工作路径。
1 import os 2 3 filepath = '数据文件所在路径' 4 os.chdir(filepath) #将工作路径设置至filepath
然后利用pandas来读取数据与合并数据。
1 import pandas as pd 2 from pandas import DataFrame, Series 3 4 # 导入三个csv数据表 5 DAU_data = pd.read_csv("section3-dau.csv") 6 DPU_data = pd.read_csv("section3-dpu.csv") 7 Install_data = pd.read_csv("section3-install.csv") 8 9 #合并数据 10 data_total = DAU_data.merge(Install_data, on="user_id") #on表示键 11 data_total = data_total.merge(DPU_data, how='outer', on=['user_id', 'log_date']) #how表示连接方式,这里采用外连接(outer)
合并后的前10行数据。
log_date app_name_x user_id install_date app_name_y app_name payment 0 2013-06-01 game-01 116 2013-04-17 game-01 NaN NaN 1 2013-06-02 game-01 116 2013-04-17 game-01 NaN NaN 2 2013-06-03 game-01 116 2013-04-17 game-01 NaN NaN 3 2013-06-04 game-01 116 2013-04-17 game-01 NaN NaN 4 2013-06-05 game-01 116 2013-04-17 game-01 NaN NaN 5 2013-06-06 game-01 116 2013-04-17 game-01 NaN NaN 6 2013-06-07 game-01 116 2013-04-17 game-01 NaN NaN 7 2013-06-08 game-01 116 2013-04-17 game-01 NaN NaN 8 2013-06-09 game-01 116 2013-04-17 game-01 NaN NaN 9 2013-06-10 game-01 116 2013-04-17 game-01 NaN NaN
2、数据预处理
先将多余的列删除,然后查看每一列的数据类型与缺失情况。
1 data_total.drop(columns=['app_name_y', 'app_name'], inplace=True) 2 data_total.info() 3 data_total.head()
返回结果如下所示:
为了后面统计的方便,这里将user_id的数据类型转变为字符型,然后将日期‘2018-01-03’转换成‘2018-01’。
1 # 将user_id变为字符型 2 data_total['user_id'] = data_total['user_id'].astype('str') 3 4 #日期转换 5 data_total.loc[:, 'log_date'] = pd.to_datetime(data_total.loc[:, 'log_date'], format='%Y/%m/%d', errors='coerce') 6 data_total.loc[:, 'log_date_new'] = data_total.loc[:, 'log_date'].dt.strftime('%Y-%m') 7 data_total.drop(columns=['log_date'], inplace=True) #删除列 8 data_total.rename(columns={'log_date_new':'log_date'}, inplace=True) #将列名重命名 9 10 data_total.loc[:, 'install_date'] = pd.to_datetime(data_total.loc[:, 'install_date'], format='%Y/%m/%d', errors='coerce') 11 data_total.loc[:, 'install_date_new'] = data_total.loc[:, 'install_date'].dt.strftime('%Y-%m') 12 data_total.drop(columns=['install_date'], inplace=True) #删除列 13 data_total.rename(columns={'install_date_new':'install_date'}, inplace=True) #将列名重命名
增加一列变量new_user,表示该位客户是否为新用户,0表示老用户,1表示新用户。
1 #判断其是否为新用户 2 data_total['new_user'] = 0 3 data_total['new_user'][data_total['log_date']==data_total['install_date']] = 1 4 data_total.head(10)
将用户消费金额一列中的缺失值用0填充,然后查看最终数据。
1 data_total['payment'].fillna(value=0, inplace=True) 2 #查看数据 3 data_total.head()
app_name_x user_id payment log_date install_date new_user 0 game-01 116 0.0 2013-06 2013-04 0 1 game-01 116 0.0 2013-06 2013-04 0 2 game-01 116 0.0 2013-06 2013-04 0 3 game-01 116 0.0 2013-06 2013-04 0 4 game-01 116 0.0 2013-06 2013-04 0
为了查看新老用户在6月、7月的消费总额,对消费金额按照月份以及‘new_user’进行分组加总。
1 result = data_total.pivot_table(values='payment', index='new_user', columns='log_date', aggfunc='sum') 2 result.index = ['已有用户', '新用户'] 3 result
3、数据可视化
利用matplotlib做一个累积分布图。
1 import matplotlib.pyplot as plt 2 3 x = list(result.columns) 4 y1 = list(result.loc['已有用户', :]) 5 y2 = list(result.loc['新用户', :]) 6 7 plt.figure(dpi=100, facecolor='0.8') 8 plt.bar(x, y1, width=0.5, color='r', ) 9 plt.bar(x, y2, width=0.5, color='b', bottom=y1) 10 plt.ylim(0, 280000) #设置y轴范围 11 plt.legend(['已有用户', '新用户'], loc='upper right', fontsize=10) #设置图例名称以及位置 12 plt.xlabel('log_month') #x轴名称 13 plt.ylabel('total.payment(JPY)') #y轴名称 14 plt.grid(color='0.5', alpha=0.5) #设置网格 15 #添加标签 16 for a,b in zip(x, y1): 17 plt.text(a, b-100000, '已有用户', ha='center', va='bottom',fontsize=10) 18 for a,b in zip(x, y2): 19 plt.text(a, b+150000, '新用户', ha='center', va='bottom',fontsize=10) 20 #显示 21 plt.show()
由此,由上图可以清晰看出导致本月销售额下降的一个重要原因是由于本月的新用户消费额缩减了近一半。