常见的数据统计分析有:求和、平均数、中位数、众数、方差、均方差、极差、最大值、最小值等。本文从数理统计基础出发,简单总结了java中求以上统计分析量的算法,如下:
//1.求和
public static double getSum(double[] arr){
double sum = 0;
for(int i =0;i < arr.length;i++){
sum += arr[i];
}
return sum;
}
//2.求平均数
public static double getMean(double[] arr){
return getSum(arr) / arr.length;
}
//3.求众数
public static double getMuch(double[] arr){
/*方法一
//构造对应关系的映射
Map<Double,Integer> map = new HashMap<Double,Integer>();
for(int i = 0;i < arr.length;i++){
if(map.containsKey(arr[i])){
//containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。
//get(Object key)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
//put(K key, V value)将指定的值与此映射中的指定键关联(可选操作)。
map.put(arr[i], map.get(arr[i])+1);
}else{
map.put(arr[i], 1);
}
}
int maxCount = 0;//初始化出现次数
double much = -1;//初始化众数
//迭代器
Iterator<Double> iter = map.keySet().iterator();
while(iter.hasNext()){
//next()返回迭代的下一个元素
double num = iter.next();
int count = map.get(num);
if(count > maxCount){
maxCount = count;
much = num;
}
}
return much;
*/
//方法二
if(arr.length == 1){
return arr[0];
}
int count = 0;
int max = 0;
double much = 0;
Arrays.sort(arr);
for(int i = 0;i < arr.length - 1;i ++){
if(arr[i] == arr[i+1]){
count ++ ;
}else{
count = 0;
}
if(count > max){
max = count;
much = arr[i];
}
}
return much;
}
//4.求中位数
public static double getMedian(double[] arr){
if(arr.length % 2 == 0){
//如果原数组是偶数个,中位数是中间两个的平均数
return ((arr[arr.length/2]+arr[arr.length/2-1])/2);
}else{
//如果原数组是奇数个,中位数是中间的数
return arr[arr.length/2];
}
}
//5.求极差
public static double getRange(double[] arr){
double max = arr[0],min = arr[0];
for(int i = 0;i<arr.length;i++){
if(arr[i]>max){
max = arr[i];
}
if(arr[i]<min){
min = arr[i];
}
}
return max-min;
}
//6.求方差
public static double getVariance(double[] arr){
double variance = 0 ;
double mean = getMean(arr);
double sum = 0;
for(int i=0;i<arr.length;i++){
sum += (arr[i]-mean)*(arr[i]-mean);
}
variance = sum/arr.length;
return variance;
}
//7.求标准差
public static double getStandardDevition(double[] arr){
return Math.sqrt(getVariance(arr));
}
对以上方法进行测试:
double arr[] = {1,2,3,4,5,6,5,6,7,5};
System.out.println("原始数组是:");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i]);
System.out.print('\t');
}
System.out.println();
System.out.println("数据的和是:"+getSum(arr));
System.out.println("数据的平均数是:"+getMean(arr));
System.out.println("数据的中位数是:"+getMedian(arr));
System.out.println("数据的方差是:"+getVariance(arr));
System.out.println("数据的标准差是:"+getStandardDevition(arr));
System.out.println("数据的极差是:"+getRange(arr));
System.out.println("数据的众数是:"+getMuch(arr));
结果如下: