影刀RPA 数据统计基础:均值中位数与分位数 影刀RPA 数据统计基础均值中位数与分位数作者林焱什么情况用什么拿到一批数据需要快速了解数据概况——平均工资多少、中位数是多少、最高的10%和最低的10%差多少、数据是否偏斜。在影刀RPA里用pandas的统计函数可以一键生成描述性统计帮你在做报表前先理解数据。适用场景数据分析前概览、薪资/价格分布分析、业绩评估、异常值辅助判断、数据质量检查。怎么做拼多多店群自动化报活动上架描述性统计importpandasaspdimportnumpyasnp dfpd.read_excel(rC:\Data\employee.xlsx)# 一键描述性统计数值列print(df.describe())# 输出count, mean, std, min, 25%, 50%, 75%, max# 包含分类列print(df.describe(includeall))# 单列统计print(f平均工资:{df[工资].mean():.2f})print(f工资中位数:{df[工资].median():.2f})print(f工资标准差:{df[工资].std():.2f})print(f最高工资:{df[工资].max():.2f})print(f最低工资:{df[工资].min():.2f})print(f工资范围:{df[工资].max()-df[工资].min():.2f})分位数分析# 四分位数Q1df[工资].quantile(0.25)# 下四分位数Q2df[工资].quantile(0.50)# 中位数Q3df[工资].quantile(0.75)# 上四分位数IQRQ3-Q1# 四分位距print(fQ125%:{Q1:.2f})print(fQ250%:{Q2:.2f})print(fQ375%:{Q3:.2f})print(fIQR:{IQR:.2f})![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/402b286e60004c1b882ed5e39d799ef6.png#pic_center)# 自定义分位数percentiles[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]forpinpercentiles:print(f{int(p*100)}%分位:{df[工资].quantile(p):.2f})# 十分位数deciles[df[工资].quantile(i/10)foriinrange(1,10)]分组统计# 按部门统计工资dept_statsdf.groupby(部门)[工资].agg([count,mean,median,std,min,max]).round(2)# 添加分位数dept_stats[Q1]df.groupby(部门)[工资].quantile(0.25).round(2)dept_stats[Q3]df.groupby(部门)[工资].quantile(0.75).round(2)print(dept_stats)离散程度分析defanalyze_distribution(df,column):分析数据分布datadf[column].dropna()stats{均值:data.mean(),中位数:data.median(),标准差:data.std(),方差:data.var(),最小值:data.min(),最大值:data.max(),极差:data.max()-data.min(),变异系数(CV):data.std()/data.mean()ifdata.mean()!0else0,偏度:data.skew(),峰度:data.kurtosis(),Q1:data.quantile(0.25),Q3:data.quantile(0.75),IQR:data.quantile(0.75)-data.quantile(0.25),}# 解读print(f{column}分布分析 )forkey,valinstats.items():print(f{key}:{val:.2f})![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b4bc918cb5a64eef8cd7c3ffc795d194.png#pic_center)print(\n 分布解读 )ifstats[偏度]0.5:print( → 右偏分布大部分值偏小少数大值拉高均值)elifstats[偏度]-0.5:print( → 左偏分布大部分值偏大少数小值拉低均值)else:print( → 近似对称分布)ifstats[均值]stats[中位数]:print(f → 均值({stats[均值]:.0f}) 中位数({stats[中位数]:.0f})存在高值拉动)cvstats[变异系数(CV)]ifcv0.5:print(f → 变异系数{cv:.2f}数据离散程度高)elifcv0.2:print(f → 变异系数{cv:.2f}数据较集中)returnstats# 使用analyze_distribution(df,工资)生成统计摘要报表defgenerate_stats_report(df,output_path):生成统计摘要报表withpd.ExcelWriter(output_path,engineopenpyxl)aswriter:# 1. 全局统计numeric_colsdf.select_dtypes(include[np.number]).columns global_statsdf[numeric_cols].describe().T global_stats[变异系数](global_stats[std]/global_stats[mean]).round(3)global_stats[偏度]df[numeric_cols].skew().round(3)global_stats[峰度]df[numeric_cols].kurtosis().round(3)global_stats.to_excel(writer,sheet_name全局统计)# 2. 分组统计if部门indf.columns:group_statsdf.groupby(部门)[numeric_cols].agg([count,mean,median,std]).round(2)group_stats.to_excel(writer,sheet_name分组统计)# 3. 分位数表percentiles[0.05,0.1,0.25,0.5,0.75,0.9,0.95]quantile_data{}forcolinnumeric_cols:quantile_data[col]{f{int(p*100)}%:df[col].quantile(p)forpinpercentiles}quantile_dfpd.DataFrame(quantile_data).round(2)quantile_df.to_excel(writer,sheet_name分位数)# 4. 分类变量频率cat_colsdf.select_dtypes(include[object]).columnsforcolincat_cols[:5]:# 最多5个分类列freqdf[col].value_counts().head(20)freq_dfpd.DataFrame({值:freq.index,数量:freq.values})freq_df[占比](freq_df[数量]/len(df)*100).round(2).astype(str)%sheet_namef频率_{col}[:31]# Excel sheet名最长31字符freq_df.to_excel(writer,sheet_namesheet_name,indexFalse)returnoutput_path# 使用generate_stats_report(df,rC:\Data\stats_report.xlsx)有什么坑TEMU店群矩阵自动化运营核价报活动坑1均值受异常值影响大# 问题9个人月薪1万1个月薪100万均值10.9万不能代表真实水平# 解决用中位数print(f均值:{df[工资].mean()})# 109000print(f中位数:{df[工资].median()})# 10000 ← 更能代表真实水平# 或用截尾均值去掉最高最低5%后求均值fromscipy.statsimporttrim_mean trimmedtrim_mean(df[工资].dropna(),proportiontocut0.05)坑2std()对空值的处理# 问题std()默认跳过空值但结果可能不准df[工资].std()# 自动跳过NaN# 如果整组只有一个值df.groupby(部门)[工资].std()# 某部门只有1人stdNaN# 解决填充0或标注dept_stddf.groupby(部门)[工资].std().fillna(0)坑3分位数计算方法不同# pandas默认用linear插值法df[工资].quantile(0.5)# 默认linear# 其他方法结果不同df[工资].quantile(0.5,interpolationlower)# 取较低值df[工资].quantile(0.5,interpolationhigher)# 取较高值![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f4009493d88745ee9fd3bff601987064.png#pic_center)df[工资].quantile(0.5,interpolationnearest)# 取最近值# 和Excel的QUARTILE函数结果可能不同# Excel用的是另一种插值方法坑4describe()对分类列无统计意义# 问题对分类列算mean、std没有意义df.describe()# 只统计数值列自动跳过文本列# 查看分类列用df.describe(include[object])# 输出count, unique, top众数, freq众数频率坑5分组统计后内存膨胀# 问题对多列做多种聚合结果表列数暴增resultdf.groupby(部门).agg({工资:[mean,median,std,min,max,count],年龄:[mean,median,std],工龄:[mean,median,max]})# 列数 6 3 2 11列 × N个部门![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/80b1cf15bc7a492b9ed8291bf8edd5a8.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2f04b5fa660b48bfb519ef268db2deb7.png#pic_center)# 解决分Sheet写入或用命名聚合resultdf.groupby(部门).agg(工资均值(工资,mean),工资中位(工资,median),工资标准差(工资,std),年龄均值(年龄,mean),).round(2).reset_index()