作者:稀饭
对绝大部分企业来说,费用报销是财务领域必备的一项工作,对企业的各项基本工作单元来说,一旦涉及到费用的支出,就会产生成本,就可能会涉及到费用报销和入账。对于大型企业来说,由于业务量的庞大,导致费用报销里面蕴含的数据量和数据种类也是庞大的,由于报销产生的费用往往是要作为成本进行入账的,所以对这部分数据进行分析,能够对企业的成本情况有一些提前认知,而不需要等到出财报或管报的时候才开始分析,从而尽量及时地去改善企业的经营情况。
费用报销中的一些重要指标,可以通过不同的方法进行监控和分析,以挖掘其中蕴含的信息,来改善公司的成本支出,进一步改善整体经营情况。下面举一些例子,并使用Python实现。
(1)单量波动对比
假设现在需要比较本月和上月,每天起草报销的单量,在一个月度范围内的平均水平是否有比较明显的差异,则可以采用双样本假设检验的方法来完成:
import numpy as np # 导入数据分析常用的库import pandas as pdimport random as rdlast_month = [] # 构建空列表用于存储数据this_month = []for i in range(0,30): # 模拟上个月和本月的单量(假设都是30天)last_month.append(rd.randint(1000,2000)) # 模拟1000-2000的整数this_month.append(rd.randint(1500,2500)) # 模拟1500-2500的整数print(len(last_month), len(this_month)) # 查看两个列表的长度

def t_test(a,b): # 定义双样本检验的公式mean_a = np.mean(a)mean_b = np.mean(b)var_a = np.var(a)var_b = np.var(b)n_a = len(a)n_b = len(b)z_value = 1.96 # 采用95%的临界值z_stat = abs(mean_a - mean_b) np.sqrt(var_a/n_a + var_b/n_b) # 计算统计量if(z_stat > z_value):if(mean_a - mean_b < 0):print('统计检验显著,认为本月和上月的单量有明显差别,本月平均值高于上月')if(mean_a - mean_b >= 0):print('统计检验显著,认为本月和上月的单量有明显差别,本月平均值低于上月')if(z_stat <= z_value):print('统计检验不显著,认为本月和上月的单量无明显差别')print(t_test(last_month,this_month)) # 输出检验的结果

(2)判断每周的报销金额是否在今年存在上升趋势
假设现在按周汇总统计报销金额,需要看在今年是否有一个上升的趋势,假设已经收集了30个星期的数据,则可以采用趋势检验的方法来判断:
import numpy as np # 导入数据分析常用的库import pandas as pdimport random as rdfrom scipy.stats import normfrom sklearn.linear_model import LinearRegressionamount_week = [] # 构建空列表用来存储数据for i in range(0,30):amount_week.append(rd.randint(1000,1100 + 10*i)) # 模拟数据,小幅区间拉长print(len(amount_week)) # 输出列表的长度

def mk(x, alpha=0.1): # 定义Mann-Kendall检验的计算逻辑n = len(x)# 计算趋势slopemodel = LinearRegression()model.fit(np.arange(1,n+1).reshape(-1,1),x)slope = model.coef_[0]# 计算S的值s = 0for j in range(n - 1):for i in range(j + 1, n):s += np.sign(x[i] - x[j])# 判断x里面是否存在重复的数,输出唯一数队列unique_x,重复数数量队列tpunique_x, tp = np.unique(x, return_counts=True)g = len(unique_x)# 计算方差VAR(S)if n == g: # 如果不存在重复点var_s = (n * (n - 1) * (2 * n + 5)) 18else:var_s = (n * (n - 1) * (2 * n + 5) - np.sum(tp * (tp - 1) * (2 * tp + 5))) 18# 计算z_valueif n <= 10: # n<=10属于特例z = s (n * (n - 1) 2)else:if s > 0:z = (s - 1) np.sqrt(var_s)elif s < 0:z = (s + 1) np.sqrt(var_s)else:z = 0# 计算p_value,可以选择性先对p_value进行验证p = 2 * (1 - norm.cdf(abs(z)))# 计算Z(1-alpha/2)h = abs(z) > norm.ppf(1 - alpha 2)# 趋势判断if (z < 0) and h:trend = -1 # 下降趋势elif (z > 0) and h:trend = 1 # 上升趋势else:trend = 0 # 无趋势return trend,p,slopetrend,p,slope = mk(amount_week,alpha = 0.05) # 输出m-k检验的结果if(p < 0.05 and trend != 0):if(trend == 1):print('报销金额整体呈上升趋势,上升强度为',slope)if(trend == -1):print('报销金额整体呈下降趋势,下降强度为',slope)if(p > 0.05 or trend == 0):print('报销金额整体上无明显趋势')

(3)预测下一阶段待审批单据数量
有时候进行单据审批作业时,会监控每天的待审批单量,因为需要预估接下来时间段的单据审批作业强度,可以根据历史的数据对未来一段时间的单量情况进行预测,考虑到单量会跟周期有关,采用考虑了周期波动的Holt-Winter方法进行预测:
import numpy as np # 导入数据分析常用的库import pandas as pdimport random as rdfrom statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holtfrom statsmodels.tsa.seasonal import seasonal_decomposeexam_paper_sum = [] # 构建空列表用来存储模拟数据rest_number = [6,7,13,14,20,21,27,28] # 休息日编码for i in range(0,29): # 模拟4周的待审批单量情况,休息日(双休)单量减少if( i == 0):exam_paper_sum.append(rd.randint(2000,3000))if( i > 0 and i not in rest_number): # 工作日exam_paper_sum.append(rd.randint(2000,3000))if( i > 0 and i in rest_number): # 休息日exam_paper_sum.append(rd.randint(500,1000))exam_paper_sum = exam_paper_sum[1:len(exam_paper_sum)] # 剃掉第一个值print(exam_paper_sum) # 查看模拟数据的结果

holt_winter_model = ExponentialSmoothing(exam_paper_sum, seasonal_periods = 7, trend='add', seasonal='add') # 建立Holt-Winter预测,周期设定为7holt_winter_model = holt_winter_model.fit(smoothing_level = 0.7, smoothing_seasonal=0.1) # 拟合模型holt_winter_model_predict = holt_winter_model.forecast(7) # 预测7天后的结果print(holt_winter_model_predict) # 输出预测的结果

广告区↓

文章转载自稀饭居然不在家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




