回归分析实践

我们需要处理的数据的链接在这里:
https://download.csdn.net/download/qq_52112285/87558750?spm=1001.2014.3001.5503

1.利用excel进行数据回归分析

首先需要确保这两项分析工具库已在加载项,如果没有需要在下方的非活动应用程序加载项选择确定
在这里插入图片描述
然后点‘转到’,并勾选如下:
在这里插入图片描述
选择x,y区域,进行线性拟合(29条数据)
在这里插入图片描述
在这里插入图片描述
可以手动调整划线区域范围
在这里插入图片描述
300条数据
在这里插入图片描述
5000条数据
在这里插入图片描述
可以发现相关系数和残差都有所下降
也可以采用列散点图的方式得到回归公式和R值
选中x,y列,点击插入散点图
在这里插入图片描述
再点击图上小点,在选项里选择添加线性趋势线和显示公式和R值(30条数据)
在这里插入图片描述
300条数据
在这里插入图片描述
3000条数据
在这里插入图片描述

2.用python自定义函数进行数据分析

import csv
import math
class regress:
    heights=[]
    weights=[]
    aver_x=0.0
    aver_y=0.0
    vx=0.0
    vy=0.0
    b=0.0
    a=0.0
    p=0.0
    def __init__(self,number) -> None:
        self.heights=[]
        self.weights=[]
        self.aver_x=0.0
        self.aver_y=0.0
        self.vx=0.0
        self.vy=0.0
        self.b=0.0
        self.a=0.0
        self.p=0.0
        self._number=number 
        with open("weights_heights.csv","r",newline='') as index:
         reader=csv.reader(index)
         i=0
         for record in reader:
          indexx, height , weight =record
          if i>0:
               self.heights.append(float(height))
               self.weights.append(float(weight))
          i+=1
          if i==number:
              break
         print("heights",len(self.heights))
        self._number=self._number-1
        self.aver_x=sum(self.heights)/self._number
        self.aver_y=sum(self.weights)/self._number
        self.b=self.giveb()
        self.a=self.givea()
        self.give_xy()
        self.give_p()
    def __str__(self) -> str:
       s=''
       for i in range(self._number):
        s+=f'NO{i} height:{self.heights[i]},weight:{self.weights[i]}  '   
        if (i+1)%3 == 0:
             s+= '\n'         
       return s
    def giveb(self) -> float:
        b=0
        b1=0
        b2=0
        for i in range(self._number):
           b1+=self.heights[i]*self.weights[i]
           b2+=self.heights[i]**2
        b1=b1*self._number
        b2=b2*self._number
        b=(b1-sum(self.heights)*sum(self.weights))/(b2-sum(self.heights)**2) 
        return b
    def givea(self) -> float:
        return self.aver_y-self.b*self.aver_x
    def give_xy(self):
      for i in range(self._number):
          self.vx+=(self.heights[i]-self.aver_x)**2
          self.vy+=(self.weights[i]-self.aver_y)**2
      self.vx=math.sqrt(self.vx)
      self.vy=math.sqrt(self.vy)
    def give_p(self):
        for i in range(self._number):
            self.p+=(self.heights[i]-self.aver_x)*(self.weights[i]-self.aver_y)
        self.p=self.p/(self.vx*self.vy) 
    def show(self):
        print(f"the equation is y="+str(self.b)+"*x+"+str(self.a))
        print(f"the R value is {self.p}")

reg2=regress(5001)
reg1=regress(301)
reg1.show()
reg2.show()


运行结果:
在这里插入图片描述

3.使用sklearn库进行回归分析

sklearn全称scikit-learn,是python一个应用广泛的机器学习库,里面集成了很多常用的机器学习算法

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
people=pd.read_csv('weights_heights.csv')
people.columns=['Index','Height','Weight']
people1=people[people['Index']<401]
x_train,x_test,y_train,y_test=train_test_split(people1.Height.values.reshape(-1,1),
 people1.Weight.values,train_size=300,random_state=10)# divide train set and test set
linear=LinearRegression()
linear.fit(X=x_train,y=y_train)# give x train and y train data and let it fit
print(linear.coef_,linear.intercept_)
predicted=linear.predict(x_test)
axes=sns.scatterplot(data=people1,x='Height',y='Weight',hue='Height',palette='spring',legend=False)
axes.set_ylim(80,190)
axes.set_xlim(50,90)
predict=(lambda x:linear.coef_*x+linear.intercept_)
x=np.array([min(people1.Height.values),max(people1.Height.values)])
y=predict(x)
line=plt.plot(x,y)
plt.show()

300个训练数据效果:
在这里插入图片描述
3500个训练数据
在这里插入图片描述
三种方法比较起来,EXCEL比较方便直接,可以直接通过按键调用,但是对背后的处理方式缺少了解,以及不好自己调节。
通过自己编写python代码实现则比较繁琐,但是可控和调整的内容则更多,便于修改和观察
调用skelearn我认为也是十分方便的,但是第一次使用的时候需要注意函数规范,上手后就很简单了,通过使用matplotlib还可以比较直接地画出图像,在功能上已经接近excel.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值