重点客户销售数据分析python_药品销售数据分析--python
一、數據分析的目的
數據分析是指用適當的統計分析方法對收集來的大量數據進行分析,提取有用信息和形成結論而對數據加以詳細研究和概括總結的過程。
本篇文章中,假設以朝陽醫院2018年銷售數據為例,目的是了解朝陽醫院在2018年里的銷售情況,這就需要知道幾個業務指標,例如:月均消費次數,月均消費金額、客單價以及消費趨勢
二、數據分析基本過程
數據分析基本過程包括:獲取數據、數據清洗、構建模型、數據可視化以及消費趨勢分析。
python先導入包,然后讀取文件,讀取的時候用object讀取,防止有些數據讀不了:
import numpy as np
from pandas import Series,DataFrame
import pandas as pd
#導入數據
file_name = '朝陽醫院2018年銷售數據.xlsx'
xls = pd.ExcelFile(file_name)
dataDF = xls.parse('Sheet1',dtype='object')
print(dataDF.head())
image.png
查看數據基本信息:
#查看基本信息
#查看數據幾行幾列
print(dataDF.shape)
#查看索引
print(dataDF.index)
#查看每一列的列表頭內容
print(dataDF.columns)
#查看每一列數據統計數目
print(dataDF.count())
image.png
總共有6578行7列數據,但是“購藥時間”和“社保卡號”這兩列只有6576個數據,而“商品編碼”一直到“實收金額”這些列都是只有6577個數據,這就意味著數據中存在缺失值,可以推斷出數據中存在一行缺失值,此外“購藥時間”和“社保卡號”這兩列都各自存在一個缺失數據,這些缺失數據在后面步驟中需要進一步處理。
2.數據清洗
數據清洗過程包括:選擇子集、列名重命名、缺失數據處理、數據類型轉換、數據排序及異常值處理
(1)選擇子集
在我們獲取到的數據中,可能數據量非常龐大,并不是每一列都有價值都需要分析,這時候就需要從整個數據中選取合適的子集進行分析,這樣能從數據中獲取最大價值。在本次案例中不需要選取子集,暫時可以忽略這一步。
(2)列重命名
在數據分析過程中,有些列名和數據容易混淆或產生歧義,不利于數據分析,這時候需要把列名換成容易理解的名稱,可以采用rename函數實現:
#列重命名
dataDF.rename(columns={'購藥時間':'銷售時間'},inplace=True)
print(dataDF.head())
image.png
(3)缺失值處理
獲取的數據中很有可能存在缺失值,通過查看基本信息可以推測“購藥時間”和“社保卡號”這兩列存在缺失值,如果不處理這些缺失值會干擾后面的數據分析結果。缺失數據常用的處理方式為刪除含有缺失數據的記錄或者利用算法去補全缺失數據。在本次案例中為求方便,直接使用dropna函數刪除缺失數據,具體如下:
#缺失值處理
print('刪除缺失值前:', dataDF.shape)
print(dataDF.info())
#刪除缺失值
dataDF = dataDF.dropna(subset=['銷售時間','社保卡號'], how='any')
print('\n刪除缺失值后',dataDF.shape)
print(dataDF.info())
image.png
(4)數據類型轉換
在導入數據時為了防止導入不進來,會強制所有數據都是object類型,但實際數據分析過程中“銷售數量”,“應收金額”,“實收金額”,這些列需要浮點型(float)數據,“銷售時間”需要改成時間格式,因此需要對數據類型進行轉換。
可以使用astype()函數轉為浮點型數據:
#數據類型轉換
dataDF['銷售數量'] = dataDF['銷售數量'].astype('float')
dataDF['應收金額'] = dataDF['應收金額'].astype('float')
dataDF['實收金額'] = dataDF['實收金額'].astype('float')
print(dataDF.dtypes)
image.png
在“銷售時間”這一列數據中存在星期這樣的數據,但在數據分析過程中不需要用到,因此要把銷售時間列中日期和星期使用split函數進行分割,分割后的時間,返回的是Series數據類型:
#定義函數將星期除去
def splitSaletime(timeColser):
timelist =[]
for val in timeColser:
data = val.split(' ')[0]
timelist.append(data)
#將列表轉為Series類型
timeSer = Series(timelist)
return timeSer
#獲取"銷售時間"這一列數據
time = dataDF.loc[:,'銷售時間']
#調用函數去除星期,獲得日期
data = splitSaletime(time)
#修改"銷售時間"這一列的值
dataDF.loc[:,'銷售時間'] = data
print(dataDF.head())
image.png
接著把切割后的日期轉為時間格式,方便后面的數據統計:
#字符串轉日期
dataDF.loc[:,'銷售時間'] = pd.to_datetime(dataDF.loc[:,'銷售時間'], format='%y-%m-%d', errors='coerce')
print(dataDF.dtypes)
#在日期轉換過程中不符合日期格式的會轉換為空值,這里需要刪除
dataDF = dataDF.dropna(subset=['銷售時間','社保卡號'], how='any')
image.png
(5)數據排序
此時時間是沒有按順序排列的,所以還是需要排序一下,排序之后索引會被打亂,所以也需要重置一下索引。其中by:表示按哪一列進行排序,ascending=True表示升序排列,ascending=False表示降序排列
#數據排序
dataDF = dataDF.sort_values(by='銷售時間', ascending=True)
dataDF = dataDF.reset_index(drop=True)
print(dataDF.head())
image.png
(6)異常值處理
先查看數據的描述統計信息
#查看描述統計信息
print(dataDF.describe())
image.png
通過描述統計信息可以看到,“銷售數量”、“應收金額”、“實收金額”這三列數據的最小值出現了負數,這明顯不符合常理,數據中存在異常值的干擾,因此要對數據進一步處理,以排除異常值的影響:
#將'銷售數量'這一列小于0的數據排除掉
pop = dataDF.loc[:,'銷售數量'] > 0
dataDF = dataDF.loc[pop,:]
print(dataDF.describe())
image.png
三、構建模型及數據可視化
數據清洗完成后,需要利用數據構建模型(就是計算相應的業務指標),并用可視化的方式呈現結果。
(1)業務指標1:月均消費次數
月均消費次數 = 總消費次數 / 月份數(同一天內,同一個人所有消費算作一次消費)
#計算總消費次數
#刪除重復數據
kpil_Df = dataDF.drop_duplicates(subset=['銷售時間','社保卡號'])
totalI = kpil_Df.shape[0]
print('總消費次數=',totalI)
#計算月份數
#按銷售時間升序排序
kpil_Df = kpil_Df.sort_values(by='銷售時間', ascending=True)
#重命名行名
kpil_Df = kpil_Df.reset_index(drop=True)
#獲取時間范圍
startTime = kpil_Df.loc[0,'銷售時間']
endTime = kpil_Df.loc[totalI-1,'銷售時間']
#計算月份
#天數
daysI = (endTime-startTime).days
mounthI = daysI//30
print('月份數=',mounthI)
#月平均消費次數
kpil_I = totalI//mounthI
print('業務指標1:月均消費次數=', kpil_I)
image.png
(2)業務指標2:月均消費金額
月均消費金額 = 總消費金額 / 月份數
#消費總金額
totalMoneyF = dataDF.loc[:,'實收金額'].sum()
mounthMoney = totalMoneyF // mounthI
print('業務指標2:月均消費金額=', mounthMoney)
image.png
(3)客單價
客單價 = 總消費金額 / 總消費次數
#客單價
pct = totalMoneyF / totalI
print('業務指標3:客單價=', pct)
image.png
(4)消費趨勢
a. 導入python可視化相關的包
import matplotlib.pyplot as plt
import matplotlib
#畫圖時用于顯示中文字符
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # SimHei是黑體的意思
#在操作之前先復制一份
b. 分析每天的消費金額
#mpl.rcParams['font.sans-serif'] = ['Songti'] # SimHei是黑體的意思
font = FontProperties(fname='/Library/Fonts/Songti.ttc') #設置字體
#在操作之前先復制一份數據,防止影響清洗后的數據
groupDF = dataDF
#將'銷售時間'設置為index
groupDF.index = groupDF['銷售時間']
print(groupDF.head())
gb = groupDF.groupby(groupDF.index)
print(gb)
dayDF = gb.sum()
print(dayDF)
#畫圖
plt.plot(dayDF['實收金額'])
plt.title('按天消費金額',fontproperties=font)
plt.xlabel('時間',fontproperties=font)
plt.ylabel('實收金額',fontproperties=font)
plt.show()
image.png
image.png
從結果可以看出,每天消費總額差異較大,除了個別天出現比較大筆的消費,大部分人消費情況維持在1000-2000元以內。
c. 分析每月的消費金額
接下來,我銷售時間先聚合再按月分組進行分析:
#將銷售時間聚合按月分組
gb = groupDF.groupby(groupDF.index.month)
print(gb)
monthDF = gb.sum()
print(monthDF)
plt.plot(monthDF['實收金額'])
plt.title('按月消費金額',fontproperties=font)
plt.xlabel('時間',fontproperties=font)
plt.ylabel('實收金額',fontproperties=font)
plt.show()
image.png
image.png
結果顯示,7月消費金額最少,這是因為7月份的數據不完整,所以不具參考價值。
1月、4月、5月和6月的月消費金額差異不大,2月和3月的消費金額迅速降低,這可能是2月和3月處于春節期間,大部分人都回家過年的原因。
d. 分析藥品銷售情況
對“商品名稱”和“銷售數量”這兩列數據進行聚合為Series形式,方便后面統計,并按降序排序:
#聚合統計各種藥品數量
medicine = groupDF[['商品名稱','銷售數量']]
bk = medicine.groupby('商品名稱')[['銷售數量']]
re_medicine = bk.sum()
#對銷售藥品數量按將序排序
re_medicine = re_medicine.sort_values(by='銷售數量', ascending=False)
print(re_medicine.head())
image.png
截取銷售數量最多的前十種藥品,并用條形圖展示結果:
top_medicine = re_medicine.iloc[:10,:]
print(top_medicine)
image.png
image.png
得到銷售數量最多的前十種藥品信息,這些信息將會有助于加強醫院對藥房的管理。
總結
以上是生活随笔為你收集整理的重点客户销售数据分析python_药品销售数据分析--python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 花呗借呗被停用了怎么才能恢复?
- 下一篇: python省市区三级联动_Django