相关关系的定义:
高中数学中,成对数据的统计分析是选修三的最后一章。在非函数关系的两个量中,一个量的变化,与另一个量有一定关系,但是还受到其他因素的影响,比如孩子身高与父母身高, 二者有一定关系,但是又不是精确决定的关系,这种关系称为相关关系(correlation)。
正相关和负相关:如果一个变量增加时,另一个变量也增加,这两个变量称为正相关,反之则称为负相关。
样本相关系数(correlation coefficient)计算公式:
如何用C++编程来计算相关系数?
假设样本数据保存在一个文件中(第一列为航班准点率,第二列为投诉量):
C++代码如下:
void correlationCoefficient();
//保存数据对的结构体
struct PointF
{
float x;
float y;
};
int main()
{
correlationCoefficient();
return 0;
}
/* --从文本文件中,逐行读出文本数据"x y",
* 并分割两个浮点型数据float x, flaot y,
* 计算二者的相关系数(correlation coefficient)
*/
void correlationCoefficient()
{
const int nPoints = 10; //数据对的个数
ifstream inData; //创建读取文件的流对象inData
PointF points[nPoints]; //保存读取数据对的数组
inData.open("XX3_CH8_P104_2.txt"); //打开文本文件
if(!inData) //打开文件失败
{
cout<<"Error: could not open file."<<endl;
exit(1);
}else cout<<"File opened."<<endl; //打开文件
string line;
int i = 0;
cout<<"Data pairs read from file:" << endl;
while(std::getline(inData, line)) //逐行读取文件内容
{
cout << line << endl;
//sscanf()的第一个参数是要分割的字符串,第二个参数是格式化,后面的参数是分割之后的变量的地址
//strtok () C语言的分割字符串函数
sscanf(line.c_str(), "%f %f", &(points[i].x), &(points[i].y));
i++;
}
cout<<"Data pairs stored in array points[" << nPoints <<"]:" << endl;
for(int k = 0; k<nPoints; k++)
{
cout << points[k].x <<" "<<points[k].y << endl;
}
//计算x的平均数,y的平均数。
float averageX = 0;
float averageY = 0;
float sumX = 0;
float sumY = 0;
for(int i = 0; i<nPoints; i++)
{
sumX += points[i].x ;
sumY += points[i].y ;
}
averageX = sumX/nPoints;
averageY = sumY/nPoints;
//
float Lxy = 0; //反映x和y相关程度的量Lxy
float Sx = 0; // Sx/nPoints 为x的方差
float Sy = 0; // Sy/nPoints 为y的方差
for(int i = 0; i < nPoints; i++)
{
Lxy += (points[i].x - averageX)*(points[i].y - averageY);
Sx += pow(points[i].x - averageX,2);
Sy += pow(points[i].y - averageY,2);
}
Sx = sqrt(Sx);
Sy = sqrt(Sy);
float correlation = Lxy/(Sx*Sy);
cout<<"correlation = " << correlation << endl;
inData.close(); //关闭数据文件
}
程序输出: