狭义数据分析1

抽样理论

集中趋势:均值、中位数、分位数、众数
离中趋势:标准差、方差
数据分布:偏态、峰态、正态分布
抽样理论:抽样误差、抽样精度

均值 df.mean()
计算:数字加起来除以总量
作用:经常用来衡量一些连续值,尤其是分布比较规律、均匀的连续值的集中趋势。

中位数 df.median()
作用:衡量异常值,有一些特别大或者特别小,用中位数衡量异常值的集中趋势。

众数 df.mode()
作用:用在离散值的集中趋势衡量。

分位数 df.quantile()
概述:就是把数据从小到大排列,然后切分成等份的数据点,最常用是四分位数。
计算:总数n,Q1位置=(n+1)*0.25,Q2位置=(n+1)*0.5,Q3位置=(n+1)*0.75
作用:配合其他一起使用

离中趋势:df.std() df.var()
是数据离散程度的衡量,衡量的量有标准差和方差
方差或标准差越大就表示数据越离散,越小就表示数据越聚拢

偏态系数: df.skew()
数据平均值偏离状态的一种衡量,要注意的是这里偏态的偏指的是偏离平均值,通常一个对称性的数据来讲,他的中位数和平均值是非常接近的。但有的时候数据并非是对称分布的,这样中位数和均值就会差得比较多,这样的分布就是有偏态的分布。均值比中位数大就是正偏。如果算出来的偏态系数是负的,就是负偏,那就是处于一个比较好的状态,大多数人比较满意的状态。

峰态系数:
数据集中程度的衡量,这个值越大,顶就会越尖,这个值越小,分布就会更平缓一些。正太分布的峰态系数是3,所以经常有算法将这个值减去3,将正太分布的系数定为0也是可以的。如果有一个分布的峰态系数 1<K<5 也就是说他和正态分布的峰态系数相差大于了2,那么基本可以断定这个分布不是正太分布了。所以峰态系数主要的作用就是可以直接否定一个分布不是正态分布。

三大分布:
卡方分布,t分布,f分布

卡方分布:
几个变量都是标准正态分布(均值为0,方差为1),如果几个标准正态分布,它的平方和满足一个分布,那么这个分布就是卡方分布。

t分布:
正态分布的一个随机变量除以一个服从卡方分布的变量就是t分布。
作用:t分布经常用来根据小样本,来估计成正态分布且方差未知的总体的均值

f分布:
是由构成两个服从卡方分布的随机变量的比构成的,就是两个卡方分布的商。

正态分布的定义
有几种不同的方法用来说明一个随机变量。最直观的方法是概率密度函数,这种方法能够表示随机变量每个取值有多大的可能性。累积分布函数是一种概率上更加清楚的方法

抽样理论
抽样分为重复抽样和非重复抽样(抽完以后不放回)
抽样方式:完全随机抽样,等差距抽样(根据某个属性,从低到高进行排列,等差距的进行抽样),分类分层抽样(根据各个类别的比例进行抽样,保证样本在这个类别下的抽样与总体是一致的)
重复抽样的误差、非重复抽样的误差都有对应的计算公式
在这里插入图片描述

应用实例1----根据平均误差和平均值估计准确的平均值:
在这里插入图片描述
因为是放回的抽样,根据公式算出了误差 μ
在这里插入图片描述
因为有95%的概率保证,根据正太分布即为-2μ ~ +2μ之间,所以估计平均每条草鱼的质量在
平均值-2μ 到平均值+2μ之内 (1.86~2.14公斤)

实例2---------计算要抽样的数量:
在这里插入图片描述

理论部分的代码实现

各个数值

import pandas as pd

df = pd.read_csv(path)

df.mean()
df.median()
df.var()

利用分布函数给出x值求出y值

import scipy.stats as ss
ss.norm # 生成一个正太分布对象
ss.norm.stats(moments='mvsk')# 查看默认的正态分布的参数 mean var skew kurt
# Out[13]: (array(0.), array(1.), array(0.), array(0.))

利用公式
在这里插入图片描述

ss.norm.pdf(0.0)# 带入具体的x值
# Out[14]: 0.3989422804014327

ss.norm.pdf(0.0)
Out[14]: 0.3989422804014327

ss.norm.ppf(0.9)# 概率密度函数从-无穷到+无穷的积分是1,ppf是指从-无穷到啥的积分是参数
Out[15]: 1.2815515655446004

ss.norm.cdf(2)# 从-无穷到给定参数的积分是多少
Out[16]: 0.9772498680518208

ss.norm.cdf(2) - ss.norm.cdf(-2)# 
Out[17]: 0.9544997361036416

ss.norm.rvs(size=10)# 生成10个符合正态分布的数
Out[18]: 
array([ 0.4050125 ,  0.96867675, -0.27785224,  0.30031429, -0.1907486 ,
        1.61640198,  0.81992617,  2.16567586,  1.0207149 ,  1.59207468])

https://blog.csdn.net/u011702002/article/details/78245804 # 具体的api及其解释参考

对DataFrame的抽样
df.sample(n=10)# 随机抽取10个
df.sample(frac=0.001)# 抽取百分之0.1的样

单一属性数据分析

数据分类
有4个分类
定类(按类别):根据实物的离散、无差别属性进行分类(类别间是无差距的如性别、民族)
定序(按顺序):可以界定数据的大小,但是不能测定差值(如收入的低中高)
定距(间隔):可以界定数据大小的同时,可以测定差值,但是没有绝对零点(如温度不能说 20℃ 比 10℃ 热2倍)(乘除是无意义的)
定比(比率):可以界定数据的大小,可以测定差值,有绝对零点(乘除是有意义的,最常见的)

异常值分析
三种异常值分析:连续异常值、离散异常值、知识异常值
连续异常值:对某个值进行排序,下面的数小上面的数大,找出这个序列的下4分为数Q1,中位数Q2,上4分位数Q3。把下4分位数和上4分为数的距离叫做4分为间距记作d,在Q1和Q3分别向下和向上取k*d(1.5 <= k <= 3)为下界和上界,下界和上界之间的就为正常值,k取不同的值,异常值的测定程度也不一样,当k取1.5时,临近边界的为中等异常,当k取3时,临近边界的为非常异常。连续异常值发现的异常值可以直接舍弃,也可以直接取边界值代替异常值。
离散异常值:离散属性定义范围以外的值,比如有的时候空值就是异常值,比如收入离散化以后只有中高低三个分类,那么其他的值就都是异常值,这些异常值可以直接舍弃,也可以用某一单一值代替
知识异常值:在人认知以外的值,如气温是100℃

对比分析
分为两个问题:1.比较什么数 2.怎么进行比较
比较什么数
绝对数比较:就是比较直接的数字
相对数比较:把几个有联系的指标进行联合构成新的数,根据联合方式的不同可以分为(结构、比例、比较、动态、强度)
联合方式:
结构相对数:比如各种率,产品合格率,考试通过率评价学生水平、考题难度
比例相对数:总体内不同部分的数值进行比较,如三大产业各自占比
比较相对数:同一时空下的同质的数据进行相比,如不同时期下的同样商品的价格
动态相对数:这种相对数一般有时间的概念在里面,如用户数量的增速,速度等
强度相对数:性质不同,但又相互联系的属性进行联合,比如人均的概念,总体GTP和 人均GTP,如粮食的亩产和密度等
怎么进行比较
从时间的维度:现在和过去比,过去和以前比,由此来推断未来的走势,如同比和环比(同比就是和去年同期进行比较,环比就是和同年的前一个月进行相比)(这个比法充分的考虑了季节和连续性
从空间的维度:现实方位上的空间如不同城市、地区;逻辑上的空间,一家公司的不同部门,不同的公司间
从经验和计划的维度:如和历史上某个率进行比较来类比现在的
结构分析
就是对比分享中的比例相对数比较,着重研究一个整体的组成结构方面的差异与相关性,分为静态结构分析和动态结构分析。
静态结构分析:直接分析总体的组成
动态结构分析:以时间为轴,分析结构变化的趋势,根据前一个月的变化趋势推后一个月的

分布分析
pass

单因子分析(只对此字段内进行分析)

对某个字段进行分析
先瞟一眼发现该字段大体位于什么数值区间内,比如值位于[ 0 , 1 ]
异常值分析

sl_s = df['xxxx']
sl_s.isnull()  -> Series # 总体上查看真真假假
sl_s[sl_s.isnull()] ->Series # 查看为空的数据组成的Series
df[df['xxxx'].isnull()] -> df # 查看某个字段为空值的该字段对应的其他字段的值
sl_s = sl_s.dropna() # 去除空值
sl_s = sl_s.fillna() # 填充空值

sl_s.mean() # 均值
Out[13]: 0.6128335222348166
sl_s.std() # 标准差
Out[14]: 0.2486306510611418
sl_s.max() # 最大值
Out[16]: 1.0
sl_s.min() # 最小值
Out[17]: 0.09
sl_s.median() # 中位数
Out[18]: 0.64
sl_s.quantile() # 中位数
Out[19]: 0.64
sl_s.quantile(q=0.25) # 下4分位数
Out[20]: 0.44
sl_s.quantile(q=0.75) # 上4分位数
Out[21]: 0.82

分析:d/四分位间距/ = 上4分位数 - 下4分位数 = 0.38,上四分位数 + d*(1.5~3)可以覆盖到最大值,下四分位数 -d*(1.5~3)可以覆盖到最小值,所以基本可以断定这个字段没有异常值了

sl_s.skew() # 偏度 负偏,均值比中位数小,大部分数比均值要大,
Out[22]: -0.4763603412839644
sl_s.kurt() # 峰度 相对于正太分布是比较平缓的状态
Out[23]: -0.6708586220574557

获得数值的离散化分布(介于各个数值区间里面的数值分布)
1.首先因为发现数据的值大致位于 0~1内,bins参数里面就是指定的分割点序列
2.np.histogram() -> tuple

np.histogram(sl_s.values, bins=np.arange(0.0, 1.1, 0.1))
Out[26]: 
(array([ 195, 1214,  532,  974, 1668, 2146, 1972, 2074, 2220, 2004],
       dtype=int64),
 array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]))

其中195就是数值位于 0.0 ~ 0.1的值的个数

实例2—分析LastEvolution
前面同样是各种看均值,标准差,最大值,最小值等
利用四分位间距找出异常值

le_s = df['last_evaluation']
q_low = le_s.quantile(q=0.25) #下四分位数
q_high = le_s.quantile(q=0.75) #上四分位数
q_interval = q_high - q_low # 四分为间距
k = 1.5
le_s = le_s[le_s < q_high + k*q_interval][le_s > q_low - k*q_interval] # 进行布尔值索引只能是一元的表达式
le_s

实例3—分析number_project (静态结构分析)
由于做过的项目数量都是些整数值,所以要获得它的分布,直接数数字出现了多少次就可以了

np_s.value_counts()
Out[71]: 
4    4365
3    4055
5    2761
2    2388
6    1174
7     256
Name: number_project, dtype: int64
np_s.value_counts(normalize=True) # 如果更关注的是各个值所占的比例理论篇.note
Out[72]: 
4    0.291019
3    0.270351
5    0.184079
2    0.159211
6    0.078272
7    0.017068
Name: number_project, dtype: float64
np_s.value_counts(normalize=True).sort_index()
Out[73]: 
2    0.159211
3    0.270351
4    0.291019
5    0.184079
6    0.078272
7    0.017068
Name: number_project, dtype: float64

55,不管实例了哈

amh_s = amh_s[amh_s < amh_s.quantile(0.75) + 1.5*(amh_s.quantile(0.75) - amh_s.quantile(0.25))][amh_s > amh_s.quantile(0.25) - 1.5*(amh_s.quantile(0.75) - amh_s.quantile(0.25))] # 获取去除了异常值的Series 
np.histogram(amh_s.values, bins=10) # 直接把数据分成10个区间
np.histogram(amh_s.values, bins=np.arange(amh_s.min(), amh_s.max() + 10,10# 根据最大最小值来搞,需要注意的是,此处最大值一定要加上一个数,不然取不到最大值
amh_s.value_counts(bins=np.arange(amh_s.min(), amh_s.max() + 10,10# 和前者一样,都可以统计位于不同规定区间的值的数量,只是这个是做开右闭,前者是左闭右开

对于只有0和1的值,直接value_counts()统计一波看一下就可以了

发现s_s有一个值为nme的异常值,要获得去除值为nme的Series

s_s.where(s_s!='nme').dropna()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值