业务指标基础分析(excel)--python实现

在很多以业务为主的数据分析工作中,常用到excel进行一系列的分析工作,笔者刚开始做数据分析时,工作中也常用到excel进行数据匹配、透视、宏等一系列的操作来进行数据整理和业务指标计算。
随着工作经验的增加,有时需要处理的数据量较大(数据量大于10万),使用excel进行指标统计和分析时会比较容易卡顿,执行透视匹配等操作时也较困难,如果还想要进行一些可视化操作就更难了,这时利用python进行分析将更加高效和快捷,那么接下来以一个简单实例的方式分享如何从excel过渡到用python来进行基础分析。

一、 数据处理

1、导入库和数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
f=open('D:/Desktop/各地区用户价值信息表.xlsx','rb') 
data=pd.read_excel(f,sep='$')
data.head()                                       #默认显示前5行

2、数据处理

(1)基本信息

data.info()


上图显示了数据的一些初步信息:
①共220347条数据,9列;
②2月用户价值存在缺失值;
③区、用户id、渠道id、细分渠道id字段在读取时,被认为成float和int类型,但应当为字符串型。

那么接下来先进行数据类型更改,并删除部分不需要的列:

#将用户id和区的数据类型转换成字符型
data['用户id'] = data['用户id'].apply(str)
data['区'] = data['区'].apply(str)

#删除不需要的内容:渠道id、细分渠道id;注意:drop函数默认删除行,列需要加axis = 1
data.drop(columns=['渠道id','细分渠道id'],axis=1,inplace=True)

可以再利用data.info()进行数据观察
在这里插入图片描述
接下来进行描述性统计指标获取,了解1月和2月价值整体情况

data.describe()

在这里插入图片描述
可以看出,这批用户在2月的价值均值是高于1月的,也不难算出整体的收益是正向的,大约300万。

(2)缺失值处理

定义缺失值情况查看函数:

def missing_val(df):
    mis_val=df.isnull().sum()
    mis_val_percent=100*mis_val/len(df)
    mis_table=pd.concat([mis_val,mis_val_percent],axis=1)
    mis_table_re=mis_table.rename(columns={0:'mis_value',1:'mis_value_percent'})
    mis_table_sort= mis_table_re[mis_table_re.iloc[:,1]!=0].sort_values('mis_value_percent',ascending=False).round(1)
    print('your selected dataframe has '+str(df.shape[1])+' columns\n'+'there are '+str(mis_table_sort.shape[0])+' columns has missing values')
    return mis_table_sort
missing_val(data)

在这里插入图片描述
对以上缺失值列进行填充,这里采用0值填充,也可以根据具体的业务情况进行均值、中位数等其他填充,当然也可以采用随机森林预测等更高级的方式进行,总之具体情况具体选择,但这些处理方式不能脱离业务本身含义:

data['2月用户价值'].fillna(0,inplace=True)

(3)新增指标

从前面的数据看,这批用户整体是给业务带来正向收益的,但不是所有用户都是正向收益的,那么这时需要做的一步就是识别出发生降收的用户,但提取的原始数据中并无相关特征标记,因此接下来的处理是利用python标记出发生降收的用户(特别说明:该步骤也可以在sql取数时进行处理,但本文不具体讨论如何在sql中进行该操作):

 data['是否降收']=[None]*len(data)    

定义标记是否降收的函数,发生降收标记为1,未降收标记为0

def js(df):
    col_name=df.columns
    data=np.array(df)
    for i in range(len(data)):
        if data[i,4]>data[i,5]:     #第4、5列分别是data数据集中的1月用户价值、2月用户价值
            data[i,-1] = 1
        else:
            data[i,-1] = 0
    i=i+1
    df1=pd.DataFrame(data,columns=col_name)
    return df1
data1=js(data) 
data1['是否降收'].value_counts()

在这里插入图片描述
到这里,降收和未降收用户的人数大致情况已经明了,但在后续分析中我们只关注投入营销资源后仍然降收的用户(类似付出努力之后仍然没有回报,当然需要重点看看)

二、基础指标分析

1、城市维度

(1)pivot_table透视

这里的操作就是挑选出参加了营销活动之后,仍然发生降收的用户:

data2=data1[data1.是否参加过活动==1]
table1=data2.pivot_table(values=['1月用户价值','2月用户价值','用户id'],columns=['是否降收'],
                         index=['地市'],aggfunc={'1月用户价值':np.sum,'2月用户价值':np.sum,'用户id':len},margins=True,margins_name='全省')
table1

在这里插入图片描述

(2)指标计算

重点计算户均降收、降收人数占比这2个指标。首先,从table1中提取出参加过活动的降收用户数据

ds_js=pd.concat([table1.iloc[:,1],table1.iloc[:,4],table1.iloc[:,7],table1.iloc[:,8]],axis=1)
ds_js.columns=['1月用户价值','2月用户价值','降收用户数','总用户数']

计算各地市降收金额、降收均值、降收用户数占比

ds_js['降收金额']= -(ds_js['2月用户价值']-ds_js['1月用户价值']).round(1)
ds_js['用户降收均值']=(ds_js['降收金额']/ds_js['降收用户数']).round(1)
ds_js['降收用户数占比(%)']=(ds_js['降收用户数']/ds_js['总用户数']).round(3)*100
ds_js_final=ds_js.iloc[:,2:7]

重置索引

ds_js_final=ds_js_final.reset_index()
ds_js_final

在这里插入图片描述
上图就是最后我们需要的数据和指标啦~到这里大家可以先把上图的指标表先保存导出

ds_js_final.to_excel('D:/Desktop/各地市用户价值指标表.xlsx',index=False)

(3)地市可视化

数据准备1
#以用户降收均值为依据排序(从高到低),注意排序时去掉最后一行汇总值
ds_js_final_1 = ds_js_final_1.iloc[0:-1,:].sort_values(by=['用户降收均值'],axis=0,ascending=False)
ds_js_final_1

生成作图需要的label和value

label=list(ds_js_final_1.地市)
value=list(ds_js_final_1.用户降收均值)
画图1
#画布设置
%matplotlib inline
plt.style.use('bmh')
plt.figure(figsize=(14,8))
#显示中文标签
plt.rcParams['font.sans-serif']=['SimHei'] 

#柱状图+均值线
plt.bar(label,value,color='#4E8975') 
plt.hlines(ds_js_final.iloc[-1,4],-1,17,linestyles='--',colors='indianred',label='平均值')
plt.ylabel('用户降收均值')
plt.title('各市用户降收金额')


#y轴刻度线范围设置
from matplotlib.pyplot import MultipleLocator   #从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
#把y轴的刻度范围设置为60到70
plt.ylim(60,70)
#把y轴的主刻度设置为1的倍数
y_major_locator=MultipleLocator(1)
ax=plt.gca()
ax.yaxis.set_major_locator(y_major_locator)


#均值线添加注解
plt.text('I市',65.8,'全省用户降收均值=65.5',fontsize=12)

结果展示
在这里插入图片描述
从上图中我们可以比较轻松的概览各城市用户降收均值的高低情况,以及各市和全省降收均值的对比情况,为后续针对异常点的深入剖析做准备

数据准备2
#降收用户、总用户数和降收用户占比
value1=list(ds_js_final_1.降收用户数)
value2=list(ds_js_final_1.总用户数-ds_js_final_1.降收用户数)
value3=list(ds_js_final_1['降收用户数占比(%)'])
画图2
#降收用户、总用户数和降收用户占比
%matplotlib inline
plt.style.use('bmh')
plt.figure(figsize=(14,8))
plt.rcParams['font.sans-serif']=['simHei']

plt.bar(label,value1,color='#4E8975',label='降收用户数')
plt.bar(label,value2,color='grey',bottom=value1,label='未降收用户数')
plt.plot(label, value1, 'indianred', ms=6, lw=3, marker='o',label='降收用户占比(%)')
plt.title('降收用户数情况')
plt.ylabel('用户数')
plt.legend()

#降收用户占比折线添加数据标签
for x,y,z in zip(label,value1,value3):   # # 添加数据标签
    plt.text(x, y+900, str(round(z,2)), horizontalalignment='left', verticalalignment='top', fontsize=11, rotation=0)

结果展示
在这里插入图片描述
这张图可以为我们清晰地展现各城市发生降收的用户数情况:
1、各城市参加了这个营销活动的总人数情况
2、哪些城市降收人数多,但降收占比不高;而哪些城市降收占比高,但实际降收人数却不多
3、哪些城市属于异常需关注的,不难发现,I市需列为重点关注对象之一
这样的概览同样也是比较全面和基础的,为了后续针对异常点的深入剖析提供数据基础和准备。

2、渠道维度

渠道维度指标分析与上述城市维度指标分析过程几乎一致,只是细节有变动,这里不再赘述(也不再针对数据和图表进行文字分析)。展示下数据结果:
基础指标表:
在这里插入图片描述
可视化图:
在这里插入图片描述
在这里插入图片描述
补充:图片也可以保存导出,代码如下

plt.savefig('需要保存的本地地址')

到这里python基础指标分析实例就结束了,虽然实例的数据特征和添加的分析指标较少,但一些操作的通用性还是比较强的,希望能够给到大家一点点帮助。当然如果以上内容存在错误和可优化之处,欢迎大家指出,一起努力,共同进步~
Ps:以上数据均为虚构数据,如有雷同,纯属巧合~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值