这次开始之前,我自己有必要先分析一下思路,再开始研读,到目前为止,我研读这些东西,都没有跟实际工作生活像结合起来,还是有一种为了学东西,而学东西。
我学这个有什么用呢?
这是没能想清楚的问题. 学了python的这点课,真的可能成为我未来转行大数据行业的技能储备吗?
有时候会觉得自己很幼稚。
但也一直觉得,能接触到这项技能真的很有意义。
是不是我把学习Python技能,强制附加了“成为未来转行的必备技能”的期望,而失去了学习东西的那份快乐呢?
好吧,废话几句。 不知道,接下来关于大数据的学习,该何去何从,接着研读吧。
import pandas as pd
import numpy as np
import scipy.stats
import matplotlib.pyplot as plt
import matplotlib # ?? 只引用matplotlib 和.pyplot 之间的区别是什么呢?
matplotlib.style.use('ggplot')
%matplotlib inline
#%config BackendInline.forture_commat('retina')
#%config InlineBackend.fortune_format = 'retina'
#
%config InlineBackend.figure_format = 'retina'
#错误记录: 配置图形格式为retina这段代码,总是写错。 1. figure_format ,拼写错误明显。 2. 不是用括号,而是直接等于。
# 新增知识点: ggplot,是一个r语言的图形绘制包,可以像图层一样绘制,很好用。
/home/bobo/anaconda3/lib/python3.6/site-packages/matplotlib/font_manager.py:280: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.
'Matplotlib is building the font cache using fc-list. '
!ls data
data_75_12.csv evolution.csv fortis_heritability.csv
我不能在自己电脑上直接使用带感叹号的方式运行linux命令。 但是去掉感叹号后,却出现了比较多的文件夹信息。
数据导入和清洗
这部分主要是把粗糙的数据进行清洗
evolution = pd.read_csv(r'data/evolution.csv')
错误记录:
- 代码和文件没有在同一层文件夹中,所以应该加入文件夹地址“data/”,我天真地以为可以直接导入
- csv,被我搞成了scv
evolution.head()
evolution.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 83 entries, 0 to 82
Data columns (total 8 columns):
Year 82 non-null object
Species 81 non-null object
Beak length 81 non-null object
Beak depth 80 non-null float64
Beak width 80 non-null float64
CI Beak length 80 non-null object
CI Beak depth 80 non-null object
CI Beak width 80 non-null object
dtypes: float64(2), object(6)
memory usage: 5.3+ KB
只有两个数字是float类型,还有绝大部分数据都不是82个。
evolution = evolution.dropna()
evolution.info()
新增知识点:
data.dropna() 是删除缺失值的方法,把数值不齐全的列给删除掉。
<class 'pandas.core.frame.DataFrame'>
Int64Index: 80 entries, 0 to 82
Data columns (total 8 columns):
Year 80 non-null object
Species 80 non-null object
Beak length 80 non-null object
Beak depth 80 non-null float64
Beak width 80 non-null float64
CI Beak length 80 non-null object
CI Beak depth 80 non-null object
CI Beak width 80 non-null object
dtypes: float64(2), object(6)
memory usage: 5.6+ KB
#evolution['Beak length']= pd.numeric['Beak length']
evolution['Beak length'] = pd.to_numeric(evolution['Beak length'])
evolution['Beak length'].head()
错误记录:
1 . 转换为数值类型需要有对象啊。 对象一半都在括号中。 我现在感觉python很像是一个超大的工具包,我说我要A工具,它流把掏出来,不过工具太多,我得说明白
所以我要说,我需要用A工具去操作对象a.
- 转换为什么的话,是需要加to的,我并没有加,也就是基本的拼写错误。
0 10.76
1 10.72
2 10.57
3 10.64
4 10.73
Name: Beak length, dtype: float64
evolution['CI Beak length'] = pd.to_numeric(evolution['CI Beak length'],errors='coerce')
evolution['CI Beak depth'] = pd.to_numeric(evolution['CI Beak depth'],errors='coerce')
evolution['CI Beak width'] = pd.to_numeric(evolution['CI Beak width'],errors='coerce')
新增知识点:强制转化为数据类型,但遇到不能转化的额,就用null代替
evolution.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 80 entries, 0 to 82
Data columns (total 8 columns):
Year 80 non-null object
Species 80 non-null object
Beak length 80 non-null float64
Beak depth 80 non-null float64
Beak width 80 non-null float64
CI Beak length 79 non-null float64
CI Beak depth 79 non-null float64
CI Beak width 79 non-null float64
dtypes: float64(6), object(2)
memory usage: 5.6+ KB
初步的数据清洗,就完成了,若是要删除某些列呢? 该咋办呀?
数据探索
evolution.head()
evolution.tail()
evolution.Species.value_counts()
错误记录: value——count可是只针对一列的汇总统计,我输入的是evolution.value_counts()对象是整个数据啊,而我只是想要其中的一列
fortis 40
scandens 40
Name: Species, dtype: int64
尝试修改列名称
evolution.rename(columns = {'Species':'species'},inplace=True)
错误记录,未加引号
evolution.head()
fortis = evolution[evolution.species=='fortis']
fortis.tail()
scandens = evolution[evolution.species=='scandens']
scandens.tail()
所有方括号的外的数据,给定了范围,方括号内,就是筛选数据范围。
evolution.species[evolution.species=='scandens'] vs
evolution[evolution.species=='scandens'] 是截然不同的结果
fortis.plot(x='Year',y=['Beak length','Beak depth','Beak width'])
错误记录:
- y= 后面只能有一个对象,我的逗号,就反映了有多个对象,应该把多个对象用方括号连起来。
- 我竟然直接开始画图,用plt.plot开头,连data都没有。 应该是fortis.plot,笨!!
<matplotlib.axes._subplots.AxesSubplot at 0xa4d6128>
scandens.plot(x='Year',y=['Beak length','Beak depth','Beak width'])
<matplotlib.axes._subplots.AxesSubplot at 0xa9006d8>
scandens.plot(x='Year',y=['Beak length','Beak depth','Beak width'],subplots = True,figsize=(10,6))
#新增知识点:1.subplots,意思应该是在多幅图上作图,而非在一张图上显示
array([<matplotlib.axes._subplots.AxesSubplot object at 0x000000000BA26898>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000BB0FC88>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000BB5F240>], dtype=object)
fortis.plot(x='Year',y='Beak depth',yerr='CI Beak depth',color='Red',marker='o',figsize=(10,5))
新增知识点:yerr,marker
<matplotlib.axes._subplots.AxesSubplot at 0xd339b00>
scandens.plot(x='Year',y='Beak depth',yerr='CI Beak depth',color='Orange',marker='o',figsize=(11,4))
<matplotlib.axes._subplots.AxesSubplot at 0xe03fc88>
75年和12年的数据比较
ls data
驱动器 C 中的卷是 WIN7
卷的序列号是 CCED-57EE
C:\Users\Administrator.USER-20170623BT\Desktop\第七课材料\第七课材料\codes\data 的目录
2017/08/31 12:13 <DIR> .
2017/08/31 12:13 <DIR> ..
2017/08/14 17:39 6,148 .DS_Store
2017/08/14 12:37 14,142 data_75_12.csv
2017/08/14 17:50 3,930 evolution.csv
2017/08/14 13:15 8,568 fortis_heritability.csv
4 个文件 32,788 字节
2 个目录 40,499,621,888 可用字节
data = pd.read_csv('data/data_75_12.csv')
data.head()
这组数据中只包含有75年和12年的所有样本,而刚才的是每年的数据一个均值。
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 651 entries, 0 to 650
Data columns (total 4 columns):
species 651 non-null object
length 651 non-null float64
depth 651 non-null float64
year 651 non-null int64
dtypes: float64(2), int64(1), object(1)
memory usage: 20.4+ KB
data.year.value_counts()
1975 403
2012 248
Name: year, dtype: int64
data.species.value_counts()
fortis 437
scandens 214
Name: species, dtype: int64
data.groupby(['species','year']).count()
错误记录:
- groupby后面的对象应该是括号啊,用方括号,往往都是为了把多个数据,合并为一个对象。
- groupby的计数,是不加s的。
data.groupby(['species','year']).mean()
fortis2 = data[data.species=='fortis']
fortis2.head()
fortis2.boxplot(by='year',figsize=(10,5))
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7fca6a16c630>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fca615bcfd0>], dtype=object)
scandens2 = data[data.species=='scandens']
scandens2.head()
scandens2.boxplot(by='year',figsize=(10,5))
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7fca610619e8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fca61493438>], dtype=object)
中地雀鸟喙深度和长度的变化
按时间给中地雀的样本分组
fortis75 = fortis2[fortis2.year==1975]
为什么对时间的切片,不用加引号呢? 引号只是对str类型有效吗?
fortis12 = fortis2[fortis2.year==2012]
print (fortis75.head())
print (fortis12.head())
species length depth year
0 fortis 9.4 8.0 1975
1 fortis 9.2 8.3 1975
2 fortis 9.5 7.5 1975
3 fortis 9.5 8.0 1975
4 fortis 11.5 9.9 1975
species length depth year
403 fortis 10.0 8.5 2012
404 fortis 12.5 8.9 2012
405 fortis 9.3 7.5 2012
406 fortis 10.3 9.6 2012
407 fortis 11.0 9.2 2012
个人思考:这里的fortis75 和fortis12 是两组抽样分布,所以我们要比较两组分布之间的数据变化,是需要用推论统计的。
而比较两组数据间的差别应该怎么办呢?
核心指标是什么啊?
是总体的均值。
但是总体的均值,是一个推测值,由两组样本之间的推测出的总体均值的范围来确定的。
所以需要用置信区间来确定,锁定在大部分情况下,总体均值会在什么范围。
但是比较两个样本的总体均值的话,该怎么办?
那就是用拒绝域的那个观点,可是拒绝域的本质问题是什么啊?
p value,还有μ的范围。
头脑有点炸 ,我看看源码吧,
fortis75.depth.mean()
9.171645569620255
fortis12.depth.mean()
8.605371900826446
def mean_ci(data):
#均值95%的置信区间
n = len(data)
x_ = np.mean(data)
s = np.std(data,ddof=1)
z = scipy.stats.norm.isf(0.0025)
se = s/np.sqrt(n)
con_in = (x_-z*se,x_+z*se)
return con_in
mean_ci(fortis75.depth)
(9.0552111088224159, 9.2880800304180937)
def mean_ci1(data):
'''给定样本数据,计算均值95%的置信区间'''
sample_size = len(data)
std = np.std(data, ddof=1)
se = std / np.sqrt(sample_size)
point_estimate = np.mean(data)
z_score = scipy.stats.norm.isf(0.025) # 置信度95%
confidence_interval = (point_estimate - z_score * se, point_estimate + z_score * se)
return confidence_interval
mean_ci1(fortis75.depth)
(9.0903471711839057, 9.2529439680566039)
mean_ci(fortis12.depth)
(8.4184311775393894, 8.792312624113503)
mean_ci1(fortis12.depth)
(8.4748436937850755, 8.7359001078678169)
鸟喙深度均值差
也就是说,拿75年和12年的均值相减。
diff_mean = fortis12.depth.mean()-fortis75.depth.mean()
diff_mean
-0.5662736687938086
bootstrap求差值的均值变化
def draw_bs_res(data,func,size = 1):
bs_replicates = np.empty(size) #错误记录,np.empy()括号中还需要情况一个值,那就是size。 既然初始化,那一定要指明初始化的是哪个数字哦
for i in range(size):
bs_replicates[i] = func(np.random.choice(data,size = len(data)))#choice()后面是有2个参数,样本是哪些? 从样本中再抽多少次?而我只是把样本放进去了,忘了写该抽样多少个
return bs_replicates
bs_for75=draw_bs_res(fortis75.depth,np.mean, 10000)
bs_for12 = draw_bs_res(fortis12.depth,np.mean,10000)
bs_for75
array([ 9.24414557, 9.20844937, 9.23446203, ..., 9.19316456,
9.12177215, 9.22363924])
bs_for12
array([ 8.57479339, 8.5731405 , 8.62190083, ..., 8.72933884,
8.76115702, 8.60330579])
diff_bs = bs_for12-bs_for75
diff_bs
array([-0.66935218, -0.63530887, -0.6125612 , ..., -0.46382571,
-0.36061513, -0.62033346])
diff_mean = np.percentile(diff_bs,[2.5,97.5])
diff_mean
array([-0.71902047, -0.40750995])