我的首次簡單」數據分析「

寫在前面

在進行數據分析錢,要先了解數據框創建、描述等操作,通過猴哥的課程,我做了個小總結:

遇到不明白的地方,我在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崗)

TAG:Python | 數據分析 |