用python双色球十大专家预测汇是否是高

在Python中使用线性回归预测数据 - Python - 伯乐在线
& 在Python中使用线性回归预测数据
本文中,我们将进行大量的编程——但在这之前,我们先介绍一下我们今天要解决的实例问题。
1) 预测房子价格
我们想预测特定房子的价值,预测依据是房屋面积。
2) 预测下周哪个电视节目会有更多的观众
闪电侠和绿箭侠是我最喜欢的电视节目。我想看看下周哪个节目会有更多的观众。
3) 替换数据集中的缺失值
我们经常要和带有缺失值的数据集打交道。这部分没有实战例子,不过我会教你怎么去用线性回归替换这些值。
所以,让我们投入编程吧(马上)
在动手之前,去把我以前的文章()中的程序包安装了是个好主意。
1) 预测房子价格
我们有下面的数据集:
在中,我们都知道必须在数据中找出一种线性关系,以使我们可以得到θ0和θ1。 我们的假设方程式如下所示:
其中: hθ(x)是关于特定平方英尺的价格值(我们要预测的值),(意思是价格是平方英尺的线性函数); θ0是一个常数; θ1是回归系数。
那么现在开始编程:
打开你最喜爱的文本编辑器,并命名为predict_house_price.py。 我们在我们的程序中要用到下面的包,所以把下面代码复制到predict_house_price.py文件中去。
# Required Packages
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
# Required Packagesimport matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom sklearn import datasets, linear_model
运行一下你的代码。如果你的程序没错,那步骤1基本做完了。如果你遇到了某些错误,这意味着你丢失了一些包,所以回头去看看。 安装博客文章中所有的包,再次运行你的代码。这次希望你不会遇到任何问题。
现在你的程序没错了,我们继续……
我把数据存储成一个.csv文件,名字为input_data.csv 所以让我们写一个函数把数据转换为X值(平方英尺)、Y值(价格)
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
X_parameter = []
Y_parameter = []
for single_square_feet ,single_price_value in zip(data['square_feet'],data['price']):
X_parameter.append([float(single_square_feet)])
Y_parameter.append(float(single_price_value))
return X_parameter,Y_parameter
# Function to get datadef get_data(file_name): data = pd.read_csv(file_name) X_parameter = [] Y_parameter = [] for single_square_feet ,single_price_value in zip(data['square_feet'],data['price']):&&&&&& X_parameter.append([float(single_square_feet)])&&&&&& Y_parameter.append(float(single_price_value)) return X_parameter,Y_parameter
第3行:将.csv数据读入Pandas数据帧。
第6-9行:把Pandas数据帧转换为X_parameter和Y_parameter数据,并返回他们。
所以,让我们把X_parameter和Y_parameter打印出来:
[[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]]
[50.0, 50.0, 450.0, 18450.0]
[Finished in 0.7s]
[[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]][6450.0, 7450.0, 8450.0, 9450.0, 11450.0, 15450.0, 18450.0][Finished in 0.7s]
脚本输出: [[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]] [50.0, 50.0, 450.0, 18450.0] [Finished in 0.7s]
现在让我们把X_parameter和Y_parameter拟合为线性回归模型。我们要写一个函数,输入为X_parameters、Y_parameter和你要预测的平方英尺值,返回θ0、θ1和预测出的价格值。
# Function for Fitting our data to Linear model
def linear_model_main(X_parameters,Y_parameters,predict_value):
# Create linear regression object
regr = linear_model.LinearRegression()
regr.fit(X_parameters, Y_parameters)
predict_outcome = regr.predict(predict_value)
predictions = {}
predictions['intercept'] = regr.intercept_
predictions['coefficient'] = regr.coef_
predictions['predicted_value'] = predict_outcome
return predictions
123456789101112
# Function for Fitting our data to Linear modeldef linear_model_main(X_parameters,Y_parameters,predict_value):& # Create linear regression object regr = linear_model.LinearRegression() regr.fit(X_parameters, Y_parameters) predict_outcome = regr.predict(predict_value) predictions = {} predictions['intercept'] = regr.intercept_ predictions['coefficient'] = regr.coef_ predictions['predicted_value'] = predict_outcome return predictions
第5-6行:首先,创建一个线性模型,用我们的X_parameters和Y_parameter训练它。
第8-12行:我们创建一个名称为predictions的字典,存着θ0、θ1和预测值,并返回predictions字典为输出。
所以让我们调用一下我们的函数,要预测的平方英尺值为700。
X,Y = get_data('input_data.csv')
predictvalue = 700
result = linear_model_main(X,Y,predictvalue)
print "Intercept value " , result['intercept']
print "coefficient" , result['coefficient']
print "Predicted value: ",result['predicted_value']
X,Y = get_data('input_data.csv')predictvalue = 700result = linear_model_main(X,Y,predictvalue)print "Intercept value " , result['intercept']print "coefficient" , result['coefficient']print "Predicted value: ",result['predicted_value']
脚本输出:Intercept value 4 coefficient [ 28.] Predicted value: [ 91] [Finished in 0.7s]
这里,Intercept value(截距值)就是θ0的值,coefficient value(系数)就是θ1的值。 我们得到预测的价格值为——意味着我们已经把预测房子价格的工作做完了!
为了验证,我们需要看看我们的数据怎么拟合线性回归。所以我们需要写一个函数,输入为X_parameters和Y_parameters,显示出数据拟合的直线。
# Function to show the resutls of linear fit model
def show_linear_line(X_parameters,Y_parameters):
# Create linear regression object
regr = linear_model.LinearRegression()
regr.fit(X_parameters, Y_parameters)
plt.scatter(X_parameters,Y_parameters,color='blue')
plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4)
plt.xticks(())
plt.yticks(())
plt.show()
12345678910
# Function to show the resutls of linear fit modeldef show_linear_line(X_parameters,Y_parameters): # Create linear regression object regr = linear_model.LinearRegression() regr.fit(X_parameters, Y_parameters) plt.scatter(X_parameters,Y_parameters,color='blue') plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4) plt.xticks(()) plt.yticks(()) plt.show()
那么调用一下show_linear_line函数吧:
show_linear_line(X,Y)
show_linear_line(X,Y)
脚本输出:
2)预测下周哪个电视节目会有更多的观众
闪电侠是一部由剧作家/制片人Greg Berlanti、Andrew Kreisberg和Geoff Johns创作,由CW电视台播放的美国电视连续剧。它基于DC漫画角色闪电侠(Barry Allen),一个具有超人速度移动能力的装扮奇特的打击犯罪的超级英雄,这个角色是由Robert Kanigher、John Broome和Carmine Infantino创作。它是绿箭侠的衍生作品,存在于同一世界。该剧集的试播篇由Berlanti、Kreisberg和Johns写作,David Nutter执导。该剧集于日在北美首映,成为CW电视台收视率最高的电视节目。
绿箭侠是一部由剧作家/制片人 Greg Berlanti、Marc Guggenheim和Andrew Kreisberg创作的电视连续剧。它基于DC漫画角色绿箭侠,一个由Mort Weisinger和George Papp创作的装扮奇特的犯罪打击战士。它于日在北美首映,与2012年末开始全球播出。主要拍摄于Vancouver、British Columbia、Canada,该系列讲述了亿万花花公子Oliver Queen,由Stephen Amell扮演,被困在敌人的岛屿上五年之后,回到家乡打击犯罪和腐败,成为一名武器是弓箭的神秘义务警员。不像漫画书中,Queen最初没有使用化名”绿箭侠“。
由于这两个节目并列为我最喜爱的电视节目头衔,我一直想知道哪个节目更受其他人欢迎——谁会最终赢得这场收视率之战。 所以让我们写一个程序来预测哪个电视节目会有更多观众。 我们需要一个数据集,给出每一集的观众。幸运地,我从维基百科上得到了这个数据,并整理成一个.csv文件。它如下所示。
闪电侠美国观众数
绿箭侠美国观众数
观众数以百万为单位。
解决问题的步骤:
首先我们需要把数据转换为X_parameters和Y_parameters,不过这里我们有两个X_parameters和Y_parameters。因此,把他们命名为flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter吧。然后我们需要把数据拟合为两个不同的线性回归模型——先是闪电侠,然后是绿箭侠。 接着我们需要预测两个电视节目下一集的观众数量。 然后我们可以比较结果,推测哪个节目会有更多观众。
导入我们的程序包:
# Required Packages
import csv
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
# Required Packagesimport csvimport sysimport matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom sklearn import datasets, linear_model
写一个函数,把我们的数据集作为输入,返回flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter values。
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
12345678910111213
# Function to get datadef get_data(file_name): data = pd.read_csv(file_name) flash_x_parameter = [] flash_y_parameter = [] arrow_x_parameter = [] arrow_y_parameter = [] for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']): flash_x_parameter.append([float(x1)]) flash_y_parameter.append(float(y1)) arrow_x_parameter.append([float(x2)]) arrow_y_parameter.append(float(y2)) return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
现在我们有了我们的参数,来写一个函数,用上面这些参数作为输入,给出一个输出,预测哪个节目会有更多观众。
# Function to know which Tv show will have more viewers
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1.fit(x1, y1)
predicted_value1 = regr1.predict(9)
print predicted_value1
regr2 = linear_model.LinearRegression()
regr2.fit(x2, y2)
predicted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 & predicted_value2:
print "The Flash Tv Show will have more viewers for next week"
print "Arrow Tv Show will have more viewers for next week"
123456789101112131415
# Function to know which Tv show will have more viewersdef more_viewers(x1,y1,x2,y2): regr1 = linear_model.LinearRegression() regr1.fit(x1, y1) predicted_value1 = regr1.predict(9) print predicted_value1 regr2 = linear_model.LinearRegression() regr2.fit(x2, y2) predicted_value2 = regr2.predict(9) #print predicted_value1 #print predicted_value2 if predicted_value1 & predicted_value2: print "The Flash Tv Show will have more viewers for next week" else: print "Arrow Tv Show will have more viewers for next week"
把所有东西写在一个文件中。打开你的编辑器,把它命名为prediction.py,复制下面的代码到prediction.py中。
# Required Packages
import csv
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
# Function to know which Tv show will have more viewers
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1.fit(x1, y1)
predicted_value1 = regr1.predict(9)
print predicted_value1
regr2 = linear_model.LinearRegression()
regr2.fit(x2, y2)
predicted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 & predicted_value2:
print "The Flash Tv Show will have more viewers for next week"
print "Arrow Tv Show will have more viewers for next week"
x1,y1,x2,y2 = get_data('input_data.csv')
#print x1,y1,x2,y2
more_viewers(x1,y1,x2,y2)
1234567891011121314151617181920212223242526272829303132333435363738394041
# Required Packagesimport csvimport sysimport matplotlib.pyplot as pltimport numpy as npimport pandas as pdfrom sklearn import datasets, linear_model&# Function to get datadef get_data(file_name): data = pd.read_csv(file_name) flash_x_parameter = [] flash_y_parameter = [] arrow_x_parameter = [] arrow_y_parameter = [] for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']): flash_x_parameter.append([float(x1)]) flash_y_parameter.append(float(y1)) arrow_x_parameter.append([float(x2)]) arrow_y_parameter.append(float(y2)) return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter&# Function to know which Tv show will have more viewersdef more_viewers(x1,y1,x2,y2): regr1 = linear_model.LinearRegression() regr1.fit(x1, y1) predicted_value1 = regr1.predict(9) print predicted_value1 regr2 = linear_model.LinearRegression() regr2.fit(x2, y2) predicted_value2 = regr2.predict(9) #print predicted_value1 #print predicted_value2 if predicted_value1 & predicted_value2: print "The Flash Tv Show will have more viewers for next week" else: print "Arrow Tv Show will have more viewers for next week"&x1,y1,x2,y2 = get_data('input_data.csv')#print x1,y1,x2,y2more_viewers(x1,y1,x2,y2)
可能你能猜出哪个节目会有更多观众——但运行一下这个程序看看你猜的对不对。
3) 替换数据集中的缺失值
有时候,我们会遇到需要分析包含有缺失值的数据的情况。有些人会把这些缺失值舍去,接着分析;有些人会用最大值、最小值或平均值替换他们。平均值是三者中最好的,但可以用线性回归来有效地替换那些缺失值。
这种方法差不多像这样进行。
首先我们找到我们要替换那一列里的缺失值,并找出缺失值依赖于其他列的哪些数据。把缺失值那一列作为Y_parameters,把缺失值更依赖的那些列作为X_parameters,并把这些数据拟合为线性回归模型。现在就可以用缺失值更依赖的那些列预测缺失的那一列。
一旦这个过程完成了,我们就得到了没有任何缺失值的数据,供我们自由地分析数据。
为了练习,我会把这个问题留给你,所以请从网上获取一些缺失值数据,解决这个问题。一旦你完成了请留下你的评论。我很想看看你的结果。
个人小笔记:
我想分享我个人的数据挖掘经历。记得在我的数据挖掘引论课程上,教师开始很慢,解释了一些数据挖掘可以应用的领域以及一些基本概念。然后突然地,难度迅速上升。这令我的一些同学感到非常沮丧,被这个课程吓到,终于扼杀了他们对数据挖掘的兴趣。所以我想避免在我的博客文章中这样做。我想让事情更轻松随意。因此我尝试用有趣的例子,来使读者更舒服地学习,而不是感到无聊或被吓到。
谢谢读到这里——请在评论框里留下你的问题或建议,我很乐意回复你。
关于作者:Python+sklearn使用线性回归算法预测儿童身高
问题描述:一个人的身高除了随年龄变大而增长之外,在一定程度上还受到遗传和饮食以及其他因素的影响,本文代码中假定受年龄、性别、父母身高、祖父母身高和外祖父母身高共同影响,并假定大致符合线性关系。
import copyimport numpy
as npfrom sklearn
import linear_model
def linearRegressionPredict(x, y):
lr = linear_model.LinearRegression()
lr.fit(x, y)
# 儿童年龄,性别(0女1男),父亲身高,母亲身高,祖父身高,祖母身高,外祖父身高,外祖母身高
x = np.array([[1, 0, 180, 165, 175, 165, 170, 165],\
[3, 0, 180, 165, 175, 165, 173, 165],\
[4, 0, 180, 165, 175, 165, 170, 165],\
[6, 0, 180, 165, 175, 165, 170, 165],\
[8, 1, 180, 165, 175, 167, 170, 165],\
[10, 0, 180, 166, 175, 165, 170, 165],\
[11, 0, 180, 165, 175, 165, 170, 165],\
[12, 0, 180, 165, 175, 165, 170, 165],\
[13, 1, 180, 165, 175, 165, 170, 165],\
[14, 0, 180, 165, 175, 165, 170, 165],\
[17, 0, 170, 165, 175, 165, 170, 165]])
# 儿童身高,单位:cm
y = np.array([60, 90, 100, 110,\
130, 140, 150, 164,\
160, 163, 168])
# 根据已知数据拟合最佳直线的系数和截距
lr = linearRegressionPredict(x, y)# 查看最佳拟合系数print('k:', lr.coef_)# 截距print('b:', lr.intercept_)
xs = np.array([[10, 0, 180, 165, 175, 165, 170, 165],\
[17, 1, 173, 153, 175, 161, 170, 161],\
[34, 0, 170, 165, 170, 165, 170, 165]])for item
# 深复制,假设超过18岁以后就不再长高了
item1 = copy.deepcopy(item)
if item1[0] & 18:
item1[0] = 18
print(item,
':', lr.predict(item1.reshape(1,-1)))
运行结果:
0 180 165 175 165 170 165] : [ 140.]
1 173 153 175 161 170 161] : [ 158.41]
0 170 165 170 165 170 165] : [ 176.]
-------相关阅读---------
----------喜大普奔----------
1、继《Python程序设计基础》(2017年9月第5次印刷)、《Python程序设计(第2版)》(2017年9月第4次印刷)、《Python可以这样学》(2017年7月第3次印刷)系列图书之后,董付国老师新书《Python程序设计开发宝典》已于日在清华大学出版社出版,并于2017年9月进行了第2次印刷。为庆祝新书《Python程序设计开发宝典》全面上架,清华大学出版社联合“赣江图书专营”淘宝店推出特价优惠活动,《Python程序设计开发宝典》原价69元,新书上架期间超低价39.8元,可以复制下面的链接使用浏览器打开查看图书详情和购买:
https://detail.tmall.com/item.htm?spm=a1z10.3-b-s.wf16db0roWfX4&id=&rn=339cbc9df2bacdedfbd2&abbucket=8&tbpm=3
2、10月13日——15日,重庆,全国高校程序设计系列课程高级研究班,详见:
没有更多推荐了,路漫漫其修远兮,吾将上下而求索
用python预测高考成绩
感谢提供的数据集。
本文旨在学习数据分析的基本过程,文中敏感数据均已隐藏。本文通过一些基本描述统计,如考生人数、科目分数及平均分、考试排名,文科理科等因素,尽可能地探求数据集中包含的有价值的信息,来预测高考成绩。
&1、数据集选用“某年上海某区高考二模成绩”
2、上海过去几年的高考制度采用“3+1+1”的模式,语数英 + 加一学科 + 综合,加一学科指在物理、化学、生物、地理、政治、历史中选其一。(这条信息很重要,有助于帮我们理解数据)
&pandas、numpy
&matplotlib
数据可视化
&Jupyter Notebook 数据分析利器
# 一、导入数据
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
import pandas as pd
import numpy as np
filename = './**.xls'
df_w = pd.read_excel(filename, sheet_name=0)
df_l = pd.read_excel(filename, sheet_name=1)
print(df_w.columns)
df_w.head(3)
Index([‘学科’, ‘学校’, ‘准考证号’, ‘姓名’, ‘语文’, ‘数学’, ‘英语’, ‘五门调整总分’, ‘总分排名’], dtype=’object’)
五门调整总分
print(df_l.columns)
df_l.head(3)
Index([‘学科’, ‘学校’, ‘准考证号’, ‘姓名’, ‘语文’, ‘数学’, ‘英语’, ‘加一调整分’, ‘五门总分’, ‘总分排名’], dtype=’object’)
加一调整分
df_l.dtypes
加一调整分
dtype: object
df_w.dtypes
五门调整总分
dtype: object
从上面发现数据质量很高,非常工整。但也存在几个小问题。
&1、文科生没有“加一调整分”列
2、文科生“五门调整总分”同 文科生“五门总分”列名不相同。
# 二、数据处理
df_w = df_w.rename(columns = {'五门调整总分':'五门总分'})
df_w.head()
df_new = pd.concat([df_w, df_l], ignore_index=True)
columns = ['学科','学校','准考证号','姓名','语文','数学','英语','加一调整分','五门总分','总分排名']
df_new = pd.DataFrame(df_new, columns=columns)
sanmen = df_new['语文'] + df_new['数学'] + df_new['英语']
df_new.insert(8,'三门总分',sanmen)
df_new.head()
加一调整分
简单数据处理后,我们把文科生成绩和理科生成绩的两张数据表合并了,由于文科生数据表中没有“加一调整分”一列,因此所有文科生的该列为空(NaN),然后我们可以进入进一步挖掘了。
# 三、数据分析
经过之前的数据处理,现在我们可以对数据集进行基础的描述性统计分析。
df_w.describe()
731.000000
731.000000
731.000000
731.000000
731.000000
363.442134
366.000000
211.165812
191.500000
333.950000
183.500000
371.700000
366.000000
108.875000
399.400000
548.500000
119.000000
128.000000
132.000000
483.500000
731.000000
df_w2 = df_w.sort_values(by='五门总分',ascending=False)
df_w=df_w2.reset_index(drop=True)
df_w.head()
从上表中我们可以看到
1、最高分(max)和最低分(min)相差非常大,说明学生成绩个体差异很大。2、平均值(mean)低于中们数(50%),说明成绩差的学生拖后腿严重。
下面我们用更直观的图表来分析
fig = plt.figure(figsize=(18,10))
ax1 = plt.subplot2grid((1,1),(0,0))
zf_mean = df_w['五门总分'].mean()
pm_mean = df_w['总分排名'].mean()
w_num = len(df_w)
sanmen = df_w['语文']+df_w['数学']+df_w['英语']
x = range(w_num)
ax1.scatter(x, df_w['语文'], color='r', edgecolor='none', s=10)
ax1.scatter(x, df_w['数学'], color='g', edgecolor='none', s=10)
ax1.scatter(x, df_w['英语'], color='b', edgecolor='none', s=10)
ax1.plot(df_w['五门总分'],label='五门总分',color='b',lw=0.8)
ax1.plot(sanmen,label='三门总分', color='r',lw=0.8)
ax1.fill_between(x,df_w['五门总分'],sanmen, facecolor='g', alpha=0.4)
ax1.scatter(pm_mean,zf_mean, color='r', s=100)
ax1.axhline(100, color='k', lw=0.8)
ax1.axvline(pm_mean, color='k', lw=0.6, linestyle = "dashed")
plt.axis([0,w_num, 0, 500])
plt.xlabel('学生排名',fontsize=18)
plt.ylabel('分数',fontsize=18)
plt.title('上海某区高考二模成绩排名表\n(文科生)',fontsize=25)
plt.legend()
plt.show()
上图说明:
1、纵坐标表示成绩,横坐标表示排名
2、红点表示语文,结点表示数学,蓝点表示英语,他们的高低分布表示分数的高低。
3、绿色填充部分表示“ 加一学科 + 综合”和的成绩。(五门总成绩-三门语数英成绩和)
4、垂直虚线表示排名平均数位置,大红点表示总分平均分。
5、沿着横坐标往右,每一个垂直线表示一个学生的成绩。(为使图像简洁,网络线没画)
如果只分析语文、数学、英语对总成绩的影响,我们可以得出以下结论:
1、成绩好的学生这三门成绩相对都很好,成绩好的学生英语成绩普遍较好
2、极个别同学偏科非常严重,英语最容易得高分,数学失分最严重。
3、三科中语文成绩差值最小,也就是上面分析到描述统计信息中的标准差(std)值最小。所以对总分影响最小
理科生分析略。
四、分析全部学生
下面开始对全部学生的分析。
PS:以下分析参考自’ ButtersPC,感谢
首先,我们对“学科”列进行分组(groupby),来看一个各科目的学生情况:
g_xueke = df_new.groupby('学科')
g_xueke['准考证号'].count().sort_values(ascending=False)
Name: 准考证号, dtype: int64
紧拉着,我们对各学科考生的平均成绩状况进行一个大致的判断:
g_xueke[['语文']].mean().sort_values(by='语文', ascending=True)
g_xueke[['数学']].mean().sort_values(by='数学', ascending=True)
g_xueke[['英语']].mean().sort_values(by='英语', ascending=True)
g_xueke[['三门总分']].mean().sort_values(by='三门总分', ascending=True)
g_xueke[['五门总分']].mean().sort_values(by='五门总分', ascending=True)
得到表格如下
我们可以得出以下结论:
1、选化学的学生最多,其次是物理,最少的是生物。
2、政治班语文平均分最高,物理班其次。
3、物理班英语平均分最高,化学班其次。
4、物理班三门总分平均分和五门总分平均分最高,其次是化学。
总体来说物理班的总体实力最强,五门总分平均分高的学生,语文、数学、英语成绩也普遍较好,和之前分析文科班的情况相似。
再业,我们对“学校”特征进行分组(groupby):
g_xuexiao = df_new.groupby('学校')
g_xuexiao['准考证号'].count().sort_values(ascending=False)
上大附中新疆部
Name: 准考证号, dtype: int64
这边我们发现了3组异常值:
同洲模范、行中中学、建峰高中三所学校的人数比较奇怪,只有20人左右
查阅网上资料后了解到:
1、行中中学是行知中学放置借读生名额的学校(为了不影响升学率的手段)
2、建峰高中是一所高职,其中会参加高考的学生并不多,因此参加高考模拟考的学生也不多
3、许多人指责同洲模范高中部很差(似乎初中部还不错?),可能校方有意收缩高中部招生
同样地,我们对各学校考生的平均成绩状况进行一个大致的判断:
g_xuexiao[['语文']].mean().sort_values(by='语文', ascending=True)
g_xuexiao[['数学']].mean().sort_values(by='数学', ascending=True)
g_xuexiao[['英语']].mean().sort_values(by='英语', ascending=True)
g_xuexiao[['三门总分']].mean().sort_values(by='三门总分', ascending=True)
g_xuexiao[['五门总分']].mean().sort_values(by='五门总分', ascending=True)
得到表格如下
得到的结果是:
语文平均分第一:罗店中学
数学平均分第一:行知中学
英语平均分第一:吴淞中学
三门平均分第一:行知中学
五门平均分第一:行知中学
有趣的是,行知中学数据平均分第一,并且也获得了三门平均分第一和五门平均分第一
难道数学考得好,更容易拿更高的名次?
从上面的文科生分析我们可以得出,数学的离散性非常大,标准差(std)也最大。
我们再尝试通过皮尔森相关系数验证一下(皮尔森相关系数能够体现两组数据之间的线性关系):
df_new[['数学','语文','英语','三门总分','五门总分']].corr()
果然数学与总分的相关系数最高,英语略低于数学,语文最低,而且低很多
我们进一步观测语数英成绩这三组的数据:
df_new[['数学','语文','英语']].describe()
102.000000
103.000000
113.000000
147.000000
120.000000
141.000000
我们发现数学的标准差最大,这说明了数学成绩离散程度比较高,每一分的考生人数比较少,因此:数学每提高1分能干掉的其他考生比其他科目少,所以似乎看来提高数学成绩是收益最低的?
的确,数学没提高1分,对于考生在数学考试上的排名提升效果较小,但是在实践考试中我们是按照语数英三门科目加总后进行排名的(而且在加总的时候不分配权重),这就说明数学的1分,英语的1分,语文的1分,在最终三门总排名上的影响是等价的。
我们再回到数学标准差较大的讨论上,我认为数学成绩方差高是一种现象,导致这种现象的是因为数学的评分机制的关系:数学题不会就是不会,经常会出现一道大题20份只拿1分的情况(解: +1分),而语文不会做也能瞎诌诌,英语则题量比较大,得分点分配的很散。再进一步说,就是方差高说明考生在该项考试中成绩差距显著,考生们更容易在该项考试中被拉出等第,也更容易方便学校来选拔考生(之前复旦大学自主招生千分考项目,应该也是同样的思路,高方差为了更便于筛选考生)。
举个例子就是说:假设某个考生A,数学略高于平均水平,英语语文略低于平均水平,在数学考试高方差的放大下,最后考生A的三门总分排名可能是高于平均水平的。而考生B,语文略高于平均水平,数学英语略低于平局水平,在语文考试低方差的影响下,最后考生B的三门总分排名往往是低于平均水平的。
最终我得出的结论是,如果将考试分为n门,理论上来说这n门的最终成绩的方差应该是近似的,如果其中有一门的方差偏高,说明这一门更能凸显考生之间的差距(也就是可以拉开排名上的差距),如果作为考生,应该在方差大的科目上多努力,这样有助于最后提高排名(当然是在最终成绩不加权的情况下)。
以上分析结论复制自’ ButtersPC)向你学习!
没有更多推荐了,

我要回帖

更多关于 双色球预测经典一注 的文章

 

随机推荐