零基础学编程037:小数据分析

时间:2022-05-03
本文章向大家介绍零基础学编程037:小数据分析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

R语言内置强大的向量运算,是搞数据分析的强大的编程语言,而Python也毫不逊色。今天就试着分析一下考试成绩表中两门科目的相关性。

问题描述:

有一个CSV文件,包含着600名学生在一次考试后的几门课程的考试成绩,想分析一下数学和物理成绩的相关关系。CSV数据样例:

num,class,chinese,math,english,physical,chemical,politics,biology,history,geo,pe 158,3,99,120,114,70,49.5,50,49,48.5,49.5,60 442,7,107,120,118.5,68.6,43,49,48.5,48.5,49,56 249,4,98,120,116,70,47.5,47,49,47.5,49,60 ......

各列含义为:学号、班级、语文、数学、英语、物理、化学、政治、生物、历史、地理、体育。

读出CSV数据

CSV是一种逗号分隔的文本文件(Comma-Separated Values),在《零基础学编程019:生成群文章目录》介绍过如何读取CSV文件。这里换一种方法,因为CSV本身是一种文本文件,而numpy模块包中也可以方便地读入这种数据,请搜索“numpy read csv”可以找出相关文章。

import numpy as np
scores = np.genfromtxt('scores.csv', delimiter=',', names=True)
x = scores['math']
y = scores['physical']

这里需要解释的是第2行,delimiter指明分隔符为逗号;names=True,表示文件中包含标题行,后面就可以使用列名来访问各列数据了。

画散点图

在《零基础学编程012:画出复利曲线图》这一课里,我们用matplotlib画曲线图,同样我们可以用它画出散点图。

import matplotlib.pyplot as plt
plt.scatter(x, y)
plt.xlabel('math')
plt.ylabel('pyhsical')
plt.title('math ~ physical')
plt.show()

核心代码就一行:plt.scatter(x, y),后面几行分别设置x轴名称、y轴名称、图名。

加上线性拟合线

我在谷歌中准备搜索matplotlib linear时,它自动弹出了搜索建议“matplotlib linear regression line”

第二条就是我们想要的答案,在plt.show()之前加入两行代码:

a, b = np.polyfit(x, y, 1)
plt.plot(x, a*x+b, '-')

polyfit表示最小二乘法的多项式拟合,1表示拟合为一阶线性函数。

写个函数,画出任意两个科目的散点分布图

import numpy as np
import matplotlib.pyplot as plt

def plot_scatter(scores, subject1, subject2) :
    ''' 画出两门科目的散点分布图和拟合直线 '''
    x = scores[subject1]
    y = scores[subject2]
    plt.scatter(x, y)
    plt.xlabel(subject1)
    plt.ylabel(subject2)
    plt.title(subject1 + ' ~ ' + subject2)
    a, b = np.polyfit(x, y, 1)
    plt.plot(x, a*x+b, '-')
    plt.show()

scores = np.genfromtxt('scores.csv', delimiter=',', names=True)
plot_scatter(scores, 'math', 'chinese')

数学和语文的相关情况:

可以看出数理不分家,数学成绩好的一般物理也好,但数学和语文的相关性就不太明显了。

小结:

  • CSV是一种逗号分隔的文本文件
  • csv模块包中的reader()函数可以读CSV文件
  • numpy中的genfromtxt()函数也可以读CSV文件
  • matplotlib中的scatter()函数可以画散点分布图
  • numpy中的polyfit()可以计算多项式拟合的系数

--- END ---