Numpy和Pandas---數據分析的梯子

數據分析用到最多的第三方庫除了標題中的numpy和pandas,還有一個就是進行數據可視化的matplotlib,這部分內容我會在後期學完之後整理出來。

本文主要包括3個部分:

1. numpy基礎知識

2. pandas基礎知識

3. 練習--藥店銷售數據分析

(本文建立在Python基礎知識上,你懂的。。。)

在Python中我們表示一維數據可以用列表(有序)和集合(無序不重複):

表示二維我們可以用列表嵌套的方式:

今天我們要討論的numpy和pandas就是從一維和二維數據上展開,先不討論複雜的高維數據。

Numpy基礎知識

Numpy(Numerical Python):開源的Python科學計算基礎庫。它是pandas和其他數據處理或科學計算庫的基礎。

numpy的最重要的一個N維數組對象:ndarray(也叫array)

numpy關注數據的結構表達(數據之間構成的維度)

numpy的引用(約定俗成):import numpy as np

在開始學習array一維數組,二維數組之前,我想你可能和我有同樣的問題,那就是在Python中已經有列表可以表示一二維數據了,為什麼還需要數組對象?

在《利用Python進行數據分析》第93頁中有這樣兩句話說:

無需編寫循環,無需編寫循環,無需編寫循環。

重要的事情說三遍,什麼意思?

比如:我們要計算s=a2+b3,a=[1,2,3,4],b=[8,7,6,5]

用Python計算:

需要藉助for循環完成計算

用Numpy數組計算:

無需編寫循環

現在你清楚為什麼需要數組對象了------它符合科學計算的思想。數組對象可以去掉元素間運算所需要的循環,讓一維向量更像單個數據。

另外列表和數組的一個明顯的區別就是:

列表:數據類型可以不同

數組:數據類型要求相同(如都是浮點數)

這個區別決定了列表不具有運算功能,如統計功能(如平均值,標準差等)、向量化計算等,然鵝數組可以(666)。

通過以上數組和列表的比較中,你應該可以看到:

生成一個ndarray數組的方式:np.array()

生成一維數組(先導入numpy包):

查詢數組元素(下標和Python一樣從0開始):

切片查詢(獲取子集):

和Python一樣[1:3]代表區間[1:3)

統計功能(如平均值):

向量計算:

生成二維數組:

根據需要查詢數組的元素:

軸(axis):表示數據的維度,如圖說明了二維數組的索引方式

統計功能:

向量計算:

Pandas基礎知識

Pandas:提供高性能易用數據類型和分析工具,常與numpy,matplotlib一起使用,是目前為止最好的數據分析工具。

Pandas的最重要的兩個數據類型:Series, DataFrame

Pandas關注數據的應用表達(數據與索引之間的關係)

Pandas的引用(約定俗成):import pandas as pd

生成一維數據(Series):由一組數據和與之相關的數據索引構成

自動索引:

自定義索引:

用loc和iloc方法查詢數據中的元素:

註:iloc對應自動索引,loc對應自定義索引

切片查詢(注意以下兩種末端含與不含的區別):

請注意與Python不同的是,這裡自定義索引的末端是包含的

自動索引的末端是不含的

統計功能:

向量計算(如果一個索引值只出現在一個Series中,就會出現空值):

出現空值有如下兩種辦法:

生成二維數據(DataFrame):共用相同索引的數據組成的數據類型。

0對應了一組數據,反過來就是說這一組數據共用了索引值0

查詢數據(和Series一樣):

切片查詢(獲取子集):

數據框DataFrame還可以通過條件判斷篩選出符合條件的數據:

篩選出銷售數量大於1的數據

統計功能:

練習-藥店銷售數據分析

數據分析步驟:提出問題--理解數據--數據清洗--構建模型--數據可視化

(接下來的內容會有點長,請多一點耐心,請多一點耐心,請多一點耐心,嗯(#^.^#))

提出問題:例如求朝陽醫院2018年銷售數據的 月均銷售次數,月均消費金額,客單價,消費趨勢

理解數據:

1.讀取Excel數據

查看數據:

查看描述這些數據的元數據(數據維度、數據類型等):

數據維度

數據類型

數據清洗:(步驟)選擇子集--列名重命名--缺失數據處理--數據類型轉換--數據排序--異常值處理

1. 選擇子集

有時候導入的數據有很多列,如果其中只有部分列是我們需要的,這時候就需要選擇子集,用切片方法選擇子集的方法前文已講到,在此不多贅述,在本案例中不需要選擇子集。

2. 列名重命名

有時候根據個人習慣或者列名不方便我們進行數據分析,可以進行列名重命名(例如我們將購葯時間改為銷售時間):

3. 缺失數據處理:

辦法1. 直接刪除:

subset 用於存放指定列

辦法2. 如果缺失值太多,可以建立模型進行插值處理,這部分內容後續會整理出來。

可以看到我們這個案例只缺失了3行數據,所以我們直接刪除了。

4. 數據類型轉換

a. 在之前查看數據的數據類型中可以看到所有的數據都是字元串類型,但是我們知道,銷售數量,應收金額,實收金額應該是數值類型(浮點型)才對。

b. 將銷售時間如「2018-06-03 星期五」,改為「2018-06-03」同時將銷售時間的數據類型轉換為日期的數據類型。

第一步:將「2018-06-03 星期五」,改為「2018-06-03」

字元串分割辦法:

由於我們需要將銷售時間這一列的格式都要改為xxxx-xx-xx,對於這種需要解決重複有規律的問題我們應該條件反射到函數。

編寫函數

實際上這個問題我們也可以在Excel中完成,但我們還是需要學會用程序來解決此類問題。

第二步:將銷售時間由字元串數據類型轉換成日期數據類型

請注意,進行日期類型轉換的過程中不符合日期格式的數值會被轉換為空值

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

5. 數據排序

通過數據排序可以知道數據的時間範圍

排序前:

排序後:

index值重排序後:

6. 異常值處理

查看數據的描述性統計信息,發現金額中出現了負值(無法找相關人員回憶正確信息並修正),這肯定是不對的,所以要刪除這些不對的記錄。

刪除異常值:

至此數據清洗告一段落,接下來構建模型。

構建模型:

前三部分準備工作做完後,現在回到我們剛開始提出的問題,即我們需要求出藥店的月均銷售次數,月均消費金額,客單價,消費趨勢。

月均消費次數=總消費次數/ 月份數

同一天內,一個人發生的所有消費算作一次消費。

因此我們需要刪除銷售時間和社保卡號都相同的重複記錄,只保留一條

求總消費次數:

求月份數:

最後得出指標1:月均消費次數

月均消費金額

等於總消費金額/ 月份數

月份數已經求出,接下來只需要對實收金額進行求和就可以得出總消費金額。

即:

客單價(per customer transaction)是指商場(超市)每一個顧客平均購買商品的金額,客單價也即是平均交易金額。

等於總消費金額 / 總消費次數

客單價乘以客戶消費次數實際上就是門店的消費額,所以對於門店的業務員來說要想提高業績,那麼想辦法提高客單價是一個辦法。

總消費金額和總消費次數上面已經求出,我們可以直接得出結果:

最後一個指標:消費趨勢

這部分內容需要用到pandas更多的功能和數據可視化包(matplotlib),會在後續文章中提到,至此關於numpy和pandas的學習先告一段落,好好吸收和消化吧(#^.^#)


推薦閱讀:

Python 數據分析學習路線
Kaggle機器學習之泰坦尼克號生還預測
4 種最搶手的數據分析職業,你會選擇?

TAG:數據分析 | numpy |