本文主要以一个电影统计的数据作为分析的基础数据,进而描述一下 如何用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文档中的其他数据来计算整个过程。