零基础学编程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 ---
- Dubbo入门-协议;注册中心
- Oracle 12c PDB浅析(二)(r8笔记第29天)
- 【Go 语言社区】在 Go 语言中,如何正确的使用并发
- Data Guard高级玩法:通过闪回恢复failover备库 (r10笔记第7天)
- ajax跨域问题-web开发必会
- 在线重定义的补充测试(r10笔记第26天)
- 聊聊Data Guard中的DG Broker(r10笔记第24天)
- stuts2返回json数据简单实现
- Linux命令ssh-copy-id (r10笔记第21天)
- 【Go 语言社区】HTML5 canvas验证码识别
- 迁移式升级的测试(二)(r10笔记第35天)
- Golang实现图片缩放服务器
- mongodb数据结构与基本操作增删改查整理(二)
- 使用在线重定义重构亿级分区表(r10笔记第34天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Join()和 List()的 6 种化学反应
- lettuce和hbase中对netty的使用你都了解吗?
- SAS-新规试行下诞生的程序
- AIOHTTP的实战(一)
- JMeter二次开发插件实例
- 「R」Obtain RNAseq Values for a Specific Gene in Xena Database
- 使用JMeter测试TCP协议
- SQL使用(一):如何使用SQL语句去查询第二高的值
- OpenCV加载图片显示对应类型(位深度)方法
- 小程序快速入门教程(登录注册、开发工具、文件及结构介绍)
- 面试题-统计字符出现最大次数
- pytorch中文语言模型bert预训练代码
- React环境搭建
- leetcode - 旋转数组的最小数字
- 笔记101 | 文件的压缩与解压笔记