在很多以业务为主的数据分析工作中,常用到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:以上数据均为虚构数据,如有雷同,纯属巧合~