我的首次簡單」數據分析「
寫在前面
在進行數據分析錢,要先了解數據框創建、描述等操作,通過猴哥的課程,我做了個小總結:
遇到不明白的地方,我在Numpy和Pandas的教程里找辦法,附上鏈接:
Numpy簡易教程https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
Pandas簡易教程http://pandas.pydata.org/pandas-docs/stable/10min.html
案列練習:對朝陽醫院銷售數據進行分析
進行簡單數據分析的流程:
提出問題→理解數據→清洗數據→構建模型→數據可視化
1. 提出問題
我們想獲得三個指標:月平均消費次數、月平均消費金額、客單價。
2. 理解數據
2.1 導入模塊包,導入Excel文件,獲取數據。
(這裡需要注意Excel文件路徑不要出現中文。)
# 導入模塊import pippackage_name=xlrdpip.main([install,package_name])# 讀取Excel數據,注意Excel文件路徑不要出現中文import pandas as pdfileNameStr=E:\abcd\朝陽醫院2018年銷售數據.xlsxxls=pd.ExcelFile(fileNameStr, dtype=object)salesDf=xls.parse(Sheet1, dtype=object)# 查看數據基本信息# 列印Excel前五行salesDf.head()
輸出:
2.2 查看數據類型、查看錶格內數據個數
(行數,列數)
3. 清洗數據
清洗數據的方法:選擇數據,重命名列名,處理缺失數據,轉換數據類型,數據排序,異常值處理。
3.1 選擇數據
在Excel數據中選擇子集,去除我們不需要某幾列數據,給數據「減肥」:
(下面選擇「購葯時間」到「銷售數量」這5列數據)
########## 清洗數據 ########## 選擇子集subSalesDf=salesDf.loc[0:4,購葯時間:銷售數量]subSalesDf
輸出:
3.2 重命名數據名稱
有時為了方便數據分析,需要對某列進行重命名。
下面將「購葯時間」重命名成「銷售時間」,並且修改數據框本身。
# 重命名列名稱,舊:新# inplace=False:數據框本身不會變,會創建一個新的數據框;# inplace=True:數據框本身會改動。colNameDict={購葯時間:銷售時間}salesDf.rename(columns=colNameDict,inplace=True) # 修改數據框本身salesDf.head()
輸出:
3.3 處理缺失數據
數據中的空值會對數據分析結果造成影響,為了更準確的了解數據、分析數據,需要將空值數據刪去。
# 缺失數據的處理print(刪除缺失值前大小,salesDf.shape)# salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any)#salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any)print(刪除缺失值後大小,salesDf.shape)
輸出:
3.4 轉換數據類型
- 將「銷售數量」、「應收金額「、」實收金額「三列字元串類型轉為數值類型。
# 字元串轉換為數值類型(浮點型)salesDf[銷售數量]=salesDf[銷售數量].astype(float)salesDf[應收金額]=salesDf[應收金額].astype(float)salesDf[實收金額]=salesDf[實收金額].astype(float)print(轉換後的數據類型:
,salesDf.dtypes)
輸出:
- 字元分割
有時會遇到需要在字元串中提取有效數據,就會用到字元串分割處理。
# 字元串分割 .split分割符testList=2018-06-03 星期五.split( )testList
輸出:[2018-06-03, 星期五]
testList[0]
輸出:2018-06-03
案例中」銷售時間「一列為『日期』+『星期』,將『日期』分割出來,便於分析數據。
# 定義函數:分割銷售日期,獲取銷售日期def splitSaletime(timeColSer): # 輸入:timeColSer 銷售時間這一列,是個Series數據類型 timeList=[] for value in timeColSer: dateStr=value.split( )[0] # 分割字銷售日期 timeList.append(dateStr) timeSer=pd.Series(timeList) # 列錶轉換成一維數組Series數據類型 return timeSer # 輸出:分割後的時間,返回也是個Series數據類型timeSer=salesDf.loc[:,銷售時間] # 獲取銷售時間一列dateSer=splitSaletime(timeSer) # 調用函數,分割銷售時間dateSer[0:3] #輸出銷售時間
輸出:
salesDf.loc[:,銷售時間]=dateSer # 修改銷售時間一列的值salesDf.head()
輸出:
前面我們將『銷售時間』數據類型轉換成數值類型,字元分割後,還需要將『銷售時間』一列的數據轉換為日期格式。
# 數據類型轉換:『銷售時間』字元串轉換為日期 # errors=coerce 如果原始數據不符合日期的格式,轉換後的值為空值NaT # format 是原始數據中日期的格式salesDf.loc[:,銷售時間]=pd.to_datetime(salesDf.loc[:,銷售時間], format=%Y-%m-%d,errors=coerce)salesDf.dtypes
輸出:
上一步操作中不符合日期格式的原始數據轉換後變為空值NaT,所以需要刪除『銷售時間』、『社保卡號』中為空的行:
# 刪除銷售時間、社保卡號列中為空的行salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any)
3.5 數據排序
將『銷售時間』按升序排列:
# 按銷售時間排序# ascending=True 升序排列# ascending=False 降序排列salesDf=salesDf.sort_values(by=銷售時間,ascending=True)salesDf.head()
輸出:
重命名行號:
# 重命名行名salesDf=salesDf.reset_index(drop=True)salesDf.head()
輸出:
3.6 異常值處理
清洗數據的最後一步:處理異常值,把明顯不合理的數據刪除,否則會影響數據分析結果。
salesDf.describe() # 描述數據
輸出:
從數據描述運行結果可以看出,銷售數量最小值出現負值,明顯不合理,所以需要將其刪除。
# 刪除異常值 print(刪除異常值前:,salesDf.shape)querySer=salesDf.loc[:,銷售數量]>0
salesDf=salesDf.loc[querySer,:] print(刪除異常值後:,salesDf.shape)
salesDf.describe()
輸出:
(至此清洗數據終於完成了,可以看到一個正常的數據了)
4. 構建模型、數據可視化
我們分析數據想獲得三個指標:
- 月平均消費次數=總消費次數/月份數;
- 月平均消費金額=總消費金額/月份數;
- 客單價=總消費金額/總消費次數。
第一步:獲取總消費次數
我們認為同一天同一個人的所有消費算作一次消費,所以要刪除在『銷售時間』相同的情況下,『社保卡號』一樣的重複數據:
# 刪除重複數據kpi1_Df=salesDf.drop_duplicates(subset=[銷售時間,社保卡號])totalI=kpi1_Df.shape[0] # 有多少行,即總消費次數print(總消費次數=,totalI)
輸出:
第二步:獲取月份數
先將刪除重複數據後的銷售時間進行升序排列、重命名行名:
# 按銷售時間排序,升序kpi1_Df=kpi1_Df.sort_values(by=銷售時間,ascending=True)kpi1_Df.head()# 重命名行名kpi1_Df=kpi1_Df.reset_index(drop=True)#kpi1_Df.head()kpi1_Df
月份數=(最大時間-最小時間)/30,取整
# 第2步:獲取時間範圍 # 獲取最小時間值startTime=kpi1_Df.loc[0,銷售時間] # 獲取最大時間值endTime=kpi1_Df.loc[totalI-1,銷售時間] # 第3步:計算月份數 # 天數daysI=(endTime-startTime).days# 月份數:運算符//整除,返回整數部分monthsI=daysI//30 print(月份數:,monthsI)
輸出:
第三步:獲取3個指標
# 業務指標1:月均消費次數=總消費次數/月份數kpi1_I=totalI//monthsIprint(業務指標1:月均消費次數=,kpi1_I)
# 業務指標2:月均消費金額=總消費金額/月份數totalMoneyF=salesDf.loc[:,實收金額].sum() # 總消費金額monthMoneyF=totalMoneyF/monthsIprint(業務指標2:月均消費金額=,monthMoneyF)
# 業務指標3:客單價=總消費金額/總消費次數pct=totalMoneyF/totalIprint(業務指標3:客單價=,pct)
好啦,最終得到了我們想要的3個指標。
如果文中哪裡有錯誤,或各位前輩有更好的建議,請毫不客氣的甩過來啊。
推薦閱讀:
※【Python3網路爬蟲開發實戰】3.1-使用urllib
※9個Python編程小貼士
※機器學習之Python基礎(五) --協程,分散式
※Python 實例對象加法和字元串表示
※一份鬱悶的轉行offer(想要python爬蟲崗,去了python的web崗)