博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《数据分析实战》--第三章 python实现
阅读量:5313 次
发布时间:2019-06-14

本文共 4172 字,大约阅读时间需要 13 分钟。

在中主要介绍分析流程以及每个过程的具体含义。这一章主要利用合并汇总来剖析企业销售额下降的原因。主要利用python中的pandas、matplotlib模块完成书中分析。

1、读取数据、合并数据

 可以采用如下方式先设置工作路径至数据表放在位置,然后利用 os.getcwd() 来查看当前工作路径。

1 import os2 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  payment0    2013-06-01    game-01    116    2013-04-17    game-01    NaN    NaN1    2013-06-02    game-01    116    2013-04-17    game-01    NaN    NaN2    2013-06-03    game-01    116    2013-04-17    game-01    NaN    NaN3    2013-06-04    game-01    116    2013-04-17    game-01    NaN    NaN4    2013-06-05    game-01    116    2013-04-17    game-01    NaN    NaN5    2013-06-06    game-01    116    2013-04-17    game-01    NaN    NaN6    2013-06-07    game-01    116    2013-04-17    game-01    NaN    NaN7    2013-06-08    game-01    116    2013-04-17    game-01    NaN    NaN8    2013-06-09    game-01    116    2013-04-17    game-01    NaN    NaN9    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'] = 03 data_total['new_user'][data_total['log_date']==data_total['install_date']] = 14 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_user0    game-01    116    0.0    2013-06    2013-04    01    game-01    116    0.0    2013-06    2013-04    02    game-01    116    0.0    2013-06    2013-04    03    game-01    116    0.0    2013-06    2013-04    04    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()

由此,由上图可以清晰看出导致本月销售额下降的一个重要原因是由于本月的新用户消费额缩减了近一半。

转载于:https://www.cnblogs.com/beyondChan/p/10869948.html

你可能感兴趣的文章
[LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming
查看>>
[Cypress] Stub a Post Request for Successful Form Submission with Cypress
查看>>
程序集的混淆及签名
查看>>
判断9X9数组是否是数独的java代码
查看>>
00-自测1. 打印沙漏
查看>>
UNITY在VS中调试
查看>>
SDUTOJ3754_黑白棋(纯模拟)
查看>>
Scala入门(1)Linux下Scala(2.12.1)安装
查看>>
如何改善下面的代码 领导说了很耗资源
查看>>
Quartus II 中常见Warning 原因及解决方法
查看>>
php中的isset和empty的用法区别
查看>>
Android ViewPager 动画效果
查看>>
pip和easy_install使用方式
查看>>
博弈论
查看>>
Redis sentinel & cluster 原理分析
查看>>
我的工作习惯小结
查看>>
把word文档中的所有图片导出
查看>>
浏览器的判断;
查看>>
ubuntu 18.04取消自动锁屏以及设置键盘快捷锁屏
查看>>
Leetcode 589. N-ary Tree Preorder Traversal
查看>>