前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >检验样本是否服从泊松分布

检验样本是否服从泊松分布

作者头像
用户3577892
发布2021-07-08 10:46:24
1.6K0
发布2021-07-08 10:46:24
举报
文章被收录于专栏:数据科学CLUB数据科学CLUB

一、数据预处理二、变量分析三、总体分布估计四、结论与分析

本文以一个订单数据为例,研究顾客购买次数的分布规律,尝试从中估计总体的分布,以对后续的订单数据进行预测或进行业绩的对比

代码语言:javascript
复制
# 环境准备
import numpy as np
import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['Microsoft YaHei']

一、数据预处理

代码语言:javascript
复制
df = pd.read_csv('./orders.csv')
df.info()
代码语言:javascript
复制
<class 'pandas.core.frame.DataFrame'>
RangeIndex:  entries,  to 
Data columns (total  columns):
customerId     non-null int64
orderDate      non-null object
dtypes: int64(), object()
memory usage: 134.0+ KB
代码语言:javascript
复制
print(df.head())
代码语言:javascript
复制
   customerId   orderDate
           --
           --
           --
           --
           --

可以看到订单日期字段是 object 对象,这里就是字符串。因此要先将其转化成 pandas 中的 DataTime 对象,然后再添加年份字段方便后续的分组聚合运算。

代码语言:javascript
复制
df.orderDate = df.orderDate.astype('datetime64')
df['year'] = df.orderDate.map(lambda dt: dt.year)
print(df.head())
代码语言:javascript
复制
   customerId  orderDate  year
          --  
          --  
          --  
          --  
          --  

二、变量分析

首先通过数据透视表,查看不同年份的购买次数分布。然后再查看单个顾客累计购买次数分布。

代码语言:javascript
复制
counts = pd.pivot_table(
    df, values='orderDate', index=['customerId'], columns=['year'], aggfunc='count'
).fillna().astype(int)
counts['all'] = counts.sum(axis=)
print(counts.head())
代码语言:javascript
复制
year        2009  2010  2011  2012  all
customerId                             
              4     0     4     0    8
              7     4     5     0   16
              5     4     3     4   16
              2     8     3    14   27
              0     3     1     2    6
代码语言:javascript
复制
plt.figure(figsize=(,))
counts.plot(kind='box')
代码语言:javascript
复制
<matplotlib.axes._subplots.AxesSubplot at 0x7fb5d490f390>




<Figure size 864x360 with 0 Axes>
代码语言:javascript
复制
plt.figure(figsize=(,))
plt.subplot()
plt.hist(counts.sum(axis=), bins=)
plt.xlabel('times'); plt.ylabel('counts')

plt.subplot()
counts.sum(axis=).plot(kind='kde')
plt.xlim(-2,); plt.ylim(,0.04); plt.xlabel('times');

三、总体分布估计

根据预览的分布密度,并且由其统计学意义,猜测购买次数近似服从泊松分布。下面进行验证。

代码语言:javascript
复制
# 计算分布参数
lambda_ = counts.drop('all', axis=).sum(axis=).mean()
# 分布密度函数
def poisson(k, lambda_=lambda_):
    return np.e**(-lambda_) * lambda_**k / np.math.factorial(k)
# 计算总体分布
predict = [poisson(k) for k in range()]
代码语言:javascript
复制
# 可视化每个年份以及汇总的分布密度,与理想的总体分布进行对比
plt.figure(figsize=(,))
counts.drop('all', axis=).plot(kind='kde', linestyle='--', linewidth=)
counts['all'].plot(kind='kde', linewidth=, color='lightblue', label='总和')
# 理想泊松分布
plt.plot(range(), predict, linewidth=, color='green', label='泊松分布密度')
# 模拟的泊松分布
test = pd.Series([stats.poisson.rvs(lambda_) for i in range()])
test.plot(kind='kde', linewidth=, linestyle='--', color='red', label='模拟的分布密度')
plt.legend(); plt.xlim(-5, );
代码语言:javascript
复制
<Figure size 864x360 with 0 Axes>

请添加图片描述

四、结论与分析

由上图可以看到,首先总和的分布与理想的分布有差异,并且均值与时间跨度有关。具体表现为,一年内的次数分布,对比四年总和的次数分布,均值明显更小,集中趋势也更加显著。由于泊松分布为二项分布的极限分布,可以理解为,时间跨度影响了二项分布中的 n 参数,进而影响泊松分布中的 lambda 参数,亦即总体均值。因此结论得出的是,样本所在总体并不服从泊松分布,但是有明显的类似泊松分布的规律,由于其它未知变量的影响产生了偏移。

另外需要注意到,泊松分布的统计学解释认为每次抽样的条件相同。对应本例中的数据,即每次抽样中,其某个特定时间段(时间点)内购买的概率相同。但是由于数据中每个观测值来自不同的客户,因此不能保证这一点。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据科学CLUB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、数据预处理
  • 二、变量分析
  • 三、总体分布估计
  • 四、结论与分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档