使用python進行數據分析
1.數據分析步驟
數據分析五個步驟
提出問題
提出一個好問題,是成功的一半。面對一堆數據,同樣也需要提出問題,這樣才能為後面的具體步驟找到方向和側重點。
如某遊戲公司想找一位明星為其新開發的遊戲進行代言。明星那麼多,如何才能話最少的錢,起到最大的宣傳的效果呢?問題一旦提出來,就會從明星擁有粉絲的數量,最近的活躍度,明星的代言大概價位這個方面進行重點分析。
理解數據
包括三個方面:第一,採集數據。從定義的問題開始,採集相關的數據。第二,導入數據。要分析的數據會存儲資料庫或者excel文件中,也有可能在web的api的介面中。第三,查看數據集信息。包括數據統計信息。對數據整理理解,會數據分析建立一個宏觀的認識。
數據清洗
數據清洗,也成數據預處理。因為數據在採集或存儲過程中,有些數據不符合要求,不方面的後續的處理。因此需要對數據進行處理,變成能夠被我們使用的格式。
構建模型
構建模型,也就是數學建模。根據問題難易程度,那麼建模也有差異。簡單的數據,如果一個餐館一年的消費總金額,客單價,月均收入等。還有一些複雜的,需要利用機器學習,進行數據建模。
數據可視化
數據的分析,一定會有數據分析報告。我們既要會做,也要會說。為了更好的表達自己,那麼展示的自己的成果的方式就是圖標。通過可視化的方式,把自己的成果展示給自己的領導或客戶看。
2. 要點總結
數據分析我們會用到numpy和pandas相關的庫。對其中核心的要點總結如下
numpy
- ndarray 是一個通用的同構數據多維容器,也就是說,其中的所有元素必須是相同的類型。每個數組都有一個shape(一個表示各維度大小的元組)和一個dtype(一個用於說明數組數據類型的對象)。
- 認為np.empty會返回全0數組的想法是不安全的。如下述例子
- 跟列表最重要的一個區別就是數組切片是原始數組的視圖,意味數據不會被賦值,視圖上的任何修改都反應到源數組上。但是需要注意,切片的數組,其地址並不是和說原數組的地址一樣。
- 花式索引。可以整數數組的方式進行索引。索引值可以整數數組列表或ndarray。使用負數,可以從尾部進行索引數組每行數組。但是返回的是一維數組,對應每個索引元組。
- 使用np.ix_函數,也可以將兩個一維整數數組轉換為一個用於選取方形區域的索引器。花式索引跟切片不一樣,它總是將數據複製到新數組中。
- 轉置和軸對換。 轉置是重塑的一種特殊形式,它返回的是源數據的視圖(不會進行任何複製操作)。數組不僅有transpose方法,還有一個特殊的T屬性。對於高維數組,transpose需要得到一個由軸編號組成的元組才能對這些軸進行轉置。
- 通用函數(即ufunc)是一種對ndarray 中的數據執行元素級運算的函數。你可以將其看做簡單函數(接受一個或多個標量值,併產生一個或多個標量值)的矢量化包裝器。
許多ufunc是簡單的元素級變體,如sqrt,exp
- 一些函數,如rint,四捨五入取最近的整數。modf,將數組的小數和整數部分分成兩個獨立數組。
- NumPy 數組使你可以將許多種數據處理任務表述為簡潔的數組表達式。用數組表達式代替循環的做法,通常稱為矢量化。矢量化數組運算要比等價的純python方式快上一兩個數量級,尤其是各種數值計算。
- numpy.where函數是三元表達式x if condition else y 的矢量化版本。np.where 的第二個和第三個參數不必是數組,它們都可以標量值。在數據分析工作中,where通常用於根據另一個數組而產生一個新的數組。
- 布爾值會被強制轉換為1(True)和0(False)。因此,sum可以用來對布爾型數組中的True 值進行計數。
- 布爾數組還有兩個方法any,all,它們對布爾型數組非常有用。any用於測試數組中是否存在一個或多個True,而all則檢查數組中所有值是否都是True
- 跟python 內置的列表類型一樣,Numpy數組也可以通過sort 方法就地排序。頂級方法np.sort返回的是數組已排序副本,而就地排序則會修改數組本身。計算數組分位數最簡單的辦法是對其進行排序,然後選取特定位置的值。
- Numpy 提供了一些針對一維ndarray 的基本集合運算。最常用的可能要數np.unique。它用於找出數組中的唯一值並返回已排序的結果。
- np.in1d用於測試一個數組中的值在另個一個數組中的成員資格,返回一個布爾型數組。
- np.save 和np.load是讀寫磁碟數組數據的兩個主要函數,默認情況下,數組是以未壓縮的原始二進位格式保存在擴展名為.npy的文件中。
- 通過np.savez可以將多個數組保存到一個壓縮文件中,將數組以關鍵字參數的形式傳入即可。
- dot函數,用於實現矩陣的點積。任何一個二維矩陣和一個合適的一維數組進行點積,得到是一個一維數組。x。dot(y) = np.dot(x,y)
- 矩陣論中,行列式,本徵值,本徵向量,矩陣的逆,QR分解,奇異值分解,最小二乘解,線性方程求解,需要再複習
- 隨機數生成。numpy.random模塊對python 內置random進行補充,可以生成多種概率分布的樣本值函數。用normal 得到一個標準正太分布。而python的random函數只能一次只能生產一個。
pandas
- Series, DataFrame,是pandas兩種常用的數據類型;
- Series 類似於一維數組的對象,數據類型包含numpy的數據類型,以及與之相對的數據標籤構成
- 將Series 看成是一個定長的有序字典,因為他是索引值到數據值的一個映射。它可以用在許多原本需要字典參數的函數中。可以將數據存放在一個python的字典中,也可以直接通過這個字典來創建Series。
- pandas 中有函數isnull,notnull 用於判斷數組中數據是否為空,可以用於檢測缺失數據。
- Series最重要的功能在算術運算中將不同索引的數據進行自動對齊。
- series 數組進行加法運算,兩個數組都有的數據,那麼會對裡面的數據進行加法運算。沒有的數據,會進行集合運算,但是對應的數據是NAN。
- Series 對象本身及其索引都一個name的屬性。該屬性跟pandas其它的關鍵功能關係非常密切。
- Series 的索引可以通過賦值來進行就地修改。
- DataFrame是一個表格型數據結構,它含有一組有序的列,每列可以是不同的值類型。既有行索引,也有列索引,它可以被看做是Series 組成的字典。DataFrame 中面向行和面向列的操作基本上是平衡的。
- DataFrame列用 columns,index 用於行索引
- 對DataFrame 的數據進行修改時,必須保證列表或數字和DataFrame的長度相匹配。
- 如果用Series進行賦值,就會精確匹配DataFrame的索引,所有的空位都將被填上缺失值。
- DataFrame常見的數據形式是嵌套字典,就是字典中中的字典。對應的DataFrame,鍵的外層對是DataFrame的列,內層對應的是DataFrame的行索引。
- 如果有讀取execl 文件,需要裝載 xlrd 或openpyxl 安裝包
3.遇到的問題
- 數據清洗時,出現告錯
當時出現這個告警時,一直沒有找到原因。『銷售時間』,本來的數據是string,怎麼會變成float的呢?打開數據表格,發現『銷售時間』這一列空的數據。而python中,空的數據是用NaN表示。NaN 和None 型是有差別的。差別如下
NaN型,對應的float的數據格式,所以他不具有split()這個方法。
因此需要『銷售時間』這一列數據進行清洗,把含有NaN的數據項清除出去。因此在前面執行如下命令行
salesDf=salesDf.dropna(subset=[ ],how=any)
在dropna的函數中,sunset 設定為空集。以為不指定,表示對所有範圍進行清除。但是實際執行時,如果為空,表示不執行數據集任何為空的行。因此需要重新制定,才能被正確清除。正確的代碼如下:
salesDf=salesDf.dropna(subset=[銷售時間,社保卡號],how=any)
。執行的上述,後面的告警才正式消除。
- 數據索引的方式
DataFram 的數據進行索引時,經常使用loc的屬性。加入要索引某列,使用的代碼如下
data1.loc[:,列號索引]。而在實際應用中,如果寫成data1[列號索引],是否有問題?
實際應用中,沒有發現問題。而且通過id函數,發現這個兩個指向是一個內存單元,可以理解為這兩種索引方式是等價。
如下:
4.總結
本次主要學習《利用python進行數據分析》的知識學習。書中有對numpy,pandas,還有文件的讀寫進行初步講解。由於主要進行基礎性入門的講解,對這兩種數據格式有一個初步了解,對文件的操作,有一個大概認識。而要加深了解,還需要持續的學習和實踐。
學習一個東西真的有難度,可能剛開始有一腔熱血,但是能夠在長期的枯燥中,還能不停的進步,不停的學習,這個才是難的。但是,也正是這樣,人與人之間才能拉開距離。希望自己的通過不停的闖關,不停的進步,成為真正入門人工智慧的人。或許因為是人工智慧魅力,吸引著我往前走。
推薦閱讀:
※Kaggle數據分析——Titanic
※霍金已逝,這些物理學家也慢慢被淡忘了
※帆軟2017百城巡展啟動在即,力掀數據化管理之風
※2017年3D列印行業大數據報告,3D列印品牌數據分析
※吉利帝豪GS--車主洞察研究