贡献度分析
贡献度分析又称80/20法则、二八法则、帕累托法则、帕累托定律、最省力法则或不平衡原则。 80/20法则认为:原因和结果、投入和产出、努力和报酬之间本来存在着无法解释的不平衡。
通过上述公式得出累计贡献度,当累计贡献度接近80%时(不一定正好是80%),然后找到该产品在图表中相应的位置并进行标注。
案例:产品贡献度分析
python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
import numpy as np
aa =r'data11.xls'
df = pd.DataFrame(pd.read_excel(aa))
# 分组统计排序
# 通过reset_index()函数将groupby()的分组结果重新设置索引
df1 = df.groupby(["图书编号"])["买家实际支付金额"].sum().reset_index() #重置索引
df1 = df1.set_index('图书编号') # 设置索引
df1 = df1[u'买家实际支付金额'].copy()
df2=df1.sort_values(ascending=False) # 排序
print(df2)
# 图表字体黑体,字号为8
plt.rc('font', family='SimHei', size=8)
plt.figure("贡献度分析")
df2.plot(kind='bar')
plt.ylabel(u'销售收入(元)')
p = 1.0*df2.cumsum()/df2.sum()
print(p)
p.plot(color='r', secondary_y=True, style='-o', linewidth=0.5)
plt.title("产品贡献度分析")
plt.annotate(format(p[9], '.4%'), xy=(9, p[9]), xytext=(9 * 0.9, p[9] * 0.9),
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.1")) # 添加标记,并指定箭头样式。
plt.ylabel(u'收入(比例)')
plt.show()
差异化概述
通过差异化分析比较不同性别之间在某个指标上存在的差异,通过分析结果对不同性别定制不同的方案。例如,分析不同性别的同学在学习成绩上的差异,了解男生和女生之间的这些差异,因材施教,定制不同的弥补弱项的方案。对于女生,可以有意识地培养她的思维能力;而对于男生,可以买些书籍,来增强他薄弱的方面。
年龄差异化分析,了解不同年龄的需求,投其所好,使企业的利润最大化。例如,网购、自媒体、汽车、旅游等行业,通过年龄差异化分析,找出不同年龄段用户群体的喜好,从而增加产品销量。
案例:学生成绩性别差异分析
ini
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
import numpy as np
df = pd.read_excel('成绩表.xlsx')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
labels = np.array(['语文', '数学', '英语', '物理', '化学', '生物']) # 标签
dataLenth = 6 # 数据长度
# 计算女生、男生各科平均成绩
df1 = np.array(df[df['性别'] == '女'].mean(numeric_only=True).round(2)) #numeric_only=True,pandas>=2.0默认False
print(df1)
df2 = np.array(df[df['性别'] == '男'].mean(numeric_only=True).round(2)) #返回元组数据平均值,保留两位小数
print(df2)
print(df1 - df2)
data_labels = ('男生','女生')
# 设置雷达图的角度,用于平分切开一个平面
angles = np.linspace(0, 2 * np.pi, dataLenth, endpoint=False)
labels = np.concatenate((labels, [labels[0]]))
df1 = np.concatenate((df1, [df1[0]])) # 使雷达图闭合
df2 = np.concatenate((df2, [df2[0]])) # 使雷达图闭合
angles = np.concatenate((angles, [angles[0]])) # 使雷达图闭合
plt.polar(angles, df1, 'r--', linewidth=2, ) # 设置极坐标系,r--代表red和虚线
plt.fill(angles, df1, facecolor='r', alpha=0.5) # 填充
plt.polar(angles, df2, 'bo', linewidth=2, ) # 设置极坐标系,bo代表blue和实心圆
plt.fill(angles, df2, facecolor='b', alpha=0.5) # 填充
plt.thetagrids(angles * 180 / np.pi, labels) # 设置网格、标签
plt.ylim(0, 140) # 设置y轴上下限
legend = plt.legend(data_labels, loc=(0.94, 0.8), labelspacing=0.1)
# plt.setp(legend.get_texts(), fontsize='small')
plt.show()
相关性分析
相关性分析是指对多个具备相关关系的数据进行分析,从而衡量数据之间的相关程度或密切程度。相关性可以应用到所有数据的分析过程中。如果一组数据的改变引发另一组数据朝相同方向变化,那么这两组数据存在正相关性。例如,身高与体重,一般个子高的人体重会重一些,个子矮的人体重会轻一些,如果一组数据的改变引发另一组数据朝相反方向变化,那么这两组数据存在负相关性,例如,运动与体重。夏天温度的高低与空调的销量就存在相关性。当温度升高时,空调的销量也会相应提高。
案例:广告展现量与费用成本相关性分析
为了促进销售,电商营销必然要投入广告,这样就会产生广告展现量和费用成本相关的数据。通常情况下,我们认为费用高,广告效果就好,他们之间必然存在联系,但是仅仅通过主管判断没有说服力,无法证明数据之间关系的真实存在,也无法度量他们之间关系的强弱。因此,我们要通过相关性分析来找出数据之间的关系。
费用成本与广告展现量相关数据情况
相关性分析方法很多,简单的相关性分析方法是将数据进行可视化处理,单纯从数据的角度很难发现数据之间的趋势和联系,而将数据绘制成图表户就可以直观地看出数据之间的趋势和联系。
ini
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
# 解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
# 设置数据显示的列数和宽度
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
df_y = pd.read_excel('展现量.xlsx')
df_x = pd.read_excel('费用.xlsx')
df_x = df_x.set_index('日期') # 将日期设置为索引
df_y = df_y.set_index('日期') # 将日期设置为索引
df_x.index = pd.to_datetime(df_x.index) # 将数据的索引转换为datetime类型
df_x = df_x.resample('D').sum() # 按天统计费用
data = pd.merge(df_x, df_y, on='日期') # 数据合并
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.xlabel('费用成本(x)')
plt.ylabel('广告展现量(y)')
plt.scatter(data['费用'], data['展现量']) # 绘制散点图,以"费用"和"展现量"作为横纵坐标
plt.show()
# 相关系数
print(data.corr())
虽然图表清晰地展示了广告展现量与费用成本的相关性,但无法判断数据之间有什么关系,相关关系也没有准确地度量,并且数据超过两组时也无法完成各组数据的相关性分析。
下面再介绍一种方法-----相关系数方法。相关系数是反映数据之间关系密切程度的统计指标,相关系数的取值区间为1~-1.1表示数据之间完全正相关(线性相关);-1表示数据之间完全负相关;0表示数据之间不相关。数据越接近0表示相关关系越弱,越接近1表示相关关系越强。
计算相关系数需要一定的计算公式,而在python重无须使用繁琐的公式,通过DataFrame对象提供的corr()函数就可以轻松实现。
kotlin
data.corr()
相关系数的优点是可以通过数字对变量的关系进行度量,并且具有方向性,1表示正相关,-1表示负相关
,越靠近0相关性越弱,缺点是无法利用这种关系进行预测。
时间序列
时间序列就是按照时间顺序排列的一组数据序列。时间序列分析就是找出数据变化发展的规律,从而预测未来的走势。
时间序列分析有以下几种表现形式:
长期趋势变化: 受某种因素的影响,数据依据时间变化,按某种规则稳步增长或下降。使用的分析方法有移动平均法、指数平滑法等。
季节性周期变化: 受季节更替等因素影响,数据依据固定周期规则性的变化。季节性周期变化,不局限于自然季节,还包括月、周等短期周期。例如,空调、羽绒服、冷饮的销售,双十一、双十二流量在一周之内的波动等。采用的方法为季节指数。
循环变化: 指一种较长时间的上、下起伏周期性波动,一般循环时间为2~15年。
随机性变化: 由许多不确定因素引起的数据变化,在时间序列中无法预计。
案例:年增长趋势和季节性波动分析
ini
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df = pd.read_excel('TB.xls')
df1 = df[['订单付款时间', '买家实际支付金额']]
# print(df1['订单付款时间'],type(df1['订单付款时间']))
df1 = df1.set_index('订单付款时间') # 将"订单付款时间"设置为索引
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
# print(df1, type(df1))
# 按年统计数据
df_y = df1.resample('AS').sum().to_period('A')
print(df_y)
# 按季度统计数据
df_q = df1.resample('Q').sum().to_period('Q')
print(df_q)
# 绘制子图
fig = plt.figure(figsize=(8, 3))
ax = fig.subplots(1, 2)
df_y.plot(subplots=True, ax=ax[0])
df_q.plot(subplots=True, ax=ax[1])
# 调整图表距上部和底部的空白
plt.subplots_adjust(top=0.95, bottom=0.2)
plt.show()
案例:霍兰德人格分析
ini
# -*- coding: utf-8 -*-
"""
Created on Sat Jul 1 20:52:54 2023
@author: zcq
"""
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
import numpy as np
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
radar_labels = np.array(['A1:研究型(I)', 'A2:艺术型(A)', 'A3:社会型(S)','A4:企业型(E)', 'A5:常规型(C)', 'A6:现实型(R)'])
nAttr = 6
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
[0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
[0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
[0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
[0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
[0.34, 0.31, 0.38, 0.40, 0.92, 0.28]])
data_labels = ('工程师', '实验员', '艺术家', '推销员', '社会工作者', '记事员')
radar_labels = np.concatenate((radar_labels, [radar_labels[0]]))
angels = np.linspace(0, 2 * np.pi, nAttr, endpoint=False)
data = np.concatenate((data, [data[0]]))
angels = np.concatenate((angels, [angels[0]]))
fig = plt.figure(facecolor='white')
plt.subplot(111, polar=True)
plt.plot(angels, data, 'o-', linewidth=1, alpha=0.2)
plt.fill(angels, data, alpha=0.25)
plt.thetagrids(angels * 180 / np.pi, radar_labels)
plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
legend = plt.legend(data_labels, loc=(0.94, 0.8), labelspacing=0.1)
plt.setp(legend.get_texts(), fontsize='small')
plt.grid(True)
plt.savefig('Holland_radar.jpg')
plt.show()