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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容