Data 8 学习笔记(一)

介绍

DATA 8 是加州大学伯克利分校的数据科学基础课程,使用的编程语言为python。
课程资源:

  • 课程官网

    包含了课程视频,课上ppt,但是作业需要UCB的账号。
    视频在Youtube可以找到,目前最新的是2022Spring(最新的人家不可能让你免费看嘛)

  • Github 课程作业

    包含课堂同步Jupiter notebook还有lab, hw, project以及最重量级的textbook。最新的是2025Spring(太良心了)。

具体的配置很简单,主要是使用numpy, panda, matplotlib, 还有UCB自己的datascience这几个python库。


datascience library

安装(在terminal, cmd):

npm install datascience

这个库属于UCB为了初学者专门创建的preliminary tool,它主要操作的数据类型是库里定义的Table。就如同它的名字一样,Table就是个表格,每一列都是一个np array(大概就是访问速度更快储存空间更小的array),datascience库为它提供了包括可视化在内的基础操作。

别忘了import:

1
2
3
4
import numpy as np
import matplotlib.pyplot as plt
from datascience import *
import panda as pd

对Table的基础操作

Tip: 课程有一部分时间教了python的基本语法,函数,传参还有使用函数等等,这里不做介绍了。对于不熟悉的函数可以参考 datascience 官方文档 , 或者使用help(function)


make_array()

datasicence.util.make_array(), 把传入的每个数据合并到一个np array里面,传入的数据类型必须相同。返回一个np array。
对于np array可以使用numpy库的各种函数,比较常用的有:

  • np.sort() 排序
  • np.diff() 取相邻元素求差值
  • np.sum() 求和
  • np.prod() 求乘积
  • np.round( ,digit) 取digit位数,默认取整数

np.arrange(start, end, step), np.linspace(start, end, num)np.array(list,tuple,etc)也能创造np array。

需要选取一个np array里的数据可以使用.item(index),index遵循python列表的索引规则(正序从0开始,倒序从-1开始)。


Table()

使用Table() 函数会创造一个新的空Table数据,其中不含有任何行或列元素。
该函数通常搭配.with_columns()函数使用。

Table.with_columns(column_name:str, column_data: np_array)
该函数传入一个字符串作为列名称,以及一个np array作为列数据
eg:

1
2
a = Table().with_columns("name", np.array(("Penny", "Brian")))
a.show()
name
Penny
Brian
  • 使用 Table.drop(column_name:str, ...) 可以从Table里删除列(传入的列名称不存在的话报错)
  • 使用Table.num_rowsTable.num_columns可以获取Table里的行和列的数量。
  • 使用 Table.labels 获取Table里所以的列的名称, 使用Table.relabeled(old_label, new_label)可以更换列名称。
  • 使用Table.column(column_label)会返回带有这个列名称的列,返回类型是np array。
  • 使用Table.select()可以返回多个目标列组成的Table, 该函数可以传入索引也可以传入列名称。

Table.sort()

datascience也支持根据某一列来排序Table。

Table.sort()传入列名称,datascience库会根据该列的数据进行排序,并返回一个新列表。

Tip: Table.sort(str, descending = False)默认升序排列,如果想要降序排列可以把descending属性改成True。


Table.take()

之前说的.select() 还有 .column()函数都是选取列的,datascience也是支持选取特殊行的。

Table.take(index,...) 可以选取表格的index行并返回新的Table, index可以是collection,例如:

1
Table.take(np.arange(0,10,2)

这样就会选取Table里从第一行到第10行,每隔一行的目标行,也就是会返回第1,3,5,7,9行组成的新Table。

虽然这样根据行数选取行很有用,但是在有规律地选取行的时候限制很大。


Table.where()

where函数我们可以有条件地筛选需要的行。

Table.where(column_name: str, condition)
我们传入需要筛选的列数据地列名称,以及条件

对于条件参数,datascience也创造了新的类,are。通过are.below(),are.between()等函数,我们可以筛选符合一定数学条件地数据。
但是我个人推荐使用python内置地匿名函数lambda。例如are.below()就可以使用lambda y : y < x来代替。


通过上述的操作,我们可以把数据汇总到我们需要的Table里面。为了获取需要的Table,我们很可能要对数据进行很多步的操作,在此过程中必须格外注意哪些函数是直接修改原表格的,而哪些是会返回新的表格的,否则很有可能导致我们的操作不被保存在具体变量里。
想要熟悉这些操作的话可以试一下DATA 8 课程配套的project。


可视化

面对汇总成Table的大量数据,为了方便我们分析,我们往往需要把数据转变成可视化的图。datascience和matplotlib都有能够将数据可视化的强大能力。


散点图 Scatter plots

datascience库提供了极其简单的创造散点图的方法——Table.scatter().

给定一个已经汇总好的Table,我们可以往scatter函数里传入我们想要放入散点图的x,y轴的列名称,例如:

1
Table.scatter(x_column_name: str, y_column_new: str)

Tip: 如果我们使用matplotlib来画散点图的话可能会更复杂点:

1
2
3
4
5
6
import matplotlib.pyplot as plt
plt.scatter(table.column(), table.column(), label="Points")
#重要的是传入两个np array作为x,y轴
plt.title("") #图的标题
plt.xlabel("") #x轴的标签
plt.ylabel("") #y轴的标签

折线图 Line plots

折线图和散点图的语法完全一样,但是是使用Table.plot()函数。

传入x,y轴的列数据列名称即可。

1
Table.plot(x_column_name: str, y_column_new: str)

如果使用matplotlib的话也很简单:

1
plt.plot(x, y, label="Line")

条形图 Bar chart

datascience支持画横向纵向的条形图:

使用Table.bar(category, value)画纵向的条形图,其中第一个参数是分组,第二个是数值(也就是说每个数据的高是第二个参数, 而每个数据的分组(x轴)是第一个参数)。

使用Table.barh()画横向的条形图,参数顺序一致,不过每个数据的名称显示在y轴而已。

Tip: 使用matplotlib画条形图的语法完全相同,但是函数的对象不再是Table而是plt plt.bar(), plt.barh()


直方图 Histogram

在画直方图之前我们必须先了解binning(分箱)。

bins 箱:指连续的区间 [a,b) 分箱时他们不一定是相等的区间。

直方图展示的是数据的分布而非数据的值:

area 每个箱的高和箱的长度相乘可得这个箱的面积, 每个箱的面积的和为1。
height 每个箱的高为: $$高(密度) = 频率/宽度 = (频数/总数)/宽度$$

那怎么画直方图捏:

1
2
3
4
5
6
7
#当你分箱完毕后记得把bins放到一个nparray里面,然后调用Table.hist()
bins=np.arange(10,50,10)
a = Table().with_columns("count", np.array((10,20,20,30,40)))
a.hist("count", bins=bins)

#也可以使用.bin()来查看每个bin里面的频数
a_counts = a.bin("count", bins=bins)

bin_counts: 假设column是(10,20,20,30,30,40), bins是np.array((10,20,30,40)), 那么对该列使用.bins()的结果是:

bin count
10 1
20 2
30 2
40 1

重叠图 Overlaid graphs

有时候我们需要把坐标和尺度相同的数据集放在同一个图表里,datascience库也能很轻松地完成这个任务。

对于比较常用的散点图scatter(),条形图bar,barh,和折线图plot,调用方法都一样,结构类似于:
Table.method(column_label_of_common_axis, array_of_labels_of_variables_to_plot)

不过最常用的办法是用select函数从Table里先筛选出需要画图的列,然后在第一个参数里放入坐标列的名称即可,datascience库会自动把剩余列元素一同放在图里。


Reference

Data 8 Text book: Inferential Thinking chapter 1-7