편차(deviation)
통계학에서 편차(deviation)는 관측값과 평균의 차이를 말한다. 편차점수라고도 한다. 어떤 변인 y에서 특정 사례의 편차 d를 다음과 같이 나타낼 수 있다. 편차는 양수일수도 있고 음수일 수 있으며, 이는 평균보다 크거나 작음을 나타낸다. 값의 크기는 관측값이 평균으로부터 얼마나 떨어져 있는가를 나타낸다.

주어진 표본에서 편차를 모두 더하면 항상 0이 된다.

표준편차(standard deviation)
표준편차(standard deviation)는 자료의 산포도를 나타내는 수치로, 분산의 음이 아닌 제곱근으로 정의된다. 표준편차가 작을수록 평균값에서 변량들의 거리가 가깝다. 통계학과 확률에서 주로 확률의 분포, 확률변수 혹은 측정된 인구나 중복집합을 나타낸다. 일반적으로 모집단의 표준편차는 sigma(시그마)로, 표본의 표준편차는 S(에스)로 나타낸다.
확률변수 X의 표준 편차 sigma 는 다음과 같다. E(x)는 기대값 또는 평균값이다. X는 이산확률변수(discreate random variable)이다.

분산 (Variance)
확률론과 통계학에서 어떤 확률변수의 분산(分散, 영어: variance, 변량)은 그 확률변수가 기댓값으로부터 얼마나 떨어진 곳에 분포하는지를 가늠하는 숫자이다. 기댓값은 확률변수의 위치를 나타내고 분산은 그것이 얼마나 넓게 퍼져 있는지를 나타낸다.

위 식 Var[X]는 다음의 선형성을 이용해서 얻을 수 있다.

히스토그램
히스토그램(histogram)이란 표로 되어 있는 도수 분포를 그래프로 나타낸 것이다. 보통 히스토그램에서는 가로축이 계급, 세로축이 도수를 뜻한다.
N을 모든 관측값의 수라 하고, n을 상자 개수라 하면, 히스토그램 h_k는 다음 조건을 만족한다:


사용 예) http://www.centerworld.com/acad/ytpark/11.htm
표준편차 구하기
#include <stdio.h>
#include <math.h> // sqrt()
double mean(double* array, int size);
double standardDeviation(double* array, int size, int option);
int main(void)
{
double foo[] = { 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 };
// 평균 구하기
printf("평균 %f\n", mean(foo, sizeof(foo) / sizeof(foo[0]))); // 출력 결과: 1328.600000
// 표본의 표준편차 구하기 (STDEV)
printf("표본의 표준편차 %f\n", standardDeviation(foo, sizeof(foo) / sizeof(foo[0]), 1)); // 출력 결과: 27.463916
// 모집단 전체의 표준편차 구하기 (STDEVP)
printf("모집단전체의 표준편차 %f\n", standardDeviation(foo, sizeof(foo) / sizeof(foo[0]), 0)); // 출력 결과: 26.054558
// 분산
double stdev = standardDeviation(foo, sizeof(foo) / sizeof(foo[0]), 0);
printf("분산 %f\n", stdev*stdev );
return 0;
}
// 산술 평균 구하기
double mean(double* array, int size)
{
double sum = 0.0;
for (int i = 0; i < size; i++) sum += array[i];
return sum / size;
}
// 표준 편차 계산 함수
// option 1 : 엑셀의 STDEV() 함수에 해당하는 "표본의 표준 편차"
// option 0 : 엑셀의 STDEVP() 함수에 해당하는 "모집단 전체의 표준 편차"

도수분포(히스토그램)

문제) 국어 점수 10개를 입력 받아 표준편차, 분산, 히스토그램을 출력하시오.
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[])
{
double kor[10] = { 10,10,30,20,40,20,30,30,50,70 };
// 평균
float avr=0;
for(int i=0;i<10;i++) avr += (float) kor[i];
avr /= 10;
printf("평균 %f\n",avr);
// 표준편차
float dev=0;
for(i=0;i<10;i++) dev += (kor[i]-avr)*(kor[i]-avr);
dev = sqrt(dev/10.0f);
printf("표준편차 %f\n",dev);
// 분산
float var = dev*dev;
printf("분산 %f\n",var);
// 히스토그램
int histo[10];
for(i=0;i<10;i++) histo[i]=0;
for(i=0;i<10;i++) histo[ (int)(kor[i]/10) ]++;
// 히스토그램 그리기
for(i=0;i<10;i++) {
printf("[%02d] ",i*10);
for(int j=0;j< histo[i]; j++) printf("*");
printf("\n");
}
return 0;
}