Python数据分析 | 数据描述性分析
目录:
- 数据准备
- 类别型数据分析
- 数值型数据分析
- 查看数据分布
- 查看异常值
- 描述性统计分析
- 数据分布模型
- 相关性分析
1.数据准备
首先导入一些必要的数据处理包和可视化的包,读文档数据并通过前几行查看数据字段。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
# 设置中文识别
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
# matplotlib.style.use('bmh')
matplotlib.style.use('seaborn-white')
data = pd.read_excel(r"C:/Users/asus/Desktop/match_result.xlsx", encoding='utf-8')
# 查看数据样例信息
data.head()
数据示例
对于我的数据来说,由于数据量比较大,因此对于缺失值可以直接做删除处理。
# 去除缺失值
data.dropna(inplace=True)
得到最终的数据,并提取需要的列作为特征。
result = data['result']
inventor_num = data['inventor_num']
inventor_patent_num = data['inventor_patent_num']
famliy = data['famliy']
assignee_patent_num = data['assignee_patent_num']
claims_num = data['claims_num']
2.类别型数据分析
对类别数据进行统计:
- count:指定字段的非空总数。
- unique:该字段中保存的值类型数量,比如性别列保存了男、女两种值,则unique值则为2。
- top:数量最多的值。
- freq:数量最多的值的总数。
object_result = data.describe(include=['object'])
类别型字段包括location、cpc_class、pa_country、pa_state、pa_city、assignee六个字段,其中:
- location有5,215个唯一值,每个值出现的频次都是1,说明这5,215个专利没有重复值;
- cpc_class有1436个唯一值,其中最高的是有151个专利来自“A-61-k-31”这一分类;
- pa_country有2个唯一值,说明所有申请的专利来自两个不同国家,其中有5,174个专利(占99.21%)来自美国;
- pa_state有49个唯一值,其中有790个专利来自Virginia州;
- pa_city有635个唯一值,其中有541个专利来自Washington;
- pa_assignee有2876个唯一值,其中有68个专利都来自IBM公司。
3.数值型数据分析
单变量统计描述是数据分析中最简单的形式,其中被分析的数据只包含一个变量,不处理原因或关系。单变量分析的主要目的是通过对数据的统计描述了解当前数据的基本情况,并找出数据的分布模型。
单变量数据统计描述从集中趋势上看,指标有:均值,中位数,分位数,众数;从离散程度上看,指标有:极差、四分位数、方差、标准差、协方差、变异系数,从分布上看,有偏度,峰度等。需要考虑的还有极大值,极小值(数值型变量)和频数,构成比(分类或等级变量)。
查看数据分布
对于数值型数据,首先希望了解一下数据取值范围的分布,因此可以用统计图直观展示数据分布特征,如:柱状图、正方图、箱式图、频率多边形和饼状图。
fig = plt.figure(figsize=(16,8))
plt.subplot(231)
plt.plot(inventor_num.index, inventor_num)
plt.ylabel("inventor number")
plt.xlabel("application id")
plt.title('inventor number distribution')
plt.show()
按照发布的时间先后作为横坐标,数值范围的分布情况如图所示.
直方图还可以根据最终分类的结果查看这些数值数据在不同类别上的分布统计。
fig = plt.figure(figsize=(16,8))
plt.subplot(231)
df1 = data[data['result']==1]
plt.scatter(df1.index, df1['inventor_num'], label="success")
df2 = data[data['result']==0]
plt.scatter(df2.index, df2['inventor_num'], label="fail")
plt.ylabel("inventor number")
plt.xlabel("application id")
plt.title('inventor number of different class')
plt.legend()
plt.grid()
plt.show()
不同类别下的分布
描述性统计分析
def status(x) :
return pd.Series([x.count(),x.sum(),x.min(),x.idxmin(),x.quantile(.25),x.median(),
x.quantile(.75),x.mean(),x.max(),x.idxmax(),x.mode(),x.mad(),x.var(),
x.std(),x.skew(),x.kurt()],index=['非空数','求和','最小值','最小值位置','25%分位数',
'中位数','75%分位数','均值','最大值','最大值位数','众数','平均绝对偏差','方差','标准差','偏度','峰度'])
df = pd.DataFrame(np.array([result,inventor_num]).T, columns=['result','inventor_num'])
df.apply(status)
查看异常值
箱线图可以更直观的查看异常值的分布情况。
fig = plt.figure(figsize=(16,8))
plt.subplot(231)
inventor_num.plot.box(vert=False, grid = True)
plt.xlabel("application id")
plt.title('inventor number of different class')
plt.show()
箱线图
异常值指数据中的离群点,此处定义超出上下四分位数差值的1.5倍的范围为异常值,查看异常值的位置。
# 上四分位数
q3 = claims_num.quantile(q=0.75)
#下四分位数
q1 = claims_num.quantile(q=0.25)
# 四分位差
iqr = q3-q1
print("上四分位数:{}\n下四分位数:{}\n四分位差{}".format(q3,q1,iqr))
df_tm_01 = claims_num[(claims_num>q3+1.5*iqr) | (claims_num<q1-1.5*iqr)]
print("异常值:\n{}".format(df_tm_01))
数据分布模型——检验是否符合正态分布
参考:
python数据分析之数据分布 - yancheng111 - 博客园
python数据统计分析 - 简书
方法1 :scipy.stats.normaltest (a, axis=0)
- 参数:a - 待检验数据;axis - 可设置为整数或置空,如果设置为 none,则待检验数据被当作单独的数据集来进行检验。该值默认为 0,即从 0 轴开始逐行进行检验。
- 返回:k2 - s^2 + k^2,s 为 skewtest 返回的 z-score,k 为 kurtosistest 返回的 z-score,即标准化值;p-value - p值 (p>0.05 符合正态分布) 返回结果 p-value=0.00000000e+000,比指定的显著水平(一般为5%)小,则拒绝假设:x不服从正态分布。
scipy.stats.normaltest(claims_num)
方法2 Shapiro-Wilk test
- 方法:scipy.stats.shapiro(x)
- 官方文档:SciPy v1.1.0 Reference Guide
- 参数:x - 待检验数据
- 返回:W - 统计数;p-value - p值
scipy.stats.shapiro(claims_num)
方法3: scipy.stats.kstest
科尔莫戈罗夫检验(Kolmogorov-Smirnov test),检验样本数据是否服从某一分布,仅适用于连续分布的检验。下例中用它检验正态分布。
- 方法:scipy.stats.kstest (rvs, cdf, args = ( ), N = 20, alternative =‘two-sided’, mode =‘approx’)
- 官方文档:SciPy v0.14.0 Reference Guide
- 参数:rvs - 待检验数据,可以是字符串、数组;
- cdf - 需要设置的检验,这里设置为 norm,也就是正态性检验;
- alternative - 设置单双尾检验,默认为 two-sided
- 返回:W - 统计数;p-value - p值
scipy.stats.kstest(claims_num,'norm')
在使用k-s检验该数据是否服从正态分布,提出假设:x从正态分布。最终返回的结果,p-value=0.9260909172362317,比指定的显著水平(一般为5%)大,则我们不能拒绝假设:x服从正态分布。这并不是说x服从正态分布一定是正确的,而是说没有充分的证据证明x不服从正态分布。因此我们的假设被接受,认为x服从正态分布。如果p-value小于我们指定的显著性水平,则我们可以肯定的拒绝提出的假设,认为x肯定不服从正态分布,这个拒绝是绝对正确的。
方法4: Anderson-Darling test
- 方法:scipy.stats.anderson (x, dist =‘norm’ )
该方法是由 scipy.stats.kstest 改进而来的,可以做正态分布、指数分布、Logistic 分布、Gumbel 分布等多种分布检验。默认参数为 norm,即正态性检验。 - 官方文档:SciPy v1.1.0 Reference Guide
- 参数:x - 待检验数据;dist - 设置需要检验的分布类型
- 返回:statistic - 统计数;critical_values - 评判值;significance_level - 显著性水平
scipy.stats.anderson(claims_num,dist="norm")
4.相关性分析
衡量两个变量的相关性至少有以下三个方法:
- pearson:衡量两个数据集合是否在一条线上(线性关系)
- kendall:有序变量相关性
- spearman:根据变量排列位置的等级相关性,多用于交叉数据
皮尔森相关系数(Pearson correlation coefficient)
是反应俩变量之间线性相关程度的统计量,用它来分析正态分布的两个连续型变量之间的相关性。常用于分析自变量之间,以及自变量和因变量之间的相关性。
from scipy import stats
import scipy
# 方法一
data['result'].corr(data['inventor_num'], method='pearson')
# 方法二
stats.pearsonr(result, inventor_num)
返回结果的第一个值为相关系数表示线性相关程度,其取值范围在[-1,1],绝对值越接近1,说明两个变量的相关性越强,绝对值越接近0说明两个变量的相关性越差。当两个变量完全不相关时相关系数为0。第二个值为p-value,统计学上,一般当p-value<0.05时,可以认为两变量存在相关性。
斯皮尔曼等级相关系数(Spearman’s correlation coefficient for ranked data )
,它主要用于评价顺序变量间的线性相关关系,在计算过程中,只考虑变量值的顺序(rank, 秩或称等级),而不考虑变量值的大小。常用于计算类型变量的相关性。
# spearman 相关系数
data['result'].corr(data['inventor_num'], method='spearman')
stats.spearmanr(result,inventor_num)
返回结果的第一个值为相关系数表示线性相关程度,本例中correlation趋近于1表示正相关。第二个值为p-value,p-value越小,表示相关程度越显著。
kendall
:
# kendall 相关系数
data['result'].corr(data['inventor_num'], method='kendall')
也可以直接对整体数据进行相关性分析,一般来说,相关系数取值和相关强度的关系是:0.8-1.0 极强 0.6-0.8 强 0.4-0.6 中等 0.2-0.4 弱 0.0-0.2 极弱。
data.corr()
连续变量的相关系数(corr)