分享一个超详细的数据分析案例【Python】附ABTest详细介绍_abtest案例

文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

p

1

p_1

p1​>=

p

2

p_2

p2​,即

p

1

p_1

p1​-

p

2

p_2

p2​>=0;

  • 备择假设

H

1

H_1

H1​:

p

1

p_1

p1​<

p

2

p_2

p2​,即

p

1

p_1

p1​-

p

2

p_2

p2​<0。

3.2 确定检验方向

由备择假设可以看出,检验方向为单项检验(左)。

3.3 选定统计方法

由于样本较大,故采用Z检验。此时检验统计量的公式如下:

z

=

p

1

p

2

(

1

n

1

1

n

2

)

×

p

c

×

(

1

p

c

)

z= \frac{p_1-p_2}{\sqrt{( \frac{1}{n_1}+\frac{1}{n_2})\times p_c \times (1-p_c)}}

z=(n1​1​+n2​1​)×pc​×(1−pc​)

​p1​−p2​​其中

p

c

p_c

pc​为总和点击率。

3.3.1 方法一:公式计算
# 用户数
n1 = len(data[data.dmp_id == 1])  # 对照组
n2 = len(data[data.dmp_id == 3])  # 策略二

# 点击数
c1 = len(data[data.dmp_id ==1][data.label == 1])
c2 = len(data[data.dmp_id ==3][data.label == 1])

# 计算点击率
p1 = c1 / n1
p2 = c2 / n2

# 总和点击率(点击率的联合估计)
pc = (c1 + c2) / (n1 + n2)

print("总和点击率pc:", pc)

在这里插入图片描述

# 计算检验统计量z
z = (p1 - p2) / np.sqrt(pc \* (1 - pc)\*(1/n1 + 1/n2))

print("检验统计量z:", z)

在这里插入图片描述
这里我去

α

\alpha

α为0.05,此时我们利用python提供的scipy模块,查询

α

=

0.5

\alpha=0.5

α=0.5时对应的z分位数。

from scipy.stats import norm
z_alpha = norm.ppf(0.05)
# 若为双侧,则norm.ppf(0.05/2)
z_alpha

在这里插入图片描述

z

α

=

1.64

z_\alpha = -1.64

zα​=−1.64, 检验统计量z = -59.44,该检验为左侧单尾检验,拒绝域为{z<

z

α

z_\alpha

zα​},z=-59.44落在拒绝域。

所以我们可以得出结论:在显著性水平为0.05时,拒绝原假设,策略二点击率的提升在统计上是显著的。

假设检验并不能真正的衡量差异的大小,它只能判断差异是否比随机造成的更大。因此,我们在报告假设检验结果的同时,应给出效应的大小。对比平均值时,衡量效应大小的常见标准之一是Cohen’d,中文一般翻译作科恩d值:

d

=

1

2

d=\frac{样本_1平均值-样本_2平均值}{标准差}

d=标准差样本1​平均值−样本2​平均值​
这里的标准差,由于是双独立样本的,需要用合并标准差(pooled standard deviations)代替。也就是以合并标准差为单位,计算两个样本平均值之间相差多少。双独立样本的合并标准差可以如下计算:

s

=

(

(

n

1

1

)

×

s

1

2

(

n

2

1

)

×

s

2

2

)

n

1

n

2

2

s=\frac{((n_1-1)\times s^2_1+(n_2-1)\times s^2_2)}{n_1+n_2-2}

s=n1​+n2​−2((n1​−1)×s12​+(n2​−1)×s22​)​

其中s是合并标准差,n1和n2是第一个样本和第二个样本的大小,s1和s2是第一个和第二个样本的标准差。减法是对自由度数量的调整。

# 合并标准差
std1 = data[data.dmp_id ==1].label.std()
std2 = data[data.dmp_id ==3].label.std()
s = np.sqrt(((n1 - 1)\* std1\*\*2 + (n2 - 1)\* std2\*\*2 ) / (n1 + n2 - 2))
# 效应量Cohen's d
d = (p1 - p2) / s
print('Cohen\'s d为:', d)

在这里插入图片描述

一般上Cohen’s d取值0.2-0.5为小效应,0.5-0.8中等效应,0.8以上为大效应。

3.3.2 方法二:Python函数计算
import statsmodels.stats.proportion as sp
# alternative='smaller'代表左尾
z_score, p = sp.proportions_ztest([c1, c2], [n1,n2], alternative = "smaller")
print("检验统计量z:",z_score,",p值:", p)

在这里插入图片描述
用p值判断与用检验统计量z判断是等效的,这里p值为0,同样也拒绝零假设。

至此,我们可以给出报告:

  • 对照组的点击率为:0.0126,标准差为:0.11
  • 策略二的点击率为:0.0262,标准差为:0.16
  • 独立样本z=-59.44,p=0,单尾检验(左),拒绝零假设。
  • 效应量Cohen’s d= -0.11,较小。

根据前面案例,我们用的是两个比率的z检验函数proportion.proportions_ztest,输入的是两组各自的总数和点击率;如果是一般性的z检验,可以用weightstats.ztest函数,直接输入两组的具体数值,可参考https://www.statsmodels.org/stable/generated/statsmodels.stats.weightstats.ztest.html

import statsmodels.stats.weightstats as sw
z_score1, p_value1 = sw.ztest(data[data.dmp_id ==1].label, data[data.dmp_id ==3].label, alternative='smaller')
print('检验统计量z:', z_score1, ',p值:', p_value1)

在这里插入图片描述
可以看到计算结果很接近,但是有点差异。因为非比率的z检验是不计算联合估计的。

作为补充,我们再检验下策略一的点击率提升是否显著。

z_score, p = sp.proportions_ztest([c1, len(data[data.dmp_id ==2][data.label == 1])],[n1, len(data[data.dmp_id ==2])], alternative = "smaller")
print('检验统计量Z:',z_score,',p值:',p)

在这里插入图片描述
p值约为 7.450121742737582e-46,p<α,但是因为前面我们设置了对点击率提升的最小要求(1%),这里仍然只选择第二组策略进行推广。

3.3.3 方法三:蒙特卡洛法模拟

蒙特卡洛法其实就是模拟法,用计算机模拟多次抽样,获得分布。

在零假设成立(p1>=p2)的前提下, p1=p2 为临界情况(即零假设中最接近备择假设的情况)。如果连相等的情况都能拒绝,那么零假设的剩下部分( p1>p2)就更能够拒绝了。

定义effect_tb.csv中样本的总点击率为 p_all:

p_all = data.label.mean()
print('p\_all:', p_all)

在这里插入图片描述
我们进行一次模拟,以 p_all 为对照组和策略二共同的点击率,即取p_old=p_new=p_all,分别进行n_old次和n_new次二点分布的抽样,使模拟的样本大小同effect_tb.csv中的样本大小相同:

choice1 = np.random.choice(2, size=n1, p=[1-p_all, p_all])
choice2 = np.random.choice(2, size=n2, p=[1-p_all, p_all])
diff = choice1.mean() - choice2.mean()
print('对照组结果:', choice1, ',策略二结果:', choice2, ',模拟的转化率差值:', diff)

在这里插入图片描述
因为是随机抽样,所以每次模拟的点击率差值也是不同的,多运行几次就会发现,我们模拟出的结果很难比effect_tb.csv中样本的点击率差值更小,这说明了什么?

# 计算effect\_tb.csv样本的点击率差值
data_diff = data[data["dmp\_id"] == 1]["label"].mean()-data[data["dmp\_id"] == 3]["label"].mean()
print('effect\_tb.csv样本的点击率差值:', data_diff)

在这里插入图片描述
按照如上方式进行多次模拟,这里我们进行10000次,并计算出每个样本得到的策略点击率差值,将其存储在diffs中:

diffs=[]
for i in range(10000):
    p2_diff = np.random.choice(2,size=n2,p=[1-p_all,p_all]).mean()
    p1_diff = np.random.choice(2,size=n1,p=[1-p_all,p_all]).mean()
    diffs.append(p1_diff - p2_diff)

实际上每次模拟都得到了一个大小为316205的样本,此处得到了10000个样本。在图上将模拟得到的diffs绘制为直方图,将effect_tb.csv中样本的点击率差值绘制为竖线:

diffs = np.array(diffs)
plt.hist(diffs)
plt.axvline(data_diff)

在这里插入图片描述

在diffs列表的数值中,有多大比例小于effect_tb.csv中观察到的点击率率差值?

(diffs < data_diff).mean()

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,让我们开始介绍这个案例。 欺诈检测是金融行业中非常重要的领域。许多金融机构都会使用数据分析来发现和预防欺诈行为。在这个案例中,我们将使用Python进行欺诈检测。 首先,让我们导入需要使用的库。 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix, classification_report ``` 接下来,我们将加载数据集并进行一些基本的数据探索。 ```python data = pd.read_csv('creditcard.csv') print(data.head()) print(data.describe()) print(data.info()) ``` 我们可以看到数据集包含了信用卡交易的信息。其中,Class列表示该交易是否被认为是欺诈交易,0表示不是欺诈交易,1表示是欺诈交易。我们可以看到数据集中有284,807条交易记录,其中492条是欺诈交易,占比不到0.2%。 接下来,我们将绘制一个热力图来查看数据集中各列之间的相关性。 ```python corrmat = data.corr() fig = plt.figure(figsize=(12, 9)) sns.heatmap(corrmat, vmax=.8, square=True) plt.show() ``` 我们可以看到数据集中各列之间的相关性并不强。 接下来,我们将进行数据预处理,包括标准化和拆分数据集。 ```python # 标准化数据 from sklearn.preprocessing import StandardScaler data['normalizedAmount'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1, 1)) data = data.drop(['Amount'], axis=1) # 拆分数据集 X = data.iloc[:, :-1] y = data.iloc[:, -1] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) ``` 接下来,我们将使用逻辑回归模型进行欺诈检测,并输出模型的评估结果。 ```python # 训练模型 lr = LogisticRegression() lr.fit(X_train, y_train) # 预测结果 y_pred = lr.predict(X_test) # 输出评估结果 print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred)) ``` 最后,我们可以看到模型的准确率为99.9%,召回率为60.8%。这意味着我们的模型能够正确识别大多数欺诈交易,但有一些欺诈交易可能会被错误地分类为非欺诈交易。因此,我们需要继续优化模型,以提高召回率和准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值