Python

两变量之间分析方法选用总结

2020-05-24  本文已影响0人  走二仙桥丶
共勉

写在最前面:

请看下面几个问题,如果你能轻松的知道问题的答案,那么可以不再阅读本文或快速浏览一下本文,如果不是很轻松就能知道答案,那么建议花一点时间读一下本文。

数据分析师在实际工作中经常遇见以下的情形:

1.一个变量是否对另一个变量有影响?用什么方法?这个方法适合我的数据吗?
2.EDA探索性数据分析除了描述单变量的分布,还能做些什么。
3.在用机器学习做分类或回归问题时,都说数据决定精度的上界,模型只是去逼近这个上界,那么在对数据进行探索时,可以用哪些方法来做。

目录

1.一个实际案例引发的思考
2.实际工作中常见的数据类型
3.两个连续型数值变量之间的关系探究
4.一个连续型数值变量与一个分类变量之间的关系探究
5.两个分类变量之间的关系探究
6.思考:我们说的AB Test原理是什么

一、一个实际案例引发的思考

在看这个案例之前,有下面几个问题,请带着这些问题边看案例边思考:
1.如果你在工作中会怎么做这个分析?
2.他这样分析对吗?
3.如果不对,问题出在哪里,应该怎么修改?
4.如果回答不上来上述1-3问题,再看完这篇文章后,你是否可以回答1-3

【注】该案例来自知乎上的书:《活用数据:驱动业务的数据分析实战》,若有侵权,联系必删!
我们想对服装进行精准营销 案例来自书--《活用数据:驱动业务的数据分析实战》
案例来自书--《活用数据:驱动业务的数据分析实战》 案例来自书--《活用数据:驱动业务的数据分析实战》

二、实际工作中常见的数据类型

要做分析,那么必然要清楚分析的数据是什么类型,不同类型的数据分析方法与处理方式是不同的,因此有必要清楚实际工作中常见的数据类型。
什么是数据?我认为凡是可以电子化记录的都是数据。因此,数据范围会随着科技进步和计算机发展不断扩充变大。就目前技术水平与计算机发展,个人认为数据可以做如下分类:

个人理解的目前数据类型分类 啰嗦几句题外话:现在很多人对深度学习很迷信崇拜,觉得用深度学习高大上,效果会很好,但是就目前来看深度学习还有很长的路要走;虽然目前深度学习在非结构化数据处理上一骑绝尘,但是我们要知道深度学习的训练,参数的调整,可解释性,对计算机性能的要求,这些东西对于个人工作中是很难去满足的,深度学习没有那么神秘,也不是干什么都是最好的,综合考虑各种因素找到可解决的办法就行。

三、两个连续型数值变量之间的关系探究

对于两个连续型数值变量之间的关系探究,我们比较容易想到相关关系(回归先不探讨),日常工作中,我们常把相关关系和因果关系(常用回归分析探索)弄混,这里简单说一下:
相关变量的关系也可分为两种:
两个变量间相互影响——平行关系
一个变量变化受另一个变量的影响——依存关系
它们对应的分析方法:
相关分析是研究呈平行关系的相关变量之间的关系
回归分析是研究呈依存关系的相关变量之间的关系
回归分析和相关分析都是研究变量之间关系的方法,两种分析方法相互结合和渗透;可以总结为:用相关分析不一定要用回归分析;用回归分析,必先用相关分析探索一下变量之间的关系。

使用相关分析探究两个连续型数值变量之间的关系步骤:

1.绘制散点图
2.计算相关系数并完成相关系数显著性检验

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.stats as stats   #Python中做统计检验的库
# 导入数据
data = pd.DataFrame(np.random.randn(200,4)*100, columns = ['A','B','C','D'])
data.head()
data.head()
#研究变量A和变量B之间的相关关系
#第一步:画出变量A与变量B的散点图
plt.figure(figsize = (3,3))  # 图片像素大小
plt.scatter(data.A, data.B,color="blue")  # 散点图绘制
plt.grid()  # 显示网格线
plt.show()  # 显示图片
变量A与B之间的散点图

从散点图来看,变量A与变量B之间可能不存在线性相关关系。

#第二步:计算相关系数与显著性检验
#方法一:使用pandas中的corr()方法
print(data.corr()) #如果由数据框调用corr函数,那么将会计算每个列两两之间的相似度,返回DataFrame
print(data['A'].corr(data['B']))  #如果由序列调用corr方法,那么只是该序列与传入的序列之间的相关度,返回一个数值型,大小为相关度
使用pandas的corr方法做相关分析

可以看到使用pandas中的corr()方法求相关分析是只会给出相关系数,不会给出相关系数对应的显著性水平值的,因此如果想更严谨的话还是使用scipy.stats库比较好。

r,p = stats.pearsonr(data.A,data.B)  # 相关系数和P值
if p<0.05:
    print("P=%.3f,应拒绝原假设,可以认为变量之间相关关系显著。"%p)
    if r>0:
        print("变量之间存在显著正相关关系,相关系数r=%.3f"%r)
    else:
        print("变量之间存在显著负相关关系,相关系数r=%.3f"%r)
else:
    print("P=%.3f,我们没有理由拒绝原假设,可以认为变量之间不存在相关关系显著。"%p)
在显著性为0.05的水平下,检验结果

可以看到,在0.05的置信水平下,认为变量A和变量B是不存在显著相关关系的;但看P=0.099,其实P值不算大,如果在0.1的置信水平下,就可以认为变量A和变量B是存在显著相关关系的,这时是可以说相关系数为多少。


四、一个连续型数值变量与一个分类变量之间的关系探究


统计检验方法:
1.单因素方差分析(若分类变量下类别水平为2,此时单因素方差分析等价于独立样本T检验,两者可以统计量互相转换)
2.独立样本T检验(仅适用于分类变量下类别水平为2的情况)


因此为了篇幅考虑,就以单因素方差分析适用案例作为本文的内容。


使用单因素方差分析的步骤:

1.对数据是否符合正态分布和组间方差是否一致做检验(完成单因素方差分析的前提假设)
2.描述性分析;建议使用箱线图来进行
3.采用单因素方差分析判断分类变量是否对连续型变量有显著影响
4.若不同组间有差异,通过多重检验来判断哪个处理间存在差异


在日常工作中,我们经常碰到这样的问题,就是一个分类变量对一个连续型变量是否有影响,以植物生长作为一个案例,探究施肥是否会促进植株生成(植株生长以树高作为指标来衡量),采用控制变量的方法,采取清水作为对照组,实验组以某肥料四个浓度梯度,分别是A,B,C,D,施肥一段时间之后测量树高(要控制其他变量保持一致,比如施肥之前的树高要基本保持一致,生长势基本保持一致等等)。

import numpy as np
import pandas as pd
df = {'ctl':list(np.random.normal(10,5,100)),
      'treat1':list(np.random.normal(15,5,100)),\
      'treat2':list(np.random.normal(20,5,100)),\
      'treat3':list(np.random.normal(30,5,100)),\
      'treat4':list(np.random.normal(31,5,100))}
df = pd.DataFrame(df)
df.head()
data.head()

数据中的teat1-4代表的就是A-D四个化肥浓度。

#第一步:正态性检验
import scipy.stats as stats
#Shapiro检验(常用Shapiro检验和K-S检验来检验数据是否服从正态分布,若数据量低于5000,则使用Shapiro检验比较合理,否则使用K-S检验)
print(stats.shapiro(df['ctl']))
print(stats.shapiro(df['treat1']))
print(stats.shapiro(df['treat2']))
print(stats.shapiro(df['treat3']))
print(stats.shapiro(df['treat4']))
正态检验结果
#第二步:方差齐性检验
d1=df['ctl']
d2=df['treat1']
d3=df['treat2']
d4=df['treat3']
d5=df['treat4']
args = [d1,d2,d3,d4,d5]
#levene test
w,p=stats.levene(*args)
if p<0.05:
    print("警告:Levene test 显示方差齐性假设不成立(p=%.2f)"%p)
else:
    print("通过齐性检验")

#方差分析
f,p=stats.f_oneway(*args)
print(f,p)
方差齐性检验结果
#第三步:绘制箱线图
df_melt=df.melt()
df_melt.columns=['Treat','Value']
import seaborn as sns
sns.boxplot(x='Treat',y='Value',data=df_melt)
箱线图
#第四步:单因素方差分析
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
model = ols('Value~C(Treat)',data=df_melt).fit()
anova_table=anova_lm(model,typ=2)
print(anova_table)
单因素方差分析结果
#第五步:邓肯多重检验(Tukey HSD test)
from statsmodels.stats.multicomp import MultiComparison
mc =MultiComparison(df_melt['Value'],df_melt['Treat'])
tukey_result = mc.tukeyhsd(alpha=0.5)
print(tukey_result)
多重检验结果

通过上述分析,可以看到不同化肥水平对应的植株生长存在显著影响,并且通过箱线图和多重检验可以看到,treat3和treat4对应的植株生长是和其他对照组显著差异,treat3和trea4对应的植株生长更好,因此可以建议采用treat3下的化肥水平,treat4的植株生长相较于treat3并没有太明显差异;甚至可以再继续采取一些化肥水平来判断是否当化肥水平超过treat3的水平后,化肥的提升不会再进一步影响植物生长。

五、两个分类变量之间的关系探究


统计检验方法:
卡方检验
(卡方检验是针对自变量和因变量都是分类数据,也就是说带有属性的数据)


使用美国人口收入数据作为案例,研究性别与收入之间的关系。 data.head()
pivot_table = pd.crosstab(
    data['sex'],
    data['income'],
    margins = True #总计
)
pivot_table
列联表
Female_income = pivot_table.iloc[0][0:2].values
Male_income = pivot_table.iloc[1][0:2].values
#画图
fig = plt.figure(figsize=(5, 5))
sns.set(font_scale=1.8)
categories = ["<=50K",">50K"]
p1 = plt.bar(categories, Female_income, 0.55, color='#d62728')
p2 = plt.bar(categories, Male_income, 0.55, bottom=Female_income)
plt.legend((p1[0],p2[0]), ('Female', 'Male'))
plt.ylabel('Count')
plt.show()
做图
f_obs = np.array([Female_income,
                  Male_income])
from scipy import stats
stats.chi2_contingency(f_obs)[1]    #得出的是卡方检验的P值
卡方检验结果

通过卡方检验,可以看到P值趋近于0,小于0.05,我们可以认为男性和女性在收入上是存在显著差异的;结合列联表和做出的图,我们可以看到在高收入人群中,男性占比较大。

六.思考:我们说的AB Test原理是什么

现在回顾第一部分的那个案例,研究的是性别和颜色偏好之间的关系,这是两个分类变量之间的关系,应该使用卡方检验而不应该使用单因素方差分析。
在本文中,没有具体交代方法论的原理,如果感兴趣可以自行查阅。现在我们可以思考下AB Test原理到底使用的方法论到底是什么? AB Test怎么选择指标更加合理,怎么设计方案更可行,得到的数据怎么分析才正确,下周会做一个关于AB Test的总结。

参考文献:
https://zhuanlan.zhihu.com/p/36441826 简单相关性分析(两个连续型变量)
https://www.cnblogs.com/jiaxin359/p/7995073.html 统计学当中关于变量的分类

上一篇下一篇

猜你喜欢

热点阅读