统计学进阶
统计量:描述样本特征的数值
参数:描述总体特征的数值
使用假设检验的前提:总体大致呈正态分布
独立双样本T检验步骤
1.建立假设
H0 原假设
H1 备择假设
2. 选择单尾或双尾检验
双尾检验
- 原假设:两个参数不存在差异
- 备择假设:两个参数之间存在差异
单尾检验
- 原假设:参数A没有大于参数B
- 备择假设:参数A大于参数B
或
- 原假设:参数A没有小于参数B
- 备择假设:参数A小于参数B
3.确定显著性水平
显著水平低,则允许检验犯错误概率低;显著水平高,则允许检验犯错误概率高
一般双尾检验显著水平选择0.05,即如果检验结果为拒绝原假设,则原假设为真概率是5%;如果检验结果为接受原假设,则原假设为真概率是95%
单尾检验显著水平一般选择0.025
4.计算t值
t = 两个样本均值之差/两个样本的方差除以的样本大小之和的开平方
5.计算自由度
自由度 = 样本1的数量 + 样本2的数量 – 2
6.查看t值临界值表
7.比较临界值和t值
t值 >= 临界值 =》 拒绝原假设
t值 < 临界值 =》 接受原假设
tip:独立双样本z检验跟独立双样本t检验步骤差不多,在总体方差已知或样本数量比较大(>30)时用z检验更好
使用SciPy库进行T检验
scipy库也是建立在numpy库的基础上的
导入Scipy库的函数ttest_ind如下:
# 导入Scipy库中的ttest_ind函数,用于t检验 from scipy.stats import ttest_ind
计算t值和p值
# 进行t检验, 计算t和p值 t_stat, p_value = ttest_ind(Series1, Series2) print(t_stat, p_value)
p值小于我们选择的显著性水平,则拒绝原假设,反之接受原假设,如:
# 判断显著性 alpha = 0.05 if p_value < alpha: print("两组数据有显著差异") else: print("两组数据无显著差异")
使用Statsmodels进行Z检验
导入Statsmodels库的函数ztest如下:
# 导入Statsmodels库中的ztest函数,用于z检验 from statsmodels.stats.weightstats import ztest
计算t值和p值
# 进行z检验, 计算z和p值 z_stat, p_value = ztest(Series1, Series2, alternative="two-sided") print(z_stat, p_value)
之后步骤同t假设一样。
函数ztest的可选参数alternative的几种可设值:
值 | 作用 |
two-sided | 使计算结果用于判断两组数据均值是否存在显著差异 |
larger | 使计算结果用于判断第一组数据均值是否显著大于第二组 |
smaller | 使计算结果用于判断第一组数据均值是否显著小于第二组 |
线性回归
通过线性方程来描述自变量和因变量之间关系的分析方法
残差:实际观察值与估计值(拟合值)之间的差
拟合目标:让所有残差的平方和最小
通过最小二乘法来找到最佳的模型参数
多元线性回归
也是通过最小二乘法来找到最佳的模型参数
对于分类变量作为自变量的情况,我们需要引入虚拟变量,如:是/否用1/0表示
对于分类变量有多个值(n个值)的情况,我们需要将其中n-1个值分别变成单个的是/否变量,如:为几线城市(包含一线、二线、三线、四线),我们需要改成是否为一线城市、是否为二线城市、是否为三线城市,同时不为一、二、三线城市时为四线城市。
这里之所以只需要取n-1个值,是因为当知道n-1个值时已经可以推导出第n个值是什么,所有如果取n个值时,这些被拆分成单个的是/否变量是强相关的,不相互独立,会出现共线性问题
因此我们在建立回归模型前,可以进行一下相关性分析,如果发现某两个自变量相关系数的绝对值比较大(如超过0.8或0.9)可以考虑将其中一个自变量移除再做回归分析
此外,我们也需要留意各个自变量在模型中对应的p值,如果p值大于我们所设显著性水平,则自变量对因变量无显著的预测作用,可以考虑将该自变量剔除,再重新进行拟合
R2 可以衡量线性回归模型整体的预测拟合度,数值为0-1,越接近1越拟合
使用Statsmodels建立线性回归模型
导入Statsmodels库的模块api如下:
# 导入Statsmodels库中的api模块 import statsmodels.api as sm
pandas中将分类变量转换成分类变量的函数
函数 | 用法 | 返回值 |
get_dummies | pandas.get_dummies(Dataframe, columns=列名) | 返回一个指定列被转换成虚拟变量的新DataFrame,虚拟变量列类型为布尔类型 |
get_dummies | pandas.get_dummies(Dataframe, columns=列名, dtype=int) | 返回一个指定列被转换成虚拟变量的新DataFrame,虚拟变量列类型为int类型 |
get_dummies | pandas.get_dummies(Dataframe, columns=列名, dtype=int, drop_first=True) | 返回一个指定列被转换成虚拟变量的新DataFrame,虚拟变量列类型为int类型,并且删除第一个虚拟变量列 |
显然最后一种用法对应我们上方所讲分类变量转换虚拟变量方法
andas中检查自变量之间相关性的Series方法
函数 | 用法 | 返回值 | 是否修改原值 |
corr | Series1.corr(Series2) | 返回相关系数 | 否 |
相关系数绝对值越接近1,越相关。
大于0.8时肯导致严重共线性,应该舍弃其中一个
Pandas中检查自变量之间相关性的DataFrame方法
方法 | 用法 | 返回值 | 是否修改原值 |
corr | DataFrame.corr() | 返回DataFrame中各个变量之间相关系数DataFrame | 否 |
Statsmodels.api中添加常量列的函数
函数 | 用法 | 返回值 | 是否修改原值 |
add_constant | sm.add_constant(DataFrame) | 返回添加常量列的新DataFrame | 否 |
建立线性回归模型
通过之前的学的Pandas操作将自变量(DataFrame)和因变量(Series)整理好
# 建立线性回归模型 model = sm.OLS(Series, DataFrame) # 建立线性回归模型,对数据进行拟合 result = sm.OLS(Series, DataFrame).fit() # 对结果进行汇总展示 result.summary()
看汇总表中的coef(系数)列即可得到完整的线性回归方程。
看p-[t]列即可知道对应自变量是否对因变量有显著的预测作用
再R2 值,如果越接近1,则说明模型对因变量变化的解释程度越高
# 预测位置数据 result.predict(自变量DataFrame)
注意,使用get_dummies函数之前,应该将使用Pandas.Cetegorical方法,指定对应分类变量列的拥有值有哪些,这样可以避免预测数据缺少虚拟变量时使用不了所建立回归模型的情况,如:
DataFrame[列名] = pandas.Cetegorical(DataFrame[列名], categories=[值1, 值2, ...]) DataFrame = pandas.get_dummies(Dataframe, columns=列名)
逻辑回归
逻辑回归的输出只能为0和1之间,即[0, 1]
通过最大似然估计来找到最佳的模型参数
使用Statsmodels建立逻辑回归模型
导入Statsmodels库的模块api如下:
# 导入Statsmodels库中的api模块 import statsmodels.api as sm
对自变量(DataFrame)和因变量(Series)的整理方法与线性回归模型一致
整理好后即可建立模型,代码如下:
# 建立逻辑回归模型 model = sm.Logit(Series, DataFrame) # 建立逻辑回归模型,对数据进行拟合 result = sm.Logit(Series, DataFrame).fit() # 对结果进行汇总展示 result.summary()
需要注意的是,其中结果汇总表中的coef的列并不直接代表倍数,需要对其进行计算自然常数的次方,如其中一个值为3,则实际倍数为e3
Numpy库中有个函数exp可以直接求队友自然常数的次方,如numpy.exp(3)
如果要看模型有哪些输入变量,可以查看模型的params属性,如:model.params