美文网首页解密大数据
重新研读fish千聊课07 (上)

重新研读fish千聊课07 (上)

作者: Bog5d | 来源:发表于2017-11-07 21:08 被阅读19次

这次开始之前,我自己有必要先分析一下思路,再开始研读,到目前为止,我研读这些东西,都没有跟实际工作生活像结合起来,还是有一种为了学东西,而学东西。

我学这个有什么用呢?

这是没能想清楚的问题. 学了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')

错误记录:

  1. 代码和文件没有在同一层文件夹中,所以应该加入文件夹地址“data/”,我天真地以为可以直接导入
  2. 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.

  1. 转换为什么的话,是需要加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'])

错误记录:

  1. y= 后面只能有一个对象,我的逗号,就反映了有多个对象,应该把多个对象用方括号连起来。
  2. 我竟然直接开始画图,用plt.plot开头,连data都没有。 应该是fortis.plot,笨!!
<matplotlib.axes._subplots.AxesSubplot at 0xa4d6128>
output_22_1.png
scandens.plot(x='Year',y=['Beak length','Beak depth','Beak width'])
<matplotlib.axes._subplots.AxesSubplot at 0xa9006d8>
output_23_1.png output_24_1.png
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)
output_24_1.png
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>
output_25_1.png
scandens.plot(x='Year',y='Beak depth',yerr='CI Beak depth',color='Orange',marker='o',figsize=(11,4))
<matplotlib.axes._subplots.AxesSubplot at 0xe03fc88>
output_26_1.png

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()

错误记录:

  1. groupby后面的对象应该是括号啊,用方括号,往往都是为了把多个数据,合并为一个对象。
  2. 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)
output_37_1.png
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)
output_39_1.png

中地雀鸟喙深度和长度的变化


按时间给中地雀的样本分组
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])

相关文章

  • 重新研读fish千聊课07 (上)

    这次开始之前,我自己有必要先分析一下思路,再开始研读,到目前为止,我研读这些东西,都没有跟实际工作生活像结合起来,...

  • 重新研读fish千聊课07

    这次开始之前,我自己有必要先分析一下思路,再开始研读,到目前为止,我研读这些东西,都没有跟实际工作生活像结合起来,...

  • 重新研读fish千聊课05

  • 重新研读fish千聊课06

    已经重新研读了6节课了,感觉fish的课程,真的有很多高质量内容,这种感觉就像,你希望去提高自己到厨艺,于是自己去...

  • 重新研读fish千聊课05

    中心极限定理 & 区间估计 matplotlib inline这句,可以不用plt.show出图 ​ 标准正态分布...

  • 重新研读fish千聊课04

    计算机模拟 生成随机数 疑惑: 为什么要有种子呢? 小疑惑,random()生成的随机数,是默认为0-1之间的吗?...

  • fish千聊课重新研读03

    本课主要是统计学常识。 很多概念都值得背诵下来。 描述统计量 集中趋势均值中位数众数 离散程度全距四分位距方差、...

  • 重新研读fish千聊课代码02

    自己每次研读完代码,就是直接把notebook文件copy到简书,使得排版特别杂乱,而且自己散乱的个人感悟,和代码...

  • 重新研读fish课代码 01

    前言: fish在千聊的课已经收尾了。 她的课备得特别好,尤其是代码的注释做得特别好。 是很好的学习材料,我决...

  • 微课平谷的思考

    今天市场部开微课,我很久没在千聊开课了,这次重新来思考怎么做好这次课。在千聊看了下,现在千聊也着重自己在开亲子微课...

网友评论

  • TheTiger:感谢波波对解密大数据社群的信任,和难能可贵的坚持精进!
    Bog5d:@amoyyean 好的,谢谢哈。 我现在继续在报一些课程学习,一起加油哦
    amoyyean:波波不错。

    要维护一个社群也不容易。新生大学那里现在大家能经常保持交流吗?学习社群难点之一是每个人的工作内容不同,自己和公司期望的工作目标不同。和具体职能(而且最好是能维持不错生活水平的职业)距离远一些,和市场需求匹配度不够高的,大家之间比较少有长期的问答交流。我现在就是公司想解决的问题和一些课程差异还是蛮大的,所以更多是在实践中再思考和解决了。
    Bog5d:@泰阁志 嗯嗯
    还得感谢tiger领进门,现在觉得Python,大数据等文章,都跟自己有关系了。
    再谢

本文标题:重新研读fish千聊课07 (上)

本文链接:https://www.haomeiwen.com/subject/hsksmxtx.html