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

共勉

写在最前面:

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

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

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 统计学当中关于变量的分类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345