Python數據分析簡單的基本過程

(此文為新手學習筆記,大牛請忽略。閱讀此文大概需要5~7分鐘。)

一、準備工作

環境:Python3.5.2(使用其自帶的IDLE,並已經配置好環境變數),win10.

數據來源:pan.baidu.com/s/1jJ9e1V 密碼:bm9r

用到的包:NumPy、Pandas、matplotlib、xlrd、datetime(可用pip install xxx直接安裝,有問題就直接搜索引擎解決)。

Numpy:

NumPy是Python語言的一個擴充程序庫。支持高級大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。NumPy的核心功能是"ndarray"(即n-dimensional array,多維數組)數據結構。這是一個表示多維度、同質並且固定大小的數組對象。而由一個與此數組相關係的數據類型對象來描述其數組元素的數據格式(例如其字元組順序、在內存中佔用的字元組數量、整數或者浮點數等等)。

詳細介紹:zh.wikipedia.org/wiki/N

使用教程:TutorialsPoint NumPy 教程

Pandas:pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。

使用教程:Python For Data Analysis 0.1 documentation

matplotlib:是Python編程語言的一個繪圖庫及其數值數學擴展 NumPy。它為利用通用的圖形用戶界面工具包,如Tkinter, wxPython, Qt或GTK+嚮應用程序嵌入式繪圖提供了面向對象的應用程序介面(API)。還有一個基於狀態機(如開放圖形庫OpenGL)的程序pylab介面,設計成與MATLAB非常類似--儘管使用起來有些不堪。SciPy就利用了matplotlib。

pyplot是matplotlib的一個模塊,它提供了一個類似MATLAB的介面。 matplotlib被設計得用起來像MATLAB,具有使用Python的能力。免費是其優點。

詳細介紹:zh.wikipedia.org/wiki/M

使用教程:十分鐘入門Matplotlib| 編程派 | Coding Python

二、NumPy一維數據分析:

1.

import pandas as pd #導入pandas包import numpy as np #導入numpy包#這裡使用NumPy的array方法來創建數組,並將數據放在列表中a = np.array([2,3,6,8]) #定義一維數據array。

運行結果:

>>> aarray([2, 3, 6, 8])

2.獲取數據。

使用索引:

import numpy as npa = np.array([2,3,6,8]) #定義一維數據array。

輸出結果:

>>> a[1]3

使用切片:

import numpy as npa = np.array([2,3,6,8]) #定義一維數據array。a[0:2]

輸出結果:

>>> a[0:2]array([2, 3])

使用for循環:

import numpy as npa = np.array([2,3,6,8]) #定義一維數據array。for i in a: print(i)

輸出結果:

2368

使用dtype屬性來查看數據類型:

import numpy as npa = np.array([2,3,6,8]) #定義一維數據array。

輸出結果:

>>> a.dtypedtype(int32)

三、分析:NumPy一維數組與Python列表的區別

1.NumPy一維數組自帶有統計功能:如平均值mean()、標準差std()等。

mean():

import numpy as npa = np.array([2,3,6,8]) #定義一維數據array。b = np.mean(a) #計算數組中元素的平均值

輸出結果:

>>> b4.75

std:

import numpy as npa = np.array([2,3,6,8]) #定義一維數據array。b = np.std(a) #計算數組中元素的標準差 。

輸出結果:

>>> b2.384848003542364

2.2 利用NumPy對數值進行向量化計算。

import numpy as npa = np.array([2,3,6,8]) #定義一維數據array。

輸出結果:

>>> a*4 #乘以標量array([ 8, 12, 24, 32])

import numpy as npa = np.array([2,4,6,8]) #定義一維數據array。b = np.array([1,3,5,7]) #向量相加求和。

輸出結果:

>>> a+barray([ 3, 7, 11, 15])

此外,NumPy一維數組裡面的每個數據類型必須相同,而列表中的數據可以是不同類型的數據。

三、Pandas一維數據分析:

Pandas的Series和NumPy的數組之間的主要區別是Series有索引,並且要用index來指定索引。

1、根據以下圖中公司的股價來定義Series。

import pandas as pd#index參數指定了每個元素的索引。stockS = pd.Series([54.74, 190.9, 173.14, 1050.3, 181.86, 1139.49], index=[騰訊,阿里巴巴,蘋果,谷歌,FaceBook,亞馬遜])

輸出結果:

>>> stockS騰訊 54.74阿里巴巴 190.90蘋果 173.14谷歌 1050.30FaceBook 181.86亞馬遜 1139.49dtype: float64

2、用定義好的describe()方法獲取這個一維數組的統計信息。

>>> stockS.describe()count 6.000000mean 465.071667std 491.183757min 54.74000025% 175.32000050% 186.38000075% 835.450000max 1139.490000dtype: float64

其中對應的含義是:

count #數據總數mean #平均值std #標準差min #最小值25% #下四分位數50% #中位數75% #上四分位數max #最大值

3、獲取一維數組。

>>> stockS.iloc[1] #iloc屬性是根據位置獲取對應的值。190.90000000000001

>>> stockS.loc[谷歌] #loc屬性用於根據索引獲取對應的值。1050.3

4、一維數組Series支持向量化運算。

(1)

import pandas as pda1 = pd.Series([2,4,6,8], index=[a,b,c,d])a2 = pd.Series([20,40,60,80], index=[a,b,c,d])

輸出結果:

>>> a1+a2a 22b 44c 66d 88dtype: int64

(2)

import pandas as pda1 = pd.Series([2,4,6,8], index=[a,b,c,d])a2 = pd.Series([20,40,60], index=[a,b,c])

輸出結果:

>>> a1+a2a 22.0b 44.0c 66.0d NaNdtype: float64

(3)

import pandas as pda1 = pd.Series([2,4,6,8], index=[a,b,c,d])a2 = pd.Series([20,40,60,80], index=[a,b,f,g])

輸出結果:

import pandas as pda1 = pd.Series([2,4,6,8], index=[a,b,c,d])a2 = pd.Series([20,40,60,80], index=[a,b,f,g])

小結:Pandas一維數組Series的向量相加時,數組裡的數據個數可以不一樣,都是索引值相同的值相加,若某索引值只存在於其中一個一維數組中,這相加後返回這個索引值所對應的值就是空值NaN。但在NumPy一維數組的向量相加時,NumPy一維數組裡面的數據個數必須相同,否則報錯。

5、若在實際請款中不希望有空值出現的情況,可以用以下兩種辦法處理空值。

(1)

import pandas as pda = pd.Series([2,4,6,8], index=[a,b,c,d])b = pd.Series([20,40,60,80], index=[a,b,f,g])c = a+b

輸出結果:

>>> c.dropna() #使用dropna()方法刪除缺失值,即刪除空值。a 22.0b 44.0dtype: float64

(2)

import pandas as pda = pd.Series([2,4,6,8], index=[a,b,c,d])b = pd.Series([20,40,60,80], index=[a,b,f,g])#用add()方法把兩個數組相加,傳入fill_value=0作為參數,表示缺失值用0來填充。c = a.add(b,fill_value=0)

輸出結果:

>>> ca 22.0b 44.0c 6.0d 8.0f 60.0g 80.0dtype: float64

四、NumPy二維數據分析。

在Excel表格中,每一行和每一列的數據其數據類型很可能是不一樣的,這個時候就需要用到Pandas中的數據框(DataFrame)了。

Pandas中的數據框(DataFrame)中的每一列可以是不同類型的數據,並且有Pandas的一維數組Series的引索功能,即這二維表格每一行或列都有一個引索值。

1、創建一個數據框(使用Dataframe)。

import pandas as pd#首先定義一個字典,用來存放二維表格中的數據,並映射列名和對應列的值salesDict = { 購葯時間:["2018-01-01 星期五","2018-01-02 星期六","2018-01-03 星期日"], 社保卡號:[001616528,001616528,0012602828], 商品編碼:[236701,236701,236701], 商品名稱:[強力VC銀翹片,清熱解毒口服液,感康], 銷售數量:[6,1,2], 應收金額:[82.8,28,16.8], 實收金額:[69,24.64,15] }#接著使用DataFrame方法來定義數據框,將字典作為參數傳入其中salesDf = pd.DataFrame(salesDict)

接著輸出結果:(好吧IDLE輸出結果不是很美觀 = =、)

>>> salesDf 商品名稱 商品編碼 實收金額 應收金額 社保卡號 購葯時間 銷售數量0 強力VC銀翹片 236701 69.00 82.8 001616528 2018-01-01 星期五 61 清熱解毒口服液 236701 24.64 28.0 001616528 2018-01-02 星期六 12 感康 236701 15.00 16.8 0012602828 2018-01-03 星期日 2

以上的輸出結果實在太不美觀,所以利用搜索引擎找了一下解決辦法修改如下:

import pandas as pdfrom collections import OrderedDict#首先定義一個字典,用來存放二維表格中的數據,並映射列名和對應列的值salesOrderDict = OrderedDict([ (購葯時間,["2018-01-01 星期五","2018-01-02 星期六","2018-01-03 星期日"]), (社保卡號,[001616528,001616528,0012602828]), (商品編碼,[236701,236701,236701]), (商品名稱,[強力VC銀翹片,清熱解毒口服液,感康]), (銷售數量,[6,1,2]), (應收金額,[82.8,28,16.8]), (實收金額,[69,24.64,15]) ])#接著使用DataFrame方法來定義數據框,將字典作為參數傳入其中salesDf = pd.DataFrame(salesOrderDict)

再來看輸出結果:

>>> salesDf 購葯時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額0 2018-01-01 星期五 001616528 236701 強力VC銀翹片 6 82.8 69.001 2018-01-02 星期六 001616528 236701 清熱解毒口服液 1 28.0 24.642 2018-01-03 星期日 0012602828 236701 感康 2 16.8 15.00

看起來比剛剛好了那麼一丟丟 = =、

2.接著再對定義好的DataFrame取平均值:

>>> salesDf.mean() #按每列來求平均值商品編碼 236701.000000銷售數量 3.000000應收金額 42.533333實收金額 36.213333dtype: float64

3.查詢數據

a.首先是利用iloc屬性根據位置查詢值。

>>> salesDf.iloc[1,3] #根據行號列號查詢清熱解毒口服液

再接著:

>>> salesDf.iloc[1,:] #獲取第2行全部數據購葯時間 2018-01-02 星期六社保卡號 001616528商品編碼 236701商品名稱 清熱解毒口服液銷售數量 1應收金額 28實收金額 24.64Name: 1, dtype: object

還可以這樣:

>>> salesDf.iloc[:3,1] #第2列的第1至3行0 0016165281 0016165282 0012602828Name: 社保卡號, dtype: object

b.利用loc屬性根據引索查詢值。

>>> salesDf.loc[0,實收金額]69.0>>> salesDf.loc[0,:] #獲取第一行數據購葯時間 2018-01-01 星期五社保卡號 001616528商品編碼 236701商品名稱 強力VC銀翹片銷售數量 6應收金額 82.8實收金額 69Name: 0, dtype: object>>> salesDf.loc[0:3,銷售數量]0 61 12 2Name: 銷售數量, dtype: int64>>> salesDf.loc[:,商品名稱:銷售數量] 商品名稱 銷售數量0 強力VC銀翹片 61 清熱解毒口服液 12 感康 2

c.直接獲取整列數據。

>>> salesDf[應收金額]0 82.81 28.02 16.8Name: 應收金額, dtype: float64>>> salesDf[[應收金額,實收金額]] 應收金額 實收金額0 82.8 69.001 28.0 24.642 16.8 15.00

4.根據給出的條件篩選符合要求的數據。

a.給出一個查詢條件:

>>> querySer = salesDf.loc[:,銷售數量]>1>>> querySer #返回一個Pandas一維數組Series,裡面存放的書布爾類型的數據0 True1 False2 TrueName: 銷售數量, dtype: bool

b.利用a的條件繼續查詢:

>>> salesDf.loc[querySer,:] #行名的地方傳入剛才查詢條件的變數名,篩選出滿足條件的行 購葯時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額0 2018-01-01 星期五 001616528 236701 強力VC銀翹片 6 82.8 69.02 2018-01-03 星期日 0012602828 236701 感康 2 16.8 15.0

5. 繼續查詢數據框中的描述統計信息。

a.使用Pandas的ExcelFile()可將數據讀入DataFrame中,但一定要寫清楚Excel文件的具體目錄路徑,才能夠成功讀取數據並存放在salesDf中。

提醒:如果沒有計算機上沒有xlrd包,需要先下載安裝。代碼如下:

C:WINDOWSsystem32>pip install xlrd

安裝好了是這樣:

C:WINDOWSsystem32>pip install xlrdCollecting xlrd Downloading xlrd-1.1.0-py2.py3-none-any.whl (108kB) 100% |████████████████████████████████| 112kB 228kB/sInstalling collected packages: xlrdSuccessfully installed xlrd-1.1.0

當然還有其他辦法,不過這種方法最快。

好了,繼續剛剛的:

import pandas as pdimport xlrdfileNameStr=(rF:/朝陽醫院2016年銷售數據.xlsx) #這一句要特別注意,r不能漏掉,反斜杠也是xls = pd.ExcelFile(fileNameStr)salesDf = xls.parse(Sheet1)

關於讀取數據,我踩了幾個坑,具體可以參考:python3遇到了OSError: [Errno 22] Invalid argument

好了,再繼續輸出結果:

>>> salesDf.head(5) 購葯時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額0 2016-01-01 星期五 1616528 236701 三九感冒靈 7 196.0 182.001 2016-01-02 星期六 1616528 236701 三九感冒靈 3 84.0 84.002 2016-01-06 星期三 10070343428 236701 三九感冒靈 3 84.0 73.923 2016-01-11 星期一 13389528 236701 三九感冒靈 1 28.0 28.004 2016-01-15 星期五 101554328 236701 三九感冒靈 8 224.0 208.00

b.用dtype()可以查看某列的數據類型。

>>> salesDf.loc[:,實收金額].dtypedtype(float64)

c.使用shape查看數據集的數據量(行數與列數)。

>>> salesDf.shape(6577, 7)

d.使用DataFrame的describe屬性可以獲取數據集的描述統計數據。

>>> salesDf.describe() 社保卡號 商品編碼 銷售數量 應收金額 實收金額count 6.577000e+03 6.577000e+03 6577.000000 6577.000000 6577.000000mean 6.091858e+09 1.015869e+06 2.386194 50.473803 46.317510std 4.889157e+09 5.131153e+05 2.375202 87.595925 80.976702min 1.616528e+06 2.367010e+05 -10.000000 -374.000000 -374.00000025% 1.014234e+08 8.614560e+05 1.000000 14.000000 12.32000050% 1.001650e+10 8.615070e+05 2.000000 28.000000 26.60000075% 1.004882e+10 8.690690e+05 2.000000 59.600000 53.000000max 1.283612e+10 2.367012e+06 50.000000 2950.000000 2650.000000

五、數據分析的基本過程描述。

數據分析的基本步驟

步驟解析:

1.提出問題。

定義清楚我們需要研究的問題,是數據分析的根本所在,也是所有數據分析的第一步。

關於數據分析研究的問題,可以參考這個知乎的問題:

什麼時候覺得,數據分析真的非常有用?www.zhihu.com圖標

2.理解數據。

理解數據關係到的如何分析與挖掘:

  • 帶著業務目標的眼光看數據
  • 行列數
  • 數據單位,或者說數據的詳細程度,是每天還是每月每年
  • 研究群體
  • 理解每個變數及其之間的關係(順帶剔除沒有信息量的數據,如線性無關的數據、沒有區分度的數據)

所以,真正解決問題之前先看數據集的整體信息,從整體上理解和把握數據。

可以使用Pandas的ExcelFile()將數據讀入數據框中,在讀取過程中加入dtype這個參數(表示統一按照字元串類型讀取數據,使某些列的數值確保是對的),最後列印查看數據:

更多的數據理解可以參考:

第一章·你真的理解數據了嗎(1):數據表達了什麼 | 《數據之美》 | 數據觀 | 中國大數據產業觀察_大數據門戶www.cbdio.com圖標

3.數據清洗。

a.選擇子集。

有時候只需要導入數據中的某幾列,這就需要使用切片的方式單獨讀取,代碼如下:

>>> subSalesDf = salesDf.loc[0:3,購葯時間:商品名稱]>>> subSalesDf 購葯時間 社保卡號 商品編碼 商品名稱0 2016-01-01 星期五 1616528 236701 三九感冒靈1 2016-01-02 星期六 1616528 236701 三九感冒靈2 2016-01-06 星期三 10070343428 236701 三九感冒靈3 2016-01-11 星期一 13389528 236701 三九感冒靈

b.列名的重命名。

舉例:將「購葯時間」改為「銷售時間」:

>>> colNameDict = {購葯時間:銷售時間} #先建立舊列名與新列名對應的字典關係>>> salesDf.rename(columns = colNameDict,inplace = True) #再重命名>>> salesDf.head(5) 銷售時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額0 2016-01-01 星期五 1616528 236701 三九感冒靈 7 196.0 182.001 2016-01-02 星期六 1616528 236701 三九感冒靈 3 84.0 84.002 2016-01-06 星期三 10070343428 236701 三九感冒靈 3 84.0 73.923 2016-01-11 星期一 13389528 236701 三九感冒靈 1 28.0 28.004 2016-01-15 星期五 101554328 236701 三九感冒靈 8 224.0 208.00

重命名rename()中傳入參數inplace;

默認inplace=False,表示數據框本身不會變,會自動創建改動後的新數據框,不影響原始數DataFrame;

若inplace=True,表示在原始數據框上操作,會變成重命名的樣子。

c.缺失數據處理。

原始數據一般是「臟」的,會有很多缺失和空值的情況出現,會造成導出的數據有些是空值NaN,有2種方法處理這些缺失數據。

1)刪除空值

>>> salesDf = salesDf.dropna(subset = [銷售時間,社保卡號], how = any)>>> print(刪除後的行數列數,salesDf.shape)刪除後的行數列數 (6577, 7)

刪除列(銷售時間、社保卡號)中為空的行。

使用dropna()刪除,how=any作為參數表示刪除給定某列中任何缺失值。

2)另外,若空值太多可建立模型進行插值填充這些缺失的數據。

d.數據類型的轉換。

像「銷售數據」這樣的文字信息屬於字元串類型,不方便計算,需要轉換為數值型,可用astype進行數據類型的轉換。

>>> salesDf[銷售數量 ] = salesDf[銷售數量].astype(float)>>> salesDf[應收金額 ] = salesDf[應收金額].astype(float)>>> salesDf[實收金額 ] = salesDf[實收金額].astype(float)>>> print("轉換後的數據類型
",salesDf.dtypes)轉換後的數據類型 銷售時間 object社保卡號 int64商品編碼 int64商品名稱 object銷售數量 float64應收金額 float64實收金額 float64dtype: object

銷售日期數據處理,如將「2018-01-01 星期五」變成「2018-01-01,可使用字元串分隔符的split(),拆分輸出想要的字元串:

>>> testList = 2018-01-01 星期五.split( ) #分隔符為空格>>> testList[2018-01-01, 星期五]

接著使用索引獲取數據:

>>> testList[0]2018-01-01

對「銷售日期」這一列所有日期進行字元串拆分,所有要先定義分割字元串的函數,用於分割字元串:

import pandas as pdimport xlrdfileNameStr=(rF:/朝陽醫院2016年銷售數據.xlsx)xls = pd.ExcelFile(fileNameStr)salesDf = xls.parse(Sheet1)colNameDict = {購葯時間:銷售時間}salesDf.rename(columns = colNameDict,inplace = True)定義分割字元串的函數,獲取日期;輸出timeColSer銷售時間這一列,是個Series類型;輸出分割後的時間,返回也是Series類型。def splitSaletime(timeColSer): timeList=[] for value in timeColSer: dateStr = value.split( )[0] timeList.append(dateStr) #將列錶轉換為一維數據Series類型 timeSer = pd.Series(timeList) return timeSer#獲取銷售時間這一列timeSer = salesDf.loc[:,銷售時間]#對字元串進行分割,獲取日期dateSer = splitSaletime(timeSer)#列印前三個變數查看是否分割好dateSer[0:3]

輸出結果:

>>> dateSer[0:3]0 2016-01-011 2016-01-022 2016-01-06dtype: object

接下來修改「銷售時間」這一列的值為日期數據:

>>> salesDf.loc[:,銷售時間]=dateSer>>> dateSer0 2016-01-011 2016-01-022 2016-01-063 2016-01-11.....(此處省略很多)6576 2016-04-28Length: 6577, dtype: object

使用Pandas的to_datetime()將字元串轉換成日期格式:

#format是原始數據中的日期格式#errors = coerce的意思是如果原始數據不符合日期格式,其轉化後的值為空值NaN>>> salesDf.loc[:,銷售時間] = pd.to_datetime(salesDf.loc[:,銷售時間],format = %Y-%n-%d,errors = coerce)>>> salesDf.dtypes #查看數據類型銷售時間 object社保卡號 int64商品編碼 int64商品名稱 object銷售數量 int64應收金額 float64實收金額 float64dtype: object

刪除列(銷售時間,社保卡號)中為空的行:

>>> salesDf = salesDf.dropna(subset = [銷售時間,社保卡號],how = any)>>> salesDf 銷售時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 實收金額0 2016-01-01 1616528 236701 三九感冒靈 7 196.0 182.001 2016-01-02 1616528 236701 三九感冒靈 3 84.0 84.002 2016-01-06 10070343428 236701 三九感冒靈 3 84.0 73.923 2016-01-11 13389528 236701 三九感冒靈 1 28.0 28.00.....(此處省略很多)6572 2016-04-27 10060482828 2367011 高特靈 1 5.6 5.006573 2016-04-27 107886128 2367011 高特靈 10 56.0 54.806574 2016-04-27 10087865628 2367011 高特靈 2 11.2 9.866575 2016-04-27 13406628 2367011 高特靈 1 5.6 5.006576 2016-04-28 11926928 2367011 高特靈 2 11.2 10.00[6577 rows x 7 columns]

e.對數據進行排列。

使用Pandas的sort_values()對指定的列名進行排序:

by:按那幾列排序ascending = True 表示升序排列ascending = False 表示降序排序「銷售時間」按照升序排列>>> salesDf = salesDf.sort_values(by = 銷售時間,ascending = True)>>> salesDf 銷售時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 2016-01-01 1616528 236701 三九感冒靈 7 196.0 399 2016-01-01 10074599128 2367011 開博通 5 140.0 398 2016-01-01 10072612028 2367011 開博通 1 28.0 3888 2016-01-01 10014289328 866851 纈沙坦分散片(易達樂) 1 26.0 .....(此處省略很多)

接下來用reset_index()重命名列名,因為排序後的行號為之前的行號,修改為0~n按順序的索引值:

>>> salesDf = salesDf.reset_index(drop= True)>>> salesDf 銷售時間 社保卡號 商品編碼 商品名稱 銷售數量 應收金額 2016-01-01 1616528 236701 三九感冒靈 7 196.0 1 2016-01-01 10074599128 2367011 開博通 5 140.0 2 2016-01-01 10072612028 2367011 開博通 1 28.0

最後用describe()方法獲取每一列的描述統計信息,從整體上了解數據集:

>>> salesDf.describe() 社保卡號 商品編碼 銷售數量 應收金額 實收金額count 6.577000e+03 6.577000e+03 6577.000000 6577.000000 6577.000000mean 6.091858e+09 1.015869e+06 2.386194 50.473803 46.317510std 4.889157e+09 5.131153e+05 2.375202 87.595925 80.976702min 1.616528e+06 2.367010e+05 -10.000000 -374.000000 -374.00000025% 1.014234e+08 8.614560e+05 1.000000 14.000000 12.32000050% 1.001650e+10 8.615070e+05 2.000000 28.000000 26.60000075% 1.004882e+10 8.690690e+05 2.000000 59.600000 53.000000max 1.283612e+10 2.367012e+06 50.000000 2950.000000 2650.000000

出現銷售數量最小值為-10,這是因為記錄錯誤而導致的異常值。

f.異常值處理。

異常值:有些數值太大超過了定義的範圍,所以在數據分析之前需要通過條件篩選,刪除異常值,保留有用的數值。

#通過條件篩選刪除異常值,從而篩選出數據#查詢條件>>> querySer = salesDf.loc[:,銷售數量]>0#應用查詢條件>>> print(刪除異常值前: , salesDf.shape)刪除異常值前: (6577, 7)>>> salesDf = salesDf.loc[querySer,:]>>> print(刪除異常值後: , salesDf.shape)刪除異常值後: (6534, 7)

4.構建模型。

a.業務指標1:月均消費次數=總消費次數/月份數

(註:同一天同一個人發生的所有消費算作一次消費)

可根據消費時間、社保卡號來判斷哪些數據是重複的,獲取總消費次數時,在消費時間、社保卡號倆個列中分別去掉重複數據,分別指保留一個

用drop_duplicates()刪除重複數據:

#刪除重複數據>>> kpil_Df = salesDf.drop_duplicates(subset=[銷售時間,社保卡號])>>> totall = kpil_Df.shape[0]#查看行數>>> print(總消費次數= ,totall)總消費次數= 5365

接下來求月份數,月份數=(最早消費時間-最晚消費時間)/30天:

>>> 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[totall-1,銷售時間]>>> endTime2016-07-19>>> startTime2016-01-01>>> import datatime>>> d1 = datetime.datetime(2016,7,19)>>> d2 = datetime.datetime(2016,1,1)>>> days_Df = (d1 - d2).days>>> months_Df = days_Df // 30>>> print(月份數: , months_Df)月份數: 6

最後得到月均消費次數:

>>> kpil_l = totall // months_Df>>> print(業務指標1: 月均消費次數 ,kpil_l)業務指標1: 月均消費次數 894

b.業務指標2:月均消費金額=總消費金額/月份數

上面已經求出月份數,現只需求總消費金額即可:

>>> totalMoney_Df = salesDf.loc[:,實收金額].sum()>>> monthMoney_Df = totalMoney_Df / months_Df>>> print(業務指標2: 月均消費金額 = , monthMoney_Df)業務指標2: 月均消費金額 = 50920.6716667

c.客單價(門店每一個顧客平均買商品的金額,即平均消費金額)

門店銷售金額由客單價和顧客數量決定的,除了增加顧客數目和其交易次數外,提高客單價也是很重要的。

業務指標3:客單價=總消費金額/總消費次數

綜上所述,總消費金額和總消費次數都已經求出來:

>>> pct = totalMoney_Df / totall>>> print(客單價: ,pct)客單價: 56.9476290774

5.數據可視化。

由於篇幅有限,後續文章會詳細寫基本的數據可視化。敬請期待~


推薦閱讀:

Numpy和Pandas---數據分析的梯子
2018年一定要收藏的20款免費預測分析軟體!
就是它了-結合自己興趣與事業發展的新方向
Kaggle機器學習之泰坦尼克號生還預測

TAG:數據分析 | numpy |