藥店銷售數據分析
數據分析步驟
一、提出問題
明確了問題,為後面的數據分析提供了一個大的方向和目標。
想要得出以下幾個業務指標:
二、理解數據
1、採集數據:根據問題採集相關的數據。
2、導入數據:從Excel、資料庫或web的API介面中,把數據導入python的數據結構中。比如,讀取EXCEL數據到二維數據框中。
3、查看數據集的信息:包括描述統計學信息,從總體上了解數據。
代碼如下:
1)讀取Excel數據
#導入數據分析包import pandas as pd#讀取Excel數據,參數dtype統一先按照str讀入,之後轉換fileNameStr=./朝陽醫院2018年銷售數據.xlsxxls=pd.ExcelFile(fileNameStr,dtype=object)salesDf=xls.parse(Sheet1,dtype=object)
2)列印前幾行
salesDf.head()
#有多少行多少列salesDf.shape(6578, 7)type(salesDf.shape)tuple#查看列的數據類型salesDf.dtypes購葯時間 object社保卡號 object商品編碼 object商品名稱 object銷售數量 object應收金額 object實收金額 objectdtype: objecttype(salesDf.dtypes)pandas.core.series.Series
三、數據清洗
數據清洗的步驟,如下圖
subSalesDf=salesDf.loc[0:4,購葯時間:銷售數量]subSalesDf
2.列名重命名
#字典:舊列名和新列名對應關係colNameDict={購葯時間:銷售時間}inplace=False,數據框本身不會變,而會創建一個改動後新的數據框,默認的inplace是Falseinplace=True,數據框本身不會動salesDf.rename(columns=colNameDict,inplace=True)salesDf.head()
3.缺失數據處理
python缺失值有3種:1)Python內置的None值2)在pandas中,將缺失值表示為NA,表示不可用not available。3)對於數值數據,pandas使用浮點值NaN(Not a Number)表示缺失數據。
後面出來數據,如果遇到錯誤:說什麼float錯誤,那就是有缺失值,需要處理掉所以,缺失值有3種:None,NA,NaN可採用兩種辦法,a.直接刪除缺失的數據; b.建立模型,進行插值補充數據,以後會有介紹。下面用第一種方法:drop函數詳細使用地址
#None和NaN的區別print(None的數據類型,type(None))from numpy import NaNprint(NaN的數據類型,type(NaN))None的數據類型 <class NoneType>NaN的數據類型 <class float>print(刪除缺失值前的大小,salesDf.shape)刪除缺失值前的大小 (6578, 7)#刪除列(銷售時間,社保卡號)中為空的行#subset用於指定刪除列的列表#how=any 在給定的任何一列中有缺失值就刪除salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any)print(刪除缺失後大小,salesDf.shape)刪除缺失後大小 (6575, 7)
4.數據類型轉換
字元串轉換為數值(浮點型)#字元串轉換為數值(浮點數)salesDf[銷售數量]=salesDf[銷售數量].astype(float)salesDf[應收金額] = salesDf[應收金額].astype(float)salesDf[實收金額] = salesDf[實收金額].astype(float)print(轉換後的數據類型:
,salesDf.dtypes)轉換後的數據類型: 銷售時間 object社保卡號 object商品編碼 object商品名稱 object銷售數量 float64應收金額 float64實收金額 float64dtype: object
字元串轉換為日期數據類型
#字元串分割testList=2018-06-03 星期五.split( )testList[2018-06-03, 星期五]testList[0]2018-06-03定義函數:分割銷售日期,獲取銷售日期輸入:timeColSer 銷售時間這一列,是個Series數據類型輸出:分割後的時間,返回也是個Series數據類型def splitSaletime(timeColSer): timeList=[] for value in timeColSer: #例如2018-01-01 星期五,分割後為:2018-01-01 dateStr=value.split( )[0] timeList.append(dateStr) #將列錶轉化為一維數據Series類型 timeSer=pd.Series(timeList) return timeSer#獲取『銷售時間』這一列timeSer=salesDf.loc[:,銷售時間]#對字元串進行分割,獲取銷售日期dateSer=splitSaletime(timeSer)dateSer[0:3]0 2018-01-011 2018-01-022 2018-01-06dtype: object#修改銷售時間這一列的值salesDf.loc[:,銷售時間]=dateSersalesDf.head()
字元串轉換為日期
#errors=coerce 如果原始數據不符合日期的格式,轉換後的值為空值NaT#pandas中對於時間的缺失值的特定值為NaT,NA是不可用,時間類型不可用是NaT#format 是你原始數據中日期的格式salesDf.loc[:,銷售時間]=pd.to_datetime(salesDf.loc[:,銷售時間],format=%Y-%m-%d,errors=coerce)salesDf.dtypes銷售時間 datetime64[ns]社保卡號 object商品編碼 object商品名稱 object銷售數量 float64應收金額 float64實收金額 float64dtype: objectsalesDf.shape(6575, 7)轉換日期過程中不符合日期格式的數值會被轉換為空值,這裡刪除列(銷售時間,社保卡號)中為空的行salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any)salesDf.shape(6549, 7)
5.數據排序
print(排序前數據集)salesDf.head()排序前數據集
排序後
by:按哪幾列排序ascending=True 表示升序排列,ascending=False表示降序排列na_position=True表示排序的時候,把空值放到前列,這樣可以比較清晰的看到哪些地方有空值#按銷售日期進行升序排列salesDf=salesDf.sort_values(by=銷售時間, ascending=True, na_position=first)print(排序後的數據集)salesDf.head(3)排序後的數據集
重命名行名(index)排序後的列索引值是之前的行號,需要修改成從0到N按順序的索引值
salesDf=salesDf.reset_index(drop=True)salesDf.head()
6.異常值處理
每一列的描述統計信息salesDf.describe()
刪除異常值:通過條件判斷篩選出數據
#查詢條件querySer=salesDf.loc[:,銷售數量]>0#應用查詢條件print(刪除異常值前:,salesDf.shape)salesDf=salesDf.loc[querySer,:]print(刪除異常值後:,salesDf.shape)刪除異常值前: (6549, 7)刪除異常值後: (6506, 7)
四、構建模型
對清洗後的數據進行分析
簡單的分析:得出一些業務指標
複雜的分析:運用機器學習的演算法訓練模型
業務指標1:月均消費次數=總消費次數 / 月份數總消費次數:同一天內,同一個人發生的所有消費算作一次消費#根據列名(銷售時間,社區卡號),如果這兩個列值同時相同,只保留1條,將重複的數據刪除#刪除重複數據kpil_Df=salesDf.drop_duplicates(subset=[銷售時間,社保卡號])#有多少行totalI=kpil_Df.shape[0]print(總消費次數=,totalI)總消費次數= 5342計算月份數:時間範圍#第1步:按銷售時間升序排序kpil_Df=kpil_Df.sort_values(by=銷售時間, ascending=True)#重命名行名(index)kpi1_Df=kpil_Df.reset_index(drop=True)kpi1_Df.head()
#第2步:獲取時間範圍#最小時間值startTime=kpi1_Df.loc[0,銷售時間]#最大時間值endTime=kpi1_Df.loc[totalI-1,銷售時間]#第3步:計算月份數#天數daysI=(endTime-startTime).days#月份數: 運算符「//」表示取整除 #返回商的整數部分,例如9//2 輸出結果是4monthsI=daysI//30print(月份數:,monthsI)月份數: 6#業務指標1:月均消費次數=總消費次數 / 月份數kpi1_I=totalI // monthsIprint(業務指標1:月均消費次數=,kpi1_I)199
指標2:月均消費金額 = 總消費金額 / 月份數
#總消費金額totalMoneyF=salesDf.loc[:,實收金額].sum()#月均消費金額monthMoneyF=totalMoneyF / monthsIprint(業務指標2:月均消費金額=,monthMoneyF)業務指標2:月均消費金額= 50668.3516667
客單價(per customer transaction)是指商場(超市)每一個顧客平均購買商品的金額,客單價也即是平均交易金額。
totalMoneyF:總消費金額totalI:總消費次數pct=totalMoneyF / totalIprint(客單價:,pct)客單價: 56.909417821
五、數據可視化
指標4:消費趨勢,畫圖:折線圖需要用到pandas的高級功能
pandas更多高級功能以及繪圖等更多高級數據分析功能,在學習後再進行補充。
推薦閱讀: