數據分析基本過程
在數據分析中,用到最多的包就是numpy、pandas和matplotlib。
其中numpy是用於數學計算,比如線性代數中的矩陣計算,在機器學習中非常有用;
pandas包是基於numpy的數據分析工具,該工具是為了解決數據分析任務而創建的,他提供了一種名為數據框的數據結構,可以方便地對錶結構的數據進行分析;
matplotlib包是一個圖形繪製庫,專門用於數據分析結構的可視化。
一維數據分析
一維數據在numpy中由array表示,在pandas中由series表示,pandas中的series比numpy數組中的功能更多,pandas的series是建立在numpy的array基礎上的,所以在使用series之前,先了解numpy。
定義一維數組可以使用numpy的array方法來創建,把數據放在列表中,通過傳參數的方法傳給array方法。
numpy一維數據結構:
#導入包import pandas as pdimport numpy as np#定義:一維數組arraya = np.array([2,3,4,5])#通過訪問數組下標查詢元素a[0] #2#切片訪問a[1:3] #[3,4,5]#查看數據類型a.dtype #dtype(int32)#查看平均值a.mean() #3.5#查看標準差a.std() #1.1180339887498949#向量化計算b=np.array([2,3,4])c=b*4c #array([ 8, 12, 16])
numpy一維數組與列表的區別:
1.具有統計功能
平均值mean(),標準差std()
2.向量化計算
1)向量相加
2)乘以標量
3)numpy中的數組中的每個元素都必須是同一種數據類型,列表中可以是不同的數據類型
pandas一維數據結構:
series和array的區別是:series有索引,我們可以在定義時使用index指定這個索引,指定索引後我們可以通過索引名稱來訪問元素。
定義好一維數組之後,我們可以使用describe方法來獲取數組的描述統計信息,其中包括一維數組裡有多少個元素,平均值、標準差,以及四分位。
獲取一維數組裡的元素可以通過iloc屬性,或者loc屬性。圖中我們通過loc屬性傳入索引值騰訊,就可以獲取到索引值對應的元素,也就是騰訊對應的股價。
一維數組series也支持向量運算,兩個向量相加是根據索引值相同來相加的,如果出現nan值,就是兩個向量中的索引值不相同,沒法相加。
#定義:一維數據seriesstockS=pd.Series([54.74,190.9,173.14,1050.3,181.86,1139.49], index=[騰訊,阿里巴巴,蘋果,谷歌,Facebook,亞馬遜])#獲取描述統計信息stockS.describe()count 6.000000mean 465.071667std 491.183757min 54.74000025% 175.32000050% 186.38000075% 835.450000max 1139.490000dtype: float64#iloc屬性用於根據位置獲取值stockS.iloc[0] #54.740000000000002#loc屬性用於根據索引獲取值stockS.loc[騰訊] #54.740000000000002#向量化運算:向量相加s1=pd.Series([1,2,3,4],index=[a,b,c,d])s2=pd.Series([10,20,30,40],index=[a,b,e,f])s3=s1+s2s3a 11.0b 22.0c NaNd NaNe NaNf NaNdtype: float64#方法1:將缺失值進行填充s3=s1.add(s2,fill_value=0)s3a 11.0b 22.0c 3.0d 4.0e 30.0f 40.0dtype: float64#方法2:刪除缺失值s3.dropna()a 11.0b 22.0dtype: float64
二維數據分析:
在Numpy(Numerical Python)中使用array來創建二維數組,在Pandas中使用dataframe中來創建,一般更習慣於用dataframe來創建,因為它有額外的功能,處理二維表格也更方便。
在numpy中創建一維數組和二維數組的不同之處在於:
二維數組每一行都是一個列表代表一行,各行之間是各個列表,列表間用逗號隔開代表每一行,圖中創建了一個三行四列的二維數組,所以傳入了三個列表,每個列表有四個元素。
#導入包import numpy as npimport pandas as pd#定義二維數組a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
二維數組中的行號和列號都是從0開始的,查詢分為三種情況:
- 查詢數組中的某個元素;
- 查詢某一行的元素,先指定行號,然後指定列號(使用切片功能,切片功能使用冒號,通過冒號前後的數字來指定切片的範圍,如果不填寫數字,表示獲取所有的列值);
- 查詢某一列的元素,先指定行號(使用切片功能),然後指定列號。
1)查詢元素
a[0,2] #變數名[行號,列號]
2)獲取第一行
a[0,:]
3)獲取第一列
a[:,0]
4)numpy數軸參數
numpy的二維數組如果不指定數軸參數,就會計算平均值、標準差,會在整個數組上運行,在這個情況下,算術平均值將計算整個數組的平均值,而不考慮行和列
numpy數組有一個數軸參數,如果我們指定值的話,就可以按某一行或者某一列計算
#按軸計算:axis=1計算每一行a.mean(axis=1)#array([ 2.5, 6.5, 10.5])a.mean()#6.5
numpy的數組中每個元素都是同一個數據類型,這在數值計算和科學計算中是非常有用的,但是不利於我們表達excel中的數據內容,因為excel中每一列的數據一樣,但整體不一樣
pandas二維數組相較於numpy有兩個優點:
1.數據框中的每一列可以是不同的數據類型;
2.類似於pandas一維數組series,dataframe(數據框)二維數組每一行有一個索引值,每一列也都有一個索引值,這使得pandas數據框很容易做出我們平時的表格數據
一般情況下,先定義一個字典,用戶存放二維表格中的數據,然後定義資料庫,傳入字典參數
但是列印出來的我們定義的數據框和之前定義的字典里的列名順序是不一致的,因為我們給數據框傳入的字典是一個無序的數據結構
以下是更加標準的流程:
1.有序的數據框
2.平均值計算
現在我們傳入的就是有序字典,這樣的字典傳入數據框中,就和我們之前excel的數據順序一致了
對定義好的數據框取平均值,也就是用mean()函數取平均值,計算出的是每一列的平均值,因為每一列都是不同的數據類型,所以pandas這麼做是更合理的
查詢:
iloc屬性和loc屬性:
iloc根據位置查詢,loc可以根據屬性值來查詢數據框中任何屬性的數據,沒有建立行名稱的行名就是行號,一般情況下都是使用的loc來查詢
1.1 iloc查詢元素:
salesDf.iloc[0,1]
1.2 loc查詢元素:
salesDf.loc[0,社保卡號]
2.1 iloc獲取第一行:
salesDf.iloc[0,:]購葯時間 2018-01-01 星期五社保卡號 001616528商品編碼 236701商品名稱 強力VC銀翹片銷售數量 6應收金額 82.8實收金額 69Name: 0, dtype: object
2.2 loc獲取第一行:
salesDf.loc[0,:]#結果同上
3.1 iloc獲取第一列:
salesDf.iloc[:,0]0 2018-01-01 星期五1 2018-01-02 星期六2 2018-01-06 星期三Name: 購葯時間, dtype: object
3.2 loc獲取第一列:
salesDf.loc[:,購葯時間]0 2018-01-01 星期五1 2018-01-02 星期六2 2018-01-06 星期三Name: 購葯時間, dtype: object
我們還可以通過一個列表來查詢數據框中的某幾列
還可以通過切片功能,通過冒號來指定範圍來獲取元素,案例里給定列名稱的地方我們傳入的是切片範圍,也就是列名稱的範圍
1)查詢某幾列:
salesDf[[商品名稱,銷售數量]]
2)切片功能:指定範圍
salesDf.loc[:,[商品名稱,銷售數量]]
通過條件判斷篩選:
1)通過loc獲取銷售數量大於1的數據,返回結果是pandas的一維數組series,裡面存放的是布爾類型數值
2)運用loc屬性時,行名稱的地方傳入的是查詢條件的變數名稱,會根據查詢名稱篩選出符合條件的行
通過這兩步就可以篩選出符合條件的結果
#構建查詢條件querySer=salesDf.loc[:,銷售數量]>1type(querySer) #pandas.core.series.SeriesquerySer
#應用查詢條件salesDf.loc[querySer,:]
數據集描述統計信息
- 通過pandas的excelfile功能將銷售數據讀入數據框里,然後存放在變數salesDf中,df就表示數據框,這樣我們通過變數名稱就可以看出數據類型
- 列印前5行,看看數據框的數據長什麼樣子
- 通過dtype方法查看某一列的數據類型
1)讀取Excel數據
2)列印前五行:salesDf.head()
3)查看某一列的數據類型
4)查看數據集有多少行和列
5)獲取數據集的描述統計信息:salesDf.describe()
數據分析案例
數據分析步驟:提出問題 - 理解數據 - 數據清洗 - 構建模型 - 數據可視化
1.先定義清楚問題才能夠進行數據分析,明確的問題為數據分析提供了方向和目標
2.是理解數據,分為三步:採集數據,要根據我們定義的問題來採集數據,第二步要導入數據,我們的數據可能在excel中,也可能在外部的api介面中,所以我們要將這些數據導入到python的數據結構中,比如讀取excel中的數據到我們的二維數據框中,第三步是查看數據集的信息,包括描述統計信息,也就是從整體上理解數據
3.對數據進行清洗,也叫數據預處理,就是把數據變成我們想要的樣子以便於後續的數據探索和分析
4.構建模型,也就是對清洗後的數據進行分析、加工,簡單的分析就是得出一些業務指標,複雜的分析就是要用到機器學習的演算法來訓練模型
5.數據可視化,與他人交流研究成果的最好方式就是圖表
一、提出問題:
分析朝陽醫院銷售數據指標——月均消費次數、月均消費金額、客單價、消費趨勢
二、理解數據:
在解決問題之前,要看下數據集的基本信息,也就是從總體上理解數據,我們先用pandas的excelfile方法把excel數據讀取到數據框中,在讀取的過程中,我們加入了dtype=object這個參數,意思是會統一按照字元串類型讀取數據,這樣可以保證讀取的數據是正確的
2)列印前幾行以保證數據正確讀取了,並查看讀取的數據到底什麼樣,有哪些欄位信息以了解欄位的特點,在這份數據中我們可以看到有7個欄位,6578行數據
import pandas as pdfileNameStr=./朝陽醫院2018年銷售數據.xlsxxls = pd.ExcelFile(fileNameStr,dtype=object)salesDf = xls.parse(Sheet1,dtype=object)salesDf.head()
salesDf.dtypes
salesDf.shape#(6578, 7)
三、數據清洗(很重要):
步驟:選擇子集 - 列名重命名 - 缺失數據處理 - 數據類型轉換 - 數據排序 - 異常值處理
1.導入的數據中有很多列,其中只有部分是我們所需要的,這時需要選擇子集來選擇我們研究的對象
2.如果列名不符合我們的使用習慣或者不方便分析時我們需要重命名
3.由於原始數據有些沒有記錄會造成有些數據是空值,所以需要某些技術來處理這部分數據
4.比如銷售數據是字元串類型,不方便計算,需要轉化成數字類型
5.數據排序方便我們發現有價值的東西
6.有些數值太大或太小超過了我們定義的範圍,這時就需要對異常值進行處理
(一)選擇子集(本例中不需要)
(二)列名重命名
推薦閱讀:
※數據分析、數據挖掘和機器學習共享
※2018年一定要收藏的20款免費預測分析軟體!
※R語言起步--excel透視表功能實現
※就是它了-結合自己興趣與事業發展的新方向
TAG:數據分析 |