机器学习基础之概率浅析,电影分析

本文通过Python对电影数据进行统计分析,包括死亡人数与上映年份的关系,并应用条件概率及贝叶斯公式进行深入探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



本文主要以一个电影统计的数据作为分析的基础数据,进而描述一下 如何用python 进行简单的数据分析统计,得出想要的结果。

本文用到的csv中的数据为——电影上映的年份,电影中死亡的人数。


首先从github上将数据下载下来:

import urllib.request
urllib.request.urlretrieve('https://github.com/sjmgarnier/R-vs-Python/archive/master.zip', 'master.zip')



将数据解压缩:

import zipfile
zip = zipfile.ZipFile('./master.zip', 'r')
for name in zip.namelist():
    zip.extract(name, '.')



将数据读取出来:

import pandas as pd

film_deaths = pd.read_csv('./R-vs-Python-master/Deadliest movies scrape/code/film-death-counts-Python.csv')
film_deaths.describe()


output:

  Year Body_Count Length_Minutes IMDB_Rating
count 421.000000 421.000000 421.000000 421.000000
mean 1996.491686 53.287411 115.427553 6.882898
std 10.913210 82.068035 21.652287 1.110788
min 1949.000000 0.000000 79.000000 2.000000
25% 1991.000000 11.000000 100.000000 6.200000
50% 2000.000000 28.000000 111.000000 6.900000
75% 2005.000000 61.000000 127.000000 7.700000
max 2009.000000 836.000000 201.000000 9.300000

在这个数据当中,film_deaths.Year 就是年份     film_deaths.Body_Count 就是该电影死亡的人数

可以简单把电影用matplotpib描述出来:



import pylab as plt

plt.plot(film_deaths['Year'], film_deaths['Body_Count'], 'rx')

output:




接下来用到一点条件概率的知识, 该年份下 电影中死亡人数超过40的电影出现的概率——sum(死亡人数超40的点影)/sum(该年份的电影总数):


import numpy as np
import pylab as plt

years = np.array(list(set([x for x in film_deaths['Year']])))
prob_death=np.array([float((film_deaths.Body_Count[film_deaths.Year==year]>40).sum())/float((film_deaths.Year==year).sum()) for year in years])

plt.plot(years, prob_death, 'r*')
plt.show()


output:



联合概率 等于 条件概率 乘以 该条件发生的概率:


p(y,t)=p(y|t)p(t)




用代码表示就是:

p_t = float((film_deaths.Year==2002).sum())/float(film_deaths.Body_Count.count())
p_y_given_t = float((film_deaths.Body_Count[film_deaths.Year==2002]>40).sum())/float((film_deaths.Year==2002).sum())
p_y_and_t = float((film_deaths.Body_Count[film_deaths.Year==2002]>40).sum())/float(film_deaths.Body_Count.count())
print("P(t) is", p_t)
print("P(y|t) is", p_y_given_t)
print("P(y,t) is", p_y_and_t)
print(p_t*p_y_given_t)


output:

P(t) is 0.06413301662707839
P(y|t) is 0.4074074074074074
P(y,t) is 0.026128266033254157
0.026128266033254157


进而我们还可以验证一下概率的和:

P(y)=tP(y,t)

在不同t条件下的所有联合概率的和等于条件 y 发生的概率 即 p(y):

years = set(film_deaths.Year)
p_y = sum([float((film_deaths.Body_Count[film_deaths.Year==year]>40).sum())/float(film_deaths.Body_Count.count()) for year in years])
print('p(y) is', p_y)


output:

p(y) is 0.37767220902612836


在得出了这些结论之后,我们可以得出贝叶斯公式的结果: P(y,t)=P(t,y)=P(t|y)P(y)

因为 P(y,t)=P(t,y)=P(t|y)P(y)


所以 P(t|y)=P(y|t)P(t)P(y)
等式右边的所有变量都可以求出,所以可以估算 在给定死亡概率的条件下,推算这部电影是那一年上映的。



ps: 事实上,电影死亡的人数与年份之间没有特别强的关联性,读者不妨可以试试csv文档中的其他数据来计算整个过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值