Kaggle统计分析入门
本文是针对kaggle上面一份肿瘤数据的统计分析,适合初学者快速入门:
- 基于直方图的频数统计
- 基于四分位法的异常点定位分析
- 描述统计分析
- 基于累计分布函数的分析
- 两两变量间分析
- 相关性分析…
数据集
数据地址为:https://www.kaggle.com/code/kanncaa1/statistical-learning-tutorial-for-beginners/notebook
最初的数据来自UCI官网:https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic)
导入库
In [1]:
1 | import pandas as pd |
In [2]:
基本信息
In [3]:
1 | df.shape |
Out[3]:
1 | (569, 33) |
In [4]:
1 | df.isnull().sum() |
Out[4]:
1 | id 0 |
删除两个对分析无效的字段:
In [5]:
1 | df.drop(["Unnamed: 32", "id"],axis=1,inplace=True) |
剩余的全部的字段:
In [6]:
1 | columns = df.columns |
Out[6]:
1 | Index(['diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean', |
分析1:直方图-Histogram
直方图统计的是每个值出现的频数
In [7]:
1 | # radius_mean:均值 |
小结:
- 恶性肿瘤的半径平均值大多数是大于良性肿瘤
- 良性肿瘤(绿色)的分布大致上呈现钟型,符合正态分布
分析2:异常离群点分析
根据数据的4分位数来确定异常点。
In [8]:
1 | data_b = df[df["diagnosis"] == "B"] # 良性肿瘤 |
In [9]:
1 | # 异常点 |
分析3:箱型图定位异常
从箱型图能够直观地看到数据的异常点
In [10]:
1 | # 基于Plotly |
1 | # 基于seaborn |
分析4:描述统计分析describe
良性肿瘤数据data_b的描述统计信息:
1 | # 针对肿瘤半径:radius_mean |
分析5:CDF分析(CDF累计分布函数)
CDF:Cumulative distribution function,中文名称是累计分布函数,表示的是变量取值小于或者等于x的概率。P(X <= x)
In [15]:
1 | plt.hist(data_b.radius_mean, |
分析6:效应值分析-Effect size
Effect size描述的是两组数据之间的差异大小。值越大,说明两组数据的差异越明显。
一般规定为:
- <0.2:效应小
- [0.2,0.8]:中等效应
- >0.8:大效应
在这里分析的是良性和恶性肿瘤的radius_mean的值差异性
In [16]:
1 | diff = data_m.radius_mean.mean() - data_b.radius_mean.mean() |
很明显:这两组数据之间存在明显的效应;也和之间的结论吻合:良性肿瘤和恶性肿瘤的半径均值彼此间差异大
分析7:两两变量间的关系
两个变量
使用散点图结合柱状图来表示
In [17]:
1 | plt.figure(figsize = (15,10)) |
可以看到这两个特征是正相关的
多个变量
In [18]:
1 | sns.set(style="white") |
分析8:相关性分析-热力图
In [19]:
1 | corr = df.corr() # 相关系数 |
分析9:协方差分析
协方差是衡量两个变量的变化趋势:
- 如果它们变化方向相同,协方差最大
- 如果它们是正交的,则协方差为零
- 如果指向相反的方向,则协方差为负数
In [20]:
1 | # 协方差矩阵 |
Out[20]:
1 | array([[1.24189201e+01, 1.22448341e+03], |
In [21]:
1 | # 两个变量的协方差值 |
Out[21]:
1 | 1224.483409346457 |
In [22]:
1 | # 两个变量的协方差值 |
Out[22]:
1 | -0.0003976248576440629 |
分析10:Pearson Correlation
假设有两个数组,A、B,则皮尔逊相关系数定义为:
Pearson=cov(A,B)std(A)∗std(B)
In [23]:
1 | p1 = df.loc[:,["area_mean","radius_mean"]].corr(method= "pearson") |
In [24]:
1 | print('Pearson Correlation Value: \n', p2) |
分析11:Spearman’s Rank Correlation
Spearman’s Rank Correlation,中文可以称之为:斯皮尔曼下的排序相关性。
皮尔逊相关系数在求解的时候,需要变量之间是线性的,且大体上是正态分布的
但是如果当数据中存在异常值,或者变量的分布不是正态的,最好不要使用皮尔逊相关系数。
在这里采用基于斯皮尔曼的排序相关系数。
In [25]:
1 | df_rank = df.rank() |
Out[25]:
area_mean | radius_mean | |
---|---|---|
area_mean | 1.000000 | 0.999602 |
radius_mean | 0.999602 | 1.000000 |
对比皮尔逊相关系数和斯皮尔曼系数:
- 现有数据下,斯皮尔曼相关性比皮尔逊相关系数要大一点
- 当数据中存在异常离群点的时候,斯皮尔曼相关性系数拥有更好的鲁棒性