
图片由编辑提供
引言
如果你刚刚踏上数据科学之旅,可能会认为进行数据分析必须依赖Python、R这类专业软件。然而,你可能忽略了,命令行本身就是一个功能强大的统计工具箱。
命令行工具处理大型数据集的速度,往往比将它们加载到内存消耗大的应用程序中更快。它们易于编写脚本和实现自动化。更重要的是,这些工具在任意Unix系统上都能直接运行,无需额外安装任何软件。
本文将教你如何仅使用内置的Unix工具,直接在终端中执行核心的统计操作。
🔗 这里是GitHub上的Bash脚本。强烈建议你边编码边学习,以充分理解相关概念。
学习本教程,你需要:
- 一个类Unix环境(Linux、macOS或安装了WSL的Windows)。
- 我们将只使用系统中已安装的标准Unix工具。
现在,打开你的终端,准备开始吧。
设置示例数据
在分析数据之前,我们需要一个数据集。在终端中运行以下命令,创建一个代表网站每日流量的简单CSV文件:
cat > traffic.csv << EOF
date,visitors,page_views,bounce_rate
2024-01-01,1250,4500,45.2
2024-01-02,1180,4200,47.1
2024-01-03,1520,5800,42.3
2024-01-04,1430,5200,43.8
2024-01-05,980,3400,51.2
2024-01-06,1100,3900,48.5
2024-01-07,1680,6100,40.1
2024-01-08,1550,5600,41.9
2024-01-09,1420,5100,44.2
2024-01-10,1290,4700,46.3
EOF
这将创建一个名为traffic.csv的新文件,其中包含表头和十行示例数据。
探索你的数据
统计数据集行数
了解数据集包含多少条记录通常是第一步。使用wc(单词计数)命令配合-l标志,可以计算文件的行数:
wc -l traffic.csv
输出显示:11 traffic.csv(共11行,减去1行表头,得到10行数据)。
查看数据
在进行计算之前,最好先确认一下数据结构。head命令可以显示文件的前几行:
head -n 5 traffic.csv
这将显示前5行,让你预览数据。
date,visitors,page_views,bounce_rate
2024-01-01,1250,4500,45.2
2024-01-02,1180,4200,47.1
2024-01-03,1520,5800,42.3
2024-01-04,1430,5200,43.8
提取单列数据
要处理CSV文件中的特定列,可以使用cut命令,并指定分隔符和字段编号。以下命令提取访客数列:
cut -d',' -f2 traffic.csv | tail -n +2
这里,cut提取第2个字段(访客数列),而tail -n +2则跳过表头行。
计算集中趋势度量
计算均值(平均值)
均值是所有数值之和除以数值个数。我们可以通过提取目标列,然后使用awk累加值来计算:
cut -d',' -f2 traffic.csv | tail -n +2 | awk '{sum+=$1; count++} END {print "Mean:", sum/count}'
awk命令在处理每一行时累加总和与计数,然后在END代码块中进行除法运算。
Mean: 1340
接下来,我们计算中位数和众数。
计算中位数
中位数是将数据集排序后位于中间的值。对于偶数个数值,它是中间两个值的平均值。首先对数据进行排序,然后找到中间位置:
cut -d',' -f2 traffic.csv | tail -n +2 | sort -n | awk '{arr[NR]=$1; count=NR} END {if(count%2==1) print "Median:", arr[(count+1)/2]; else print "Median:", (arr[count/2]+arr[count/2+1])/2}'
这里用sort -n对数据进行数字排序,将值存储在数组中,然后找到中间值(如果计数为偶数,则取两个中间值的平均值)。
Median: 1355
计算众数
众数是出现频率最高的值。我们可以通过排序、统计重复项并找出出现次数最多的值来找到它:
cut -d',' -f2 traffic.csv | tail -n +2 | sort -n | uniq -c | sort -rn | head -n 1 | awk '{print "Mode:", $2, "(appears", $1, "times)"}'
这会对值进行排序,用uniq -c统计重复项,按频率降序排序,并选择最顶部的结果。
计算离散程度(或分布)度量
查找最大值
要找到数据集中的最大值,我们可以比较每个值并跟踪最大值:
awk -F',' 'NR>1 {if($2>max) max=$2} END {print "Maximum:", max}' traffic.csv
这里用NR>1跳过表头,将每个值与当前最大值比较,并在找到更大值时更新它。
查找最小值
类似地,要找到最小值,可以从第一行数据初始化最小值,并在找到更小的值时更新它:
awk -F',' 'NR==2 {min=$2} NR>2 {if($2<min) min=$2} END {print "Minimum:", min}' traffic.csv
运行上述命令以获取最大值和最小值。
同时查找最小值和最大值
与其运行两个独立的命令,我们可以在单次遍历中同时找到最小值和最大值:
awk -F',' 'NR==2 {min=$2; max=$2} NR>2 {if($2<min) min=$2; if($2>max) max=$2} END {print "Min:", min, "Max:", max}' traffic.csv
这种单次遍历的方法从第一行初始化两个变量,然后分别独立更新。
Min: 980 Max: 1680
计算(总体)标准差
标准差衡量数值相对于均值的离散程度。对于完整的总体,使用以下公式:
awk -F',' 'NR>1 {sum+=$2; sumsq+=$2*$2; count++} END {mean=sum/count; print "Std Dev:", sqrt((sumsq/count)-(mean*mean))}' traffic.csv
这累加了总和与平方和,然后应用公式:( sqrt{rac{sum x^2}{N} – mu^2} ),得到输出:
Std Dev: 207.364
计算样本标准差
当处理样本而非完整总体时,使用贝塞尔校正(除以 ( n-1 ))以获得无偏的样本估计:
awk -F',' 'NR>1 {sum+=$2; sumsq+=$2*$2; count++} END {mean=sum/count; print "Sample Std Dev:", sqrt((sumsq-(sum*sum/count))/(count-1))}' traffic.csv
这将得到:
Sample Std Dev: 218.581
计算方差
方差是标准差的平方。它是另一种衡量离散程度的指标,在许多统计计算中很有用:
awk -F',' 'NR>1 {sum+=$2; sumsq+=$2*$2; count++} END {mean=sum/count; var=(sumsq/count)-(mean*mean); print "Variance:", var}' traffic.csv
这个计算与标准差类似,只是省略了平方根。
Variance: 43000
计算百分位数
计算四分位数
四分位数将排序后的数据分成四个相等的部分。它们对于理解数据分布特别有用:
cut -d',' -f2 traffic.csv | tail -n +2 | sort -n | awk '
{arr[NR]=$1; count=NR}
END {
q1_pos = (count+1)/4
q2_pos = (count+1)/2
q3_pos = 3*(count+1)/4
print "Q1 (25th percentile):", arr[int(q1_pos)]
print "Q2 (Median):", (count%2==1) ? arr[int(q2_pos)] : (arr[count/2]+arr[count/2+1])/2
print "Q3 (75th percentile):", arr[int(q3_pos)]
}'
这个脚本将排序后的值存储在数组中,使用 ( (n+1)/4 ) 公式计算四分位数位置,并提取这些位置上的值。代码输出:
Q1 (25th percentile): 1100
Q2 (Median): 1355
Q3 (75th percentile): 1520
计算任意百分位数
你可以通过调整位置计算来计算任意百分位数。以下灵活的方法使用线性插值:
PERCENTILE=90
cut -d',' -f2 traffic.csv | tail -n +2 | sort -n | awk -v p=$PERCENTILE '
{arr[NR]=$1; count=NR}
END {
pos = (count+1) * p/100
idx = int(pos)
frac = pos - idx
if(idx >= count) print p "th percentile:", arr[count]
else print p "th percentile:", arr[idx] + frac * (arr[idx+1] - arr[idx])
}'
这会将位置计算为 ( (n+1) imes (percentile/100) ),然后对分数位置在数组索引之间使用线性插值。
处理多列数据
通常,你会希望同时计算多列的统计量。以下是同时计算访客数、页面浏览量和跳出率平均值的方法:
awk -F',' '
NR>1 {
v_sum += $2
pv_sum += $3
br_sum += $4
count++
}
END {
print "Average visitors:", v_sum/count
print "Average page views:", pv_sum/count
print "Average bounce rate:", br_sum/count
}' traffic.csv
这为每一列维护了单独的累加器,并在所有三列之间共享相同的计数,得到以下输出:
Average visitors: 1340
Average page views: 4850
Average bounce rate: 45.06
计算相关性
相关性衡量两个变量之间的关系。皮尔逊相关系数的范围从-1(完全负相关)到1(完全正相关):
awk -F', *' '
NR>1 {
x[NR-1] = $2
y[NR-1] = $3
sum_x += $2
sum_y += $3
count++
}
END {
if (count < 2) exit
mean_x = sum_x / count
mean_y = sum_y / count
for (i = 1; i <= count; i++) {
dx = x[i] - mean_x
dy = y[i] - mean_y
cov += dx * dy
var_x += dx * dx
var_y += dy * dy
}
sd_x = sqrt(var_x / count)
sd_y = sqrt(var_y / count)
correlation = (cov / count) / (sd_x * sd_y)
print "Correlation:", correlation
}' traffic.csv
这通过将协方差除以标准差的乘积来计算皮尔逊相关系数。
Correlation: 0.994096
结论
命令行是进行统计分析的一个强大工具。你可以处理海量数据、计算复杂的统计数据并自动化生成报告——所有这些都无需安装系统本身之外的任何软件。
这些技能是对你Python和R知识的补充,而非替代。在进行快速探索和数据验证时使用命令行工具,然后在需要复杂的建模和可视化时转向专业工具。
最棒的是,这些工具在你数据科学职业生涯中使用的几乎所有系统上都可用。打开你的终端,开始探索你的数据吧。
