昨天介绍了两连续变量的相关分析,今天来说说连续变量与分类变量(二分)之间的检验。


通俗的来讲,就是去发现变量间的关系。


连续变量数量为一个,分类变量数量为两个。


总体:包含所有研究个体的集合。


样本:经过抽样总体中的部分个体。


均值:变量的数值之和除以变量的个数。


极差:变量的最大值与最小值之差。


方差标准差反映数据的离散程度,其值越大,数据波动越大。



/ 01 / 正态分布


在实际情况里,总体的信息往往难以获取,所以需要抽样,通过样本来估计总体。


点估计和区间估计是通过样本来估计总体的两种方法。


那么样本是否能够代表总体就是关键点,样本需要具有代表性。


点估计:用样本统计量去估计总体参数。


区间估计:不同于点估计,能够提供待估计参数的置信区间和置信度。


区间估计用到了中心极限定理,表现为如果抽样多次,每次抽样都有一个均值,产生的多个均值服从正态分布。


就可以利用正态分布的性质,推断出样本均值出现在某区间范围的概率。


正态分布关于均值左右对称的,呈钟形。且均值和标准差具有代表性。均值=中位数=众数。


在现实生活中,男女身高(性别有影响需区分开)、体重、考试成绩都是属于正态分布。


影响它们的变量都是独立互不影响的。


接下来对豆瓣电影TOP250里的电影评分进行分析。



首先读取数据。


import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
import pandas as pd

# 读取文件
df = pd.read_csv('douban.csv', header=0, names=["quote""score""info""title""people"])
dom1 = []
# 清洗数据,获取国家列,1为中国,2为外国
for i in df['info']:
    country = i.split('/')[1].split(' ')[0].strip()
    if country in ['中国大陆''台湾''香港']:
        dom1.append(1)
    else:
        dom1.append(0)
df['country'] = dom1


生成电影评分直方图,观察其是否符合正态分布。


# distplot:集合功能,kde:显示核密度估计图,fit:控制拟合的参数分布图形,本次为拟合正态分布
sns.distplot(df.score, kde=True, fit=stats.norm)
plt.show()


运行代码后得到下图,发现电影评分分布近似正态分布。



生成电影评分QQ图,观察电影评分与正态分布的接近程度。


# qqplot检验数据是否服从正态分布
sm.qqplot(df.score, fit=True, line='45')
plt.show()


运行代码后得到下图,其中样本点越靠近红色线说明变量越趋近正态分布,结论显而易见。



区间估计,计算95%保证程度下的区间估计范围。


# 标准差
se = df.score.std() / len(df) ** 0.5
# 均值下限
LB = df.score.mean() - 1.98 * se
# 均值上限
UB = df.score.mean() + 1.98 * se
print(LB, UB)
# 得到的结果
8.782710866637895 8.849289133362106


即在95%的置信度下,电影评分的总体均值位于区间「8.7827-8.8492」内。


定义函数,计算不同置信度下的置信区间。


def confint(x, alpha=0.05):
    """计算不同置信度下的置信区间"""
    n = len(x)
    xb = x.mean()
    df = n - 1
    tmp = (x.std() / n ** 0.5) * stats.t.ppf(1-alpha/2, df)
    return {'Mean': xb, 'Degree of Freedom': df, 'LB': xb-tmp, 'UB': xb+tmp}

result = confint(df.score, 0.05)
print(result)
# 得到的结果
{'LB'8.782886780076549'UB'8.849113219923453'Degree of Freedom'249'Mean'8.816}


即在99%的置信度下,电影评分的总体均值位于区间「8.7828-8.8491」内。



/ 02 / t检验


01 假设检验


在研究变量时,对分布的性质进行一定的假设,然后通过抽样来检验假设是否成立。


这似乎与我们中学时代的反证法有点类似,假设需要证明的东西成立,然后去反推。


其中实际抽样结果与假设的差异程度可以用概率值表示,为「p-value」。


概率值越大意味着越无差异,越接近。


人为设定一个「p-value」的阈值将差异程度判断为「有差异」或「无差异」,这个阈值就是「显著性水平」。


目前接触的原假设都是设置为等值假设,本次假设电影评分均值为8.8。


显著性水平的设置根据样本容量,本次取显著性水平为0.05。


最后的结论就是「p-value」值小于显著性水平时,差异明显,有理由拒绝原假设。


「p-value」值大于显著性水平时,差异较小,那么就不能拒绝原假设。


这里书本没有对「p-value」如何查表取值详细解说,需要百度查询。


02 单样本t检验


单样本t检验是最基础的假设检验,其利用来自总体的样本数据,推断总体均值是否与假设的检验值之间存在显著差异。


P值大于显著性水平,则无法拒绝原假设。


P值小于显著性水平,则拒绝原假设。


下面在Python中进行单样本t检验,使用电影评分数据,假设均值为8.8分。


# stas:列联表
d1 = sm.stats.DescrStatsW(df.score)
print('t-statistic=%6.4f, p-value=%6.4f, df=%s' %d1.ttest_mean(8.8))
# 得到的结果
t-statistic=-2.0223, p-value=0.3422, df=249.0


P值为0.3422,如果规定显著性水平为0.05,那么就无法拒绝原假设。


即电影评分均值为8.8分的原假设成立。


03 双样本t检验


双样本t检验是检验两个样本均值的差异是否显著。


常用于检验某二分类变量区分下的某连续变量是否有显著差异。


本次使用豆瓣电影TOP250中中外国家电影评分数据。


研究电影评分受国家的影响是否显著(之前分析的结论是没什么影响)。


# 对数据分组汇总
print(df['score'].groupby(df['country']).describe())


得到结果如下,发现均值还是有一点点差异的。



接下来用双样本t检验来看这种差异是否显著。


在进行双样本t检验前,有三个基本条件需要考虑。


①观测之间独立(本次满足)


②两组均服从正态分布(本次满足)


①两组样本的方差是否相同(需检验)


上面的结果已经包含了样本评分均值的方差了,可是书里却说还需要进行方差齐性分析。


这一点不是很理解,就当多学点东西吧。


方差齐性检验的原假设为两组数据方差相同。


# levene:方差齐性检验
country0 = df[df['country'] == 0]['score']
country1 = df[df['country'] == 1]['score']
leveneTestRes = stats.levene(country0, country1, center='median')
print('w-value=%6.4f, p-value=%6.4f' %leveneTestRes)
# 得到的结果
w-value=0.5855, p-value=0.4449


P值为0.4449,若以0.05为显著性水平,则无法拒绝原假设。


即中国电影评分和外国电影评分的方差是相同的


因此进行方差齐性的双样本t检验。


# equal_var=True:两组数据方差齐性
print(stats.stats.ttest_ind(country0, country1, equal_var=True))
# 得到的结果
Ttest_indResult(statistic=0.9331710237657628, pvalue=0.3516393015610625)


P值为0.35,若以0.05为显著性水平,则无法拒绝原假设。


说明中国电影评分和外国电影评分无显著差异



/ 03 / 总结


学习这一部分内容,最大的困惑就是「p-value」的取值。


书上没讲明白如何用公式确定其值,只是通过Pyhton直接结算得出结果。


网上查取的资料也是零零散散,解释的不够全面。


文末点个赞,比心!!!





···  END  ···



©著作权归作者所有:来自51CTO博客作者mb5fe18ec4a4df8的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 终于搞清楚正态分布、指数分布到底是啥了!
  2. 谈谈统计学正态分布阈值原理在数据分析工作中的运用

随机推荐

  1. 如何使用golang的pprof包对程序进行性能
  2. 关于Golang 指针理解
  3. go语言导包时“.”和“_”的区别是什么?
  4. 详解Golang数组的传递
  5. 分享golang实现文件传输小demo
  6. go语言中run与build命令的区别是什么?
  7. 解决GO语言安装air框架时遇到go: inconsi
  8. 分享5种文件变更时自动重载Go程序的方法
  9. go语言中普通函数与方法的区别是什么?
  10. golang中方法的receiver为指针和不为指针