精华内容
下载资源
问答
  • 没有实际数据很难回答这个问题,但我想你正在寻找这样的东西:Top15["Citable docs per Capita"].corr(Top15["Energy Supply per Capita"])举个例子:import pandas as pddf = pd.DataFrame({&...

    没有实际数据很难回答这个问题,但我想你正在寻找这样的东西:

    Top15["Citable docs per Capita"].corr(Top15["Energy Supply per Capita"])

    举个例子:

    import pandas as pd

    df = pd.DataFrame({"A": range(4), "B": [2*i for i in range(4)]})

    A B

    0 0 0

    1 1 2

    2 2 4

    3 3 6

    然后

    df["A"].corr(df["B"])

    按预期给出1.

    现在,如果您更改了某个值,例如

    df.loc[2, "B"] = 4.5

    A B

    0 0 0.0

    1 1 2.0

    2 2 4.5

    3 3 6.0

    命令

    df["A"].corr(df["B"])

    回报

    0.99586

    正如预期的那样仍然接近1.

    df.corr()

    因此会回来

    A B

    A 1.000000 0.995862

    B 0.995862 1.000000

    在您显示的图形中,仅表示相关矩阵的左上角(我假设).

    在某些情况下,您可以在解决方案中获得NaN – 请查看this post作为示例.

    如果要过滤/低于特定阈值的条目,可以查看this question.

    如果要绘制相关系数的热图,可以检查this answer,然后如果遇到重叠轴标签的问题,请检查the following post.

    展开全文
  • 本文主要记录了python对数据进行相关性统计检验的实现方法。 主要是: 1、连续变量VS连续变量:皮尔逊相关系数 2、分类变量VS分类变量:卡方检验 3、连续变量VS多分类变量:F检验 4、连续变量VS二分类变量:若...

    本文主要记录了python对数据进行相关性统计检验的实现方法。

    主要是:

    1、连续变量VS连续变量:皮尔逊相关系数

    2、分类变量VS分类变量:卡方检验

    3、连续变量VS多分类变量:F检验

    4、连续变量VS二分类变量:若连续变量满足正态分布,则用t检验,否则应用曼-惠特尼U检验

    主要的python脚本如下:

    from sklearn.feature_selection import SelectKBest,chi2
    from scipy import stats
    from  scipy.stats import ttest_ind, levene
    
    
    def corr_continue_continue(series_1,series_2):
        corr = pearsonr(series_1,series_2)[1]
        return corr
    def corr_cate_cate(series_1,series_2):
        series_1 = np.array(series_1).reshape(-1,1)
        model1 = SelectKBest(chi2, k=1)
        model1.fit_transform(series_1, series_2)
        corr = model1.scores_[0]
        p_value = model1.pvalues_[0]
        return corr,p_value
    def corr_continue_multicate(fenlei_series_1,lianxu_series_2):
        f,p = stats.f_oneway(fenlei_series_1,lianxu_series_2)
        return f,p
    def normal_test(series):
        u = series.mean()
        std = series.std()
        statistic,pvalue = stats.kstest(series,'norm',(u,std))
        return statistic,pvalue   
    def corr_continue_twocate(data,fenlei_var,lianxu_var):
        fenlei = list(set(data[fenlei_var]))
        series_1 = data[lianxu_var][data[fenlei_var]==fenlei[0]]
        series_2 = data[lianxu_var][data[fenlei_var]==fenlei[1]]
        stats_1,pvalue_1 = normal_test(series_1)
        stats_2,pvalue_2 = normal_test(series_2)
        if pvalue_1 < 0.05 or pvalue_2 < 0.05:
            t_value,p_value = stats.mannwhitneyu(series_1,series_2,alternative='two-sided')
        else:
            _,levene_p_value = levene(series_1,series_2)
            if levene_p_value>0.05:
                t_value,p_value = ttest_ind(series_1,series_2)
            else:
                t_value,p_value = ttest_ind(series_1,series_2,equal_var=False)
        return t_value,p_value,pvalue_1,pvalue_2

     

    展开全文
  • 数据特征分析技能—— 相关性检验 相关性分析是指对两个或多个具备相关性的变量元素进行分析,从而衡量两个变量因素的相关密切程度 一般常用四种方法: - 画图判断 - pearson(皮尔逊)相关系数 - sperman(斯皮尔曼...

    数据特征分析技能—— 相关性检验
    相关性分析是指对两个或多个具备相关性的变量元素进行分析,从而衡量两个变量因素的相关密切程度 
    一般常用四种方法: 
    - 画图判断 
    - pearson(皮尔逊)相关系数 
    - sperman(斯皮尔曼)相关系数 
    - Cosine similarity (余弦相关系数)

     

     

    绘制图形判断

    一般对于强相关性的两个变量,画图就能定性判断是否相关

    (1)散点图向量分析干系 

    #random产生高斯分布
    #uniform产生均匀分布
    
    data1 = pd.Series(np.random.rand(50)*100).sort_values()
    data2 = pd.Series(np.random.rand(50)*50).sort_values()
    data3 = pd.Series(np.random.rand(50)*500).sort_values(ascending = False)
    # 创建三个数据:data1为0-100的随机数并从小到大排列,data2为0-50的随机数并从小到大排列,data3为0-500的随机数并从大到小排列,
    
    fig = plt.figure(figsize = (10,4))
    ax1 = fig.add_subplot(1,2,1)
    ax1.scatter(data1, data2)
    plt.grid()
    # 正线性相关
    
    ax2 = fig.add_subplot(1,2,2)
    ax2.scatter(data1, data3)
    plt.grid()
    # 负线性相关
    

    (2)散点图矩阵初判多变量间关系

    data = pd.DataFrame(np.random.randn(200,4)*100, columns = ['A','B','C','D'])
    pd.plotting.scatter_matrix(data,figsize=(8,8),
                             c = 'k',
                             marker = '+',
                             diagonal='hist',
                             alpha = 0.8,
                             range_padding=0.1)
    data.head()

    è¿éåå¾çæè¿°

    pearson(皮尔逊)相关系数

    要求样本满足正态分布 
    - 两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商,其值介于-1与1之间

     

    data1 = pd.Series(np.random.rand(100)*100).sort_values()
    data2 = pd.Series(np.random.rand(100)*50).sort_values()
    data = pd.DataFrame({'value1':data1.values,
                         'value2':data2.values})
    print(data.head())
    print('------')
    # 创建样本数据
    
    u1,u2 = data['value1'].mean(),data['value2'].mean()  # 计算均值
    std1,std2 = data['value1'].std(),data['value2'].std()  # 计算标准差
    print('value1正态性检验:\n',stats.kstest(data['value1'], 'norm', (u1, std1)))
    print('value2正态性检验:\n',stats.kstest(data['value2'], 'norm', (u2, std2)))
    print('------')
    # 正态性检验 → pvalue >0.05
    
    
    data['(x-u1)*(y-u2)'] = (data['value1'] - u1) * (data['value2'] - u2)
    data['(x-u1)**2'] = (data['value1'] - u1)**2
    data['(y-u2)**2'] = (data['value2'] - u2)**2
    print(data.head())
    print('------')
    # 制作Pearson相关系数求值表
    
    r = data['(x-u1)*(y-u2)'].sum() / (np.sqrt(data['(x-u1)**2'].sum() * data['(y-u2)**2'].sum()))
    print('Pearson相关系数为:%.4f' % r)
    # 求出r
    # |r| > 0.8 → 高度线性相关
    

    结果为

         value1    value2
    0  0.438432  0.486913
    1  2.974424  0.663775
    2  4.497743  1.417196
    3  5.490366  2.047252
    4  6.216346  3.455314
    
    ------
    value1正态性检验:
     KstestResult(statistic=0.07534983222255448, pvalue=0.6116837468934935)
    value2正态性检验:
     KstestResult(statistic=0.11048646902786918, pvalue=0.1614817955196972)
    ------
    
         value1    value2  (x-u1)*(y-u2)    (x-u1)**2   (y-u2)**2
    0  0.438432  0.486913    1201.352006  2597.621877  555.603052
    1  2.974424  0.663775    1133.009967  2345.549928  547.296636
    2  4.497743  1.417196    1062.031735  2200.319086  512.612654
    3  5.490366  2.047252    1010.628854  2108.181383  484.479509
    4  6.216346  3.455314     931.020494  2042.041746  424.476709
    ------
    Pearson相关系数为:0.9937
    

     pd中包含内置的求解pearson系数方法函数

    # Pearson相关系数 - 算法
    
    data1 = pd.Series(np.random.rand(100)*100).sort_values()
    data2 = pd.Series(np.random.rand(100)*50).sort_values()
    data = pd.DataFrame({'value1':data1.values,
                         'value2':data2.values})
    print(data.head())
    print('------')
    # 创建样本数据
    
    data.corr()
    # pandas相关性方法:data.corr(method='pearson', min_periods=1) → 直接给出数据字段的相关系数矩阵
    # method默认pearson
    

    Sperman秩相关系数

    皮尔森相关系数主要用于服从正太分布的连续变量,对于不服从正太分布的变量,分类关联性可采用Sperman秩相关系数,也称 等级相关系数

    data = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],
                        '每周看电视小时数':[7,0,27,50,28,29,20,12,6,17]})
    print(data)
    print('------')
    # 创建样本数据
    
    data.sort_values('智商', inplace=True)
    data['range1'] = np.arange(1,len(data)+1)
    data.sort_values('每周看电视小时数', inplace=True)
    data['range2'] = np.arange(1,len(data)+1)
    print(data)
    print('------')
    # “智商”、“每周看电视小时数”重新按照从小到大排序,并设定秩次index
    
    data['d'] = data['range1'] - data['range2']
    data['d2'] = data['d']**2
    print(data)
    print('------')
    # 求出di,di2
    
    n = len(data)
    rs = 1 - 6 * (data['d2'].sum()) / (n * (n**2 - 1))
    print('Sperman秩相关系数为:%.4f' % rs)
    # 求出rs

    输出结果为: 

        智商  每周看电视小时数
    0  106         7
    1   86         0
    2  100        27
    3  101        50
    4   99        28
    5  103        29
    6   97        20
    7  113        12
    8  112         6
    9  110        17
    ------
        智商  每周看电视小时数  range1  range2
    1   86         0       1       1
    8  112         6       9       2
    0  106         7       7       3
    7  113        12      10       4
    9  110        17       8       5
    6   97        20       2       6
    2  100        27       4       7
    4   99        28       3       8
    5  103        29       6       9
    3  101        50       5      10
    ------
        智商  每周看电视小时数  range1  range2  d  d2
    1   86         0       1       1  0   0
    8  112         6       9       2  7  49
    0  106         7       7       3  4  16
    7  113        12      10       4  6  36
    9  110        17       8       5  3   9
    6   97        20       2       6 -4  16
    2  100        27       4       7 -3   9
    4   99        28       3       8 -5  25
    5  103        29       6       9 -3   9
    3  101        50       5      10 -5  25
    ------
    Sperman秩相关系数为:-0.1758
    

    pd中包含内置的求解spearman系数方法函数

    # spearman相关系数 - 算法
    
    data = pd.DataFrame({'智商':[106,86,100,101,99,103,97,113,112,110],
                        '每周看电视小时数':[7,0,27,50,28,29,20,12,6,17]})
    print(data)
    print('------')
    # 创建样本数据
    
    data.corr(method='spearman')
    # pandas相关性方法:data.corr(method='pearson', min_periods=1) → 直接给出数据字段的相关系数矩阵
    # method默认pearson

    此处转载自:https://blog.csdn.net/ICERON/article/details/80219603 

    余弦待更.....一般余弦计算相似度比较多哈。

     

     

     

    展开全文
  • 选择Pearson相关性作为检验统计量,此命题,我们使用双侧检验。 原假设:母亲年龄和新生儿体重之间没有相关性。 备择假设:母亲年龄和新生儿体重之间有相关性。 思路:假设母亲年龄和新生儿体重之间没有相关性,...

    一、检验连变量相关性

    简介

    在全国家庭增长调查数据集中,新生儿体重和母亲年龄的相关性均为0.07,年龄较大的母亲似乎产下的孩子更重,但是,这种效应是偶然产生的吗?

    检验方案

    选择Pearson相关性作为检验统计量,此命题,我们使用双侧检验。

    原假设:母亲年龄和新生儿体重之间没有相关性。

    备择假设:母亲年龄和新生儿体重之间有相关性。

    思路:假设母亲年龄和新生儿体重之间没有相关性,那么我们将“母亲年龄”这组数据打散1000次,每次“母亲年龄”的排列都不同,这1000次计算得来的Pearson相关系数应该服从均值为0的某一分布,如果当前情况的测量值偏离均值0太远,完全是小概率事件,则我们完全有理由认为,两变量之间的相关系数不为0,即两变量是有相关性的。

    python代码实现

    1.导入两变量

    live,firsts,others=first.MakeFrames()  #产生数据
    live=live.dropna(subset=['agepreg','totalwgt_lb'])  #删除两变量为空值的行
    data=live['agepreg'].values,live['totalwgt_lb'].values  #转换为list
    xs,ys=data

    2、定义函数(协方差,相关系数等)

    import collections
    import math
    #将两个样本中其中一个样本的元素打散。
    def RunModel3(xs,ys): 
        xs=np.random.permutation(xs)#与shuffle类似,只是permutation不改变原来的数据结构
        data=xs,ys
        return data
    
    #计算协方差
    def Cov(xs,ys):
        xs=np.asarray(xs) #将其他数据类型转换为array数组
        ys=np.asarray(ys)
        mean_x=xs.mean()
        mean_y=ys.mean()
        cov=np.dot(xs-mean_x,ys-mean_y)/len(xs) #计算两数组的內积
        return cov
    
    #计算Pearson相关性
    def Corr(xs,ys):
        xs=np.asarray(xs) #将其他数据类型转换为array数组
        ys=np.asarray(ys)
        var_x=xs.var()
        var_y=ys.var()
        corr=Cov(xs,ys)/math.sqrt(var_x*var_y)
        return corr
    
    #计算每次重新划分之后的相关系数的绝对值。
    def TestStatistic3(data):
        xs,ys=data
        test_stat=abs(Corr(xs,ys))
        return test_stat

    3、计算p值

    a=[TestStatistic3(RunModel3(xs,ys)) for _ in range(1000)] #模拟1000次试验
    sorted(a,reverse=True)

    输出:

    b=sum(1 for x in a if x>=Corr(xs,ys)) #计算比当前情况乃至更差情况出现的次数
    b/1000

    输出:

    0.0

    实际数据的相关性为0.07。检验计算得到的p值为0,在1000次重复试验中,模拟得到的最大相关性为0.036。因此,虽然观擦到的变量相关性很小,但这种相关性是显著的。

    二、检验线性模型

    拟合优度

    要度量一个线性模型的质量优劣,或拟合优度,最简单的方法之一是计算决定系数,决定系数(R^{2})和Pearson(r)相关系数之间有一个简单的关系:R^{2}=r^{2},我们计算得到R^{2}=0.0047

    我们已经知道母亲年龄和新生儿体重的影响很小,几乎没有预测能力。那么,这个明显的关系可能是偶然产生的吗?我们可以使用一下以下方法检验线性拟合的结果。

    1、检验方法一

    检验决定系数R^{2}是否为0。

    原假设为R^{2}=0,上面,我们已经对母亲年龄和新生儿体重的相关系数r,由于R^{2}=r^{2}R^{2}的单侧检验等效于r的双侧检验。我们已经进行了这项检验,得到p<0.001,因此认为母亲年龄和新生儿体重之间的关系是统计显著的。

    2、检验方法二

    检验斜率是否偶然。

    原假设是斜率为0,因此,我们可以使用均值附近的随机变化(残差)建立新生儿体重模型,我们先普及回归方程斜率和截距的公式:

    #导入样本
    live,firsts,others=first.MakeFrames()
    live=live.dropna(subset=['agepreg','totalwgt_lb'])
    ages=live['agepreg']
    weights=live['totalwgt_lb']
    
    
    import collections
    #根据样本X、Y,计算线性方程的斜率与截距
    def LeastSquares(xs,ys):
        mean_x,var_x=xs.mean(),xs.var()  #X的样本的均值、方差
        mean_y=ys.mean()   #Y的均值
        cov=np.dot(xs-mean_x,ys-mean_y)/len(xs) #协方差
        slope=cov/var_x   #斜率
        inter=mean_y-slope*mean_x   #截距
        return inter,slope
    
    #假设斜率为0,则所有的y轴应该都等于y的均值加上偏差。
    def RunModel(ys): 
        ybar=ys.mean()   #计算因变量y的均值
        res=ys-ybar  #计算体重和均值的差,作为残差
        weight=ybar+np.random.permutation(res)  #随机残差,与shuffle类似
        return weight
    
    #计算每次重新划分之后的斜率。
    def TestStatistic(xs,ys):
        _,slope=LeastSquares(xs,ys)
        return slope
    
    
    

    计算1000次对残差随机抽样的斜率结果:

    a=[TestStatistic(ages,RunModel(weights)) for _ in range(1000)]
    sorted(a,reverse=True)

    输出:

    其中在斜率为0的原假设下,我们通过抽样随机残差能够获得的斜率最大值为0.0092。

    b=sum(1 for x in a if x>=LeastSquares(ages,weights)[1]) #计算比当前情况乃至更差情况出现的次数
    b/1000

    输出:

    0.0
    

    当前数据情况算得的斜率为0.017,原假设条件下,得到当前情况的概率为0,故认为斜率不为0是显著的。

    3、检验方法三

    绘制原假设(斜率为0)成立的条件下,和抽样分布下,斜率的累积密度分布。

    何为抽样分布?

    我们将观测到的妊娠数据看成一个整体,从这个整体当中进行有放回的重复抽样。

    1000次抽样分布斜率的函数如下:首先需要对原数据进行重复抽样。

    #有放回的从df中重新选择行,组成新的df,新df和原df行数相同。
    def ResampleRows(df):
        indices=np.random.choice(df.index,len(df),replace=True)
        return df.loc[indices]
    
    #计算斜率和截距
    def SampleDistributions(df,iters=1000):   
        t=[]
        for _ in range(iters):
            sample=ResampleRows(df)
            ages=sample['agepreg']
            weights=sample['totalwgt_lb']
            estimates=LeastSquares(ages,weights)
            t.append(estimates)
        inters,slopes=zip(*t)   #t为一个列表,*表示将列表t展开。
        return inters,slopes
    
    #计算1000次抽样的斜率和截距,以列表的形式
    _,slopes=SampleDistributions(live)

    1000次原解释的斜率分布请参考方法二当中

    a=[TestStatistic(ages,RunModel(weights)) for _ in range(1000)]
    sorted(a,reverse=True)

    计算两种分布下,斜率的累积概率密度

    cdf=Cdf(Pmf(Hist(slopes)))   #抽样分布下斜率的累积概率分布
    slope,cdf_slope=zip(*cdf.items())   
    
    cdf_h=Cdf(Pmf(Hist(a)))     #原假设条件下的累积概率分布
    slope_h,cdf_slope_h=zip(*cdf_h.items())    

    画图:

    #画图
    from matplotlib import pyplot as plt
    plt.rcParams['font.sans-serif']=['SimHei'] #用来显示中文标签
    plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
    plt.figure(figsize=(6,4.5)) #表示绘制图形的画板尺寸为6*4.5;
    plt.plot(slope,cdf_slope,color ='g',label='抽样分布')   
    plt.vlines(Pecentile(cdf,0.5),ymin=0,ymax=1) #辅助线,中位值
    
    plt.plot(slope_h,cdf_slope_h,color ='b',label='原假设斜率为0')
    plt.vlines(Pecentile(cdf_h,0.5),ymin=0,ymax=1) #辅助线,中位值
    
    plt.legend(loc='upper left')  #添加图例
    plt.xlim(-0.03,0.03) 
    plt.ylim(0,1) 
    plt.xlabel('斜率(磅/年)')
    plt.ylabel('CDF')
    plt.show()

     输出:

    根据以上图片,我们可以用两种方法估计p值:  
    1、计算原假设下斜率大于观测斜率的概率。  
    2、计算抽样分布中斜率小于0的概率(如果估计斜率为负数,那么应该计算抽样分布中斜率大于0的概率)

    由图我们可以看到,抽样分布(绿线)斜率小于0的概率为0,图中不相交。故原假设不成立,斜率不为0是显著的。

    展开全文
  • 正态分布、正态性检验相关性分析1 正态分布2 正态性检验2.1 直方图初判2.2 QQ图2.3 K-S检验2.3.1推导过程2.3.2 直接一行代码调用3 相关性分析3.1 图示初判3.2 Pearson相关系数3.2.1 计算推导3.2.2 代码一步到位3.3...
  • Python特征分析- 相关性分析

    千次阅读 2020-05-12 10:35:16
    Python特征分析- 相关性分析相关性分析引入库图示初判变量之间的线性相关性散点图矩阵初判多变量间关系Pearson相关系数创建样本数据正态性检验 → pvalue >0.05制作Pearson相关系数求值表求出rPearson相关系数 - ...
  • 相关性检验之Pearson系数及python实现

    万次阅读 多人点赞 2017-06-21 16:59:41
    二、Python代码实现 在这里主要实现了第一种Pearson形式的代码,代码分为三个模块,第一个模块的功能是来获取两个向量的平均值;第二个模块的功能实现的是求两个向量间的pearson系数,返回pearson系数;最后一个...
  • 假设检验实战 1.要解决的问题 给出的数据集为人体的体温数据,下载链接为 https://pan.baidu.com/s/1t4SKF6U2yyjT365FaE692A* 包括三个数据字段: gender:性别,1为男性,2为女性 Temperature:体温 Heart...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 127
精华内容 50
关键字:

python检验相关性

python 订阅