數據分析的基礎過程之:Numpy和Pandas的使用
在數據分析中,用到最多的包就是numpy、pandas和matplotlib。
其中numpy是用於數學計算,比如線性代數中的矩陣計算,在機器學習中非常有用;
pandas包是基於numpy的數據分析工具,該工具是為了解決數據分析任務而創建的,他提供了一種名為數據框的數據結構,可以方便地對錶結構的數據進行分析;
matplotlib包是一個圖形繪製庫,專門用於數據分析結構的可視化。
一、一維數據分析
Pandas 和Numpy 都有表示一維數據的特殊數據結構。
一維數據在Pandas中由Series表示,在Numpy中由Array。pandas中的series比numpy數組中的功能更多,pandas的series是建立在numpy的array基礎上的,所以在使用series之前,先了解numpy。
1、Numpy一維數據結構:
Numpy一維數組與列表的區別:
numpy中的數組中的每個元素都必須是同一種數據類型,列表中可以是不同的數據類型。
2、pandas一維數據結構:
series和array的區別是:series有索引,我們可以在定義時使用index指定這個索引,指定索引後我們可以通過索引名稱來訪問元素。
2.1獲取數組描述統計信息:describe()
2.2獲取一維數組中的元素:
1)通過Iloc屬性可以根據元素位置獲取值。
2)通過Loc屬性可以根據索引獲取值。
2.3series也支持向量運算,兩個向量相加是根據索引值相同的值來相加,如果出現空值Nan,就是兩個向量中的索引值不相同,沒法相加。
處理數據中出現空值的辦法:
1)刪除缺失值:dropna()
2)將缺失值進行填充:add(參數1,fill_value=)
二、二維數據分析
在Numpy(Numerical Python)中使用array來創建二維數組,在Pandas中使用Dataframe中來創建,一般更習慣於用Dataframe來創建,因為它有額外的功能,處理二維表格也更方便。
1、Numpy中創建一維數組和二維數組的不同之處在於:
二維數組每一行都是一個列表代表一行,各行之間是各個列表,列表間用逗號隔開代表每一行,圖中創建了一個三行四列的二維數組,所以傳入了三個列表,每個列表有四個元素。
1.1二維數組中的行號和列號都是從0開始的,查詢分為三種情況:
1)查詢數組中的某個元素,逗號前面先指定行號,後面指定列號。
2)查詢某一行的元素,先指定行號,然後指定列號(使用切片功能,切片功能使用冒號,通過冒號前後的數字來指定切片的範圍,如果不填寫數字,表示獲取所有的列值)。
3)查詢某一列的元素,先指定行號(使用切片功能),然後指定列號。
4)numpy數軸參數:numpy的二維數組如果不指定數軸參數,計算平均值、標準差,會在整個數組上運行,在這個情況下,算術平均值將計算整個數組的平均值,而不考慮行和列,
numpy數組有一個數軸參數,如果我們指定值的話,就可以按某一行或者某一列計算
Numpy的數組中每個元素都是同一個數據類型,這在數值計算和科學計算中是非常有用的,但是不利於我們表達excel中的數據內容,因為excel中每一列的數據一樣,但整體不一樣。
2、pandas二維數組相較於numpy有兩個優點:
1)數據框中的每一列可以是不同的數據類型;
2)類似於pandas一維數組series,Dataframe(數據框)二維數組每一行有一個索引值,每一列也都有一個索引值,這使得pandas數據框很容易做出我們平時的表格數據。
2.1、有序的數據框
2.2、計算平均值:
現在我們傳入的就是有序字典,這樣的字典傳入數據框中,就和我們之前excel的數據順序一致了
對定義好的數據框取平均值,也就是用mean()函數取平均值,計算出的是每一列的平均值,因為每一列都是不同的數據類型,所以pandas這麼做是更合理的。
2.3、查詢:
iloc屬性根據位置查詢值,loc屬性根據索引查詢值。
1)iloc和loc查詢元素
salesDf.iloc[0,1]
salesDf.loc[0,社保卡號]
2)iloc和loc查詢第一行
salesDf.iloc[0,:]
salesDf.loc[0,:] 結果同上
3)iloc和loc獲取第一列
salesDf.iloc[:,0]
salesDf.loc[:,購葯時間] 結果同上
2.4數據框複雜查詢
1)通過傳入列表來查詢數據框中的某幾列:
2)切片功能:指定範圍
3)通過條件判斷篩選複合要求的數據
1.建立查詢條件,,使用loc獲取銷售數量大於1的數據,返回結果是pandas的一維數組series,裡面存放的是布爾類型數值。
2.運用loc屬性時,行名稱的地方傳入的是查詢條件的變數名稱,會根據查詢名稱篩選出符合條件的行
通過這兩步就可以篩選出符合條件的數據
2.5數據集描述統計信息
1)通過pandas的excelfile功能將銷售數據讀入數據框里,然後存放在變數salesDf中,df就表示數據框,這樣我們通過變數名稱就可以看出數據類型
2)列印前5行:head()
3)查看列的數據類型:dtype
4)有多少行,多少列:shape
5)每一列的統計數:describe()
三、數據分析的基本過程:
數據分析步驟:提出問題 - 理解數據 - 數據清洗 - 構建模型 - 數據可視化
1.先定義清楚問題才能夠進行數據分析,數據分析的目標就是為了解決我們生活中的某些問題,明確的問題才能給我們的工作指明正確方向。
2.理解數據,理解數據首先要獲取到數據,數據的來源可以多種多樣,可能在excel中,也可能在web的api介面中,所以我們要將這些數據導入到python的數據結構中,比如讀取excel中的數據到我們的二維數據框中,第三步是查看數據集的信息,包括描述統計信息,也就是從整體上理解數據。
3.對數據進行清洗,也叫數據預處理,我們從外部拿到的數據有時候格式並不是我們想要的也許是數據類型不對,也許是名稱不對,就是把數據變成我們想要的樣子以便於後續的數據探索和分析。
4.構建模型,對於清晰後的數據進行分析,得到我們想要的指標或者結論
5.數據可視化,在建立模型得到結論之後,我們就需要將結果展示給他人
案例分析:
3.1提出問題:
分析朝陽醫院銷售數據指標——月均消費次數、月均消費金額、客單價、消費趨勢
3.2理解數據:
先讀取Excel的數據,在讀取的過程中,我們加入了dtype=object這個參數,意思是會統一按照字元串類型讀取數據,這樣可以保證讀取的數據是正確的。再查看所需要的數據的某些信息,比如數據的行數列數,前5行數據,從而初步理解數據
3.3數據清洗(重要)
1.步驟:選擇子集 - 列名重命名 - 缺失數據處理 - 數據類型轉換 - 數據排序 - 異常值處理
1)選擇子集:原始數據太大有很多是我們不需要的信息,這是就需要選擇其中一部分數據作為分析對象。
2)列表重命名:如果列名不符合我們的使用習慣或者不方便分析時我們需要重命名。
3) 缺失數據處理:由於原始數據有些沒有記錄會造成有些數據是空值,所以需要某些技術來處理這部分數據
4)數據類型的轉換:比如銷售數據是字元串類型,不方便計算,需要轉化成數字類型。
5)數據排序:方便我們發現有價值的東西
6)異常值處理:有些數值太大或太小超過了我們定義的範圍,這時就需要對異常值進行處理3.3.1選擇子集:(只選取需要進行分析的數據,本例中不需要)
從原始數據中選擇子集可以使用切片冒號來進行選擇,使用loc屬性獲取指定範圍。
3.3.2列表重命名:有時候對於從原始中讀取的數據,也許其列名稱不符合我們所需要的,我們需要將其更改
首先需要定義一個字典表明舊列名和新列名的對應關係
3.3.3缺失數據處理:
用dropan方法來刪除缺失值。
原始數據經常會有缺失、錯誤,我們可以刪除數據,或者當缺失數據量過多的時候建立模型進行插值的辦法來補充數據;
在上圖的例子中,我們希望銷售數據和社保卡號不能有缺失值,我們可以用dropna方法來刪除缺失數據;
我們在案例代碼里給函數傳入了兩個參數,一個參數名稱是subset,它是用於存放刪除指定列的列表,另一個參數名稱是how,用於指定如何刪除數據,how=any表示只要在給定的任何一列中有缺失值,那麼就刪除;
在刪除前,數據是6578條,刪除後,數據是6575條,說明3條數據有缺失銷售時間或者社保卡號。
3.3.4數據類型轉換:
數據類型轉換astype()
因為在我們一開始導入數據的時候將所有的列都導入成字元串類型的了,但是『銷售數量』『應收金額』『實收金額』應該是數值類型的。
字元串分割,利用.split()
日期這一列是字元串格式,前面是日期,後面是星期幾,中間以空格分開,在時間的數據處理中我們其實是不需要星期五這樣的內容的,只需要日期值即可,所以我們需要進行字元串分割;
在split中傳入分隔符,就可以按照分隔符進行字元串的分隔;
在案例代碼里,我們傳入的分隔符是一個空格,也就是說字元串中只要遇到空格就會進行拆分,分割後返回的是一個列表的類型,我們可以訪問列表元素獲取我們想要的內容;
由於我們對數據框這一列所有數據進行字元串的分隔,所以我們要先定義一個分割字元串的函數,通過for循環對每個字元串進行分割,返回的是分割後的日期,最後注意將列錶轉行為一維數據Series類型(因為銷售時間這一列是Series數據類型,所以返回的也要是series的一維數組類型)。
字元串轉換為日期
通過to_datetime將字元串轉換為日期,傳入的format是我們原始的日期格式,如果不符合日期的格式,errors=coerce,表示無法解析設為NaT
,或者設為 ignore
忽略錯誤;
轉換後我們需要再運行一遍刪除缺失值的代碼,因為轉換日期的過程中不符合日期格式的值會轉化為空值;
在數據清洗的過程中,數據清洗的幾個步驟不是運行一次就好的,需要根據數據清洗的目的反覆多次。
3.3.5數據排序:
將xx按某種順序排序:sort_values,by按哪幾列排序,ascending=True按升序,False按降序
排序後需要重命名行名,使用reset_index,可以將行號修改成從0到n順序排列的索引值,其中drop = True選項會丟棄原來的索引而設置新的從0開始的索引,這個方法只對DataFrame有用貌似。
3.3.6異常值處理:
3.4構建模型:
數據已經清洗好了,開始構建模型計算我們需要的指標。
業務指標1:月均消費次數=總消費次數/月份數
同一天內,同一個人的所有消費算作是一次消費,比如一天買了兩次葯算作是一次消費,所以在獲取總消費次數時要根據消費時間和社保卡號這兩列來判斷哪些數據是重複的;
求總消費次數:1. 使用drop_duplicates這個函數來刪除重複數據,給這個函數參數名subset的值是一個列表,裡面存放了要刪除重複數據的列的名稱,兩個列里都相同的數值保留一條,並將結果存放在數據框kpi1_Df中;
2. 使用數據框shape屬性就可以得到行數和列數,shape返回的是一個列表的數據類型,我們訪問序號為0的元素,就可以得到這個列表裡面的第一個元素,也就是行數,從而得到總消費次數。
求月份數:
要想知道月份數,先要知道消費時間這一列里的消費時間範圍,也就是時間最早和最晚的消費記錄之差
1.排序後重命名行名
2. 獲取時間範圍,最大時間值需要-1
3. 獲取月份值
總消費次數/月份數
業務指標2:月均消費金額=總消費金額/月份數
實際消費金額對應的是實收金額列,總消費金額就是實收金額的總和
業務指標3:客單價=總消費金額/總消費次數
知識點總結:
推薦閱讀:
※自動駕駛免費數據資源分享
※下一部電影
※當我們從事數據崗位時我們需要會什麼
※選全明星哪家強,機器學習來幫忙
※橘子:我為什麼要學數據分析?|數據分析