多因子分析与复合分析
探索属性和属性之间的联系,分析属性和属性之间联系的分析方法
假设检验
根据一定的假设条件,从样本推断总体,或者推断样本与样本之间关系。作出一个假设,然后根据数据,或者根据已知的分布性质来推断这个假设成立的概率有多大
方法:
建立原假设H0,H0的反命题H1(备择假设)在假设检验中,常常把这个假设和一个已知的分布关联起来,这样原假设为符合该分布,备择假设为不符合该分布
选择检验统计量 这个检验统计量是根据数据的像均值、方差等性质构造的一个转换函数,构造这个函数的目的,是让这个数据符合一个已知的分布比较容易解决的格式,比如把一些数据减去均值在除以标准差,判断转换后的统计量是否符合标准正态分布,即可以判断数据分布是否是正太分布的概率了
根据显著性水平(一般用α表示)(一般为0.05)确定拒绝域 显著性水平表示可以接受假设的失真程度的最大限度,显著性水平和相似度的和为1,比如我们确定了某数据属性有95%的可能性是某个分布,那么它的显著性水平就是5%,显著性水平一般是人为定的一个值,这个值定得越低,那么相当于对数据和分布的契合程度的要求就越高(意思就是数据就越符合某个分布),一旦确定了显著性水平,那么在分布上就可以画出一段这个数据与分布相似性比较高的区域,叫做接受域,接受域以外的区域就是拒绝域,如果检验统计量落入了拒绝域,那么H0就可以认为是假的
计算p值或者样本统计值,做出判断 就是根据计算的统计量和我们要比较的分布进行判断,判断的思路有两种 ① 根据区间估计的方法,计算一个检验统计量的分布区间,看这个区间是是不是包含了我们要比较的分布的特征。 ② 计算一个p值,直接和显著性水平进行比较,这个p值,可以理解成比我们计算出来的检验统计量结果更差的概率,如果p值小于α,那么这个假设就可以认为是假的
t分布检验常用来比较两组样本分布是否一致,如临床医疗上药物有没有效果。f检验常常用在方差分析(独立t分布检验:检验两组值的均值是否有比较大的差异性)
栗子–假设检验值μ检验法:
题:某个洗衣粉制造厂的历史数据得到,洗衣粉制造机器制造出的洗衣粉的标准重量均值为500g, 标准差为2g,现在有一台洗衣粉制造机,对其生产的洗衣粉进行抽样为上面7个数据,问该机器是否符合该洗衣粉制造厂的要求?
每个指标的误差为sqrt(std**2/n)
检验统计量 = (1.8+2.4-1+0.3+4.5-1.8+5.6)/sqrt(4/7)/7 就是在2.23σ
这时往两边取的概率加起来就是0.026,也就是p值为0.026 < 0.05 ,所以不行
卡方检验
常用来检验两个因素之间有没有比较强的联系
此处想看一下,化妆这个行为和性别有没有关系
求出来的卡方值为129.3对应表中的值129.3 > 3.841,所以拒绝原假设,性别与化妆是有比较强的关系的。
方差检验(f分布)
想知道多个东西之间的对应数值是不是有差别,如此处想看每个电池寿命的平均值是否有差别
独立t分布检验
t分布检验常用来比较两组样本分布是否一致,如临床医疗上药物有没有效果。f检验常常用在方差分析(独立t分布检验:检验两组值的均值是否有比较大的差异性)
百度的一段话:t检验过程,是对两样本均数(mean)差别的显著性进行检验。惟t检验须知道两个总体的方差(Variances)是否相等;t检验值的计算会因方差是否相等而有所不同。也就是说,t检验须视乎方差齐性(Equality of Variances)结果。
相关系数
相关系数是衡量两组数据,两组样本的分布趋势,变化趋势一致性程度的因子,相关系数分为正相关,负相关,不相关。相关系数越大越接近1,二者的变化趋势越正向同步,相关系数越小,越接近-1,二者变化跟接近于反向同步,相关系数越趋近于0,二者认为是没什么相关关系的
Spearman相关系数用于相对比较的情况下比较适合,因为其只和数值在序列中的排名有关系,而和数值的大小没有关系
线性回归
回归的定义:回归是两种或两种以上变量之间相互依赖的定量关系的一种方法
线性回归:线性回归最常见的解法就是最小二乘法
最小二乘法:其的本质就是最小化误差的平方的方法。
公式:
↓度量线性回归效果的两个指标:决定系数、残差不相关(R²越接近1,拟合效果越好,越接近0,回归效果就越差)(DW的范围是 0 < DW < 4,DW=2表示残差不相关,接近于4表示残差正相关,接近于0表示残差负相关,DW越接近于2越好)
主成分分析
一个数据表可以看成一个空间、矩阵,把每个属性当做由这张表构成整个空间的一个维度,没行的实体就代表这个空间中的一个向量。对于维度,是有主要和次要之分的,如果通过某个维度不能把几个对象区分开来。
疑问ing(更为灵活的,可以通过正交变换,将一组可能存在相关性的变量转化为一组线性不相关的变量,在这个转化后的新的维度上有的尺度被拉伸,有的尺度被收缩,取尺度比较大的成分为主成分—线性代数?????暂时不懂耶)
作用:主成分分析最重要的作用就是降低维度,比如一张表有很tm多列,但有一些是没有必要的,就把主成分提取出来,以尽可能少的失真,减少了工作量,使得后续的分析更快速简单。
上面这个标黄的兄弟就是主成分的定义
除了PCA之外,奇异值降解也是一种常用的线性降维与成分提取的思路,它也可以简单的认为是一种PCA的方法,
实操:
import numpy as np
import pandas as pd
import scipy.stats as ss
norm_dist = ss.norm.rvs(size=20) # 生成20个符合正太分布的数
norm_dist
Out[5]:
array([-1.21025163, -0.89306484, 0.6896318 , 0.68585521, 0.89620911,
-0.00586108, 1.21578697, -0.28039375, -1.28860528, 1.15958839,
-0.33549066, -0.3010338 , 0.60410362, 1.13552601, -1.54899299,
-0.65347036, -1.14050622, -0.13727325, 0.59398519, -0.26795322])
ss.normaltest(norm_dist) # 检测这个数组是否符合正太分布
Out[6]: NormaltestResult(statistic=3.292636559115329, pvalue=0.1927582859186863)
# 上面的结果统计值是 3.2,p值是0.19,p值0.19是大于0.05的,所以符合
# 此处的normaltest()方法是使用基于偏度和峰度的正态分布检验方法
ss.chi2_contingency([[15, 95], [85, 5]])
Out[9]:
(126.08080808080808, 2.9521414005078985e-29, 1, array([[55., 55.],
[45., 45.]]))
# 使用卡方检验 获得返回值 1.检验统计量x² 2.p值 3.自由度 4.理论分布
ss.ttest_ind(ss.norm.rvs(size=10), ss.norm.rvs(size=20)) # 使用独立t分布检验两个属性之间均值的差异性
Out[11]: Ttest_indResult(statistic=-0.8746245008046779, pvalue=0.38921893158897236)
# 此处p值 0.38 > 0.05 两者的均值是没有差别的方法
ss.f_oneway([[49, 50, 39, 40, 43], [28, 32, 30, 26, 34], [38, 40, 45, 42, 48]]) # 方差检验
D:\Anaconda_file\lib\site-packages\scipy\stats\stats.py:2931: RuntimeWarning: invalid value encountered in true_divide
msb = ssbn / float(dfbn)
Out[13]: F_onewayResult(statistic=array([nan, nan, nan, nan, nan]), pvalue=array([nan, nan, nan, nan, nan]))
ss.f_oneway([49, 50, 39, 40, 43], [28, 32, 30, 26, 34], [38, 40, 45, 42, 48]) # 方差检验
Out[14]: F_onewayResult(statistic=17.619417475728156, pvalue=0.0002687153079821641)
# F = 17.6, p = 0.00029
'''除了通过假设检验的方法,还可以通过qq图来对比一个分布是不是符合一个已知的分布的
比如我们得到了一个分布,可以找到它的分位数,对应的分位数找到正态分布的分位数,横轴是正态分布的分位数的值,
纵轴是已知分布的值,这样就可以得到一条曲线或者得到一个散点图,如果这条曲线或者散点的分布重合于y = x这条直线,
那么就是符合分布的'''
Out[16]: '除了通过假设检验的方法,还可以通过qq图来对比一个分布是不是符合一个已知的分布的\n比如我们得到了一个分布,可以找到它的分位数,对应的分位数找到正态分布的分位数,横轴是正态分布的分位数的值,\n纵轴是已知分布的值,这样就可以得到一条曲线或者得到一个散点图,如果这条曲线或者散点的分布重合于y = x这条直线,\n那么就是符合分布的'
from statsmodels.graphics.api import qqplot
from matplotlib import pyplot as plt
plt.show(qqplot(ss.norm.rvs(size=100)))

s1 = pd.Series([0.1, 0.2, 1.1, 2.4, 1.3, 0.3, 0.5])
s2 = pd.Series([0.5, 0.4, 1.2, 2.5, 1.1, 0.7, 0.1])
s1.corr(s2) # 相关系数
Out[22]: 0.9333729600465923
s1.corr(s2, method='spearman') # 默认是pearson相关系数, 此处指定spearman先关系数
Out[23]: 0.7142857142857144
df = pd.DataFrame([s1, s2])
df.corr()
Out[25]:
0 1 2 3 4 5 6
0 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0
1 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0
2 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0
3 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0
4 -1.0 -1.0 -1.0 -1.0 1.0 -1.0 1.0
5 1.0 1.0 1.0 1.0 -1.0 1.0 -1.0
6 -1.0 -1.0 -1.0 -1.0 1.0 -1.0 1.0
df
Out[26]:
0 1 2 3 4 5 6
0 0.1 0.2 1.1 2.4 1.3 0.3 0.5
1 0.5 0.4 1.2 2.5 1.1 0.7 0.1
df = pd.DataFrame(np.array([s1, s2]).T)
df
Out[28]:
0 1
0 0.1 0.5
1 0.2 0.4
2 1.1 1.2
3 2.4 2.5
4 1.3 1.1
5 0.3 0.7
6 0.5 0.1
df.corr()
Out[29]:
0 1
0 1.000000 0.933373
1 0.933373 1.000000
x = np.arange(10).astype(np.float).reshape((10, 1))
y = x*3 + 4 + np.random.random((10, 1))
# + np.random.random((10, 1)) 加噪声
x
Out[33]:
array([[0.],
[1.],
[2.],
[3.],
[4.],
[5.],
[6.],
[7.],
[8.],
[9.]])
y
Out[34]:
array([[ 4.87509605],
[ 7.60761047],
[10.50227683],
[13.04560387],
[16.75142136],
[19.08913619],
[22.19606296],
[25.80885009],
[28.7128933 ],
[31.68337722]])
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
res = reg.fit(x, y)
y_pred = reg.predict(x)
y_pred
Out[39]:
array([[ 4.51813823],
[ 7.52015925],
[10.52218028],
[13.5242013 ],
[16.52622232],
[19.52824335],
[22.53026437],
[25.53228539],
[28.53430641],
[31.53632744]])
reg.coef_ # 参数
Out[40]: array([[3.00202102]])
reg.intercept_ # 截距
Out[41]: array([4.51813823])
# 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
# PCA的另一种常用方法
from sklearn.decomposition import PCA
lower_dim = PCA(n_components=1) # 降成一维
lower_dim.fit(data)
Out[47]:
PCA(copy=True, iterated_power='auto', n_components=1, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
lower_dim.explained_variance_ratio_
Out[48]: array([0.96318131])
# 降维后 得到了百分之96的信息量
lower_dim.fit_transform(data) # 直接得到转换后的数值
Out[50]:
array([[-0.82797019],
[ 1.77758033],
[-0.99219749],
[-0.27421042],
[-1.67580142],
[-0.9129491 ],
[ 0.09910944],
[ 1.14457216],
[ 0.43804614],
[ 1.22382056]])
# sklearn 的降维方法用的是奇异值方法
def myPCA(data, n_components=10000):# 普通的主成分降维方法
mean_vals = np.mean(data, axis=0)
mid = data - mean_vals
cov_mat = np.cov(mid, rowvar=False)
from scipy import linalg
eig_vals, eig_vects = linalg.eig(np.mat(cov_mat))
eig_val_index = np.argsort(eig_vals)
eig_val_index = eig_val_index[:-(n_components + 1): -1]
eig_vects = eig_vects[:, eig_val_index]
low_dim_mat = np.dot(mid, eig_vects)
return low_dim_mat, eig_vals
qq图