或扫描下方二维码获取:python
在本次博客中,我将利用Python数据分析工具来作一个某医院某年度的销售状况汇总。网络
项目运行环境:函数
操做系统 | Windows 10 64位 |
Python | 3.7.0 |
开发工具 | Pycharm(ipython) |
数据分析的基本过程主要分为两方面:
1、数据分析的目的
一方面是发现问题,而且找到问题的根源,最终经过切实可行的办法解决存在的问题;另外一方面,提取有用信息和造成结论而对数据加以详细研究和归纳,对以往的数据分析,总结发展趋势,为网络营销决策提供支持。
二 、数据分析基本过程
数据分析基本过程包括:获取数据、数据清洗、构建模型、数据可视化、得出结论。工具
注:本次项目使用的数据请在前面连接自行下载
导包开发工具
import os import pandas as pd import matplotlib.pyplot as plt |
os.chdir(r'填写你的数据所在路径') #好比:os.chdir(r'F:\360Downloads\朝阳医院') |
dataDF=pd.read_ecxel('文件名(记得带文件后缀名)') #好比:dataDF=pd.read_excel('朝阳医院2018年销售数据.xlsx') |
dataDF.head() #默认查看前5行 |
接下来查看数据的下列信息:shape(形状)、index(索引)、columns(列名)、count(总数)字体
dataDF.shape #查看数据的结构(行、列数) |
dataDF.index #查看数据的索引 |
dataDF.columns #查看数据的列名 |
dataDF.count() #查看数据的总数 |
dataDF.describe() #查看数据的数值详细信息 |
经过以上的数据能够看出: 总共有6578行7列数据,可是“购药时间”和“社保卡号”这两列只有6576个数据,而“商品编码”一直到“实收金额”这些列都是只有6577个数据。这就意味着数据中存在缺失值,能够推断出数据中存在一行缺失值。 此外“购药时间”和“社保卡号”这两列都各自存在一个缺失数据,这些缺失数据在后面步骤中须要进一步处理。 并且数据中存在负数,这将在后面也须要进一步处理。 |
数据清洗一般包括:选择子集、修改列名称、处理缺失值、处理异常值、转换数据类型、数据排序(为可视化作准备),在这里咱们根据实验数据自己特征进行处理,过程以下:
选择子集:编码
在进行数据分析时,一般会遇到很是庞大的数据包,而且其中不免会有一些‘无用’的数据,以及和本次项目不相关的信息,这时就须要将其分开并按照需求选择,获得有价值的数据集来进行进一步分析,从而挖掘出咱们须要的潜在信息。因为本次案例使用的数据集量小且简单,所以能够忽略这一步。 |
修改列名称:spa
在拿到的原始数据中,列名称和数据和其余列名之间可能会类似或者不可以‘见名知意’,致使给后续分析带来困难,为了不此现象,咱们能够根据需求调用rename()函数将列名重命名,好比中文名称(这里纯属我的习惯) |
dataDF=dataDF.rename(columns={'购药时间':'销售时间'}) dataDF.head() |
处理缺失值:操作系统
经过上面的dataDF.count()能够看出,数据的“购药时间”和“社保卡号”行数和其余数据不相等,证实确定存在空值,为了避免对后续的操做形成干扰,在这里须要进一步处理,一般处理方式有两种:第一,删除;第二,填充。在本次案例中,因为数据简单,咱们采用第一种方式将含有空值的行删除,获得‘干净’数据,使用到的函数有dropna() |
dataDF=dataDF.dropna(subset=['销售时间','社保卡号'],how='any') dataDF.count() |
处理异常值:
咱们先来查看一下数据的当前信息:
excel
dataDF.describe() |
能够看出数据当中存在异常值(负值)。
如今咱们删除负值所在的行
pop=dataDF.loc[:,'销售数量']>0 |
dataDF=dataDF.loc[pop,:] dataDF.describe() |
接下来再查看一下数据信息(行数)
转换数据类型:
咱们先来查看一下数据的当前类型:
发现销售时间这一列并非咱们想要的datetime格式,所以须要转换,为后续分析作准备。这里使用到的函数有:astype()函数
在处理以前,原始数据以下图(发现‘销售时间’这一列存在星期*,显然这并非咱们须要的,接下来咱们编写(分割)函数将其去除,具体操做以下):
下图是我编写的一个(分割)函数以及具体操做(此处方法不少,远远不止这一种)
本案例操做方法以下:
调用函数,处理数据(具体过程见上图的‘函数调用方法’部分)
time=dataDF.loc[:,'销售时间'] data=SplitSaletime(time) dataDF.loc[:,'销售时间']=data |
处理后的数据(销售时间)以下:
查看当前数据类型(以下图,发现销售时间列格式已经修改为功,接下来将其转换为datetime类型便可):
dataDF.loc[:,'销售时间']=pd.to_datetime(dataDF.loc[:,'销售时间'],format='%Y-%m-%d',errors='coerce') |
此时咱们再来看数据(销售时间)类型,发现已经转换成功:
数据排序(重置索引):
接下来咱们按照时间列进行升序排序
dataDF=dataDF.sort_values(by=['销售时间'],ascending=True) #by='填写须要按照那一列来排序',ascending=True表示升序(False表示降序) |
而后重置索引
dataDF=dataDF.reset_index(drop=True) |
数据准备就绪后,根据相关业务利用可视化工具实现图标制做,从而挖掘出数据背后的信息。 |
dataDF_qc=dataDF.drop_duplicates(subset=['销售时间','社保卡号']) |
接着查看数据形状,看是否有变化:
再看一下原始数据形状:
打印重复的行数:
print(f'原始数据与去重后的数据行数相差:{dataDF.shape[0]-dataDF_qc.shape[0]}行。') |
计算总消费次数:
Total_time=dataDF_qc.shape[0] |
结果以下:
按照销售时间升序排序,而后重置索引
升序排序 | dataDF_shengxu=dataDF_qc.sort_values(by=['销售时间'],ascending=True) |
重置索引 | dataDF_qc_resrt_index=dataDF_qc.reset_index(drop=True) |
计算销售时间范围:
StartTime=dataDF_qc_resrt_index.loc[0,'销售时间'] |
EndTime=dataDF_qc_resrt_index.loc[Total_time-1,'销售时间'] |
此时发现销售时间出现空值,所以这里咱们删除空值所在行数据:
dataDF_qc_resrt_index.dropna(subset=['销售时间'],inplace=True) |
如今咱们重复上述步骤获取开始和结束时间:
StartTime=dataDF_qc_resrt_index.loc[0,'销售时间'] |
EndTime=dataDF_qc_resrt_index.loc[Total_time-1,'销售时间'] |
计算总天数:
Day_time=(EndTime-StartTime).days |
计算月份数:
Month_time=Day_time//30 #其中//为整除运算,每个月按30天计 |
月均消费次数 = 总消费次数/月份数:
Ave_time=Total_time//Month_time |
Total_Money=data_new.loc[:,'实收金额'].sum() |
print(f'每个月平均消费{(Total_Money//Month_time)}元。') |
print(f'每次购药平均消费金额为:{(Total_Money/Total_time)}元。') |
准备工做:
导入可视化包: import matplotlib.pyplot as plt 遇到数据中有中文的时候,必定要先设置中文字体 plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文 |
首先将数据复制到一个新的变量,专门用做数据可视化
Data_KSH=dataDF_qc_resrt_index |
重置索引为‘销售时间’列:
Data_KSH.index=Data_KSH['销售时间'] |
绘制图形:
数据聚合(按照月份):
Mon=Data_KSH.groupby(Data_KSH.index.month) |
利用sum()求和,计算每个月销售金额:
Mon_Money=Mon.sum() |
绘制图形:
按照销售数量排序:
Data_XSSL=Data_KSH.sort_values(by='销售数量') |
按照销售数量去重:
Data_XSSL=Data_XSSL.drop_duplicates(subset=['销售数量']) |
提取前十行数据:
Top_10=Data_XSSL.iloc[:10,:] |
查看前十行数据:
绘制图形:
本案例数据集地址(百度网盘):连接:https://pan.baidu.com/s/1mStg3VcubipPx3EzQwMLEQ 提取码:5ua5 (此连接永久有效)
或者扫描下方二维码获取源代码: