from https://zhuanlan.zhihu.com/p/369830612
前言
这里将介绍统计学的基本知识,也是从事数据分析工作必须所了解到的,希望对你有所帮助。
目录
- 柱状图
- 离群值
- 箱线图 Box Plot
- 描述性统计
- 累计分布函数CDF
- 效应值
- 变量之间的关系
- 相关性
- 协方差
- 皮尔逊相关系数
- Spearman’s Rank Correlation
- 均值着与中值
- 假设检验
- 正态(高斯)分布和z分数
- 注:演示的数据来自Breast Cancer Wisconsin (Diagnostic) Data Set(文末可获取)
柱状图Histogram
- 每个值在数据集中出现的次数。
- 这种描述称为变量的分布
- 最常用的表示变量分布的方法是直方图,即显示每个值出现频率的图。
- 频数=每个值出现的次数 例如:[1,1,1,1、2、2、2]。1的频数是4,2的频数是3
m = plt.hist(data[data["diagnosis"] == "M"].radius_mean,bins=30,fc = (1,0,0,0.5),label = "Malignant")
b = plt.hist(data[data["diagnosis"] == "B"].radius_mean,bins=30,fc = (0,1,0,0.5),label = "Bening")
plt.legend()
plt.xlabel("Radius Mean Values")
plt.ylabel("Frequency")
plt.title("Histogram of Radius Mean for Bening and Malignant Tumors")
plt.show()
frequent_malignant_radius_mean = m[0].max()
index_frequent_malignant_radius_mean = list(m[0]).index(frequent_malignant_radius_mean)
most_frequent_malignant_radius_mean = m[1][index_frequent_malignant_radius_mean]
print("Most frequent malignant radius mean is: ",most_frequent_malignant_radius_mean)
让我们看看其他结论:
- 从这张图中可以看出恶性肿瘤的平均半径大多大于良性肿瘤的平均半径。
- Bening分布(图中绿色部分)近似为钟形,即正态分布(高斯分布)。
- 可以很容易找到最常见的恶性平均半径
离群值Outliers
- 当你看直方图时,你可以看见在Bening分布中有一些罕见的值(图中绿色)。
- 这些值可能是错误或罕见事件。 这些错误和罕见事件可以称为离群值。
- 计算离群值:
- 首先我们需要计算第一个四分位数(Q1)(25%)
- 然后找到IQR(四分位数范围)= Q3-Q1
- 最后计算Q1 – 1.5IQR 和 Q3 + 1.5IQR
- 任何超出这个范围的都是离群值
- 我们来写特征平均半径的肿瘤分布的代码
data_bening = data[data["diagnosis"] == "B"]
data_malignant = data[data["diagnosis"] == "M"]
desc = data_bening.radius_mean.describe()
Q1 = desc[4]
Q3 = desc[6]
IQR = Q3-Q1
lower_bound = Q1 - 1.5*IQR
upper_bound = Q3 + 1.5*IQR
print("Anything outside this range is an outlier: (", lower_bound ,",", upper_bound,")")
data_bening[data_bening.radius_mean < lower_bound].radius_mean
print("Outliers: ",data_bening[(data_bening.radius_mean < lower_bound) | (data_bening.radius_mean > upper_bound)].radius_mean.values)
Anything outside this range is an outlier: ( 7.645000000000001 , 16.805 )
Outliers: [ 6.981 16.84 17.85 ]
Box Plot箱线图
你也可以从盒图中看到异常值 在Bening均值中有3个离群点,在箱形图中有3个离群点。
melted_data = pd.melt(data,id_vars = "diagnosis",value_vars = ['radius_mean', 'texture_mean'])
plt.figure(figsize = (15,10))
sns.boxplot(x = "variable", y = "value", hue="diagnosis",data= melted_data)
plt.show()
描述性统计
- Mean
- 方差:分布的散布
- 标准差方差的平方根
- 让我们来看看bening肿瘤辐射平均值的描述性统计
print("mean: ",data_bening.radius_mean.mean())
print("variance: ",data_bening.radius_mean.var())
print("standart deviation (std): ",data_bening.radius_mean.std())
print("describe method: ",data_bening.radius_mean.describe())
-----
mean: 12.14652380952381
variance: 3.170221722043872
standart deviation (std): 1.7805116461410389
describe method: count 357.000000
mean 12.146524
std 1.780512
min 6.981000
25% 11.080000
50% 12.200000
75% 13.370000
max 17.850000
Name: radius_mean, dtype: float64
- 累积分布函数是变量取值小于等于x的概率。P(X <= x)
- 让我们用cdf图来解释bening半径的平均值
- 在图中,P(12 < X)是多少?答案是0.5。变量取小于或等于12(半径平均值)的概率是0.5。
- 可以使用两种不同的方法绘制cdf
plt.hist(data_bening.radius_mean,bins=50,fc=(0,1,0,0.5),label='Bening',normed = True,cumulative = True)
sorted_data = np.sort(data_bening.radius_mean)
y = np.arange(len(sorted_data))/float(len(sorted_data)-1)
plt.plot(sorted_data,y,color='red')
plt.title('CDF of bening tumor radius mean')
plt.show()
效应值effect size
- 描述性统计的其中一种。
- 它描述了一个效应的大小,这是量化两组之间差异的简单方法。
- 换句话说,效应大小强调的是差异的大小
- 使用科恩效应大小
- Cohen认为,如果d(效应量)= 0.2,则为小效应量,d = 0.5中效应量,d = 0.8大效应量。
- 让我们来比较bening平均值和恶性bening平均值之间的影响大小
- 效应量是2.2,太大了,说明两组和我们预期的不一样,因为我们的小组是良性半径平均值和恶性半径平均值
mean_diff = data_malignant.radius_mean.mean() - data_bening.radius_mean.mean()
var_bening = data_bening.radius_mean.var()
var_malignant = data_malignant.radius_mean.var()
var_pooled = (len(data_bening)*var_bening +len(data_malignant)*var_malignant ) / float(len(data_bening)+ len(data_malignant))
effect_size = mean_diff/np.sqrt(var_pooled)
print("Effect size: ",effect_size)
Effect size: 2.2048585165041428
变量之间的关系
- 我们可以说两个变量是相互关联的,如果其中一个给出其他变量的信息
- 例如,价格和距离。如果你乘出租车去长途,你要付更多的钱。因此我们可以说,价格和距离是正相关的。
- 散点图 最简单的方法来检查两个变量之间的关系 让我们看看半径均值和面积均值之间的关系
- 在散点图中可以看到,当半径平均值增加时,面积平均值也会增加。因此,它们之间是正相关的。
- area_mean与fractal_dimension_se没有相关性。因为当area_mean发生变化时,fractal_dimension_se不受area_mean概率的影响
plt.figure(figsize = (15,10))
sns.jointplot(data.radius_mean,data.area_mean,kind="regg")
plt.show()
# Also we can look relationship between more than 2 distribution
sns.set(style = "white")
df = data.loc[:,["radius_mean","area_mean","fractal_dimension_se"]]
g = sns.PairGrid(df,diag_sharey = False,)
g.map_lower(sns.kdeplot,cmap="Blues_d")
g.map_upper(plt.scatter)
g.map_diag(sns.kdeplot,lw =3)
plt.show()
相关性
- 两个变量之间关系的强度
- 让我们看看所有特征之间的相关性。
f,ax=plt.subplots(figsize = (18,18))
sns.heatmap(data.corr(),annot= True,linewidths=0.5,fmt = ".1f",ax=ax)
plt.xticks(rotation=90)
plt.yticks(rotation=0)
plt.title('Correlation Map')
plt.savefig('graph.png')
plt.show()
- 包含很多数字的巨大矩阵
- 这些数的范围是-1到1。
- 1的意思是半径均值和面积均值这两个变量是正相关的
- 零的意义是半径均值等变量与分形维数se之间没有相关性
- -1的意思是半径均值和fractal_dimension_se均值这两个变量呈负相关。实际上它们之间的相关性不是-1,而是-0。3但是如果相关性的符号是负的那就意味着存在负相关性。
协方差
- 协方差是对两个变量一起变化的趋势的度量
- 所以当两个向量相同时协方差是最大的
- 如果它们是正交的,协方差是零。
- 如果方向相反,协方差是负的
- 让我们看看半径均值和面积均值之间的协方差。然后看半径均值和fractal_dimension_se
np.cov(data.radius_mean,data.area_mean)
print("Covariance between radius mean and area mean: ",data.radius_mean.cov(data.area_mean))
print("Covariance between radius mean and fractal dimension se: ",data.radius_mean.cov(data.fractal_dimension_se))
Covariance between radius mean and area mean: 1224.4834093464565
Covariance between radius mean and fractal dimension se: -0.0003976248576440626
皮尔逊相关系数
- 协方差除以变量的标准偏差
- 让我们看看半径均值和面积均值之间的皮尔逊相关性
- 首先让我们使用.corr()方法,我们实际上在相关部分使用。在相关部分我们实际上使用了皮尔逊相关:)
- p1和p2是一样的。在p1中我们使用corr()方法,在p2中我们使用pearson相关性的定义(cov(A,B)/(std(A)*std(B))))
- 我们期望面积均值和面积均值之间的皮尔逊相关性是1,这意味着它们是相同的分布
- 面积均值和radius_mean之间的皮尔逊相关系数为0.98,说明它们之间是正相关的,两者之间的关系非常高。
- 更明确地说,我们在相关部分和皮尔逊相关部分所做的是相同的。
p1 = data.loc[:,["area_mean","radius_mean"]].corr(method= "pearson")
p2 = data.radius_mean.cov(data.area_mean)/(data.radius_mean.std()*data.area_mean.std())
print('Pearson correlation: ')
print(p1)
print('Pearson correlation: ',p2)
Pearson correlation:
area_mean radius_mean
area_mean 1.000000 0.987357
radius_mean 0.987357 1.000000
Pearson correlation: 0.9873571700566128
Spearman’s Rank Correlation
- 如果变量之间的关系是线性的,并且变量大致是正常的,皮尔逊相关是有效的。但如果存在异常值,它就不是稳健的
- 为了计算spearman的相关性,我们需要计算每个值的秩
ranked_data = data.rank()
spearman_corr = ranked_data.loc[:,["area_mean","radius_mean"]].corr(method= "pearson")
print("Spearman's correlation: ")
print(spearman_corr)
------
Spearman's correlation:
area_mean radius_mean
area_mean 1.000000 0.999602
radius_mean 0.999602 1.000000
- 斯皮尔曼相关系数略高于皮尔逊相关系数
- 如果分布之间的关系是非线性的,spearman的相关倾向于更好地估计关系的强度
- 皮尔逊相关可以受到离群值的影响。斯皮尔曼的相关性更强。
均值VS中位数
- 有时我们需要用中位数而不是平均值。我将用一个例子来解释为什么我们需要使用中位数
- 假设有10个人在一家公司工作。如果这家公司的工资平均水平低于5英镑,他将要求加薪
salary = [1,4,3,2,5,4,2,3,1,500]
print("Mean of salary: ",np.mean(salary))
Mean of salary: 52.5
- 平均工资是52.5,所以老板认为我给了员工很多工资。也不会给他们加薪。然而,正如你所知道的,这是不公平的,500(薪水)在这个薪水列表中是异常的。
- 中值避免了离群值
print("Median of salary: ",np.median(salary))
Median of salary: 3.0
- 现在工资的中位数是3,低于5,员工会加薪,这种情况是公平的:)
假设检验
- 古典假设检验
- 我们想回答这个问题:“给定一个样本和一个明显的效应,偶然看到这种效应的概率是多少?”
- 第一步是通过选择一个检验统计量来量化表观效应的大小。检验统计量的自然选择是两组间均值的差异。
- 第二步是定义零假设,即基于显性效应不真实的假设建立的系统模型。零假设是统计学中使用的一种假设,它提出在一组给定的观察结果中不存在统计学意义。零假设是人们试图否定它的假设。替代假设是人们想要证明它的假设。
- 第三步是计算p值,即如果零假设为真,看到明显效果的概率。假设我们用零假设检验。然后计算p值。
- 如果p值小于或等于一个阈值,我们拒绝零假设。如果p值较低,则该效应在统计学上是显著的,这意味着它不太可能是偶然发生的。因此,我们可以说,这种效应更有可能出现在较大的人群中。
- 让我们来举个例子。零假设:世界是平的。另一种假设:地球是圆的。几位科学家开始否定零假设。这最终导致了对零假设的反思和对备择假设的接受。
- 其他的例子。“这个效果是真实的”这是零假设。基于这一假设,我们计算了表观效应的概率。这就是p值。如果p值很低,我们认为零假设不太可能是正确的。
- 现在让我们来举个例子:
- 我想知道半径均值和面积均值之间有关系吗?我的零假设是“在肿瘤群体中,半径均值和面积均值之间的关系为零”。
- 现在我们需要反驳这个零假设,以证明半径均值和面积均值是相关的。(实际上我们从之前的经验中就知道了)
- 让我们找到p值(概率值)
statistic, p_value = stats.ttest_rel(data.radius_mean,data.area_mean)
print('p-value: ',p_value)
p-value: 1.5253492492559045e-184
- P值几乎为零,所以我们可以拒绝零假设
正态(高斯)分布和z分数
- 又称钟形分布
- 通过一个例子了解高斯分布
- 经典的例子是IQ分数的高斯分布。
- 世界上平均智商是110。
- 很少有人是超级聪明的,他们的智商超过110。可能是140或150,但很少见。
- 也有很少的人有低智商,他们的智商低于110。可能是40或50,但很少见。
- 根据这些信息,我们可以说智商的平均值是110。标准偏差是20。
- 均值和标准差是正态分布的参数。
- 让我们创建100000个样本,并用直方图将其可视化。
# parameters of normal distribution
mu, sigma = 110, 20 # mean and standard deviation
s = np.random.normal(mu, sigma, 100000)
print("mean: ", np.mean(s))
print("standart deviation: ", np.std(s))
# visualize with histogram
plt.figure(figsize = (10,7))
plt.hist(s, 100, normed=False)
plt.ylabel("frequency")
plt.xlabel("IQ")
plt.title("Histogram of IQ")
plt.show()
- 从柱状图可以看出,大多数人都聚集在110附近,这是我们正态分布的平均值
- 然而,什么是“最”?我在前面的句子中提到的?如果我想知道有多少人的智商分数应该在80到140之间呢?
- 我们用z分数来回答这个问题
* z = (x - mean)/std
* z1 = (80-110)/20 = -1.5
* z2 = (140-110)/20 = 1.5
* Distance between mean and 80 is 1.5std and distance between mean and 140 is 1.5std.
* If you look at z table, you will see that 1.5std correspond to 0.4332
* Lets calculate it with 2 because 1 from 80 to mean and other from mean to 140
* 0.4332 * 2 = 0.8664
* 86.64 % of people has an IQ between 80 and 140.
- 智商低于80的人应该占多大比例? Z = (110-80)/20 = 1.5
- 让我们看看z分数0.4332的表格。43.32%的人智商在80至平均(110)之间。
- 如果我们用50%减去43.32%,我们就能发现IQ分数低于80的人的百分比。
- 50 – 43.32 = 6.68。因此,6.68%的人智商低于80分。
总结
我们从目录出发,并结合数据实战演示了统计学中各种方法,并给出了一些有用的结论,这些技巧是工作学习中可能会经常用到的。