一、数据搜集与准备
1.前提假设与数据构成
一个循环圈就是:提出假设后你既可以做设计数据方案的工作,又可以又可以做可行性分析的工作。最后这三者是可以彼此作用的。
用户问题的相关数据的说
有六种类型:
分类:类别划分嘛,最为典型的就是阳性阴性的分类
预测:根据已知得到未知结果(结果可以是连续值也可以是标签),最典型的是天气预测
排序/打分:对某些属性进行数量化排序,典型的是优秀员工的排序
(去)关联化:在多特征中找某特征以解释或数据降维,典型的是电影标签
特征提取:找出最有代表性的特征
聚类:据样本间相似度将样本分组
数据搜集
要了解一些基本概念:但总体、个体、样本、样本容量这些就不废话了。
样本的两个必要条件:
1.容量不能太小(>30)
2.无偏抽样(抽样的过程不受个体性质的影响)
实际上有一些常见的抽样偏差就是比如说幸存者偏差:长寿秘诀都是抽取长寿老人的生活习惯,那么是否有同样习惯的非长寿者呢?
辛普森悖论
现象描述:每个分组里面A的优势都明显,但是总体上B的优势更大。
原因:混杂因素
就是说,有些因素会对分组的总体造成影响,但是必须认识到这一点,只要适当剔除就可以了。比如书上的那个例子,很显然如果高学历和高学历相互比较、低学历彼此比较就没问题了;
2.混杂因素和A/B Testing
例题
某个汽车销售门店对过去三个月的销售业绩不满意,在找原因:
前提假设:促销方案的改变?
搜集数据:促销方案改变前、后的业绩
答:应该按照混杂因素分组:
前 | 后 | ||
品牌A | 车型A | ||
车型B | |||
车型C | |||
品牌B | 车型I | ||
车型II | |||
车型III |
A/B Testing
在主动搜集数据时,专门设计一些对比试验,即控制变量。
二、Python介绍
数据的导入与准备
那别的肯定不多讲了,就讲我不熟的了:数据的导入与准备
import numpy as np
import pandas as pd
my_data = pd.read_csv("C:/Users/86133/Desktop/titanic.csv")
#实际上吧,除了read_csv还有read_excel这种方法,后者是读xlsx文件的
my_data.info()
#这个是看数据概貌的
常规的数据操作
分组groupby&平均值mean()
x = my_data.groupby(['Pclass']).mean()
#这是先按照Pclass分组,再求平均值#部分会出现mean()后面加一个[0]的,原因是平均值结果未必是一个数值,
#可能是一个元组或者其他什么的
print(x['Fare'])
#打印Fare列的结果
删除空白行、列(axis)
my_fil_data1 = my_data.dropna(axis=0)
#axis=0时,删空值所在行
my_fil_data1.head(7)
#展示数据前七行,不写7则默认为5
my_fil_data2 = my_data.dropna(axis=1)
#axis=1时,删空值所在列
行、列基础操作
提取列与行是最起码的:
两种写法的不同,一层中括号提取的是序列,两层中括号提取的还是DataFrame!
上面那个是添加新列 ,下面的是添加新行:
行与列的合并
可以看见,之前的表里面也是有a、b、c、d四个列的,合并之后对应不上的就直接NaN。
检测缺失值 isnull()
缺失为TRUE;否则为FALSE
引申应用:求共有多少缺失值?
填充fillna
#这里就是打算用平均值去填充
mean_Age = int(my_data[['Age']].mean()[0])
#这里可以看到出现了我上面提到的可能是元组的平均值
#而且这里的平均值应该是取整的
my_dict = {'Age':mean_Age,'Cabin':'haha'}
#建立一个字典,键值如上
my_fil_data3 = my_data.fillna(my_dict)#这个地方的就是用字典内容的关系来填充
#不得不说,这个fillna函数细节很多
#inplace参数、method参数、limit参数、axis参数
#不指定任何参数
#可以是常数填充、字典填充
#指定inplace参数
True:直接修改原对象
False:创建一个副本,修改副本,原对象不变(此为默认值)
method参数的取值 : ‘pad’、 ‘ffill’、‘backfill’、 ‘bfill’、 None
pad/ffill:用前一个非缺失值去填充该缺失值
backfill/bfill:用下一个非缺失值填充该缺失值
None:指定一个值去替换缺失值(默认值)
limit参数:限制填充个数
axis参数:修改填充方向
#注意!这和删除是相反的
0:按列
1:按行
特殊的DataFrame
一种特殊的数据结构;
创建:
#一般都是通过字典的形式创建
student_scores = pd.DataFrame({'姓名':['张三']*3+['李四']*3+['王五']*3,'成绩':[10,10,10,8,8,8,5,5,5]})
#我们分析一下就会发现键是列的头部,值则是一行行的内容
#运行结果如下:
姓名 | 成绩 | |
---|---|---|
0 | 张三 | 10 |
1 | 张三 | 10 |
2 | 张三 | 10 |
3 | 李四 | 8 |
4 | 李四 | 8 |
5 | 李四 | 8 |
6 | 王五 | 5 |
7 | 王五 | 5 |
8 | 王五 | 5 |
数组的创建目前没见到,见到了就回来删掉这句话,然后写上
然后因为这个东西的一些操作和内容实在是很重要,就放一个链接吧。十分的详细!
重复项duplicated()
懒得打字,就直接上链接:
举一下老师布置的实验题的例子:
先是去除重复项,要看一看前后的对比与代码:
最后三行都是重复的
效果很好,那么接下来就是去除重复列了:
用另一个有现成代码和结果的例子
问题状况如上,名称那个是重复的
因为没有直接去除重复列的代码,所以要先转置成为行,行去重,再转回列就好了。技术上是利用drop_duplicates()与转置矩阵的做法。
这里列去重的效果是好的,我没有行去重。
隐秘的重复项
实际上,如果看到行和列不一样,不仔细检查的话,其实是看不出他们的重复关系的,比如他们之间的关系是线性关系。这样我们就需要一种方法来去重了:
线性相关分析:Dataframe.corr(method=’pearson’)求线性相关系数,当其接近1或-1,则说明两个数据存在强的线性相关或反相关,有较大冗余;等于0,则没有线性相关。
值得注意的一点就是,转置是有可能会改变数值类型的,所以如果之前做过转置操作,最好用转置之前的原表来进行线性相关性分析。
描述性统计
位置性测度
常用的位置性测度有算术平均、中位数、p百分位数、众数等。
其他几个我是很容易理解的,这里细致讲解一下p百分位数:是将所有样本值按照从小到大排序好,排序在第p%的样本取值。若将第p百分位数记为,那么样本中有且仅有p%的样本观察值小于或等于。常用的有第10百分位数、第25百分位数(又称之为第1四分位数)、第75百分位数(又称之为第3四分位数)、第90百分位数。
求解均值:
my_data[["Fare"]].mean()[0]
求解中位数:
my_data[["Fare"]].median()[0]
求解第25分位数:
my_data[["Fare"]].quantile(q=0.25)[0]
求解众数:
my_data[["Fare"]].mode().values[0,0]
离散性测度
常用的离散性测度有极差、方差、或标准差、变异系数等
这里详细解释一下,避免忘记:
极差:数据集中最大值减最小值
my_data[["Fare"]].max()[0]- my_data[["Fare"]].min()[0]
方差:每个样本值和平均值相减后平方,再一起相加,最后求得的平均
即:
my_data[["Fare"]].var()[0]
标准差就是方差开平方:
my_data[["Fare"]].std()[0]
变异系数我平时也没怎么见到过,所以这里说一下:
是标准差除以均值再乘100%的结果:
my_data[["Fare"]].std()[0]/ my_data[["Fare"]].mean()[0]
由于没有直接的代码,所以要自己记住公式
图形化描述统计
直方图:
my_data[["Fare"]].hist(bins=40,figsize=(18,5),xlabelsize=16,ylabelsize=16)
bins的参数的是将数据范围分为多少等分,可以看作X轴上有多少个柱子
figsize单位是英寸,表示要创建的图的大小
xlabelsize、ylabelsize:如果指定了这个值,则可以改变标记尺寸
grid:是否显示坐标线
箱式图不好懂,就写一下代码吧,估计也不会怎么用上去。
my_data[["Fare"]].boxplot()
相比之下,散点图就是一个很重要的图形化描述了:
核心语句是:
scatterplot=pd.plotting.scatter_matrix(my_data,alpha=0.3,figsize=(10,10),diagonal='hist',color=colors,maker='o',grid=True)
三、建模与性能评价
统计建模
概率密度函数
概率密度函数f(x)
连续随机变量X落在横轴上各值附近的可能性( X落在a点附近的无穷小邻域内的概率)
Y轴是概率密度,x轴是随机事件的取值(如大学生身高)。f(x)即概率密度是非负的,积分的面积是概率,所以曲线下积分面积总和为1(全体事件的概率之和为1)
质量密度不表示质量,而表示质量分布的密集程度
概率密度不表示概率,而表示概率分布的密集程度
概率分布函数F(x):给出取值小于某个值的概率,是概率的累加形式
概率密度函数f(x):给出了变量落在某值xi邻域内(或者某个区间内)的概率变化快慢,概率密度函数的值不是概率,而是概率的变化率,概率密度函数下面的面积才是概率
f(x=a)的物理意义:x落在a点附近的无穷小邻域内的概率,但不是落在a点的概率
正态分布
是一种比较特殊的概率分布:它是许多分布在数据集足够大之后的趋向(中心极限定理)。
其函数曲线表现为以为对称轴的钟形曲线。
性质:
均值就是期望
极端值很少
标准差决定胖瘦(大则矮胖,小则瘦高)
相关公式也写一下:
泊松分布是最重要的离散分布之一,它多出现在当X表示在一定的时间或空间内出现的事件个数这种场合
随着单位时间内随机事件发生次数的增加,泊松分布会逐渐近似于均值和方差都等于λ的正态分布。因此,只要单位时间内,随机事件的平均发生次数λ足够大(λ至少大于5,严格就是大于10),就可以将泊松分布看作是均值和方差都等于λ的正态分布
python 中的statistic模块,和scipy中的stats模块提供了大量的统计学常用函数。中心极限定理对总体的分布没有要求,我们这里从两个不同均值的泊松分布中产生随机数作为我们的数据。stats模块中poisson函数的rvs可产生服从泊松分布的随机数,其均值由loc参数加上mu参数决定,size参数则指定了产生随机数的个数
通过直方图,可明显看出,这个总体呈现一个双峰模式分布,而不是一个正态分布。但是这只是一次选取的结果,从统计学角度来说,还是不太好。所以我们将随机抽取100个样本的行为重复500次,每次都能得到一个样本的统计平均,对500个统计平均我们再求均值,发现其更接近总体的均值了。这就是我们所说的样本统计平均是总体均值的无偏估计。
图像更加接近钟形曲线。
t分布
根据中心极限定理,从总体中抽样,每组样本容量大于等于30时,样本的均值是符合正态分布的,以此可以做均值的点估计和样本的区间估计
但如果样本容量小于30时,样本的均值就不符合正态分布,我们可以将均值标准化后构造一个统计量t,统计量t是符合t分布的,在t分布中就可以做均值估计和区间估计了
标准化:
解释一下参数:
是样本的均值
是总体均值
s是标准差
n是样本容量
t分布曲线也是一个关于0对称的类似钟形曲线,样本容量越小,则越平坦,样本容量越大,则越接近正态分布
均值的区间估计:
(1)抽样出一组样本,求出这组样本的均值(1个)和标准差s(1个)。
(2)将求出的样本标准差s进行标准化,得到sigma(σ)=
(3)通过(mydata中9000个总体的均值)、、σ和t分布的自由度(样本容量n-1)这三者,可以构造t统计量和t分布曲线(t分布概率密度函数曲线)(因为、σ无论原来是什么值后来都标准化了,所以不会再影响t分布曲线,只有自由度会影响t分布曲线的形态(n越小曲线越矮胖,n越大曲线越高瘦,n趋近于无穷大时)
(4)通过t统计量的值和曲线的形态就可以求出在一定的置信度水平(alpha参数,比如95%)下,包含潜在总体均值的区间(因为有了95%,就可以算出曲线上的边界值(左区间到右区间)的位置,t统计量将以不低于95%的概率落在这个区间内,又因为t统计量由样本均值构造而成,样本均值可以代表总体均值,所以“t统计量将以不低于95%的概率落在这个区间内”就代表“总体均值也将以不低于95%的概率落在这个区间内”?
卡方分布
假设那些来源于服从标准正态分布(的正态分布) 潜在总体的n个独立随机抽样,则统计量服从自由度为n的卡方分布。
也就是说,当我们的考察量出现平方和的形式时,就可以考虑是否能够构造卡方分布了。
方差点估计
设,…,是某一个均值μ,标准差为σ的总体的一组随机样本,在样本量为n的所有随机样本中,样本方差 是 的无偏估计;
即
其中,样本方差
如果方差要做区间估计,可以怎么做呢?样本方差的定义,呈现出平方和形式,平方和形式的统计量有可能服从卡方分布。所以,当样本是来源于标准正态分布的独立随机抽样时,样本方差是n-1个独立随机变量的平方和,所以服从n-1自由度的卡方分布,从而可以借助于卡方分布来做区间估计
假设检验
定义:先提出一个假设,然后验证是否可以接受该假设
基本思想:反证法
应用:
在假定某个假设是正确的情况下,构造一个小概率事件,如果在一次试验里小概率事件竟然发生了,我们就怀疑这个假设的正确性,从而拒绝这个假设
例:
根据所考察问题的要求提出原假设H0和备择假设H1,为了检验原假设是否正确,先假定原假设是正确的情况下(比如假定女士不能分辨加奶加茶的顺序,即把女士不能分辨作为H0),构造一个小概率(设要小到5%以下才算小概率,即显著性水平为5%)事件(在假定女士不能分辨的情况下,连对5杯就是小概率事件(注意,如果是假定女士能分辨,连对5杯就不是小概率事件了,反而是连错5杯是小概率事件),然后根据抽取的样本去检验这个小概率事件是否发生。如果在一次试验里小概率事件竟然发生了(比如女士真的连对5杯),我们就怀疑原假设H0(女士不能分辨)的正确性,从而拒绝原假设(拒绝女士不能,反而认为女士有能力分辨)。如果在一次试验里小概率事件没有发生,则没有理由怀疑原假设的正确性,因此接受原假设
零假设:H0,一般是事物的惯常态,概率较大
备择假设:H1,与H0相反的假设,往往是需要努力去证明其正确性的命题,概率较小
真实性 | |||
H0 | H1 | ||
判定 | 接受H0 | II型错误 | |
拒绝H0 | I型错误 |
紫色面积α(例如0.05)是显著性水平,也是第一类错误(拒真)发生的概率上限;红色面积β(不一定是1-α)是第二类错误(取伪)发生的概率上限(统计量落到红色β这一段时,真实情况是H1,但我们却接受了假设H0(注意H0是假设,H1是真实情况不是假设),所以属于取伪错误)。
改变分界点,会发现α和β是跷跷板的关系,一个变大,另一个就缩小。
如果加大样本,H0和H1的标准差都缩小,两个钟形曲线彻底分开,那么α还在,但就不存在β了,也就是加大样本,可以同时减小第一类错误和第二类错误发生的概率(上限)
注意,这里看的是曲线下面积,0.025+0.025=0.05
关于显著性水平alpha的设置:
拒绝H0,即认为H0不对,错误拒绝的概率小;
接受H0,即认为H0正确,错误拒绝的概率大;
P值是错误拒绝H0的概率
举个例子,之前的例子中有两个泊松分布,均值分别为70和25,那么他们合起来的均值会是47.5吗?这就需要做假设来验证了。
代码:
接下来详细解释一下那些代码的作用:
为验证该假设,我从总体中随机抽取100个数构成样本集,用这个样本集构造出t统计量,根据我们上一节课所介绍,这个t统计量服从自由度为99的t分布。scipy库中stats模块的ttest_1samp函数可以返回t统计量,我们结合t分布曲线,看看这个t统计量在曲线上所处的位置
np.linspace(start,stop,num)这个函数是用来分成等间距的数组的。
num是等间距的数量,默认为50
这个例子是为了t分布的概率密度曲线图,先生成曲线图的x坐标范围(概率从0.00000001到0.99999999)序列
plt.plot(x,y)就是一个画图的函数
x、y的取值可以是元组,也可以是列表;
同索引位置的x,y组合起来就对应相关位点;
也可以有多个plot,就是一个画图板上有多个线;
plt.plot((t_statistic,t_statistic),(-0.01,0.4),'-.r')中(-0.01,0.4)是红线端点y轴坐标
ppf是百分比点函数(Percent Point Function),此函数可以由累计概率(概率密度曲线下面积)求分位点(x轴上的值)
Cdf是累积分布函数(Cumulative Distribution Function),可以由分位点(x轴上的值)求累计概率(概率密度曲线下面积),例如在t分布曲线中分位点为0时,累积概率应该是0.5
双样本t检验
独立t检验:是针对两组不相关样本(各样本量可以相等也可以不相等),检验它们在均值之间的差异,如一个班级中男生和女生的成绩是否有差异
配对t检验:针对同一组样本在不同场景下均值之间的差异,如一个班级中的女生第一次月考和第二次月考的成绩是否有差异
实例+代码:
P值是错误拒绝H0的概率!
在这里,也是抽样误差造成两组均值有差异的概率,由于这个概率高,所以认为两组间均值的差异是由抽样误差引起的,而不是两组来源于不同总体引起的
p-hacking
即便,我们拒绝空假设也还是存在着错误拒绝的风险,错误拒绝的概率 p
避免过度挖掘 -- p-hacking
回归
建立因变量y和自变量x之间的函数关系:
y -- 目标、响应
x -- 预测变量
若f是线性函数,则线性回归;
若f是非线性函数,则非线性回归;
若x包含一个特征,则一元回归
若x包含多个特征,则多元回归
线性回归
建立响应y与预测变量x之间的线性关系
可以借助于这幅图来理解一下线性回归的几何意义。我们以样本的x和y分别作为横坐标和纵坐标,绘制出二维散点图。一元线性回归就是企图找到一条直线,能够最好的反映出y与x之间的联动关系。那么,问题来了,很显然我们可以轻易地在这堆散点中画出很多条直线,可到底哪条才是最好的呢?
解决这个问题,我们需要先引入一个叫残差的概念。我们把模型得到的y值称为预测值,而对y观测得到的值称为观测值,预测值和观测值之间的差异就叫做残差
代码与实例:
Sepal萼片 Petal花瓣
Intercept 截距
coef 回归系数r*代表红色五角星
ms代表尺寸大小
metrics.mean_squared_error可以求出残差平方和的平均值,但开根号要另外求
上图的第四行才是散点的绘制;
倒数第五行是那条回归线的绘制 ;
倒数第五行是回归线上的红五角星的绘制;
值得注意的是,不是所有的回归线都是有意义的!
见下图:
上图的前者就没什么意义,后者则效果十分明显!
那么问题来了,该如何判断一个回归线是否有意义?
这就需要我们引入一个叫做决定系数()的概念:
残差平方和越小越好,所以可以认为越接近1越好
线性回归与线性相关
这是一组相当容易让人难以区分的概念:
线性相关系数r取值范围是[-1,1]:
标明的是两个变量的耦合程度,两个变量的地位平等,不可用其中一个去预测另一个
线性回归:
强调回归函数的确定, 建立两个变量之间的关系,期望得到用x预测y这样的效果
样本回归系数与样本回归系数r的关系之间的关系:
s表示的是标准差;
Logistic函数
如果不要输出连续区间的取值,只要分类结果呢?
解决方法有两种:
1.设置一个阈值,然后分类
2.放弃线性函数,采用输出概率的函数。即基于多个特征直接预测一件事情的发生概率。
一图小总结
朴素贝叶斯
X代表我们能观察到的属性,即观察变量;C代表一个潜在特性,比如说分类的类别。我们希望通过能观察的属性X,来给出潜在特性C取某值的概率。当引入条件概率后,观察到X时,取C类的概率就被记为符号P(C|X),又称为C的后验概率。
由贝叶斯定理有C的后验概率等于在C类中观察到X的条件概率,乘以总体中C类发生的概率,再除以在总体中观察到X的概率。这里,我们还常常把总体中C类发生的概率P(C)称为C的先验概率,在C类中观察到X的条件概率称为似然性likelihood。
举例:
千万注意!不是说张三检测为阳性那他患病概率是99%!
正确的计算应该如下:
上图是有一个公式的(条件概率公式):
所以可以理解为:
P(x+|患病)P(患病)=又患病又检测为阳性的概率
P(x+|不患病)P(不患病)=又不患病又检测为阳性的概率
二者相加就是检测为阳性的概率
X检验的正确率从表格看起来都是99%的啊,可为什么张三在检验为阳性后患病的概率却依然这么小呢?
这是因为K疾病在该地区的发生率本来就很小啊(0.1%),没做X检验时,张三患K疾病的概率只有千分之一,当我们给出X检验结果阳性后,张三患病概率9%,已经提高到原来的90倍了,这个提高正是因为X检验结果阳性这一信息的加入而带来的
如果实践中真的出现这样的情况,那么,医生就应该补充独立检查,即不受x检验的影响
值得注意的是,这里患病的概率发生了改变!