一、项目介绍
近些年来,随着人民生活的提升,人民群众对于医疗条件的选择尤为重视,为此,各个诊所、医院应运而生来保障人民的身体健康。
以下为某医院售药部分的售药记录情况,请根据该医院的售药记录数据,进行相关数据
处理,并提出问题,挖掘其中有价值的信息,为该医院的下一步营销进行指导。
先进行数据清洗:
(1)把列索引变为容易理解的索引值
(2)删掉有空值的数据
(3)将’销售数量’,‘应收金额’,'实收金额’数据类型转换为 int
(4)删除’销售数量’,‘应收金额’,'实收金额’中小于 0 的数据
(5)'成交时间’特征转标准时间格式:
再进行分析:
(1) 每个月的人流量?
(2)人均平均消费?
(3)使用最频繁的前十种药品?
(4)多少人办社保卡?
二、代码
import pandas as pd
# 加载数据
data = pd.read_excel('./某医院2018年数据.xlsx')
print('data:\n', data)
print('data的列索引:\n', data.columns)
# print('每一列的非空数据的数量:\n', data.count())
print('每一列含有缺失值的数量:\n', pd.isnull(data).sum())
# 先进行数据处理
# 先进行数据清洗:
# (1)把列索引变为容易理解的索引值
# 将 购药时间 ----> 成交时间
# 更改列索引
data.rename(columns={'购药时间': '成交时间'}, inplace=True)
print('更改后的列索引:\n', data.columns)
# (2)删掉有空值的数据
# 删掉所有有空值的数据---->删除掉有空值的行
data.dropna(axis=0, how='any', inplace=True)
print('删除缺失值之后的结果为:\n', data.shape)
# (3)将'销售数量', '应收金额', '实收金额'数据类型转换为 int
# 获取原来的每一列的数据类型
print('原来的数据元素的类型:\n', data.dtypes)
# 修改类型 ---astype
data.loc[:, ['销售数量', '应收金额', '实收金额']] = data.loc[:, ['销售数量', '应收金额', '实收金额']].astype('int')
print('修改数据的元素类型之后的结果为:\n', data.dtypes)
# (4)删除'销售数量', '应收金额', '实收金额'中小于 0 的数据
# 根据具体业务剔除 异常值 ---自己设置函数
# 删除掉 '销售数量', '应收金额', '实收金额' < 0 的数据
# --->保留法---销售数量 >0 , 应收金额>0 ,实收金额 >0
# 利用bool数组
bool_mask_1 = data.loc[:, '销售数量'] > 0
bool_mask_2 = data.loc[:, '应收金额'] > 0
bool_mask_3 = data.loc[:, '实收金额'] > 0
# 需要同时满足这三个条件
bool_mask = bool_mask_1 & bool_mask_2 & bool_mask_3
# 筛选出 完全满足条件的
data = data.loc[bool_mask, :]
print("删除'销售数量', '应收金额', '实收金额'中小于 0 的数据之后的结果:\n ", data.shape)
# (5)'成交时间'特征转标准时间格式
def get_time(val):
"""
获取时间
:param val: 原时间字符串
:return: 处理之后的时间
"""
val = val.split(' ')[0]
if val == '2018-02-29':
val = '2018-02-28'
# 转化为pandas支持时间格式
val = pd.to_datetime(val)
return val
data.loc[:, '成交时间'] = data.loc[:, '成交时间'].transform(get_time)
print('修改时间数据之后的结果:\n', data)
print('修改时间数据之后的结果:\n', data.dtypes)
print('*' * 100)
# 分析:
# (1)每个月的人流量?
# 每个月的人流量
# 统计每个月的 人的数量
# 获取 月属性---列表推导式
# data.loc[:, 'month'] = [tmp.month for tmp in data.loc[:, '成交时间']]
data.loc[:, 'month'] = data.loc[:, '成交时间'].dt.month # 和列表推导式达到结果是一样
print('data:\n', data)
print('*' * 100)
# 每个社保账号对应一个人, 每一个具体的成交时间 对应一个人
# 同一个社保卡号,在不同的时间 ----算不同流量
# 需要对 社保账号、成交时间进行去重
res = data.loc[:, ['month', '成交时间', '社保卡号']].drop_duplicates(subset=['社保卡号', '成交时间'], inplace=False)
# 按照 月进行分组,统计行数
res_liuliang = res.groupby(by='month')['社保卡号'].count()
print('每个月的人流量:\n', res_liuliang)
# (2)人均平均消费?
# 计算人数
# 可以对社保卡号进行去重 ---计算不同的社保号 的消费 --人均消费
counts = data.drop_duplicates(subset='社保卡号', inplace=False).shape[0]
# 计算总的销售额
all_shouru = data.loc[:, '实收金额'].sum()
print('人均消费金额为:', all_shouru / counts)
# (3)使用最频繁的前十种药品?
# 按照 商品名称进行分组---统计各个组内 销售数量的 sum
res = data.groupby(by='商品名称')['销售数量'].sum().reset_index().sort_values(by='销售数量',ascending=False).head(10)
print('使用最频繁的前十种药品:\n',res)
# (4)多少人办社保卡?
# 人数 ---?出现多少次社保账号--->就有多少人
# counts = data.drop_duplicates(subset='社保卡号', inplace=False).shape[0]
print('拥有社保卡号的人数为:\n',counts)