我试图找出消费者购买的价值的分布情况。这是“零膨胀”,因为大多数消费者在给定的时间限制内不会进行任何购买。我用的是蟒蛇。由于它是购买商品的价值,因此我的数据不会像泊松分布那样受到亵渎,而是始终为非负且连续的,这可能意味着对数正态分布、指数分布、伽马分布、逆伽马分布等。 我的问题归结为如何使分布适合零膨胀数据并检查哪个更适合
?我找到了很多关于如何进行零膨胀泊松回归的信息,但我的目标是找出过程的基本分布是什么,而不是做出预测,因为我想知道方差。
什么是未知的
:膨胀零的概率 - 并非所有零都膨胀,因为它们也可能是基础分布的结果
import numpy as np
import pandas as pd
import scipy
from scipy import stats
import matplotlib.pyplot as plt
N = 1000 * 1000
p_of_inflated_zeros = 0.20
#generation of data
Data = pd.DataFrame({"Prob_bought" : np.random.uniform(0, 1, N) })
Data["If_bought"] = np.where(Data["Prob_bought"] > p_of_inflated_zeros , 1 , 0)
Data["Hipotetical_purchase_value"] = scipy.stats.expon.rvs(scale = 50, loc = 10, size = N)
#Data["Hipotetical_purchase_value"] = scipy.stats.lognorm.rvs(s = 1, scale = 50, loc = 10, size = N)
Data["Hipotetical_purchase_value"] = np.where(Data["Hipotetical_purchase_value"] < 0 ,0 , Data["Hipotetical_purchase_value"])
Data["Purchase_value"] = Data["If_bought"] * Data["Hipotetical_purchase_value"]
# fit distribiution
# based on https://stackoverflow.com/questions/6620471/fitting-empirical-distribution-to-theoretical-ones-with-scipy-python
#create
#x = np.linspace(min(gr_df_trans_tmp), max(gr_df_trans_tmp), 200)
y, x = np.histogram(Data["Purchase_value"], bins = 1000, density = True)
x = (x + np.roll(x, -1))[:-1] / 2.0
#lognormal
FIT_lognorm_sape, FIT_lognorm_loc, FIT_lognorm_scale = scipy.stats.lognorm.fit(Data["Purchase_value"])
FIT_lognorm_pdf = scipy.stats.lognorm.pdf(x, s = FIT_lognorm_sape, loc = FIT_lognorm_loc, scale = FIT_lognorm_scale)
SSE_lognorm = np.sum(np.power(y - FIT_lognorm_pdf, 2.0))
print(SSE_lognorm)
# 0.036408827144038584
#exponental
FIT_expo_loc, FIT_expo_scale = scipy.stats.expon.fit(Data["Purchase_value"])
FIT_expo_pdf = scipy.stats.expon.pdf(x, FIT_expo_loc, FIT_expo_scale)
SSE_expo = np.sum(np.power(y - FIT_expo_pdf, 2.0))
print(SSE_expo)
# 0.07564960702319487
# chart
# wykres histogram
axes = plt.gca()
axes.set_xlim([-2, 200])
plt.hist(Data["Purchase_value"], bins = 1000, alpha = 1, density = True)
# Plot the PDFs
plt.plot(x, FIT_lognorm_pdf, 'k', linewidth = 1, alpha = 0.5, color = 'red', label = 'lognormal')
plt.plot(x, FIT_expo_pdf, 'k', linewidth = 1, alpha = 0.5, color = 'blue', label = 'exponental')
plt.legend(loc='upper right', title = "")
plt.title("Fitting distribiution to ilustrativ data")
plt.xlabel("Hipotetical purchase value")
plt.ylabel('Density')
具有许多零和长右尾的数据分布表明,最好使用混合模型对数据进行建模,该模型可以容纳零处的点质量和分布的连续部分。此类数据的常用模型包括:
零膨胀模型:
零膨胀泊松 (ZIP) 或零膨胀负二项式 (ZINB) 等模型是处理计数数据时的最佳选择。然而,对于连续数据,可能更推荐使用零膨胀高斯。