数据分析(python)
转。https://zhuanlan.zhihu.com/p/35976466
1,分析背景
数据是药店2018年1月至2018年7月19日的药品销售数据,由购药时间,社保卡号,商品编码 ,商品名称,销售数量,应收金额,实收金额七个字段组成,共6578条数据。
2,分析框架
分析目的,通过对历史数据进行描述性统计分析,了解每月药品销售情况。更深入了解,用户更青睐于哪些药品,随着月份的变化,药品销量的变化,为药店进药提供支持。
分析思路,统计每月药品销售总额,每月药品销售数量,客单价,每月药品销售量和金额前十
3,数据清洗
缺失值
重复值
异常值
4,分析过程
5,总结
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import pandas as pd import numpy as np file_path='./朝阳医院2018年销售数据.xlsx'
#pd.read_excel(file_path,converters={'社保卡号':str,'商品编码':str})
xls = pd.ExcelFile(file_path) salesDf = xls.parse('Sheet1',dtype='object') salesDf.head() #查看数据,默认显示前5行 salesDf.info() #查看数据结构,包括字段,数据类型 salesDf.shape #查看数据形状,数据数目和列数 #列重命名 colNameDict={'购药时间':'销售时间'} salesDf.rename(columns = colNameDict, inplace=True) salesDf.head() #处理缺失值 salesDf.shape salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any') #数据类型转换 salesDf['销售数量'] = salesDf['销售数量'].astype('float') salesDf['应收金额'] = salesDf['应收金额'].astype('float') salesDf['实收金额'] = salesDf['实收金额'].astype('float') #时间转换 salesDf.head() def splitSaletime(timeColSer): timelist=[] for value in timeColSer: dateStr=value.split(' ')[0] timelist.append(dateStr) timeSer = pd.Series(timelist) return timeSer timeSer = salesDf.loc[:,'销售时间'] dateSer = splitSaletime(timeSer) salesDf.loc[:,'销售时间']= dateSer salesDf.head() salesDf.info()
#errors='coerce': 如果原始数据不符合日期的格式,转换后的值为空值NaT
#salesDf.loc[:,'购药时间1'] = salesDf['购药时间'].str.split(' ').str[0] #拆分时间字段 salesDf.loc[:,'销售时间'] = pd.to_datetime(salesDf.loc[:,'销售时间'],format='%Y-%m-%d',errors='coerce')
salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any')
数据排序 使用pd.sort_values方法对数据进行排序,by表示按那几列进行排序,ascending=True 表示升序排列,ascending=False表示降序排列 salesDf=salesDf.sort_values(by='销售时间',ascending=True) 重命名行号:reset_index方法生成从0到N按顺序的索引值 salesDf = salesDf.reset_index(drop=True) 异常值处理 1 查看数据框中所有数据每列的描述性统计信息 describe() salesDf.describe() #设置查询条件 querySer = salesDf.loc[:,'销售数量']>0 salesDf.shape salesDf = salesDf.loc[querySer,:] salesDf.head() salesDf=salesDf.dropna(subset=['销售时间','社保卡号'],how='any') salesDf['销售时间'].min() #Timestamp('2018-01-01 00:00:00') salesDf['销售时间'].max() #Timestamp('2018-07-19 00:00:00') -------------------------------------------------------------- 总销售额 salesDf[['销售数量','应收金额','实收金额']].sum() ''' 第一个指标:月均消费次数=总消费次数/月数 第二个指标:月均消费金额=总消费金额/月份数 第三个指标:客单价=平均交易金额=总消费金额/总消费次数 第四个指标:消费趋势 注意:同一天内,同一个人发生的所有消费算作一次消费,根据列名(销售时间,社区卡号),如果这两个列值同时相同,只保留1条,使用drop_duplicates将重复的数据删除 ''' salesDf.head() #消费次数 kpil_df = salesDf.drop_duplicates(subset=['销售时间','社保卡号']) totalI = kpil_df.shape[0] #总消费次数 5342 min_d=salesDf['销售时间'].min() #Timestamp('2018-01-01 00:00:00') max_d=salesDf['销售时间'].max() #Timestamp('2018-07-19 00:00:00') days1=(max_d - min_d).days months1 = days1//30 #月份数 6 kpi1 = totalI//months1 print('月均消费次数:',kpi1) kpi2 = round(salesDf['实收金额'].sum()/months1,4) print('月均消费金额:',kpi2) kpi3 = round(kpi2/kpi1,4) print('客单价:',kpi3) groupdf = salesDf groupdf.head() groupdf.index = groupdf['销售时间'] gb = groupdf.groupby(groupdf.index.month) monthdf = gb.sum()