美文网首页
Python数据分析 | 数据描述性分析

Python数据分析 | 数据描述性分析

作者: cathy1997 | 来源:发表于2020-01-09 16:31 被阅读0次

目录:

  • 数据准备
  • 类别型数据分析
  • 数值型数据分析
    • 查看数据分布
    • 查看异常值
    • 描述性统计分析
    • 数据分布模型
  • 相关性分析

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)

相关文章

  • 数据分析方法

    一、数据分析分类:描述性数据分析、探索性数据分析、验证性数据分析。 1、描述性数据分析:1)对比分析;2)平均分析...

  • 数据分析方法概括

    数据分析大致可以分为描述性分析、诊断性分析、预测性分析,同样的数据分析的方法论也大致分为:描述性数据分析、数理统计...

  • 谁说菜鸟不会数据分析-入门篇(第1章 数据分析那些事儿)

    1. 何为数据分析及数据分析的作用 1. 1数据分析的类别 1.1.1 描述性数据分析(初级数据分析) 对比分析法...

  • 数据分析入门

    一:入门介绍 #统计学:将数据分析划分为 描述性数据分析(初级)、探索性数据分析、验证性数据分析# #数据分析在企...

  • 谁说菜鸟不懂数据分析-读书整理

    数据分析简述: 数据分析分类及作用: 分类:描述性分析,探索性分析,验证性分析 作用:现状分析,原因分析,...

  • Python数据分析 | 数据描述性分析

    目录: 数据准备 类别型数据分析 数值型数据分析查看数据分布查看异常值描述性统计分析数据分布模型 相关性分析 1....

  • 数据分析

    数据分析类别 描述性数据分析:属于初级数据分析,常用方法有对比分析法、平均分析法、交叉分析法等。 探索性数据分析:...

  • 200个数据分析方法、模型和案例

    最近有很多朋友找我要数据分析的案例,希望获得包括需求分析、数据清洗、数据采集、基本的描述性分析和探索性分析、数据可...

  • 数据分析(谁说菜鸟不会数据分析笔记)一

    一、数据分析简介 数据分析:描述性、探索性、验证性 作用:现状分析、原因分析、预测分析 步骤: 1、明确分析目的和...

  • 谁说菜鸟不会数据分析-读书笔记

    第一章:数据分析是神马 数据分析分类: 1、数据分析分类: 描述性数据分析:常见方法:对比分析法、平均分析法、交叉...

网友评论

      本文标题:Python数据分析 | 数据描述性分析

      本文链接:https://www.haomeiwen.com/subject/fjreactx.html