贡献度分析(帕累托法则)、差异化、相关性以及时间序列分析

贡献度分析

贡献度分析又称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()
相关推荐
yyfhq37 分钟前
sdnet
python
测试199844 分钟前
2024软件测试面试热点问题
自动化测试·软件测试·python·测试工具·面试·职场和发展·压力测试
love_and_hope1 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
海阔天空_20131 小时前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
零意@1 小时前
ubuntu切换不同版本的python
windows·python·ubuntu
思忖小下2 小时前
Python基础学习_01
python
q567315232 小时前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
是萝卜干呀2 小时前
Backend - Python 爬取网页数据并保存在Excel文件中
python·excel·table·xlwt·爬取网页数据
代码欢乐豆2 小时前
数据采集之selenium模拟登录
python·selenium·测试工具
狂奔solar3 小时前
yelp数据集上识别潜在的热门商家
开发语言·python