1 分布分析: 发现各个维度下数据的分布情况 研究数据分布特征和分布类型; 主要统计量:极差 大小反应分布情况是否稳定 频率分布情况: 一般用直方图 分组区间使用pd.cut . 累积频率.cumsum() 定量一般用直方图 。 定性字段一般用饼图 分组组距及组数 ![]() 2 对比分析 绝对数比较 相对数比较 3 统计分析 集中趋势度量: 算数平均数 .mean() 位置平均数:中位数。median() 。 众数.mode()、。。。 离中趋势度量 极差 分位差 样本描述性统计.describe() . 四分之三位数/四分之一位数 方差、标准差 ![]() 4 帕累托分析 (贡献度分析) 二八定律 首先对目标数据进行排序: data.sort_values(0,ascending = False,inplace=True) 然后求出累计占比: data['累计占比'] = data[0].cumsum()/data[0].sum() 制作图表: plt.figure(figsize=(16,7)) data[0].plot(kind='bar', color='g',title='haha') plt.xticks(rotation=0) data['累计占比'].plot(style = '--ko', secondary_y = True) plt.axvline(6,color='r',linestyle='--') plt.show() ![]() 5 正态性检验
data = pd.DataFrame(np.random.randn(1000)*1000+16,columns=['value']) fig = plt.figure(figsize=(16,10)) ax1 = fig.add_subplot(2,1,1) ax1.scatter(data.index,data.value) #散点图 ax2=fig.add_subplot(2,1,2) ax2.hist(data['value'],bins=50) #直方图 plt.show()
理论推导:
直接使用函数 from scipy import stats u = data['value'].mean() std = data['value'].std() stats.kstest(data['value'],'norm',(u,std)) 6 相关性分析 首先检验数据是否符合正态分布, 如果符合使用皮尔森相关系数:data.corr() 不符合的话使用 斯皮尔曼相关系数:data.corr(method='spearman') 7 数据处理 判断是否有缺失值 : data.isnull() / data.notnull()返回布尔型结果 删除缺失值 data.dropna(inplace=True) 替换缺失值:
data.fillna('填充的值',inplace=True)
data.fillna(method='pad') . 用之前的值填充 。 backfill用之后的值填充
拉格朗日插值法填充数据: def f(s,n,k=5): y = s[list(range(n-k,n+k+1))] y = y[y.notnull()] return lagrange(y.index,list(y))(n) for i in range(len(data)): if data[0].isnull()[i]: data[0][i] = f(data[0],i) print(f(data[0],i)) 数据标准化: 0-1 标准化 def f(df,*cols): • df_n = df.copy() • for col in cols: • ma = df_n[col].max() • mi = df_n[col].min() • df_n[col+'_n'] = (df_n[col]-mi) / (ma-mi) • return df_n df_n = f(data,'value1','value2') df_n z-score标准化 z-score 标准化 把非标准正太分布 换成标准正太腹部 (值-平均值)/标准差 def f_z(df,*cols): • df_z = df.copy() • for col in cols: • me = df_z[col].mean() • std = df_z[col].std() • df_z[col+'_z'] = (df_z[col]-me) / std • return df_z df_z = f_z(data,'value1','value2') df_z 数据连续属性离散化 等宽法: #cut 方法 划分区间 bins = [1,30,50,100] cats = pd.cut(data['age'],bins,right=False) data['age_a'] = cats 等频法: #等频划分 按照分位数划分 以相同的数量记录到某个区间 # qcut 方法 data = pd.Series(np.random.rand(1000)) cats = pd.qcut(data,10) cats.value_counts(sort=False) |