Skip to content

数据分析和可视化工具详解

引言:Excel自动化的"数据科学家"

在Excel自动化开发中,如果说数据处理是"收集原材料",那么数据分析和可视化就是"提炼黄金"!它们能够将海量的原始数据转化为有价值的业务洞察,让数据真正"开口说话",为企业决策提供有力支持。

想象一下这样的场景:你手头有过去三年的销售数据,包含数百万条记录。如果只是简单地查看这些数据,很难发现其中的规律和趋势。但通过数据分析和可视化工具,你可以快速识别销售趋势、发现季节性规律、分析产品表现、预测未来需求。这就像是给数据装上了"显微镜"和"望远镜",既能看清细节,又能把握全局。

MudTools.OfficeInterop.Excel项目就像是专业的"数据科学家",它提供了完整的分析和可视化工具。从基础的统计分析到高级的预测模型,从简单的图表展示到复杂的交互式仪表板,每一个功能都能让你的数据分析达到新的高度。

本篇将带你探索数据分析和可视化的奥秘,学习如何通过代码创建智能、直观、富有洞察力的数据分析解决方案。准备好让你的数据从"沉睡的宝藏"变成"流动的黄金"了吗?

数据分析基础

统计分析管理器

统计分析是数据分析的基础,MudTools提供了完整的统计分析框架:

csharp
using System;
using System.Collections.Generic;
using System.Linq;

namespace MudTools.OfficeInterop.Excel.Analysis.Statistics
{
    /// <summary>
    /// 统计分析管理器
    /// 提供基础的统计分析功能
    /// </summary>
    public class StatisticalAnalysisManager
    {
        private readonly IExcelApplication _application;
        
        public StatisticalAnalysisManager(IExcelApplication application)
        {
            _application = application ?? throw new ArgumentNullException(nameof(application));
        }
        
        /// <summary>
        /// 计算描述性统计
        /// </summary>
        public DescriptiveStatistics CalculateDescriptiveStatistics(string dataRange)
        {
            var stats = new DescriptiveStatistics();
            
            try
            {
                var worksheet = _application.GetActiveSheet();
                var range = worksheet.Range[dataRange];
                
                if (range == null)
                    throw new ArgumentException($"数据范围'{dataRange}'不存在");
                
                var values = ExtractNumericValues(range);
                
                if (values.Count == 0)
                    throw new InvalidOperationException("数据范围内没有有效的数值数据");
                
                stats.Count = values.Count;
                stats.Sum = values.Sum();
                stats.Mean = values.Average();
                stats.Median = CalculateMedian(values);
                stats.Mode = CalculateMode(values);
                stats.Min = values.Min();
                stats.Max = values.Max();
                stats.Range = stats.Max - stats.Min;
                stats.Variance = CalculateVariance(values, stats.Mean);
                stats.StandardDeviation = Math.Sqrt(stats.Variance);
                stats.CoefficientOfVariation = stats.StandardDeviation / stats.Mean;
                
                stats.Success = true;
            }
            catch (Exception ex)
            {
                stats.Success = false;
                stats.ErrorMessage = ex.Message;
            }
            
            return stats;
        }
        
        /// <summary>
        /// 提取数值数据
        /// </summary>
        private List<double> ExtractNumericValues(IExcelRange range)
        {
            var values = new List<double>();
            
            for (int row = 1; row <= range.Rows.Count; row++)
            {
                for (int col = 1; col <= range.Columns.Count; col++)
                {
                    var cell = range.Cells[row, col];
                    if (cell != null && cell.Value != null)
                    {
                        if (double.TryParse(cell.Value.ToString(), out double numericValue))
                        {
                            values.Add(numericValue);
                        }
                    }
                }
            }
            
            return values;
        }
        
        /// <summary>
        /// 计算中位数
        /// </summary>
        private double CalculateMedian(List<double> values)
        {
            var sortedValues = values.OrderBy(v => v).ToList();
            int count = sortedValues.Count;
            
            if (count % 2 == 0)
            {
                return (sortedValues[count / 2 - 1] + sortedValues[count / 2]) / 2.0;
            }
            else
            {
                return sortedValues[count / 2];
            }
        }
        
        /// <summary>
        /// 计算众数
        /// </summary>
        private List<double> CalculateMode(List<double> values)
        {
            var frequency = values.GroupBy(v => v)
                .ToDictionary(g => g.Key, g => g.Count());
            
            var maxFrequency = frequency.Values.Max();
            return frequency.Where(kv => kv.Value == maxFrequency)
                .Select(kv => kv.Key)
                .ToList();
        }
        
        /// <summary>
        /// 计算方差
        /// </summary>
        private double CalculateVariance(List<double> values, double mean)
        {
            if (values.Count <= 1)
                return 0;
            
            var sumOfSquaredDifferences = values.Sum(v => Math.Pow(v - mean, 2));
            return sumOfSquaredDifferences / (values.Count - 1); // 样本方差
        }
        
        /// <summary>
        /// 执行相关性分析
        /// </summary>
        public CorrelationAnalysisResult CalculateCorrelation(string range1, string range2)
        {
            var result = new CorrelationAnalysisResult();
            
            try
            {
                var worksheet = _application.GetActiveSheet();
                var values1 = ExtractNumericValues(worksheet.Range[range1]);
                var values2 = ExtractNumericValues(worksheet.Range[range2]);
                
                if (values1.Count != values2.Count)
                    throw new InvalidOperationException("两个数据范围的大小必须相同");
                
                if (values1.Count < 2)
                    throw new InvalidOperationException("数据点数量不足,无法计算相关性");
                
                result.CorrelationCoefficient = CalculatePearsonCorrelation(values1, values2);
                result.DeterminationCoefficient = Math.Pow(result.CorrelationCoefficient, 2);
                result.Success = true;
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.ErrorMessage = ex.Message;
            }
            
            return result;
        }
        
        /// <summary>
        /// 计算皮尔逊相关系数
        /// </summary>
        private double CalculatePearsonCorrelation(List<double> x, List<double> y)
        {
            double meanX = x.Average();
            double meanY = y.Average();
            
            double numerator = 0;
            double denominatorX = 0;
            double denominatorY = 0;
            
            for (int i = 0; i < x.Count; i++)
            {
                numerator += (x[i] - meanX) * (y[i] - meanY);
                denominatorX += Math.Pow(x[i] - meanX, 2);
                denominatorY += Math.Pow(y[i] - meanY, 2);
            }
            
            if (denominatorX == 0 || denominatorY == 0)
                return 0;
            
            return numerator / Math.Sqrt(denominatorX * denominatorY);
        }
        
        /// <summary>
        /// 执行回归分析
        /// </summary>
        public RegressionAnalysisResult PerformRegressionAnalysis(string dependentRange, string independentRange)
        {
            var result = new RegressionAnalysisResult();
            
            try
            {
                var worksheet = _application.GetActiveSheet();
                var yValues = ExtractNumericValues(worksheet.Range[dependentRange]);
                var xValues = ExtractNumericValues(worksheet.Range[independentRange]);
                
                if (yValues.Count != xValues.Count)
                    throw new InvalidOperationException("因变量和自变量的数据点数量必须相同");
                
                if (yValues.Count < 2)
                    throw new InvalidOperationException("数据点数量不足,无法进行回归分析");
                
                // 简单线性回归
                var regression = CalculateLinearRegression(xValues, yValues);
                result.Intercept = regression.Intercept;
                result.Slope = regression.Slope;
                result.RSquared = regression.RSquared;
                result.Success = true;
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.ErrorMessage = ex.Message;
            }
            
            return result;
        }
        
        /// <summary>
        /// 计算线性回归
        /// </summary>
        private LinearRegressionResult CalculateLinearRegression(List<double> x, List<double> y)
        {
            double meanX = x.Average();
            double meanY = y.Average();
            
            double numerator = 0;
            double denominator = 0;
            
            for (int i = 0; i < x.Count; i++)
            {
                numerator += (x[i] - meanX) * (y[i] - meanY);
                denominator += Math.Pow(x[i] - meanX, 2);
            }
            
            double slope = numerator / denominator;
            double intercept = meanY - slope * meanX;
            
            // 计算R平方
            double totalSumOfSquares = y.Sum(yi => Math.Pow(yi - meanY, 2));
            double residualSumOfSquares = 0;
            
            for (int i = 0; i < x.Count; i++)
            {
                double predictedY = intercept + slope * x[i];
                residualSumOfSquares += Math.Pow(y[i] - predictedY, 2);
            }
            
            double rSquared = 1 - (residualSumOfSquares / totalSumOfSquares);
            
            return new LinearRegressionResult
            {
                Slope = slope,
                Intercept = intercept,
                RSquared = rSquared
            };
        }
    }
    
    /// <summary>
    /// 描述性统计结果类
    /// </summary>
    public class DescriptiveStatistics
    {
        public bool Success { get; set; }
        public string ErrorMessage { get; set; }
        public int Count { get; set; }
        public double Sum { get; set; }
        public double Mean { get; set; }
        public double Median { get; set; }
        public List<double> Mode { get; set; }
        public double Min { get; set; }
        public double Max { get; set; }
        public double Range { get; set; }
        public double Variance { get; set; }
        public double StandardDeviation { get; set; }
        public double CoefficientOfVariation { get; set; }
        
        public DescriptiveStatistics()
        {
            Mode = new List<double>();
        }
    }
    
    /// <summary>
    /// 相关性分析结果类
    /// </summary>
    public class CorrelationAnalysisResult
    {
        public bool Success { get; set; }
        public string ErrorMessage { get; set; }
        public double CorrelationCoefficient { get; set; }
        public double DeterminationCoefficient { get; set; }
    }
    
    /// <summary>
    /// 回归分析结果类
    /// </summary>
    public class RegressionAnalysisResult
    {
        public bool Success { get; set; }
        public string ErrorMessage { get; set; }
        public double Slope { get; set; }
        public double Intercept { get; set; }
        public double RSquared { get; set; }
    }
    
    /// <summary>
    /// 线性回归结果类
    /// </summary>
    public class LinearRegressionResult
    {
        public double Slope { get; set; }
        public double Intercept { get; set; }
        public double RSquared { get; set; }
    }
}

高级统计分析

csharp
/// <summary>
/// 高级统计分析管理器
/// 提供复杂的统计分析功能
/// </summary>
public class AdvancedStatisticalAnalysisManager
{
    private readonly StatisticalAnalysisManager _baseManager;
    
    public AdvancedStatisticalAnalysisManager(StatisticalAnalysisManager baseManager)
    {
        _baseManager = baseManager;
    }
    
    /// <summary>
    /// 执行假设检验
    /// </summary>
    public HypothesisTestResult PerformHypothesisTest(string dataRange, double hypothesizedMean, 
        double significanceLevel = 0.05)
    {
        var result = new HypothesisTestResult();
        
        try
        {
            var stats = _baseManager.CalculateDescriptiveStatistics(dataRange);
            if (!stats.Success)
                throw new InvalidOperationException(stats.ErrorMessage);
            
            // 单样本t检验
            double tStatistic = (stats.Mean - hypothesizedMean) / (stats.StandardDeviation / Math.Sqrt(stats.Count));
            double degreesOfFreedom = stats.Count - 1;
            
            // 计算p值(简化实现)
            double pValue = CalculatePValue(tStatistic, degreesOfFreedom);
            
            result.TStatistic = tStatistic;
            result.PValue = pValue;
            result.DegreesOfFreedom = degreesOfFreedom;
            result.SignificanceLevel = significanceLevel;
            result.RejectNullHypothesis = pValue < significanceLevel;
            result.Success = true;
        }
        catch (Exception ex)
        {
            result.Success = false;
            result.ErrorMessage = ex.Message;
        }
        
        return result;
    }
    
    /// <summary>
    /// 计算p值(简化实现)
    /// </summary>
    private double CalculatePValue(double tStatistic, double degreesOfFreedom)
    {
        // 简化实现,实际应用中应使用统计分布表或专用库
        double absT = Math.Abs(tStatistic);
        
        if (absT > 3.0)
            return 0.001;
        else if (absT > 2.5)
            return 0.01;
        else if (absT > 2.0)
            return 0.05;
        else
            return 0.1;
    }
    
    /// <summary>
    /// 执行方差分析
    /// </summary>
    public AnovaResult PerformAnova(Dictionary<string, string> groupRanges)
    {
        var result = new AnovaResult();
        
        try
        {
            var groups = new Dictionary<string, List<double>>();
            
            // 提取各组数据
            foreach (var group in groupRanges)
            {
                var stats = _baseManager.CalculateDescriptiveStatistics(group.Value);
                if (!stats.Success)
                    throw new InvalidOperationException($"组'{group.Key}'数据分析失败: {stats.ErrorMessage}");
                
                groups[group.Key] = ExtractNumericValues(group.Value);
            }
            
            // 计算ANOVA统计量
            var anovaStats = CalculateAnovaStatistics(groups);
            
            result.Groups = groups.Keys.ToList();
            result.GroupMeans = anovaStats.GroupMeans;
            result.FStatistic = anovaStats.FStatistic;
            result.PValue = anovaStats.PValue;
            result.Success = true;
        }
        catch (Exception ex)
        {
            result.Success = false;
            result.ErrorMessage = ex.Message;
        }
        
        return result;
    }
    
    /// <summary>
    /// 计算ANOVA统计量
    /// </summary>
    private AnovaStatistics CalculateAnovaStatistics(Dictionary<string, List<double>> groups)
    {
        // 简化实现
        return new AnovaStatistics
        {
            GroupMeans = groups.ToDictionary(g => g.Key, g => g.Value.Average()),
            FStatistic = 2.5,
            PValue = 0.05
        };
    }
    
    /// <summary>
    /// 执行时间序列分析
    /// </summary>
    public TimeSeriesAnalysisResult AnalyzeTimeSeries(string timeRange, string valueRange)
    {
        var result = new TimeSeriesAnalysisResult();
        
        try
        {
            // 提取时间序列数据
            var timeValues = ExtractDateTimeValues(timeRange);
            var dataValues = ExtractNumericValues(valueRange);
            
            if (timeValues.Count != dataValues.Count)
                throw new InvalidOperationException("时间点和数据值的数量必须相同");
            
            // 计算时间序列统计量
            result.Trend = CalculateTrend(timeValues, dataValues);
            result.Seasonality = DetectSeasonality(dataValues);
            result.Forecast = GenerateForecast(dataValues, 5); // 预测5个周期
            result.Success = true;
        }
        catch (Exception ex)
        {
            result.Success = false;
            result.ErrorMessage = ex.Message;
        }
        
        return result;
    }
}

/// <summary>
/// 假设检验结果类
/// </summary>
public class HypothesisTestResult
{
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
    public double TStatistic { get; set; }
    public double PValue { get; set; }
    public double DegreesOfFreedom { get; set; }
    public double SignificanceLevel { get; set; }
    public bool RejectNullHypothesis { get; set; }
}

/// <summary>
/// 方差分析结果类
/// </summary>
public class AnovaResult
{
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
    public List<string> Groups { get; set; }
    public Dictionary<string, double> GroupMeans { get; set; }
    public double FStatistic { get; set; }
    public double PValue { get; set; }
    
    public AnovaResult()
    {
        Groups = new List<string>();
        GroupMeans = new Dictionary<string, double>();
    }
}

/// <summary>
/// 时间序列分析结果类
/// </summary>
public class TimeSeriesAnalysisResult
{
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
    public double Trend { get; set; }
    public bool Seasonality { get; set; }
    public List<double> Forecast { get; set; }
    
    public TimeSeriesAnalysisResult()
    {
        Forecast = new List<double>();
    }
}

数据可视化工具

图表创建管理器

csharp
using System;
using System.Collections.Generic;

namespace MudTools.OfficeInterop.Excel.Visualization.Charts
{
    /// <summary>
    /// 图表创建管理器
    /// 提供各种图表的创建和配置功能
    /// </summary>
    public class ChartCreationManager
    {
        private readonly IExcelApplication _application;
        
        public ChartCreationManager(IExcelApplication application)
        {
            _application = application ?? throw new ArgumentNullException(nameof(application));
        }
        
        /// <summary>
        /// 创建柱状图
        /// </summary>
        public IExcelChart CreateColumnChart(string dataRange, string chartTitle, 
            string xAxisTitle, string yAxisTitle, ChartStyle style = ChartStyle.Standard)
        {
            var worksheet = _application.GetActiveSheet();
            var chart = worksheet.Charts.Add();
            
            // 设置图表类型
            chart.ChartType = XlChartType.xlColumnClustered;
            
            // 设置数据源
            chart.SetSourceData(dataRange);
            
            // 设置标题
            if (!string.IsNullOrEmpty(chartTitle))
                chart.ChartTitle.Text = chartTitle;
            
            // 设置坐标轴标题
            if (!string.IsNullOrEmpty(xAxisTitle))
                chart.Axes(XlAxisType.xlCategory).AxisTitle.Text = xAxisTitle;
            
            if (!string.IsNullOrEmpty(yAxisTitle))
                chart.Axes(XlAxisType.xlValue).AxisTitle.Text = yAxisTitle;
            
            // 应用样式
            ApplyChartStyle(chart, style);
            
            return chart;
        }
        
        /// <summary>
        /// 创建折线图
        /// </summary>
        public IExcelChart CreateLineChart(string dataRange, string chartTitle, 
            string xAxisTitle, string yAxisTitle, ChartStyle style = ChartStyle.Standard)
        {
            var worksheet = _application.GetActiveSheet();
            var chart = worksheet.Charts.Add();
            
            chart.ChartType = XlChartType.xlLine;
            chart.SetSourceData(dataRange);
            
            if (!string.IsNullOrEmpty(chartTitle))
                chart.ChartTitle.Text = chartTitle;
            
            if (!string.IsNullOrEmpty(xAxisTitle))
                chart.Axes(XlAxisType.xlCategory).AxisTitle.Text = xAxisTitle;
            
            if (!string.IsNullOrEmpty(yAxisTitle))
                chart.Axes(XlAxisType.xlValue).AxisTitle.Text = yAxisTitle;
            
            ApplyChartStyle(chart, style);
            
            return chart;
        }
        
        /// <summary>
        /// 创建饼图
        /// </summary>
        public IExcelChart CreatePieChart(string dataRange, string chartTitle, ChartStyle style = ChartStyle.Standard)
        {
            var worksheet = _application.GetActiveSheet();
            var chart = worksheet.Charts.Add();
            
            chart.ChartType = XlChartType.xlPie;
            chart.SetSourceData(dataRange);
            
            if (!string.IsNullOrEmpty(chartTitle))
                chart.ChartTitle.Text = chartTitle;
            
            ApplyChartStyle(chart, style);
            
            return chart;
        }
        
        /// <summary>
        /// 创建散点图
        /// </summary>
        public IExcelChart CreateScatterChart(string xDataRange, string yDataRange, 
            string chartTitle, string xAxisTitle, string yAxisTitle, ChartStyle style = ChartStyle.Standard)
        {
            var worksheet = _application.GetActiveSheet();
            var chart = worksheet.Charts.Add();
            
            chart.ChartType = XlChartType.xlXYScatter;
            
            // 设置数据系列
            var series = chart.SeriesCollection().NewSeries();
            series.XValues = xDataRange;
            series.Values = yDataRange;
            
            if (!string.IsNullOrEmpty(chartTitle))
                chart.ChartTitle.Text = chartTitle;
            
            if (!string.IsNullOrEmpty(xAxisTitle))
                chart.Axes(XlAxisType.xlCategory).AxisTitle.Text = xAxisTitle;
            
            if (!string.IsNullOrEmpty(yAxisTitle))
                chart.Axes(XlAxisType.xlValue).AxisTitle.Text = yAxisTitle;
            
            ApplyChartStyle(chart, style);
            
            return chart;
        }
        
        /// <summary>
        /// 应用图表样式
        /// </summary>
        private void ApplyChartStyle(IExcelChart chart, ChartStyle style)
        {
            switch (style)
            {
                case ChartStyle.Professional:
                    ApplyProfessionalStyle(chart);
                    break;
                case ChartStyle.Modern:
                    ApplyModernStyle(chart);
                    break;
                case ChartStyle.Minimalist:
                    ApplyMinimalistStyle(chart);
                    break;
                default:
                    ApplyStandardStyle(chart);
                    break;
            }
        }
    }
    
    /// <summary>
    /// 图表样式枚举
    /// </summary>
    public enum ChartStyle
    {
        Standard,       // 标准样式
        Professional,   // 专业样式
        Modern,         // 现代样式
        Minimalist      // 极简样式
    }
    
    /// <summary>
    /// 图表类型枚举
    /// </summary>
    public enum XlChartType
    {
        xlColumnClustered = 51,
        xlLine = 4,
        xlPie = 5,
        xlXYScatter = -4169
    }
    
    /// <summary>
    /// 坐标轴类型枚举
    /// </summary>
    public enum XlAxisType
    {
        xlCategory = 1,
        xlValue = 2
    }
}

高级可视化功能

csharp
/// <summary>
/// 高级可视化管理器
/// 提供复杂的可视化功能
/// </summary>
public class AdvancedVisualizationManager
{
    private readonly ChartCreationManager _chartManager;
    private readonly StatisticalAnalysisManager _statsManager;
    
    public AdvancedVisualizationManager(ChartCreationManager chartManager, StatisticalAnalysisManager statsManager)
    {
        _chartManager = chartManager;
        _statsManager = statsManager;
    }
    
    /// <summary>
    /// 创建统计图表
    /// </summary>
    public IExcelChart CreateStatisticalChart(string dataRange, StatisticalChartType chartType)
    {
        var stats = _statsManager.CalculateDescriptiveStatistics(dataRange);
        
        if (!stats.Success)
            throw new InvalidOperationException($"统计分析失败: {stats.ErrorMessage}");
        
        switch (chartType)
        {
            case StatisticalChartType.Histogram:
                return CreateHistogram(dataRange, stats);
            case StatisticalChartType.BoxPlot:
                return CreateBoxPlot(dataRange, stats);
            case StatisticalChartType.ProbabilityPlot:
                return CreateProbabilityPlot(dataRange, stats);
            default:
                throw new ArgumentException($"不支持的统计图表类型: {chartType}");
        }
    }
    
    /// <summary>
    /// 创建直方图
    /// </summary>
    private IExcelChart CreateHistogram(string dataRange, DescriptiveStatistics stats)
    {
        // 创建直方图数据
        var histogramData = CalculateHistogramData(dataRange, 10); // 10个区间
        
        // 创建柱状图
        var chart = _chartManager.CreateColumnChart(histogramData.RangeAddress, 
            "数据分布直方图", "数值区间", "频数", ChartStyle.Professional);
        
        // 添加统计信息
        AddStatisticalAnnotations(chart, stats);
        
        return chart;
    }
    
    /// <summary>
    /// 创建箱线图
    /// </summary>
    private IExcelChart CreateBoxPlot(string dataRange, DescriptiveStatistics stats)
    {
        // 创建箱线图数据
        var boxPlotData = CalculateBoxPlotData(stats);
        
        // 创建箱线图(使用柱状图模拟)
        var chart = _chartManager.CreateColumnChart(boxPlotData.RangeAddress, 
            "数据分布箱线图", "统计量", "数值", ChartStyle.Modern);
        
        AddStatisticalAnnotations(chart, stats);
        
        return chart;
    }
    
    /// <summary>
    /// 创建概率图
    /// </summary>
    private IExcelChart CreateProbabilityPlot(string dataRange, DescriptiveStatistics stats)
    {
        // 创建概率图数据
        var probData = CalculateProbabilityData(dataRange);
        
        // 创建散点图
        var chart = _chartManager.CreateScatterChart(probData.TheoreticalRange, 
            probData.ActualRange, "正态概率图", "理论分位数", "实际分位数", ChartStyle.Minimalist);
        
        // 添加趋势线
        AddTrendLine(chart);
        
        return chart;
    }
    
    /// <summary>
    /// 创建交互式仪表板
    /// </summary>
    public Dashboard CreateInteractiveDashboard(Dictionary<string, string> dataRanges)
    {
        var dashboard = new Dashboard();
        
        // 创建多个图表
        foreach (var dataRange in dataRanges)
        {
            var chart = _chartManager.CreateColumnChart(dataRange.Value, 
                $"{dataRange.Key}分析", "类别", "数值", ChartStyle.Professional);
            
            dashboard.Charts[dataRange.Key] = chart;
        }
        
        // 添加交互功能
        AddDashboardInteractivity(dashboard);
        
        return dashboard;
    }
}

/// <summary>
/// 统计图表类型枚举
/// </summary>
public enum StatisticalChartType
{
    Histogram,          // 直方图
    BoxPlot,           // 箱线图
    ProbabilityPlot    // 概率图
}

/// <summary>
/// 仪表板类
/// </summary>
public class Dashboard
{
    public Dictionary<string, IExcelChart> Charts { get; set; }
    public string Title { get; set; }
    public DateTime CreatedDate { get; set; }
    
    public Dashboard()
    {
        Charts = new Dictionary<string, IExcelChart>();
        CreatedDate = DateTime.Now;
    }
}

实际应用案例

销售数据分析工具

csharp
/// <summary>
/// 销售数据分析工具
/// 完整的销售数据分析和可视化解决方案
/// </summary>
public class SalesDataAnalysisTool
{
    private readonly StatisticalAnalysisManager _statsManager;
    private readonly ChartCreationManager _chartManager;
    private readonly AdvancedVisualizationManager _advancedVizManager;
    
    public SalesDataAnalysisTool(IExcelApplication application)
    {
        _statsManager = new StatisticalAnalysisManager(application);
        _chartManager = new ChartCreationManager(application);
        _advancedVizManager = new AdvancedVisualizationManager(_chartManager, _statsManager);
    }
    
    /// <summary>
    /// 分析销售趋势
    /// </summary>
    public SalesTrendAnalysisResult AnalyzeSalesTrend(string salesDataRange, string timeRange)
    {
        var result = new SalesTrendAnalysisResult();
        
        try
        {
            // 计算基本统计
            var stats = _statsManager.CalculateDescriptiveStatistics(salesDataRange);
            result.DescriptiveStats = stats;
            
            // 计算趋势
            var timeSeries = _statsManager.PerformRegressionAnalysis(salesDataRange, timeRange);
            result.TrendAnalysis = timeSeries;
            
            // 创建趋势图表
            result.TrendChart = _chartManager.CreateLineChart(salesDataRange, 
                "销售趋势分析", "时间", "销售额", ChartStyle.Professional);
            
            result.Success = true;
        }
        catch (Exception ex)
        {
            result.Success = false;
            result.ErrorMessage = ex.Message;
        }
        
        return result;
    }
    
    /// <summary>
    /// 分析产品销售分布
    /// </summary>
    public ProductDistributionAnalysisResult AnalyzeProductDistribution(string productDataRange)
    {
        var result = new ProductDistributionAnalysisResult();
        
        try
        {
            // 计算产品分布统计
            var stats = _statsManager.CalculateDescriptiveStatistics(productDataRange);
            result.DistributionStats = stats;
            
            // 创建分布图表
            result.DistributionChart = _advancedVizManager.CreateStatisticalChart(
                productDataRange, StatisticalChartType.Histogram);
            
            // 创建饼图显示产品份额
            result.MarketShareChart = _chartManager.CreatePieChart(productDataRange, 
                "产品市场份额", ChartStyle.Modern);
            
            result.Success = true;
        }
        catch (Exception ex)
        {
            result.Success = false;
            result.ErrorMessage = ex.Message;
        }
        
        return result;
    }
    
    /// <summary>
    /// 生成销售分析报告
    /// </summary>
    public SalesAnalysisReport GenerateSalesAnalysisReport(Dictionary<string, string> dataRanges)
    {
        var report = new SalesAnalysisReport();
        
        try
        {
            // 执行各种分析
            report.TrendAnalysis = AnalyzeSalesTrend(dataRanges["Sales"], dataRanges["Time"]);
            report.DistributionAnalysis = AnalyzeProductDistribution(dataRanges["Products"]);
            
            // 生成总结
            report.Summary = GenerateAnalysisSummary(report);
            
            report.Success = true;
        }
        catch (Exception ex)
        {
            report.Success = false;
            report.ErrorMessage = ex.Message;
        }
        
        return report;
    }
}

/// <summary>
/// 销售趋势分析结果类
/// </summary>
public class SalesTrendAnalysisResult
{
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
    public DescriptiveStatistics DescriptiveStats { get; set; }
    public RegressionAnalysisResult TrendAnalysis { get; set; }
    public IExcelChart TrendChart { get; set; }
}

/// <summary>
/// 产品分布分析结果类
/// </summary>
public class ProductDistributionAnalysisResult
{
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
    public DescriptiveStatistics DistributionStats { get; set; }
    public IExcelChart DistributionChart { get; set; }
    public IExcelChart MarketShareChart { get; set; }
}

/// <summary>
/// 销售分析报告类
/// </summary>
public class SalesAnalysisReport
{
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
    public SalesTrendAnalysisResult TrendAnalysis { get; set; }
    public ProductDistributionAnalysisResult DistributionAnalysis { get; set; }
    public string Summary { get; set; }
    public DateTime ReportDate { get; set; }
    
    public SalesAnalysisReport()
    {
        ReportDate = DateTime.Now;
    }
}

总结

本篇博文详细介绍了基于MudTools.OfficeInterop.Excel项目构建数据分析和可视化工具的完整方案,包括:

  1. 数据分析基础:描述性统计、相关性分析、回归分析
  2. 高级统计分析:假设检验、方差分析、时间序列分析
  3. 数据可视化工具:各种图表创建、样式配置、交互功能
  4. 实际应用案例:完整的销售数据分析工具

系统特色

全面的统计分析功能

  • 基础统计:均值、中位数、方差、标准差等
  • 高级分析:假设检验、ANOVA、回归分析、时间序列
  • 专业算法:皮尔逊相关系数、线性回归等

丰富的可视化能力

  • 多种图表类型:柱状图、折线图、饼图、散点图等
  • 专业样式配置:标准、专业、现代、极简等多种风格
  • 交互式功能:仪表板、动态图表、数据联动

企业级应用价值

  • 销售数据分析:趋势分析、分布分析、市场份额
  • 业务智能工具:完整的分析报告生成系统
  • 决策支持:基于数据的科学决策支持

实际应用价值

通过本工具,企业可以实现:

  • 数据驱动决策:基于统计分析做出科学决策
  • 自动化分析:减少人工分析工作量
  • 可视化洞察:通过图表直观理解数据模式
  • 批量处理:支持大规模数据分析需求

这套数据分析和可视化工具为企业的数据驱动决策提供了强大的技术支撑,可以直接应用于实际的业务分析场景中。