精华内容
下载资源
问答
  •  使用已有的编程技巧学习和理解贝叶斯统计  处理估计、预测、决策分析、假设的证据、假设检验等问题  从简单的例子开始,包括硬币问题、M&Ms豆问题、《龙与地下城》勇士投骰子问题、彩弹游戏和冰球比赛问题  ...
  •  使用已有的编程技巧学习和理解贝叶斯统计  处理估计、预测、决策分析、假设的证据、假设检验等问题  从简单的例子开始,包括硬币问题、M&Ms;豆问题、《龙与地下城》勇士投骰子问题、彩弹游戏和冰球比赛问题 ...
  • 概率论与数理统计第一章思维导图 本章介绍了随机试验,随机事件的概念,事件间的关系以及运算,主要给出了古典概型,条件概率的定义,概率的加法公式,全概率公式和贝叶斯公式,同时独立性和伯努利概型进行了重点...
  • 大数据与统计思维

    2018-06-20 10:57:51
    最近,《大数据时代》等几本书引起了广泛的关注,大数据正在改变着人们的行为与思维,那么以数据为研究对象的统计学该如何应对,本文基于大数据的理解,认为统计思维需要发生三个方面的改变,即要改变认识数据的思维、...
  • 目前,人工智能的火热程度不言而喻了,很多打算入行的朋友都会觉得这一块是不是数学要求很高,的确,就我... 这次的图书是《统计之美:人工智能时代的科学思维》,是关于统计学及其相关领域的,涉及到概率论、大...

           目前,人工智能的火热程度不言而喻了,很多打算入行的朋友都会觉得这一块是不是对数学要求很高,的确,就我目前接触的小范围领域来说,坚实的数学基础是必不可少的,它可以让你轻松地实现一些重要理念的推导,对后期的进一步发展也是至关重要的,所以最近打算充充电,找回当年学习数学的感觉。

            这次的图书是《统计之美:人工智能时代的科学思维》,是关于统计学及其相关领域的,涉及到概率论、大数据、人工智能等,是一本不错的入门或者是复习书籍。这本书由96个小故事组成,每个小故事对应一个专业知识点,可以让你简单愉快地完成那些晦涩高深概念的理解,就这一点而言甚得朕心~~~

           ok,这次的读书笔记做的思维导图,这样会更加直接,有喜欢此书的朋友可以入手了,最近当当貌似在搞活动……

    先看下本书的全貌吧:

    以下是根据本书内容制作的思维导图,由于是第一次做思维导图,很多地方还不是很规范,请大家多多指教:

    字比较小,有想要原图的可以发邮箱哦~~~~

    ps:图片可点击放大~~~

    展开全文
  • Downey所著的《统计思维-程序员数学之概率统计》这本书的学习过程和一些理解 [TOC]第一章 程序员的统计思维研究背景 第一个孩子是否大多数会在预产期之后出生? 数据来源 全国家庭成长调查数据(NSFG) NSFG数据...

    此文用于记录在Allen B. Downey所著的《统计思维-程序员数学之概率统计》这本书的学习过程和一些理解

    第一章 程序员的统计思维


    研究背景

    第一个孩子是否大多数会在预产期之后出生?


    数据来源


    数据处理代码-survey.py


    输入

    将NSFG的数据处理代码survey.py与NSFG放于同一目录下运行,程序会读取数据文件并显示每个文件的记录数


    输出

    >>>Number of respondents 7643
    >>>Number of pregnancies 13593

    代码分析

    survey.py中定义了以下六个类

    类名描述
    Record表示一个记录的对象
    RespondentRecord的子类,表示被调查者记录的对象
    PregnancyRecord的子类,表示怀孕者记录的对象
    Table表示若干记录集合的表对象
    RespondentsTable的子类,表示被调查者记录集合的表对象
    PregnancysTable的子类,表示怀孕者记录集合的表对象

    Table

    函数原型功能描述参数描述返回
    ReadFile(self, data_dir, filename, fields, constructor, n=None)读取压缩数据文件,每个记录生成一个对象data_dir:字符串的目录名; filename:要读取的文件的字符串名称; fields:(name, start, end, cast) 元组指定序列要提取的字段; constructor:创建什么样的对象
    MakeRecord(self, line, fields, constructor)扫描一行并返回一个具有适当字段的对象line:从数据文件的字符串行; fields:(name, start, end, cast) 元组指定序列要提取的字段; constructor:可调用的,它为记录创建对象用适当的字段记录
    AddRecord(self, record)向该表添加记录record:记录类型之一的对象
    ExtendRecords(self, records)向该表添加记录序列record:记录对象的序列
    Recode(self)子类可以重写该记录的值

    Respondents

    函数原型功能描述返回
    ReadRecords(self, data_dir=’.’, n=None)读取记录构建被调查者表
    GetFilename(self)返回数据文件名2002FemResp.dat.gz
    GetFields(self)返回指定记录字段的元组列表,这些字段就是Record对象的属性caseid:被调查者的整数ID

    Pregnancies

    函数原型功能描述返回
    ReadRecords(self, data_dir=’.’, n=None)读取记录构建怀孕者表
    GetFilename(self)返回数据文件名2002FemPreg.dat.gz
    GetFields(self)返回指定记录字段的元组列表,这些字段就是Record对象的属性caseid:被调查者的整数ID;prglength:怀孕周期,单位是周;outcome:怀孕结果的整数代码,1表示活婴;birthord:正常出生的婴儿的顺序;finalwgt:被调查者的统计权重;nbrnaliv;babysex;birthwgt_lb;birthwgt_oz;agepreg

    源码

    """This file contains code for use with "Think Stats", by Allen B. Downey, available from greenteapress.com
    
    Copyright 2010 Allen B. Downey
    License: GNU GPLv3 http://www.gnu.org/licenses/gpl.html
    """
    
    import sys
    import gzip
    import os
    
    class Record(object):
        """Represents a record."""
    
    class Respondent(Record): 
        """Represents a respondent."""
    
    class Pregnancy(Record):
        """Represents a pregnancy."""
    
    class Table(object):
        """Represents a table as a list of objects"""
    
        def __init__(self):
            self.records = []
    
        def __len__(self):
            return len(self.records)
    
        def ReadFile(self, data_dir, filename, fields, constructor, n=None):
            """Reads a compressed data file builds one object per record.
    
            Args:
                data_dir: string directory name
                filename: string name of the file to read
    
                fields: sequence of (name, start, end, case) tuples specifying 
                the fields to extract
    
                constructor: what kind of object to create
            """
            filename = os.path.join(data_dir, filename)
    
            if filename.endswith('gz'):
                fp = gzip.open(filename)
            else:
                fp = open(filename)
    
            for i, line in enumerate(fp):
                if i == n:
                    break
                record = self.MakeRecord(line, fields, constructor)
                self.AddRecord(record)
            fp.close()
    
        def MakeRecord(self, line, fields, constructor):
            """Scans a line and returns an object with the appropriate fields.
    
            Args:
                line: string line from a data file
    
                fields: sequence of (name, start, end, cast) tuples specifying 
                the fields to extract
    
                constructor: callable that makes an object for the record.
    
            Returns:
                Record with appropriate fields.
            """
            obj = constructor()
            for (field, start, end, cast) in fields:
                try:
                    s = line[start-1:end]
                    val = cast(s)
                except ValueError:
                    # If you are using Visual Studio, you might see an
                    # "error" at this point, but it is not really an error;
                    # I am just using try...except to handle not-available (NA)
                    # data.  You should be able to tell Visual Studio to
                    # ignore this non-error.
                    val = 'NA'
                setattr(obj, field, val)
            return obj
    
        def AddRecord(self, record):
            """Adds a record to this table.
    
            Args:
                record: an object of one of the record types.
            """
            self.records.append(record)
    
        def ExtendRecords(self, records):
            """Adds records to this table.
    
            Args:
                records: a sequence of record object
            """
            self.records.extend(records)
    
        def Recode(self):
            """Child classes can override this to recode values."""
            pass
    
    
    class Respondents(Table):
        """Represents the respondent table."""
    
        def ReadRecords(self, data_dir='.', n=None):
            filename = self.GetFilename()
            self.ReadFile(data_dir, filename, self.GetFields(), Respondent, n)
            self.Recode()
    
        def GetFilename(self):
            return '2002FemResp.dat.gz'
    
        def GetFields(self):
            """Returns a tuple specifying the fields to extract.
    
            The elements of the tuple are field, start, end, case.
    
                    field is the name of the variable
                    start and end are the indices as specified in the NSFG docs
                    cast is a callable that converts the result to int, float, etc.
            """
            return [
                ('caseid', 1, 12, int),
                ]
    
    class Pregnancies(Table):
        """Contains survey data about a Pregnancy."""
    
        def ReadRecords(self, data_dir='.', n=None):
            filename = self.GetFilename()
            self.ReadFile(data_dir, filename, self.GetFields(), Pregnancy, n)
            self.Recode()
    
        def GetFilename(self):
            return '2002FemPreg.dat.gz'
    
        def GetFields(self):
            """Gets information about the fields to extract from the survey data.
    
            Documentation of the fields for Cycle 6 is at
            http://nsfg.icpsr.umich.edu/cocoon/WebDocs/NSFG/public/index.htm
    
            Returns:
                sequence of (name, start, end, type) tuples
            """
            return [
                ('caseid', 1, 12, int),
                ('nbrnaliv', 22, 22, int),
                ('babysex', 56, 56, int),
                ('birthwgt_lb', 57, 58, int),
                ('birthwgt_oz', 59, 60, int),
                ('prglength', 275, 276, int),
                ('outcome', 277, 277, int),
                ('birthord', 278, 279, int),
                ('agepreg', 284, 287, int),
                ('finalwgt', 423, 440, float),
                ]
    
        def Recode(self):
            for rec in self.records:
    
                # divide mother's age by 100
                try:
                    if rec.agepreg != 'NA':
                        rec.agepreg /= 100.0
                except AttributeError:
                    pass
    
                # convert weight at birth from lbs/oz to total ounces
                # note: there are some very low birthweights
                # that are almost certainly errors, but for now I am not
                # filtering
                try:
                    if (rec.birthwgt_lb != 'NA' and rec.birthwgt_lb < 20 and
                        rec.birthwgt_oz != 'NA' and rec.birthwgt_oz <= 16):
                        rec.totalwgt_oz = rec.birthwgt_lb * 16 + rec.birthwgt_oz
                    else:
                        rec.totalwgt_oz = 'NA'
                except AttributeError:
                    pass
    
    
    def main(name, data_dir='.'):
        resp = Respondents()
        resp.ReadRecords(data_dir)
    
        print ('Number of respondents', len(resp.records))
    
        preg = Pregnancies()
        preg.ReadRecords(data_dir)
        print ('Number of pregnancies', len(preg.records))
    
    
    if __name__ == '__main__':
        main(*sys.argv)
    

    平均怀孕周期统计代码-first.py


    输入

    将平均怀孕周期统计代码first.py与survey.py,及NSFG放于同一目录下运行,程序会读取数据文件并统计出第一胎婴儿和其他婴儿的平均怀孕周期对比


    输出

    >>>Number of first babies 4413
    >>>Number of others 4735
    >>>Mean gestation in weeks:
    >>>First babies 38.60095173351461
    >>>Others 38.52291446673706
    >>>Difference in days 0.5462608674428466

    源码

    """This file contains code used in "Think Stats",
    by Allen B. Downey, available from greenteapress.com
    
    Copyright 2010 Allen B. Downey
    License: GNU GPLv3 http://www.gnu.org/licenses/gpl.html
    """
    
    import survey
    
    # copying Mean from thinkstats.py so we don't have to deal with
    # importing anything in Chapter 1
    
    def Mean(t):
        """Computes the mean of a sequence of numbers.
    
        Args:
            t: sequence of numbers
    
        Returns:
            float
        """
        return float(sum(t)) / len(t)
    
    
    def PartitionRecords(table):
        """Divides records into two lists: first babies and others.
    
        Only live births are included
    
        Args:
            table: pregnancy Table
        """
        firsts = survey.Pregnancies()
        others = survey.Pregnancies()
    
        for p in table.records:
            # skip non-live births
            if p.outcome != 1:
                continue
    
            if p.birthord == 1:
                firsts.AddRecord(p)
            else:
                others.AddRecord(p)
    
        return firsts, others
    
    
    def Process(table):
        """Runs analysis on the given table.
    
        Args:
            table: table object
        """
        table.lengths = [p.prglength for p in table.records]
        table.n = len(table.lengths)
        table.mu = Mean(table.lengths)
    
    
    def MakeTables(data_dir='.'):
        """Reads survey data and returns tables for first babies and others."""
        table = survey.Pregnancies()
        table.ReadRecords(data_dir)
    
        firsts, others = PartitionRecords(table)
    
        return table, firsts, others
    
    
    def ProcessTables(*tables):
        """Processes a list of tables
    
        Args:
            tables: gathered argument tuple of Tuples
        """
        for table in tables:
            Process(table)
    
    
    def Summarize(data_dir):
        """Prints summary statistics for first babies and others.
    
        Returns:
            tuple of Tables
        """
        table, firsts, others = MakeTables(data_dir)
        ProcessTables(firsts, others)
    
        print 'Number of first babies', firsts.n
        print 'Number of others', others.n
    
        mu1, mu2 = firsts.mu, others.mu
    
        print 'Mean gestation in weeks:' 
        print 'First babies', mu1 
        print 'Others', mu2
    
        print 'Difference in days', (mu1 - mu2) * 7.0
    
    
    def main(name, data_dir='.'):
        Summarize(data_dir)
    
    
    if __name__ == '__main__':
        import sys
        main(*sys.argv)

    结果分析

    第一胎婴儿的出生时间比其他婴儿的出生时间平均晚13个小时,出现了直观效应,仍需考虑以下问题:

    • 其他汇总统计量如何,如中位数,方差
    • 差异是否只是随机产生的
    • 差异是否是选择偏差或实验设置错误导致的
    展开全文
  • 此项调查的结果用于……进行健康服务和健康教育项目的规划,以及家庭、生育及健康情况进行统计研究”。 我们将使用这项调查收集到的数据研究第一胎是否出生较晚,并解答一些其他问题。为了有效地使用这些数据...

    第1章 探索性数据分析

    如果能将数据与实际方法相结合,就可以在存在不确定性时解答问题并指导决策,这就是本书的主题。

    举个例子。我的妻子在怀第一胎时,我听到了一个问题:第一胎是不是经常晚于预产期出生?下面所给出的案例研究就是由这个问题引出的。

    如果用谷歌搜索这个问题,会看到大量的讨论。有人认为第一胎的生产日期确实经常晚于预产期,有人认为这是无稽之谈,还有人认为恰恰相反,第一胎常常会早产。

    在很多此类讨论中,人们会提供数据来支持自己的观点。我发现很多论据是下面这样的。

    “我有两个朋友最近都刚生了第一个孩子,她们都是超过预产期差不多两周才出现临产征兆或进行催产的。”

    “我的第一个孩子是过了预产期两周才出生的,我觉得第二个孩子可能会早产两周!”

    “我认为这种说法不对,因为我姐姐是头生子,而且是早产儿。我还有好些表兄妹也是这样。”

    这些说法都是基于未公开的数据,通常来自个人经验,因此称为轶事证据(anecdotal evidence)。在闲聊时讲讲轶事当然无可厚非,所以我并不是要批评以上那几个人。

    但是,我们可能需要更具说服力的证据以及更可靠的回答。如果按照这个标准进行衡量,轶事证据通常都靠不住,原因有如下几点。

    • 观测值数量较小
      如果第一胎的孕期的确偏长,这个时间差与正常的偏差相比可能很小。在这种情况下,我们可能需要比对大量的孕期数据,才能确定这种时间差确实存在。
    • 选择数据时存在偏倚
      人们之所以参与这个问题的讨论,有可能是因为自己的第一个孩子出生较晚。这样的话,这个选择数据的过程就会对结果产生影响。
    • 确认数据时存在偏倚
      赞同这种说法的人也许更可能提供例子进行佐证。持怀疑态度的人则更可能引用反例。
    • 不精确
      轶事通常都是个人经验,经常会记错、误传或者误解等。

    那我们该如何更好地回答这个问题呢?

    1.1 统计学方法

    为了解决轶事证据的局限性,我们将使用以下统计学工具。

    • 数据收集
      我们将使用大型的全国性调查数据,这个调查专门设计用于对美国人口进行有效的统计推断。
    • 描述性统计
      得出统计量,对数据进行简要的汇总,并评估可视化数据的不同方法。
    • 探索性数据分析
      寻找各种模式、差异,以及其他能够解决我们感兴趣的问题的特征,同时还将检查数据的不一致性,发现局限性。
    • 估计
      使用样本数据来估计一般总体的统计特征。
    • 假设检验
      如果看到明显的效应,例如两个群组之间存在差异,将衡量该效应是否是偶然产生的。

    谨慎执行上面的步骤,并避免各种错误,我们就可以获得合理性和准确性更高的结论。

    1.2 全国家庭增长调查

    从1973年起,美国疾病控制和预防中心(CDC)就开始进行全国家庭增长调查(NSFG,http://cdc.ogv/nchs/nsfg.htm),以收集“与家庭生活、婚姻状况、妊娠情况、生育情况、避孕情况,以及两性健康相关的信息。此项调查的结果用于……进行健康服务和健康教育项目的规划,以及对家庭、生育及健康情况进行统计研究”。

    我们将使用这项调查收集到的数据研究第一胎是否出生较晚,并解答一些其他问题。为了有效地使用这些数据,我们必须理解这项研究是如何设计的。

    全国家庭增长调查是一项横截面(cross-sectional)研究,也就是说该研究捕获的是一个群组在某一时刻的快照。在横截面研究之外,最常见的是纵向(longitudinal)研究,指在一个时间段内重复观察一个群组。

    全国家庭增长调查进行过7次,每一次都称为一个周期(cycle)。我们将使用第6次的数据,其时间段为2002年1月至2003年3月。

    这项调查的目的是对一个总体(population)得出结论。全国家庭增长调查的目标总体是居住在美国、年龄在15~44岁的人。理想情况下,调查要收集这个总体中每个成员的数据,但这是不可能实现的。实际上,我们收集了这个总体的一个子集的数据,这个子集称为样本(sample)。参与调查的人称为调查参与者(respondent)。

    通常来说,横截面研究应该是有代表性(representative)的,也就是说目标总体中每个成员参与调查的机会均等。这种理想条件在实践中很难实现,但是进行调查的人员会竭尽所能满足这个条件。

    全国家庭增长调查不具有代表性,而是特意进行过度抽样(oversample)。这项研究的设计者招募了拉美裔美国人、非洲裔美国人和青少年3个群组的参与者,每个群组的招募比例都超过其在美国人口中所占的比例,以确保各群组的参与者数量足够多,从而进行有效的统计推断。

    当然,过度抽样也有缺点,那就是不容易从调查的统计数据中得出关于总体的结论。我们稍后会对此进行讨论。

    在使用这种调查数据时,我们必须熟悉代码本(codebook),这一点非常重要。代码本记录了一项研究的设计、使用的调查问题,以及调查中响应变量的编码。你可以从美国疾病控制和预防中心的网站(http://www.cdc.gov/nchs/nsfg/nsfg_cycle6.htm)下载全国家庭增长调查数据的代码本和使用手册。

    1.3 数据导入

    本书所用的代码和数据都可以通过GitHub(https://github.com/AllenDowney/ThinkStats2)获取。前言中介绍了如何下载和使用这些代码。

    下载代码后,你会得到一个名为ThinkStats2/code的文件夹,其中包含一个名为nsfg.py的文件。运行nsfg.py会读取数据文件,执行测试,然后打印出一条消息,例如“All test passed”。

    让我们看看这个文件所执行的工作。第6次全国家庭增长调查的妊娠数据保存在名为2002FemPreg.dat.gz的文件中,这是一个纯文本(ASCII码)形式的gzip压缩文件,有固定宽度的列。这个文件中的每一行都是一个记录(record),包含一次妊娠的数据。

    2002FemPreg.dct是一个Stata字典文件,记录了数据文件的格式。Stata是一个统计软件。Stata“字典”是由变量名、变量类型及标识变量位置的索引值组成的列表。

    下面几行摘自2002FemPreg.dct:

    infile dictionary { 
      _column(1) str12 caseid %12s "RESPONDENT ID NUMBER" 
      _column(13) byte pregordr %2f "PREGNANCY ORDER (NUMBER)" 
    }

    这个字典描述了两个变量:caseid是一个长度为12的字符串,代表调查参与者的ID;pregorder是一个单字节整数,说明这条记录描述的是这位调查参与者的第几次妊娠。

    下载的代码包含一个thinkstats2.py文件,这是一个Python模块,包含了本书中用到的很多类和函数,其中有读取Stats字典和全国家庭增长调查数据文件的函数。这两个函数在nsfg.py中的用法如下:

    def ReadFemPreg(dct_file='2002FemPreg.dct', 
                    dat_file='2002FemPreg.dat.gz'): 
        dct = thinkstats2.ReadStataDct(dct_file) 
        df = dct.ReadFixedWidth(dat_file, compression='gzip') 
        CleanFemPreg(df) 
        return df

    ReadStataDct的参数是字典文件名,返回值dct是一个FixedWidthVariables对象,其中包含从字典文件中得到的信息。dct对象提供ReadFixdWidth方法进行数据文件的读取。

    1.4 DataFrame

    ReadFixedWidth方法返回一个DataFrame对象。DataFrame是pandas提供的基础数据结构。pandas是一个Python数据和统计包,它的使用会贯穿本书。在DataFrame中,每个记录为一行(在我们的例子中就是每个妊娠数据为一行),每个变量为一列。

    除了数据,DataFrame还包含变量名和变量类型信息,并提供访问和修改数据的方法。

    如果打印df对象,你会看到其中行列的部分数据和DataFrame的大小:13 593行/记录,244列/变量。

    >>> import nsfg
    >>> df = nsfg.ReadFemPreg()
    >>> df
    ...
    [13593 rows x 244 columns]

    dfcolumns属性将列名返回为一列Unicode字符串。

    >>> df.columns
    Index([u'caseid', u'pregordr', u'howpreg_n', u'howpreg_p', ... ])

    df.columns的结果是一个Index对象,Index也是一个pandas数据结构。我们稍后会详细介绍Index,现在可以暂时将其视为一个列表。

    >>> df.columns[1]
    'pregordr'

    要访问DataFrame中的一列,你可以将列名作为键值。

    >>> pregordr = df['pregordr']
    >>> type(pregordr)
    <class 'pandas.core.series.Series'>

    其结果是一个Series对象,这又是一个pandas数据结构。Series与Python列表类似,还能提供一些附加功能。打印一个Series对象会得到索引和对应的数值。

    >>> pregordr
    0     1
    1     2
    2     1
    3     2
    ...
    13590    3
    13591    4
    13592    5
    Name: pregordr, Length: 13593, dtype: int64

    这个示例中的索引是从0到13 592的整数,但通常索引可以使用任何可排序的数据类型。这个示例中的元素也是整数,但元素可以是任何类型的。

    示例中的最后一行列出了变量名、Series长度和数据类型。int64是NumPy提供的类型之一。如果在32位机器上运行这个示例,得到的数据类型可能是int32

    你可以使用整数的index和slice值访问Series中的元素。

    >>> pregordr[0]
    1
    >>> pregordr[2:5]
    2    1
    3    2 
    4    3
    Name: pregordr, dtype: int64

    index操作符的结果是int64,slice的结果还是一个Series。

    你也可以使用点标记法来访问DataFrame中的列。

    >>> pregordr = df.pregordr

    只有当列名为合法的Python标识符时(即以字母开头,不包含空格等),才能使用这种写法。

    1.5 变量

    我们已经使用了全国家庭增长调查数据集中的两个变量——caseidpregordr,还看到数据集中共有244个变量。本书的探索性分析用到如下变量。

    • caseid:调查参与者的整数ID。
    • prglength:妊娠周数,是一个整数。
    • outcome:怀孕结果的整数代码。1代表成功生产。
    • pregordr:妊娠的顺序号。例如,一位调查参与者的第一次妊娠为1,第二次为2,以此类推。
    • birthord:成功生产的顺序号,一位调查参与者的第一个孩子代码为1,以此类推。对没有成功生产的其他妊娠结果,此字段为空。
    • birthwgt_lbbirthwgt_oz:新生儿体重的磅部分数值和盎司部分数值。
    • agepreg:妊娠结束时母亲的年龄。
    • finalwgt:调查参与者的统计权重。这是一个浮点数,表示这位调查参与者在全美人口中代表的人数。

    如果你仔细阅读了代码本,就会发现这些变量中很多都是重编码(recode),也就是说这些不是调查收集的原始数据(raw data),而是使用原始数据计算得到的。

    例如,如果成功生产,prglngth的值就与原始变量wksgest(妊娠周数)相等;否则,prglngth的值估算为mosgest * 4.33(妊娠月数乘以一个月的平均周数)。

    重编码通常都基于一定的逻辑,这种逻辑用于检查数据的一致性和准确性。一般情况下,如果数据中存在重编码,我们就直接使用,除非有特殊的原因需要自己处理原始数据。

    1.6 数据变换

    导入调查数据时,经常需要检查数据中是否存在错误,处理特殊值,将数据转换为不同的格式并进行计算。这些操作都称为数据清洗(data cleaning)。

    nsfg.py包含一个CleanFemPreg函数,用于清洗计划使用的变量。

    def CleanFemPreg(df): 
        df.agepreg /= 100.0
    
        na_vals = [97, 98, 99]
        df.birthwgt_lb.replace(na_vals, np.nan, inplace=True)
        df.birthwgt_oz.replace(na_vals, np.nan, inplace=True)
    
        df['totalwgt_lb'] = df.birthwgt_lb + df.birthwgt_oz / 16.0

    agepreg包含母亲在妊娠结束时的年龄。在数据文件中,agepreg是以百分之一年为单位的整数值。因此CleanFemPreg的第一行将每个agepreg除以100,从而获得以年为单位的浮点数值。

    birthwgt_lbbirthwgt_oz包含成功生产时的新生儿体重,分别是磅和盎司的部分。这两个变量还使用几个特殊的代码。

    97 NOT ASCERTAINED 
    98 REFUSED 
    99 DON'T KNOW

    用数字编码特殊值是一种危险的做法,因为如果没有进行正确的处理,这些数字可能产生虚假结果,例如,99磅重的新生儿。replace方法可以将这些值替换为np.nan,这是一个特殊的浮点数值,表示“不是数字”。replace方法使用inplace标识,说明直接修改现有的Series对象,而不是创建新对象。

    IEEE浮点数表示法标准中规定,在任何算术运算中,如果有参数为nan,结果都返回nan

    >>> import numpy as np
    >>> np.nan / 100.0
    nan

    因此使用nan进行计算会得到正确的结果,而且大部分的pandas函数都能恰当地处理nan。但我们经常需要处理数据缺失的问题。

    CleanFemPreg函数的最后一行生成一个新列totalwgt_lb,将磅和盎司值结合在一起,得到一个以磅为单位的值。

    需要注意的是,向DataFrame添加新列时,必须使用如下字典语法:

    # 正确 
    df['totalwgt_lb'] = df.birthwgt_lb + df.birthwgt_oz / 16.0 
    

    而不是使用点标记:

    # 错误!
    df.totalwgt_lb = df.birthwgt_lb + df.birthwgt_oz / 16.0
    

    使用点标记的写法会给DataFrame对象添加一个新属性,而不是创建一个新列。

    1.7 数据验证

    当数据从一个软件环境导出,再导入另一个环境时,可能会产生错误。如果不熟悉新数据集,可能会对数据进行不正确的解释,或者引入其他的误解。如果能抽出一些时间进行数据验证,就可以节省后续可能花费的时间,避免可能出现的错误。

    验证数据的一种方法是计算基本的统计量,并与已发布的结果进行比较。例如,全国家庭增长调查的代码本为每个变量提供了概要表。outcome变量对每个妊娠结果进行了编码,其概要表如下:

    value label       Total 
    1 LIVE BIRTH          9148 
    2 INDUCED ABORTION    1862 
    3 STILLBIRTH           120 
    4 MISCARRIAGE         1921 
    5 ECTOPIC PREGNANCY    190 
    6 CURRENT PREGNANCY    352

    Series类提供了一个value_counts方法,可用于计算每个值出现的次数。如果得到DataFrame中的outcome Series,我们可以使用value_counts方法,将结果与已发布的数据进行比较。

    >>> df.outcome.value_counts().sort_index()
    1    9148
    2    1862
    3     120
    4    1921 
    5     190 
    6     352

    value_counts返回的结果是一个Series对象。sort_index方法将Series对象按索引排序,使结果按序显示。

    我们将得到的结果与官方发布的表格进行对比,outcome变量的值似乎没有问题。类似地,已发布的关于birthwgt_lb的概要表如下:

    value label                Total 
    . INAPPLICABLE          4449 
    0-5 UNDER 6 POUNDS        1125 
    6 6 POUNDS              2223 
    7 7 POUNDS              3049 
    8 8 POUNDS              1889 
    9-95 9 POUNDS OR MORE       799

    birthwgt_lbvalue_counts结果如下:

    >>> df.birthwgt_lb.value_counts(sort=False) 
    0        8 
    1       40 
    2       53 
    3       98 
    4      229 
    5      697 
    6     2223 
    7     3049 
    8     1889 
    9      623 
    10     132 
    11      26 
    12      10 
    13       3 
    14       3 
    15       1 
    51       1

    数值6、7、8的出现次数是正确的。如果计算出0~5和9~95的次数,结果也是正确的。但是,如果再看仔细些,你会发现有一个数值肯定是错的——一个51磅的新生儿!

    为了处理这个错误,可以在CleanFemPreg中加入一行代码。

    df.birthwgt_lb[df.birthwgt_lb > 20] = np.nan

    这行代码将非法值替换为np.nan。方括号中的表达式产生一个bool类型的Series对象,值为True表示满足该条件。当一个布尔Series用作索引时,它只选择满足该条件的元素。

    1.8 解释数据

    要想有效使用数据,就必须同时在两个层面上思考问题:统计学层面和上下文层面。

    例如,让我们看一看几位调查参与者的outcome序列。由于数据文件的组织方式,我们必须进行一些处理才能得到每位调查参与者的妊娠数据。以下函数实现了我们需要的处理:

    def MakePregMap(df): 
        d = defaultdict(list) 
        for index, caseid in df.caseid.iteritems(): 
            d[caseid].append(index) 
        return d

    df是包含妊娠数据的DataFrame对象。iteritems方法遍历所有妊娠记录的索引(行号)和caseid

    d是将每个caseID映射到一列索引的字典。如果你不熟悉defaultdict,可以到Python的collections模块中查看其定义。使用d,我们可以查找一位调查参与者,获得其妊娠数据的索引。

    下面的示例就查找了一位调查参与者,并打印出其妊娠结果列表:

    >>> caseid = 10229
    >>> indices = preg_map[caseid]
    >>> df.outcome[indices].values
    [4 4 4 4 4 4 1]

    indices是调查参与者10229的妊娠记录索引列表。

    以这个列表为索引可以访问df.outcome中指定的行,获得一个Series。上面的示例没有打印整个Series对象,而是选择输出values属性,这个属性是一个NumPy数组。

    输出结果中的代码1表示成功分娩。代码4表示流产,即自发终止的妊娠,终止原因通常未知。

    从统计学上看,这位调查参与者并无异常。流产并不少见,其他一些调查参与者的流产次数相同或者更多。

    但是考虑到上下文,这个数据说明一位妇女怀孕6次,每次都以流产告终。她第7次也是最近一次怀孕成功产下了孩子。如果我们抱着同情心看待这些数据,就很容易被数据背后的故事感动。

    全国家庭增长调查数据集中的每一条记录都代表一位参与者,这些参与者诚实地回答了很多非常私密而且难以回答的问题。我们可以使用这些数据解答与家庭生活、生育和健康相关的统计学问题。同时,我们有义务思及这些数据所代表的参与者,对他们心存敬意和感谢。

    1.9 练习

    • 练习1.1

      你下载的代码中应该有一个名为chap01ex.ipynb的文件,这是一个IPython记事本。你可以用如下命令从命令行启动IPython记事本:

      $ ipython notebook &

      如果系统安装了IPython,会启动一个在后台运行的服务器,并打开一个浏览器查看记事本。如果你不熟悉IPython,我建议你从IPython网站(http://ipython.org/ipython-doc/stable/notebook/notebook.html)开始学习。

      你可以添加一个命令行选项,使图片在“行内”(即在记事本中)显示,而非弹出窗口:

      $ ipython notebook --pylab=inline &

      打开chap01ex.ipynb。记事本中一些单元已经填好了代码,可以直接执行。其他单元列出了你应该尝试的练习。

      本练习的参考答案在chap01soln.ipynb中。

    • 练习1.2

      创建一个名为chp01ex.py的文件,编写代码,读取参与者文件2001FemResp.dat.gz。你可以复制nsfg.py文件并对其进行修改。

      变量pregnum是一个重编码,用于说明每位调查参与者有过多少次妊娠经历。打印这个变量中不同值的出现次数,将结果与全国家庭增长调查代码本中发布的结果进行比较。

      你也可以将每位调查参与者的pregnum值与妊娠文件中的记录数进行比较,对调查参与者文件和妊娠文件进行交叉验证。

      你可以使用nsfg.MakePregMap生成一个字典,将每个caseid映射到妊娠DataFrame的索引列表。

      本练习的参考答案在chp01soln.py中。

    • 练习1.3

      学习统计学的最好方法是使用一个你感兴趣的项目。你想研究“第一胎是否都会晚出生”这样的问题吗?

      请思考一些你个人感兴趣的问题,可以是传统观点、争议话题或影响政局的问题,看是否可以构想出一个能以统计调查进行验证的问题。

      寻找能帮助你回答这个问题的数据。公共研究的数据经常可以免费获取,因此政府网站是很好的数据来源,如http://www.data.gov/http://www.science.gov/。如果想获得英国的数据,可以访问http://data.gov.uk/

      我个人最喜爱的两个数据集是General Social Survey(http://www3.norc.org/gss+website/)和European Social Survey(http://www.europeansocialsurvey.org)。

      如果有人看似已经解答了你的问题,那么仔细检查该回答是否合理。数据和分析中可能存在的缺陷都会使结论不可靠。如果发现别人的解答存在问题,你可以对同样的数据进行不同的分析,或者寻找更好的数据来源。

      如果有一篇论文解答了你的问题,那么你应该能够获得论文使用的原始数据。很多论文作者会把数据放在网上供大家使用,但如果涉及敏感信息,你可能需要向作者写信索要,提供你计划如何使用这些数据的信息,或者同意某些使用条款。坚持就是胜利!

    1.10 术语

    • 轶事证据(anecdotal evidence)

      随意收集,而非通过精心设计的研究获得的证据,通常是个人证据。

    • 总体(population)

      在研究中,我们感兴趣的群组。“总体”经常指一组人,但这个词也可以用于其他对象。

    • 横截面研究(cross-sectional study)

      收集一个总体在某个特定时间点的数据的研究。

    • 周期(cycle)

      在重复进行的横截面研究中,每次研究称为一个周期。

    • 纵向研究(longtitudinal study)

      在一段时间内跟踪一个总体的研究,从同一个群体重复收集数据。

    • 记录(record)

      在数据集中,关于单个人或其他对象的信息集合。

    • 调查参与者(respondent)

      参与调查的人。

    • 样本(sample)

      总体中用于数据收集的一个子集。

    • 有代表性(representative)

      如果总体中的每个成员被选入样本的机会都均等,那么这个样本就是有代表性的。

    • 过度抽样(oversampling)

      一种通过增加一个子总体的样本数来避免因样本规模过小产生错误的技术。

    • 原始数据(raw data)

      没有经过或只经过少许检查、计算或解释,直接收集和记录的值。

    • 重编码(recode)

      通过计算和应用于原始数据的其他逻辑生成的值。

    • 数据清洗(data cleaning)

      数据处理过程,包括数据验证、错误检查,以及数据类型和表示的转换等。

    from: http://www.ituring.com.cn/tupubarticle/3914
    展开全文
  • 万万没想到:用理工科思维理解世界万万没想到用理工科思维理解世界 序言 Part one人性 别想说服我 真理追求者 坏比好重要 最简单概率论的五个智慧 序言 长辈说:人到老年,看书看皮儿,看报看题儿。 所谓名著,就是...

    万万没想到:用理工科思维理解世界

    序言

    1. 长辈说:人到老年,看书看皮儿,看报看题儿。
    2. 所谓名著,就是人人都说应该看,但谁也不看的书。

    Part one(人性)

    反常识思维
    3. 煽情是文人的膝跳反应
    4. 面对灾难,媒体理性和专业的报道出来,能更客观表现出灾难情况。但是,如果采用煽情的方式,反而会收到更多的捐赠。
    5. 斯大林:“杀死一个人是悲剧,杀死一万个人是统计数字”。统计数字的力量远远比不上一个人,一个具体的人
    6. 费孝通《乡土中国》:”世代定居的传统中国社区的本质是熟人社会。在熟人社会中,人们做事不是靠商业和法治,而是靠道德和礼治。在这个体制中出了案件,首先关乎的是面子和名声,而不是利益。”
    7. 文人思维天生喜爱耸人听闻的消息,如果再加上不爱算数,就会对世界乱担心、乱指挥。

    别想说服我

    1. 蒙洛迪诺:“人做判断的时候有两种机制:一种是‘科学家机制’,先有证据再下结论;一种是‘律师机制’,先有结论再去找证据。”
    2. 给观众想要的东西,比给观众事实更能赚钱。
    3. 确认偏误:如果你已经开始相信一个东西了,那么你就会主动寻找能够增强这种相信的信息,乃至不顾事实。一旦我们有了某种偏见,我们就无法改变主意了。
    4. 为什么星座与性格的理论经久不衰:人们更愿意看到说的跟自己一样的地方,并忽略不一样的地方。
    5. 在某些问题上,甚至是文化程度越高的人群,思想越容易两极分化。

    真理追求者

    1. 如果是两个理性而真诚的真理追求者争论问题,争论的结果必然是两者达成一致。
      如果争论不欢而散,那么其中必然有一方是虚伪的。

    坏.比好重要

    1. 损失厌恶:人们总喜欢获得而害怕失去。人们对负面感情的重视程度总是超过正面感情。(完成任务获得
      奖励、得到奖励,完不成任务将失去奖励)

    最简单概率论的五个智慧

    1. 独立随机事件的发生是没有规律和不可预测的
    2. 人脑很擅长理解规律,但是很不擅长理解随机性。
    3. 小数定律:统计数字很少,很容易出现特别不均匀的情况。(容易出现极端情况)
    4. 大数定律:统计样本足够多,事件出现的频率就能无限接近它的理论概率(本性)。

    一颗阴谋论的心
    19. 相信阴谋很可能是人的一种思维本能。
    20. 想要对任何事情的真伪都给予正确的判断是不可能的,我们只能在有限的条件下合理地评估每件事的可能性。

    桥段会毁了你的生活
    健康经济学
    21. 人们会为了计算利益与健康得失,而去选择牺牲利益或者健康。

    核电站能出什么大事

    Part two(成功学的解药)
    我们需要的是科学的励志,只有你的理论具有普遍意义,你的成功才可以被复制

    科学的励志和励志的科学
    22. 自控能力强的人在职场上更受欢迎,工作效率高,更善于控制自己的感情,能换位思考,不容易出现偏执和阴郁之类的心理问题。而自控需要意志力,意志力其实是一种生理机能。

    匹夫怎么逆袭
    23. 尼采:凡是不能毁灭我的,必使我强大。
    24. 你要知道你的不利条件,在某些情况下可能是你的有利条件;
    而巨人的所谓有利条件,在某些情况下可能是他的不利条件。
    25. 你绝对不能按照对手的打法去跟他玩,你有时候得使用非常规手段。
    26. 格拉德威尔:“一般有创造性的人物,都要有点特立独行的气质:你要敢于做一些社会上通常认为不应该做的事。你不是去适应这个社会,而是让这个社会去适应你。他们追求取胜,他们根本不追求别人的喜欢。”

    练习一万小时成天才?
    27. 练习,讲究的并不是谁练得苦,或者谁的心最“诚”。
    28. 只在“学习区”练习;(舒适区:熟练的知识;学习区:可以学会的知识;恐慌区:暂时无法学会的知识)。
    把要练习的内容分成有针对性的小块,对每一个小块进行重复练习。(掌握套路)
    把整个练习过程中,随时能获得有效的反馈。(考试)
    练习时注意力必须高度集中。
    29. 真正的练习不是为了完成运动量,练习的精髓是要持续地做自己做不好的事。
    30. 在舒适区做事,叫生活。在学习区做事,叫练习。
    31. 练习者必须要对错误极度敏感,一旦发现自己错了就会感到非常不舒服,一直练习到改正为止。
    32. 纪录片对科学的作用并不在于让观众学到什么知识,而是激发观众对科学的兴趣。电影和电视是一种很好的激励手段,但不是好的教育手段。
    33. 联系需要重复,而重复一定不好玩。教育需要全面,而娱乐一定只关注其中好玩的部分。
    34. 西塞罗:”教育的目的本来应该是摆脱现实的奴役,而现在的年轻人正竭力做着相反的努力——为了适应现实而改变自己。”
    35. 真正是的乔丹成为巨星的“素质”,是对失败的痛恨。

    最高级的想象力是不自由的
    36. 想象力和知识是天敌。人在获得知识的过程中,想象力会消失。因为知识符合逻辑,而想象力无章可循。换句或说,知识的本质是科学,想象力的特征是荒诞。
    37. 真正的科学家其实比“想象家”更有想象力。一个理论物理学家可能每天都有无数个怪异的想法,真正的困难不是产生“怪异”的想法,而是产生“对”的想法。

    思维密集度与牛人的反击
    38. 思维密集度 = 准备这个读物需要的总时间 / 阅读这个读物需要的时间

    上网能避免浅薄吗?
    39. 相对于读书,网络阅读使我们能记住的信息更少,理解力和创造力下降,形成不了知识体系:互联网把我们的大脑变浅薄了。
    40. 网上冲浪可以增进做决策和解决能力问题的能力,这对老年人保持头脑年轻有好处,但坏处则是牺牲了深度理解。

    高效“冲浪”的办法
    41. 窄.框架:遇到一个东西做一次决策,一事一议;
    宽框架:把所有东西都放在一个“桌面”,从中选择。
    42. 冲浪方式:随便翻翻(toss),略读(skim),精读(read)

    笔记本就是力量
    43. 心智模式 / 矩阵:真正的专家,都有自己的一整套知识体系。这套体系就如同长在他们心中的一棵不断生枝长叶的树,又如同一张随时变大变复杂的网。每当有新的知识进来,他们都知道把这个知识放到体系的什么位置上去。
    44. 记笔记的最直接目的是为了形成自己的知识体系,改变自己看实物的眼光。
    45. 写笔记,要把一本书融会贯通,要记下自己的感想,甚至要跟.作者对话。
    46. 笔记系统,它可以帮我们把新的知识跟自己已有的知识联系起来。一般人善于发现新事物的不同点,而真正的高手则善于发现共同点。一旦发现新知识和已有知识的共同点,这个知识就彻底“长”在我们身上了。而且这样带来的类比和联想,特别能刺激创造性思维。

    用强力研读书
    47. 书有三个基本事实
    第一, 大多数人不看这种书;他们不是读书人。
    第二, 如果真看书了的,其中大多数人没有看完。
    第三, 即使看完了的,其中大多数人没有看懂。
    48. 强力研读:
    第一, 不好玩(刻意练习都不好玩,用非常严肃认真的态度,融会贯通到自己脑子里)
    第二, 用时少(把经理充沛而又不受打扰的时间段留给最好的书)
    第三, 不追求快(对不同的读物采取不同的阅读速度。读得慢,吸收知识和增长内力的效率更高)
    第四, 核心就是读书笔记。
    49. 一本书.应该被读两遍,而且只读两遍。(好书一遍掌握不到精要,一遍反而不值得强力研读。)
    第一遍,正常通读,读的时候学会思考。
    第二遍,写下笔记,作为例子的故事大可跳过,专注于思想脉络。
    (最重要的目的是为了获得心得、灵感和联想)
    50. 强力研读的笔记要求:
    1. 清晰地表现每一章的逻辑脉络
    2. 带走书中所有亮点
    3. 有大量自己的看法和心得
    4. 发现这本书和以前读过的其他书或文章的联系

    创新是落后者的特权:三个竞争故事
    51. 仅仅有思想不叫创新,敢于用这个思想才叫创新。
    52. 质量控制的办法:
    把所有导致质量损失的问题排序,造成最多问题的错误排在最前面,然后你就会发现只要你改正其中20%的错误,就能解决80%的质量问题。
    【强大的企业改革风险会很大,而落后的企业反倒光脚不怕穿鞋的,进行大改革。那如果强大的企业将需要改革的方法先放在一个分部进行实践,然后逐步进行企业全部改革。那不是能降低改革所带来的风险了?】
    53. 不是落后者要学习领先者,而是领先者要学习落后者
    【领先者学习落后者与领先者不同的地方,加以实践以及普及】

    过度自信是创业者的通行证
    54. 托•约•登宁:
    资本有20%的利润便活跃起来,有了50%的利润就会铤而走险,有了100%的利润就敢践踏一切法律,有了300%的利润就敢冒绞首的危险。

    夺魁这本色
    55. 决定一个人喜不喜欢竞争的重要因素之一,是睾酮水平。
    而决定一个人面对竞争压力时的状态,是COMT基因。
    56. 竞争的方式
    1. 有限博弈:竞争就好像体育比赛会有结束时刻,比赛中必须全力以赴,比较具有爆发力。
    2. 无限博弈:竞争永远都在井陉,讲究持续力,需要能够在其中偷偷地自我调整和恢复。

    打游戏的三个境界
    57. 罗切斯特大学:游戏之所以让人上瘾是因为它满足了人的心理需求:一个人的现实生活很平庸无聊,而在游戏却可以呼风唤雨、横扫千军。
    58. 不把游戏精神放在真实世界的原因有:
    1. 世间自由公道,付出总会有回报。
    2. 回报是即时的。

    穷人和富人的人脉结构
    59. “弱联系”的真正意义是把不同的社交圈子连接起来,从圈外给你提供有用的信息。
    60. 弱.联系理论:一个人在社会上获得机会的多少,与他的社交网络结构很有关系。如果你只跟亲朋好友交往,或者认识的人都是与自己背景类似的人,那么你大概就不如那些什么人都认识的人机会多。人脉的关键不在于你融入了哪个圈子,而在于你能接出多少圈外的人。
    61. 所有弱.联系理论的本质不是“人脉”,而是信息的传递。

    Part three(霍金的答案)
    亚里士多德为何不数数妻子有几颗牙

    物理学的逻辑和霍金的答案

    一个关于转世的流行病学研究

    摆脱童稚状态

    怎样才算主流科学

    科研的格调

    喝一口的心理学与喝一瓶的心理学

    医学研究能当真吗?

    真空农场中的球形鸡

    展开全文
  • 我不是试图用通俗的语言来解释清楚... “假设检验”,从字面上上理解就是先“假设”,后“检验”的过程,“检验”的对象当然 是之前的假设本身,有些情况下为了区分与其它学科的“假设”,研究统 计的人就 用“统计
  • 运维的理解与心得

    千次阅读 2020-09-25 19:17:45
    谈谈运维的理解 一. 运维范畴 一般考虑这五个维度:效率,稳定,安全,用户体验和成本 其中效率和稳定可以说是本职最优先做好的事情. 运维团队跟其他团队是不分彼此的, 之间的沟通非常重要, 因为每一项工作或项目最终...
  • 统计学最全思维导图

    千次阅读 2020-05-26 20:41:36
    本文用一系列 「思维导图」 由浅入深的总结了 「统计学」 领域的基础知识,是之前系列文章做的一次完整的梳理,也是我至今为止所有与统计有关的学习笔记。众所周知,「统计学」 是深入理解 「机器学习/数据挖掘」 ...
  • 大数据人类思维的影响

    千次阅读 2018-03-05 10:05:00
    决策者的价值观会影响行动决策,人们事物的理解和判断亦受制于自身思维框架的局限。物理学家在分析一个实验时,会很自然地应用物理定律来思考、理解和判断。所用的概念和语言也会有强烈的物理特征;社会科学家在...
  • 浅谈对统计机器学习的认识

    千次阅读 2018-04-16 15:01:48
    最早是在《数据处理与优化算法》课堂上接触到数据挖掘(Data Mining),接着自学Pang-Ning Tan et al.的《数据挖掘导论》入门数据挖掘。...机器学习偏向于数学与计算机的交叉,统计的理论往往需要通过机...
  • 大数据对思维方式的重要影响

    千次阅读 2018-03-05 09:51:00
    1.试述大数据对思维方式的重要影响。 大数据思维能使我们在决策过程中超越...行动决策会受到决策者价值取向的影响,人们事物的理解和判断会受制于自身思维框架的局限。一个物理学家在分析一件事物时,会很自然...
  • 计算思维

    千次阅读 2019-02-26 12:25:28
    计算思维 &nbsp; Jeannette M. Wing ( 周以真 ) &nbsp;( 翻译:徐韵文,王飞跃 , 校对:王飞跃) &nbsp; 它代表着一种普遍的认识和一类普适的技能,每一个人,不仅仅是计算机科学家,都应热心于它的...
  • 什么是计算思维

    千次阅读 2020-08-09 21:01:24
    ​ 逻辑思维、实证思维和计算思维,是目前人类认识世界和改造世界的三种基本科学思维方式。...她定义计算思维是“运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广...
  • 什么是计算机思维

    万次阅读 多人点赞 2018-04-23 16:53:53
    计算机思维是一套概念模型我们运用一个思维模型时,要经历这样三个阶段:建模,解模,解释。与之相对应的则是抽象思维、演绎思维、发散思维。通过抽象,形式化,将我们所需要研究的问题进行归纳,用一种范式表达出来...
  • 浅谈我算法理解

    千次阅读 2019-12-05 15:35:50
    内容持续更新总结中...... 算法,一直是看似复杂的东西,但是,深入本质,其实算法,是很有趣的;...算法技术点(借用知乎的一张思维导图)—— 需要的基础数学知识: 求导、nlgn等等这种时...
  • 大数据的发展必须是数据、技术、思维三大要素的联动,它不仅取决于大数据资源的扩展和大数据技术的应用,更取决于大数据思维的形成。如果没有大数据思维,即使拥有了海量的数据,也无法发挥它们的价值。 大数据思维...
  • 贝叶斯统计与贝叶斯公式

    千次阅读 2019-06-02 09:20:16
    第二,如果将先验分布理解不确定性参数所有先验知识和信息的一个概率描述,那么,贝叶斯更新表现为似然函数乘以先验分布,就可以更加直观地理解为它是不同渠道信息的一个融合。这与数据本身不同观察值在条件相互...
  • Downey所著的《统计思维-程序员数学之概率统计》这本书的学习过程和一些理解 第二章 描述性统计量 均值和平均值 均值(mean):一个包含nn个值的样本xix_i值的总和除以值的数量的汇总统计量 均值计算公式:μ=1n...
  • 关于统计学的简单理解

    千次阅读 2014-07-27 11:17:43
    在我们的日常生活中,从定性和定量的角度来分析数理统计,定性的统计学的直观表现就是经验,定量的统计指基于实际数据分析的统计推断,书本上介绍的统计思想大部分是定量的统计推断,涉及到的统计技术有抽样调查、...
  • 无论是在招聘信息,还是日常的鸡汤干货,想必大家都听过统计分析这个词。...统计分析,常指收集到的有关数据资料进行整理归类并进行计算,从而分析出相关规律的一个过程。统计分析是统计工作中统计设计、资...
  • b站看【厦门大学MOOC】多元统计分析,因为老师很好看。 参考: 【厦门大学MOOC】多元统计分析 https://www.bilibili.com/video/BV1v7411E7PB 课程大纲: 一、多元统计分析概述 二、多元数据的描述与展示 三、多元...
  • 虽然编程能力对于数据科学家而言非常重要,但是数据科学家不完全是软件工程师,他应该是编程、统计和批判性思维三者的结合体。而许多软件工程师通过机器学习框架转型为数据科学家时,没有深刻地思考并理解这些框架...
  • 大数据思维的核心是什么?

    万次阅读 2019-04-18 17:43:01
    数据为我们提供了解决问题的新方法,数据中所包含的信息可以帮助我们消除不确定性,而数据之间的相关性在某种程度上可以取代原来的因果关系,帮助我们得到我们想知道的答案,这便是大数据思维的核心。 在过去被认为...
  • 程序员必备的思维能力:抽象思维

    万次阅读 多人点赞 2021-02-12 18:03:28
    若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇抽象思维是我们工程师最重要的思维能力。因为软件技术 本质上就是一门抽象的艺术。我们的工作是存思维...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,315
精华内容 19,326
关键字:

对统计思维的理解