資料分析基本技巧及python實現(一)
該文總結資料分析常用手法,在程式碼中用註釋的形式給出必要的闡述。
需要安裝包:numpy、scipy、numpy、pandas、sklearn
檢查資料是否符合某項分佈
檢查資料是否符合正態分佈
#檢查資料是否符合正態分佈
##構建正態分佈資料
In [1]: import numpy as np
In [2]: import scipy.stats as ss
In [3]: norm_dist = ss.norm.rvs(size = 20)
In [4]: norm_dist
Out[4]:
array([ 0.16318349, -0.11471145, -0.03726154 , 0.62188027, 1.05043849,
0.55443073, -0.70993788, 1.46606357, 1.2775174 , -0.94264693,
1.74942391, -0.14927589, -1.11186715, 0.48950293, 0.15857892,
0.03093405, -1.14374045, 1.85279545, -0.43922549, -0.71918081])
#normaltest 函式檢驗資料是否符合正太分佈。
#normaltest 是基於偏度和峰度來檢驗資料是否符合正太分佈的。
In [5]: ss.normaltest (norm_dist)
結果輸出:統計值1.30,p值0.51,大於0.05的顯著性水平。不拒絕原假設(原資料不是正太分佈),資料是正態分佈。
Out[5]: NormaltestResult(statistic=1.309866519334297, pvalue=0.5194767314800961)
卡方檢驗
客戶的婚姻情況對於貸款後是否回款是否有影響?(本例引自:https://blog.csdn.net/kk185800961/article/details/79054968)
原始資料:
我們對資料進行粗分類:
將 “再婚” 歸為 “已婚” ,“初婚” 歸為 “未婚” 。“再婚”、“初婚” 、“復婚” 劃分為“已婚”。
##卡方檢驗
In [7]: ss.chi2_contingency([[1923,3384,194],[2201,7906,377]])
Out[7]: #分別得到檢驗統計量,P值,自由度,理論分佈
(371.3275753015588,
2.329386391805816e-81,
2,
array([[1419.21326243, 3885.28558023, 196.50115734],
[2704.78673757, 7404.71441977, 374.49884266]]))
根據卡方檢驗的p值可以看出,該值遠小於0.05的顯著性水平,拒絕原假設(還款情況與婚姻狀況無關),我們認為,還款情況是與婚姻狀況有關的。
方差分析
方差分析 (ANOVA) 檢驗“兩個或多個總體的均值都相等”這一假設。方差分析通過比較不同因子水平下的響應變數均值來評估一個或多個因子的重要性。原假設聲稱所有總體均值(因子水平均值)都相等,而備擇假設聲稱至少有一個存在差異。
要執行方差分析,必須具有連續的響應變數
,並且至少有一個類別因子具有兩個或更多水平。
方差分析要求資料來自近擬正態分佈
的總體,並且因子水平之間的方差相等
。但是,方差分析過程即使在違背正態性假設的情況下也非常有效
,除非一個或多個分佈高度傾斜或方差差異顯著。原始資料集的變換可能會糾正這些違規情況。
一種工業產品的產量或質量往受到許多因素的影響。例如,電池的壽命與生產工藝、原材料、工人操作技術和工廠管理水平等有關。任何一個因素的改變都可能對電池的壽命產生一定影響。為了提高經濟效益, 需要分析各種因素對電池壽命的影響如何?哪些因素是重要的、哪些是次要的,從而找出一種最佳的生產條件(即各因素最佳的配置),以達到好的經濟效益。
單因素方差分析
在問題中,只考慮一個對指標有影響的因素A。將其他的因素都固定下來,只讓A發生變化,以觀察他對指標的影響。
例子1:
一工廠用三種不同的工藝生產某型別電池。從各種工藝生產的電池中分別抽取樣本並測得樣本的壽命(使用時間)如下:(單位:小時)
工藝1 40 46 38 42 44
工藝2 26 34 30 28 32
工藝3 39 40 43 48 50
我們感興趣的指標是電池的壽命,而把“工藝”
作為對它可能影響的“因素”。這個因素有3 個水平:工藝1 是水平1,等等。
這裡涉及到兩項假定:正態分佈和均方差。
在每一種工藝下的電池壽命服從正態分佈。
而每一種工藝生產的方差體現了隨機誤差的大小,即假定了隨機誤差的大小與是那種工藝無關。
相關文件參閱我的GitHub。
方差齊性檢驗
檢驗兩組值的均值是否有較大差異性
不要求樣本容量一致
公式如圖:
#我們用兩組正態分佈的數值進行比較,pvalue>0.05 表明我們可以接受原假設,兩組資料均值不存在較大差異性。
In [8]: ss.ttest_ind(ss.norm.rvs(size = 10),ss.norm.rvs(size = 20))
Out[8]: Ttest_indResult(statistic=-0.4633109775875121, pvalue=0.6467227303536176)
對於例子1
來說 ,把“無優劣之分”作為原假設。通過程式碼檢驗原假設如下:
In [15]: ss.f_oneway([40,46,38,42,44],[26,34,30,28,32],[39,40,43,48,50])
Out[15]: F_onewayResult(statistic=19.77011494252872, pvalue=0.0001592976497929869)
我們看到pvalue 遠小於顯著性水平 0.05拒絕原假設,說明工藝對電池的壽命有影響。
QQ圖
對比某項資料是否符合某已知分佈
其原理 是利用分位數與已知分佈的對應分位數是否接近(主要是正態分佈)
In [16]: from statsmodels.graphics.api import qqplot
...: from matplotlib import pyplot as plt
...: tmp = qqplot(ss.norm.rvs(size= 20))
...: plt.show()
...:
相關係數
In [17]: import pandas as pd
...: s1 = pd.Series([0.1,0.3,0.5,1,0.4,0.6,0.9])
...: s2 = pd.Series([0.7,0.6,0.5,0.6,0.4,1.6,0.9])
...: s1.corr(s2,method='pearson')
...:
...:
Out[17]: 0.19684022528605513
迴歸
#構建十個陣列,每個陣列中間為一個float
In [19]: x = np.arange(10).astype(np.float).reshape(10,1)#十個陣列
#構建迴歸函式
...: y = x*3+4+np.random.random((10,1))#新增噪聲
In [20]: x
Out[20]:
array([[0.],
[1.],
[2.],
[3.],
[4.],
[5.],
[6.],
[7.],
[8.],
[9.]])
In [21]: y
Out[21]:
array([[ 4.62340609],
[ 7.12315872],
[10.46492325],
[13.42892489],
[16.75365368],
[19.65438393],
[22.15797004],
[25.66810073],
[28.8041721 ],
[31.3239199 ]])
In [22]: from sklearn.linear_model import LinearRegression
In [23]: reg = LinearRegression()
In [24]: res = reg.fit(x,y)
In [25]: y_pred = reg.predict(x)
#預測值
In [26]: y_pred
Out[26]:
array([[ 4.44093031],
[ 7.45411498],
[10.46729965],
[13.48048432],
[16.493669 ],
[19.50685367],
[22.52003834],
[25.53322302],
[28.54640769],
[31.55959236]])
#引數
In [27]: reg.coef_
Out[27]: array([[3.01318467]])
#截距
In [28]: reg.intercept_
Out[28]: array([4.44093031])
PCA降維
#構建資料
data = np.array([np.array([2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1]),
np.array([2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9])]).T
from sklearn.decomposition import PCA
#設定維數
lower_dim = PCA(n_components=1)
#擬合數據
lower_dim.fit(data)
Out[29]:
PCA(copy=True, iterated_power='auto', n_components=1, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
#降維後資訊儲存率
In [30]: lower_dim.explained_variance_ratio_
Out[30]: array([0.96318131])
#獲得轉換後的數值
In [32]: lower_dim.fit_transform(data)
Out[32]:
array([[-0.82797019],
[ 1.77758033],
[-0.99219749],
[-0.27421042],
[-1.67580142],
[-0.9129491 ],
[ 0.09910944],
[ 1.14457216],
[ 0.43804614],
[ 1.22382056]])
我將在資料分析基本技巧總結-特徵工程(二)中總結特徵工程相關內容。