接着上篇Python基础篇:一维数据分析和二维数据分析,我们此篇为第二大部分:
我们先看一下本次的实战数据吧~
Python实战篇:业务中的Python操作
在前期用Excel进行数据分析时,我们有讲过数据分析的步骤,此次我们对步骤进行再温习一遍:
- 提出问题
- 理解数据
- 数据预处理
- 构建模型
- 数据可视化
明确问题
此次我们有以下几个问题:
- 月均消费次数是多少?
- 月均销售额是多少?
- 客单价是多少?
问题我们知道了,接下来我们需要对手里的数据和这些业务指标进行理解。
理解数据
导入数据,先看一下整体情况:
df = pd.read_excel('朝阳医院2018年销售数据.xlsx')
print(df.columns)
我们的数据有'购药时间', '社保卡号', '商品编码', '商品名称', '销售数量', '应收金额', '实收金额'7列;
目前读取进来的数据均为数字型,一会儿再做调整。
现在明白了我们有哪些数据,再和我们的问题联系起来:
- 月均销售次数 = 总消费次数/月份数;
- 月均销售金额 = 总消费金额/月数;
- 客单价 = 总消费金额/总消费次数;
看起来,只要我们找到了总消费次数、总月份数、消费总金额,这些问题便可迎刃而解了。
总消费次数:我们需要根据“购药时间”&“社保卡号”是否一致来判断是否重复,去重后变可得到总的消费次数;
总消费金额:只需要对“实收金额”求和便得到总消费金额;
总月份数:可以从“购药时间”来看最小日期和最大日期,作差就是相差日,然后除30就是月份数。
接下来,就需要我们对数据进行预处理,处理成我们需要的样子。
数据预处理
- 选择子集
此次分析需要全部字段,故无需选择子集。
- 列名重命名
我们将“购药时间”更改为“销售时间”更易理解:
# 更改“购药时间”为“销售时间”
df.rename(columns={'购药时间':'销售时间'} , inplace=True)
- 缺失值处理
因为我们需要根据“购药时间”&“社保卡号”是否一致来判断是否重复,所以删除“销售时间”、“社保卡”号中为空的行:
# 删除“销售时间”、“社保卡”号中为空的行
df = df.dropna(subset=['销售时间','社保卡号'],how ='any')
- 数据类型转换
可以看到“社保卡号”“商品编码”此时都是浮点型:
print(type(df['社保卡号'][0]),type(df['商品编码'][0]))
① 我们需要把浮点型转换成字符串,这里我们先自定义函数再使用apply对数据进行预处理:
# 将浮点型转为字符串
def col(st):
x = str(int(st))
return x
# 使用apply对数据进行预处理
df['社保卡号'] = df['社保卡号'].apply(col)
df['商品编码'] = df['商品编码'].apply(col)
print(type(df['社保卡号'][0]),type(df['商品编码'][0]))
② 需要把“销售时间”的“2018-01-06 星期三”的格式转成“2018-01-06”格式:
# 将时间中的星期去掉
def datetm(st):
x = st.split(' ')[0]
return x
df['销售时间'] = df['销售时间'].apply(datetm)
③ 现在需要把转出字符串的时间转换日期格式:
# 将字符串转换成日期
def dt(st):
x = pd.to_datetime(st,format='%Y-%m-%d',errors='coerce')
return x
df['销售时间'] = df['销售时间'].apply(dt)
我们可以检查一下“销售时间”格式:
type(df['销售时间'][0])
我们还需要对df的异常值处理。
- 数据排序
因为要计算总月份,最小日期和最大日期作差,所以我们需要把数据集按照时间进行排序——升序:
# 按照“销售时间”排序
df.sort_values(by = '销售时间',ascending =True)
- 异常值处理
通过describe()对df每一列检查描述统计信息,发现出现负数,销售数量应该>0,所以出现不符合条件的异常值;
# 描述统计信息
df.describe()
我们对异常值进行处理,删除不符合条件的值:
# 删除不符合条件的异常值(销售数量>0)
df = df[df.loc[:,'销售数量']>0]
现在我们需要把index重命名:
df.reset_index(drop =True)
构建模型
对各指标进行计算:
① 总销售次数
# 计算总销售次数
sale_counts = df.drop_duplicates(subset = ['销售时间','社保卡号']).shape[0]
② 总销售金额
# 计算总销售金额
sale_money = df['实收金额'].sum()
③ 总月份数
# 计算总月份数
days = df['销售时间'].max()-df['销售时间'].min()
# 计算月份数
months = days.days//30
故:
月平均销售次数 = 总销售次数 / 总月数 = 890
# 月平均销售次数
months_sale_counts = int(sale_counts / months)
月平均销售金额 = 总销售金额 / 总月数 = 50,672.50
# 月平均销售金额
months_sale_money = sale_money / months
客单价 = 总销售金额 / 总销售次数
# 计算客单价
pct = sale_money /sale_counts