)
十四、数据科学导论——数学基础之统计第1关统计基础之数据描述任务描述本关任务对输入数据计算相关指标。相关知识为了完成本关任务你需要掌握1.如何对数据进行描述2.如何使用 python 计算。描述单个数据集假设某天公司领导来问你要一些关于你的成员有多少朋友的描述。对任何数据集最简单的描述方法就是数据本身num_friends [100, 49, 41, 40, 25,# ……等等许多]对足够小的数据集来说这甚至可以说是最好的描述方法。但随着数据规模变大这就显得笨拙又含混了。为此我们使用统计来提炼和表达数据的相关特征。首先我们通过 Counter 和 plt.bar() 把你的朋友数绘成直方图from collections import Counterfriend_counts Counter(num_friends)xs range(101) # 最大值是100ys [friend_counts[x] for x in xs] # height刚好是朋友的个数plt.bar(xs, ys)plt.axis([0, 101, 0, 25])plt.title(朋友数的直方图)plt.xlabel(朋友个数)plt.ylabel(人数)plt.show()不幸的是这幅图难以用来进行交流所以你需要再提炼一些统计量。数据点个数大概就是最简单的统计量了um_points len(num_friends) # 204largest_value max(num_friends) # 100smallest_value min(num_friends) # 1中心倾向我们常常希望了解数据中心位置的一些概念。一个常用的方法是使用均值即用数据和除以数据个数def mean(x):return sum(x) / len(x)mean(num_friends) # 7.333333如果有两个数据点均值就是两点的中间点。随着数据点的增加均值点会移动但是它始终取决每个点的取值。还有一个值是中位数它是指数据中间点的值如果数据点的个数是奇数或者中间两个点的平均值如果数据点的个数是偶数和均值不同中位数并不依赖于每一个数据的值。均值的计算会随着数据变化而平稳地变化。如果有 n 个数据点其中某一个点的值增加了 e则均值随之增加 e/n。这使得均值适用于各种微分运算但是为了计算中位数得先对数据排序。并且如果其中一个数据点的值增加了 e那么中位数有可能也增加 e有可能增加一个小于 e 的数也有可能根本不变这取决于其他的数据。同时均值对数据中的异常值非常敏感。如果最具人缘的用户有 200 个朋友均值会上升至 7.82而中位数不变。如果异常值属于不良数据那么均值会误导我们。中位数的一个泛化概念是分位数它表示少于数据中特定百分比的一个值。def quantile(x, p):p_index int(p * len(x))return sorted(x)[p_index]quantile(num_friends, 0.10) # 1quantile(num_friends, 0.25) # 3quantile(num_friends, 0.75) # 9quantile(num_friends, 0.90) # 13还有一个不太常用的概念众数mode它是指出现次数最多的一个或多个数def mode(x):counts Counter(x)max_count max(counts.values())return [x_i for x_i, count in counts.iteritems() if count max_count]mode(num_friends) # 1 和 6离散度离散度是数据的离散程度的一种度量。通常如果它所统计的值接近零则表示数据聚集在一起离散程度很小如果值很大则表示数据的离散度很大。例如一个简单的度量是极差指最大元素与最小元素的差def data_range(x):return max(x) - min(x)data_range(num_friends) # 99极差恰好为零意味着数据集中最大值和最小值相等这种情形只有在x中的元素全部相同时才会发生意味着数据没有离散。相反如果极差很大说明最大元素比最小元素大很多数据离散度很高。和中位数一样极差也不真正依赖于整个数据集。一个只包含 0 和 100 的数据集和一个包含 0、1 以及很多个 50 的数据集两者的极差相同。但看起来第一个数据集的离散度“应该”更高。离散度的另一个更复杂的度量是方差计算方式如下def de_mean(x):x_bar mean(x)return [x_i - x_bar for x_i in x]def variance(x):n len(x)deviations de_mean(x)return sum_of_squares(deviations) / (n - 1)variance(num_friends) # 81.54现在无论我们的数据是什么单位所有中心倾向的度量都是同一单位。极差的单位也与此相同。但是方差的单位是原数据单位的平方。然而用方差很难给出直观的比较所以我们更常使用标准差def standard_deviation(x):return math.sqrt(variance(x))standard_deviation(num_friends) # 9.03极差和标准差也都有我们之前提到的均值计算常遇到的异常值问题。再看之前的例子如果我们最具人缘的用户有 200 个朋友标准差就变为 14.89 增加了 60% 一种更加稳健的方案是计算 75% 的分位数和 25% 的分位数之差def interquartile_range(x):return quantile(x, 0.75) - quantile(x, 0.25)interquartile_range(num_friends) # 6相对来说这种计算不易受到一小部分异常值的影响。编程要求请仔细阅读右侧代码结合相关知识在 Begin-End 区域内进行代码补充不使用第三方库实现中位数的计算函数用于计算输入数据的中位数。测试说明平台会对你编写的代码进行测试测试输入[43,37,27,80,24,22,94,13,28,27]预期输出27.5开始你的任务吧祝你成功def student(data):#********* Begin *********## 复制并排序数据sorted_data sorted(data)n len(sorted_data)# 判断奇偶if n % 2 1:median sorted_data[n // 2]else:mid1 sorted_data[(n//2)-1]mid2 sorted_data[n//2]median (mid1 mid2) / 2print(median)#********* End *********#第2关统计基础之相关性任务描述本关任务编写一个能计算协方差的程序。相关知识为了完成本关任务你需要掌握1.相关的作用2.如何计算相关系数。相关接着上个关卡假设现在需要知道用户在某个网站上花费时间与其在这个网站上拥有的朋友数相关。通过分析研究流量日志得到了一个 daily_minutes 列表这个列表描述了每个用户每天在网页中花费了多长时间。该列表和之前的 num_friends 列表元素对应。协方差这个概念是方差的一个对应词。方差衡量了单个变量对均值的偏离程度而协方差衡量了两个变量对均值的串联偏离程度。如果向量 x 和向量 y 的对应元素同时大于它们自身序列的均值或者同时小于它们自身序列的均值那将为求和贡献一个正值。如果其中一个元素大于自身的均值而另一个小于自身的均值那将为求和贡献一个负值。因此如果协方差是一个大的正数就意味着如果 y 很大那么 x 也很大或者如果 y 很小那么 x 也很小。如果协方差为负而且绝对值很大就意味着 x 和 y 一个很大而另一个很小。接近零的协方差意味着以上关系都不存在。相关是更常受到重视的概念它是由协方差除以两个变量的标准差:def correlation(x, y):stdev_x standard_deviation(x)stdev_y standard_deviation(y)if stdev_x 0 and stdev_y 0:return covariance(x, y) / stdev_x / stdev_yelse:return 0 # 如果没有变动相关系数为零correlation(num_friends, daily_minutes) # 0.25相关系数没有单位它的取值在 -1 完全反相关和 1 完全相关之间。相关值 0.25 代表一个相对较弱的正相关。但是我们忽略了对数据进行检查上图中标出的有 100 位朋友数的用户是明显的异常值相关系数的计算对异常值非常敏感。所以在进行相关系数的计算时最好先将异常值去除。相关系数相关系数为零表示两个变量之间不存在线性关系。但它们之间还可能会存在其他形式的关系。例如如果:x [-2, -1, 0, 1, 2]y [ 2, 1, 0, 1, 2]那么 x 和 y 的相关系数为 0。但容易看出 x 和 y 之间显然具有某种关系 —— y 中的每个元素等于 x 中相应元素的绝对值。然而有一种关系它们却无法给出即 x_i 和 mean(x)之间的关系与 y_i 和 mean(y) 之间的关系并没有太大关联。这是一种相关系数试图捕捉的关系。此外相关系数无法告诉你关系有多强。例如x [-2, 1, 0, 1, 2]y [99.98, 99.99, 100, 100.01, 100.02]以上这两个变量完全相关但很有可能这种关系并没有实际意义。相关和因果如果 x 和 y 强相关那么意味着可能 x 引起了 y或 y 引起了 x或者两者相互引起了对方或者存在第三方因素同时引起了 x 和 y或者什么都不是。编程要求请仔细阅读右侧代码结合相关知识在Begin-End区域内进行代码补充不使用第三方库实现协方差函数并计算输入数据的协方差输出结果保留2位小数。测试说明平台会对你编写的代码进行测试。测试输入[34, 32, 2, 27, 27, 23, 39, 39][19, 33, 22, 18, 43, 46, 19, 49]预期输出23.16开始你的任务吧祝你成功def de_mean(x):x_bar sum(x) / len(x)return [x_i - x_bar for x_i in x]def dot(v, w):return sum(v_i * w_i for v_i, w_i in zip(v, w))def student(x, y):# ********* Begin *********#n len(x)# 求x、y各元素与均值的偏差dev_x de_mean(x)dev_y de_mean(y)# 协方差点积除以 n‑1cov dot(dev_x, dev_y) / (n - 1)# 保留两位小数输出print({0:.2f}.format(cov))# ********* End *********#有任何问题都可以随时关注私信