目录
以朝阳医院2018年销售数据为例,目的是了解朝阳医院在2018年里的销售情况,这就需要知道几个业务指标,本次的分析目标是从销售数据中分析出以下业务指标:
(1)业务指标1:月均消费次数
月均消费次数 = 总消费次数 / 月份数(同一天内,同一个人所有消费算作一次消费)
(2)业务指标2:月均消费金额
月均消费金额 = 总消费金额 / 月份数
(3)客单价
客单价 = 总消费金额 / 总消费次数
(4)消费趋势(可视化展示,并根据可视化结果给出下属问题分析得出的结论)
a、分析每天的消费金额
b、分析每月的消费金额
c、分析药品销售情况(截取销售数量最多的前十种药品,并用条形图展示结果)
数据分析基本过程 数据分析基本过程包括:获取数据、数据清洗、构建模型、数据可视化以及消费趋势分析。
(一)数据获取
1. 读取数据
import pandas as pd
data = pd.read_excel("朝阳医院2018年销售数据.xlsx", dtype="object")
data.head()
2. 修改为 DataFrame 格式
dataDF = pd.DataFrame(data)
print(dataDF.shape)
print("dataDF.index:{}".format(dataDF.index))
3. 查看每一列的列表头内容
print("dataDF.columns:{}".format(dataDF.columns))
print(dataDF.columns)
4. 查看每一列数据统计数目
(二)数据分析
数据清洗过程是一个复杂而细致的工作,它涉及多个步骤,旨在确保数据的质量和可用性。以下是数据清洗过程中的关键步骤:
-
选择子集:在这个阶段,我们从原始数据集中挑选出对分析或建模最相关的部分。这可能涉及到筛选特定的行和列,以便专注于对特定问题有用的信息。
-
列名重命名:为了使数据集更易于理解和操作,我们可能需要对列名进行重命名。这样做可以提供更清晰的上下文,有助于后续的数据处理和分析工作。
-
缺失数据处理:在实际情况中,数据集往往包含缺失值。处理缺失值的方法包括删除含有缺失值的行、填充缺失值(例如使用平均值、中位数或众数)或者通过算法预测缺失值。
-
数据类型转换:为了确保数据类型的一致性和正确性,我们可能需要将某些列的数据类型进行转换。例如,将字符串类型的日期转换为日期类型,或将分类数据编码为数值形式以便于分析。
-
数据排序:在某些情况下,我们可能需要对数据进行排序,以便更好地观察数据模式或趋势。排序可以是按照单个列的值进行升序或降序排列,也可以是基于多个列的组合排序。
-
异常值处理:异常值是那些与其他数据显著不同的数据点。处理异常值的方法包括识别并删除它们,或者使用统计方法(如分位数范围)来修正它们。
1. 列名重命名
...
print("dataDF.columns:{}".format(dataDF.columns))
2. 缺失值处理
print("删除缺失值之前dataDF.shape:{}".format(dataDF.shape))
dataDF = dataDF.dropna()# 通过内置的dropna函数删除缺失的数据
print("删除缺失值之后dataDF.shape:{}".format(dataDF.shape))
dataDF["销售数量"] = dataDF["销售数量"].astype("f8")
dataDF["应收金额"] = dataDF["应收金额"].astype("f8")
dataDF["实收金额"] = dataDF["实收金额"].astype("f8")
print("dataDF.dtypes:{}".format(dataDF.dtypes))
3. 自定义函数(数据类型转换)
def splitsaletime(timeColser):
timelist = []
for t in timeColser:
timelist.append(t.split(" ")[0])
timeser = pd.Series(timelist)
return timeser
4. 调用自定义函数
t = dataDF.loc[:, "销售时间"]
timeser = splitsaletime(t)
dataDF.loc[:, "销售时间"] = timeser
print(dataDF.head())
5. 数据类型转换
...
print("dataDF.dtypes:{}".format(dataDF.dtypes))
6. 删除空值
dataDF = dataDF.dropna()
print("dataDF.shape:{}".format(dataDF.shape))
dataDF = dataDF.sort_values(by='销售时间', ascending=True)
print("dataDF.head():{}".format(dataDF.head()))
dataDF = dataDF.reset_index(drop=True)
7. 删除异常值
print(dataDF.describe())
pop = dataDF.loc[:, "销售数量"] > 0
dataDF = dataDF.loc[pop, :]
8. 删除重复数据
print(dataDF.describe())
kpi1_Df = dataDF.drop_duplicates(subset=['销售时间', '社保卡号'])
(三)构建模型及数据可视化
在数据清洗和预处理工作圆满完成之后,接下来的步骤便是利用这些经过精心整理的数据来构建模型。这个模型构建的过程,实际上就是根据业务需求,运用统计学、机器学习或其他数据分析方法来计算和提取出关键的业务指标。这些业务指标对于理解数据背后的含义、评估业务状况以及指导未来的决策制定都是至关重要的。
在模型构建完成,并且相应的业务指标被计算出来之后,为了使得这些指标更加直观易懂,通常需要借助于数据可视化的手段来展示结果。数据可视化是一种将数据转换为图形或图像表示的技术,它可以帮助人们以视觉的方式快速理解和分析数据。通过使用图表、图形、地图等多种形式,数据可视化能够有效地传达复杂的信息,使得非专业人士也能轻松把握数据的核心要点。
例如,可以通过柱状图来展示不同类别的销售业绩,通过折线图来追踪股票价格的变化趋势,或者通过热力图来展现网站用户的点击行为分布。这些直观的图形不仅有助于数据的呈现,还能促进团队成员之间的沟通和讨论,为基于数据的决策提供强有力的支持。
总之,数据清洗完成后,通过构建模型计算业务指标,并利用数据可视化技术将这些指标以图形化的方式呈现出来,是数据分析流程中至关重要的一步。它不仅提高了数据处理的效率,也增强了数据故事的说服力,为业务决策提供了清晰、直观的依据。
1. 计算总消费次数
totall = kpi1_Df.shape[0]
print('总消费次数:', totall)
kpi1_Df = kpi1_Df.sort_values(by='销售时间', ascending=True)
kpi1_Df = kpi1_Df.reset_index(drop=True)
2. (月均消费次数、月均消费金额、客单价)
startTime = kpi1_Df.loc[0, '销售时间']
endTime = kpi1_Df.loc[totall - 1, '销售时间']
daysI = (endTime - startTime).days
monthsI = daysI // 30
print('月份数:', monthsI)
kpi1_I = totall // monthsI
print(' 月均消费次数=', kpi1_I)
totalMoneyF = dataDF.loc[:, '实收金额'].sum()
monthMoneyF = totalMoneyF / monthsI
print(' 月均消费金额=', monthMoneyF)
pct = totalMoneyF / totall
print(' 客单价=', pct)
3. 业务指标:消费趋势(可视化展示)
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
groupDf = dataDF
groupDf.index = groupDf['销售时间']
groupDf.head()
4. a、分析每天的消费金额
5. b、分析每月的消费金额
6. c、分析药品销售情况
medicine = groupDf[['商品名称','销售数量']]
bk = medicine.groupby('商品名称')[['销售数量']]
re_medicine = bk.sum()
7. 降序排序截取销售数量最多的十种药品
re_medicine = re_medicine.sort_values(by='销售数量', ascending=False)# 降序排序
re_medicine.head()
top_medicine = re_medicine.iloc[:10,:]
print(top_medicine)
8. 条形图展示销售数量前十的药品
部分代码省略,详细可