该文总结数据分析常用手法,在代码中用注释的形式给出必要的阐述。
需要安装包: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]])
我将在数据分析基本技巧总结-特征工程(二)中总结特征工程相关内容。