狭义数据分析2

多因子分析与复合分析

探索属性和属性之间的联系,分析属性和属性之间联系的分析方法
在这里插入图片描述
假设检验
根据一定的假设条件,从样本推断总体,或者推断样本与样本之间关系。作出一个假设,然后根据数据,或者根据已知的分布性质来推断这个假设成立的概率有多大
方法:
建立原假设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图
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值