藥品銷售數(shù)據(jù)分析--python

一、數(shù)據(jù)分析的目的

數(shù)據(jù)分析是指用適當?shù)慕y(tǒng)計分析方法對收集來的大量數(shù)據(jù)進行分析茄袖,提取有用信息和形成結論而對數(shù)據(jù)加以詳細研究和概括總結的過程琅拌。

本篇文章中,假設以朝陽醫(yī)院2018年銷售數(shù)據(jù)為例颅围,目的是了解朝陽醫(yī)院在2018年里的銷售情況,這就需要知道幾個業(yè)務指標恨搓,例如:月均消費次數(shù)院促,月均消費金額、客單價以及消費趨勢

二斧抱、數(shù)據(jù)分析基本過程

數(shù)據(jù)分析基本過程包括:獲取數(shù)據(jù)常拓、數(shù)據(jù)清洗、構建模型夺姑、數(shù)據(jù)可視化以及消費趨勢分析墩邀。

python先導入包,然后讀取文件盏浙,讀取的時候用object讀取眉睹,防止有些數(shù)據(jù)讀不了:

import numpy as np
from pandas import Series,DataFrame
import pandas as pd
#導入數(shù)據(jù)
file_name = '朝陽醫(yī)院2018年銷售數(shù)據(jù).xlsx'
xls = pd.ExcelFile(file_name)
dataDF = xls.parse('Sheet1',dtype='object')
print(dataDF.head())
image.png

查看數(shù)據(jù)基本信息:

#查看基本信息
#查看數(shù)據(jù)幾行幾列
print(dataDF.shape)
#查看索引
print(dataDF.index)
#查看每一列的列表頭內容
print(dataDF.columns)
#查看每一列數(shù)據(jù)統(tǒng)計數(shù)目
print(dataDF.count())
image.png

總共有6578行7列數(shù)據(jù),但是“購藥時間”和“社狈媳欤卡號”這兩列只有6576個數(shù)據(jù)竹海,而“商品編碼”一直到“實收金額”這些列都是只有6577個數(shù)據(jù),這就意味著數(shù)據(jù)中存在缺失值丐黄,可以推斷出數(shù)據(jù)中存在一行缺失值斋配,此外“購藥時間”和“社保卡號”這兩列都各自存在一個缺失數(shù)據(jù)灌闺,這些缺失數(shù)據(jù)在后面步驟中需要進一步處理艰争。

  • 2.數(shù)據(jù)清洗
    數(shù)據(jù)清洗過程包括:選擇子集、列名重命名桂对、缺失數(shù)據(jù)處理甩卓、數(shù)據(jù)類型轉換、數(shù)據(jù)排序及異常值處理

(1)選擇子集
在我們獲取到的數(shù)據(jù)中蕉斜,可能數(shù)據(jù)量非常龐大逾柿,并不是每一列都有價值都需要分析,這時候就需要從整個數(shù)據(jù)中選取合適的子集進行分析宅此,這樣能從數(shù)據(jù)中獲取最大價值机错。在本次案例中不需要選取子集,暫時可以忽略這一步父腕。

(2)列重命名
在數(shù)據(jù)分析過程中弱匪,有些列名和數(shù)據(jù)容易混淆或產(chǎn)生歧義,不利于數(shù)據(jù)分析璧亮,這時候需要把列名換成容易理解的名稱痢法,可以采用rename函數(shù)實現(xiàn):

#列重命名
dataDF.rename(columns={'購藥時間':'銷售時間'},inplace=True)
print(dataDF.head())
image.png

(3)缺失值處理
獲取的數(shù)據(jù)中很有可能存在缺失值,通過查看基本信息可以推測“購藥時間”和“社倍潘常卡號”這兩列存在缺失值财搁,如果不處理這些缺失值會干擾后面的數(shù)據(jù)分析結果。缺失數(shù)據(jù)常用的處理方式為刪除含有缺失數(shù)據(jù)的記錄或者利用算法去補全缺失數(shù)據(jù)躬络。在本次案例中為求方便尖奔,直接使用dropna函數(shù)刪除缺失數(shù)據(jù),具體如下:

#缺失值處理
print('刪除缺失值前:', dataDF.shape)
print(dataDF.info())
#刪除缺失值
dataDF = dataDF.dropna(subset=['銷售時間','社鼻畹保卡號'], how='any')
print('\n刪除缺失值后',dataDF.shape)
print(dataDF.info())
image.png

(4)數(shù)據(jù)類型轉換
在導入數(shù)據(jù)時為了防止導入不進來提茁,會強制所有數(shù)據(jù)都是object類型,但實際數(shù)據(jù)分析過程中“銷售數(shù)量”馁菜,“應收金額”茴扁,“實收金額”,這些列需要浮點型(float)數(shù)據(jù)汪疮,“銷售時間”需要改成時間格式峭火,因此需要對數(shù)據(jù)類型進行轉換毁习。
可以使用astype()函數(shù)轉為浮點型數(shù)據(jù):

#數(shù)據(jù)類型轉換
dataDF['銷售數(shù)量'] = dataDF['銷售數(shù)量'].astype('float')
dataDF['應收金額'] = dataDF['應收金額'].astype('float')
dataDF['實收金額'] = dataDF['實收金額'].astype('float')
print(dataDF.dtypes)
image.png

在“銷售時間”這一列數(shù)據(jù)中存在星期這樣的數(shù)據(jù),但在數(shù)據(jù)分析過程中不需要用到卖丸,因此要把銷售時間列中日期和星期使用split函數(shù)進行分割纺且,分割后的時間,返回的是Series數(shù)據(jù)類型:

#定義函數(shù)將星期除去
def splitSaletime(timeColser):
    timelist =[]
    for val in timeColser:
        data = val.split(' ')[0]
        timelist.append(data)
    #將列表轉為Series類型
    timeSer = Series(timelist)
    return timeSer
#獲取"銷售時間"這一列數(shù)據(jù)
time = dataDF.loc[:,'銷售時間']
#調用函數(shù)去除星期稍浆,獲得日期
data = splitSaletime(time)
#修改"銷售時間"這一列的值
dataDF.loc[:,'銷售時間'] = data
print(dataDF.head())
image.png

接著把切割后的日期轉為時間格式载碌,方便后面的數(shù)據(jù)統(tǒng)計:

#字符串轉日期
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)數(shù)據(jù)排序
此時時間是沒有按順序排列的嫁艇,所以還是需要排序一下,排序之后索引會被打亂弦撩,所以也需要重置一下索引步咪。其中by:表示按哪一列進行排序,ascending=True表示升序排列孤钦,ascending=False表示降序排列

#數(shù)據(jù)排序
dataDF = dataDF.sort_values(by='銷售時間', ascending=True)
dataDF = dataDF.reset_index(drop=True)
print(dataDF.head())
image.png

(6)異常值處理
先查看數(shù)據(jù)的描述統(tǒng)計信息

#查看描述統(tǒng)計信息
print(dataDF.describe())
image.png

通過描述統(tǒng)計信息可以看到歧斟,“銷售數(shù)量”、“應收金額”偏形、“實收金額”這三列數(shù)據(jù)的最小值出現(xiàn)了負數(shù)静袖,這明顯不符合常理,數(shù)據(jù)中存在異常值的干擾俊扭,因此要對數(shù)據(jù)進一步處理队橙,以排除異常值的影響:

#將'銷售數(shù)量'這一列小于0的數(shù)據(jù)排除掉
pop = dataDF.loc[:,'銷售數(shù)量'] > 0
dataDF = dataDF.loc[pop,:]
print(dataDF.describe())
image.png

三、構建模型及數(shù)據(jù)可視化

數(shù)據(jù)清洗完成后萨惑,需要利用數(shù)據(jù)構建模型(就是計算相應的業(yè)務指標)捐康,并用可視化的方式呈現(xiàn)結果。
(1)業(yè)務指標1:月均消費次數(shù)
月均消費次數(shù) = 總消費次數(shù) / 月份數(shù)(同一天內庸蔼,同一個人所有消費算作一次消費)

#計算總消費次數(shù)
#刪除重復數(shù)據(jù)
kpil_Df = dataDF.drop_duplicates(subset=['銷售時間','社苯庾埽卡號'])
totalI = kpil_Df.shape[0]
print('總消費次數(shù)=',totalI)

#計算月份數(shù)
#按銷售時間升序排序
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,'銷售時間']
#計算月份
#天數(shù)
daysI = (endTime-startTime).days
mounthI = daysI//30
print('月份數(shù)=',mounthI)

#月平均消費次數(shù)
kpil_I = totalI//mounthI
print('業(yè)務指標1:月均消費次數(shù)=', kpil_I)
image.png

(2)業(yè)務指標2:月均消費金額
月均消費金額 = 總消費金額 / 月份數(shù)

#消費總金額
totalMoneyF = dataDF.loc[:,'實收金額'].sum()
mounthMoney = totalMoneyF // mounthI
print('業(yè)務指標2:月均消費金額=', mounthMoney)
image.png

(3)客單價
客單價 = 總消費金額 / 總消費次數(shù)

#客單價
pct = totalMoneyF / totalI
print('業(yè)務指標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') #設置字體
#在操作之前先復制一份數(shù)據(jù),防止影響清洗后的數(shù)據(jù)
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

從結果可以看出姐仅,每天消費總額差異較大花枫,除了個別天出現(xiàn)比較大筆的消費,大部分人消費情況維持在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月份的數(shù)據(jù)不完整佳簸,所以不具參考價值。
1月颖变、4月生均、5月和6月的月消費金額差異不大听想,2月和3月的消費金額迅速降低,這可能是2月和3月處于春節(jié)期間疯特,大部分人都回家過年的原因哗魂。

  • d. 分析藥品銷售情況
    對“商品名稱”和“銷售數(shù)量”這兩列數(shù)據(jù)進行聚合為Series形式肛走,方便后面統(tǒng)計漓雅,并按降序排序:
#聚合統(tǒng)計各種藥品數(shù)量
medicine = groupDF[['商品名稱','銷售數(shù)量']]
bk = medicine.groupby('商品名稱')[['銷售數(shù)量']]
re_medicine = bk.sum()

#對銷售藥品數(shù)量按將序排序
re_medicine = re_medicine.sort_values(by='銷售數(shù)量', ascending=False)
print(re_medicine.head())
image.png

截取銷售數(shù)量最多的前十種藥品,并用條形圖展示結果:

top_medicine = re_medicine.iloc[:10,:]
print(top_medicine)
image.png
image.png

得到銷售數(shù)量最多的前十種藥品信息朽色,這些信息將會有助于加強醫(yī)院對藥房的管理邻吞。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葫男,隨后出現(xiàn)的幾起案子抱冷,更是在濱河造成了極大的恐慌,老刑警劉巖梢褐,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旺遮,死亡現(xiàn)場離奇詭異,居然都是意外死亡盈咳,警方通過查閱死者的電腦和手機耿眉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鱼响,“玉大人鸣剪,你說我怎么就攤上這事≌苫” “怎么了筐骇?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長江滨。 經(jīng)常有香客問我铛纬,道長,這世上最難降的妖魔是什么唬滑? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任告唆,我火速辦了婚禮,結果婚禮上间雀,老公的妹妹穿的比我還像新娘悔详。我一直安慰自己,他們只是感情好惹挟,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布茄螃。 她就那樣靜靜地躺著,像睡著了一般连锯。 火紅的嫁衣襯著肌膚如雪归苍。 梳的紋絲不亂的頭發(fā)上用狱,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機與錄音拼弃,去河邊找鬼夏伊。 笑死,一個胖子當著我的面吹牛吻氧,可吹牛的內容都是我干的溺忧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼盯孙,長吁一口氣:“原來是場噩夢啊……” “哼鲁森!你這毒婦竟也來了?” 一聲冷哼從身側響起振惰,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤歌溉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骑晶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痛垛,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年桶蛔,在試婚紗的時候發(fā)現(xiàn)自己被綠了匙头。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡羽圃,死狀恐怖乾胶,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情朽寞,我是刑警寧澤识窿,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站脑融,受9級特大地震影響喻频,放射性物質發(fā)生泄漏。R本人自食惡果不足惜肘迎,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一甥温、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妓布,春花似錦姻蚓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春加叁,著一層夾襖步出監(jiān)牢的瞬間倦沧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工它匕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留展融,地道東北人。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓豫柬,卻偏偏與公主長得像告希,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轮傍,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內容