본문 바로가기
📁 [4] 개발자 정보 & 코드 노트/C#

C# Windows Forms 강의 76편: CSV 데이터를 기반으로 한 데이터 분석 애플리케이션

by wawManager 2025. 4. 20.

 

1. 강의 개요

이번 강의에서는 CSV 데이터를 분석하고, 그 결과를 차트로 시각화하는 애플리케이션을 제작합니다.
CSV 파일은 다양한 데이터 소스에서 널리 사용되는 형식이며,
이를 활용해 통계를 계산하고 데이터를 시각적으로 표시하는 방법을 배워봅니다.
특히 LINQChart 컨트롤을 활용해 데이터를 다루는 실습을 진행합니다.


2. 학습 목표

  • CSV 파일 읽기 및 데이터 로드
  • LINQ를 사용해 데이터 분석(최대값, 평균 등)
  • Chart 컨트롤을 사용해 분석 결과를 시각화
  • 파일 열기 대화 상자를 통해 CSV 파일 선택

3. 기능 요구사항

필수 기능

1️⃣ CSV 파일 로드:

  • CSV 파일에서 데이터를 읽어와 DataGridView에 표시

2️⃣ 데이터 분석:

  • 읽어온 데이터를 기반으로 최대값, 최소값, 평균 등을 계산

3️⃣ 데이터 시각화:

  • 분석 결과를 Chart 컨트롤을 통해 그래프로 표시

4️⃣ UI 구성 및 동작:

  • 파일 로드, 데이터 분석, 그래프 표시 기능 구현

4. 실습: CSV 데이터 분석 애플리케이션 제작

1️⃣ 폼 구성

  • 폼(Form) 이름: Form1
  • 컨트롤 배치

컨트롤 타입 이름 위치 크기

Button btnLoadCsv 폼 상단 왼쪽 (100 x 30)
DataGridView dgvData 폼 중앙 (500 x 300)
Button btnAnalyze 폼 하단 왼쪽 (100 x 30)
Chart chartResult 폼 하단 전체 (500 x 300)

📌 폼 디자인 예시:

--------------------------------------------------
|            [Load CSV 버튼]                     |
--------------------------------------------------
|          [DataGridView - CSV 데이터 표시]       |
--------------------------------------------------
|           [Analyze 버튼]                       |
--------------------------------------------------
|         [Chart - 분석 결과 시각화]             |
--------------------------------------------------

2️⃣ 코드 작성

(1) CSV 파일 로드

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApp_CSVAnalysis
{
    public partial class Form1 : Form
    {
        private List<DataRecord> _data; // CSV 데이터를 저장할 리스트

        public Form1()
        {
            InitializeComponent();
        }

        // CSV 파일 로드
        private void btnLoadCsv_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.Filter = "CSV 파일 (*.csv)|*.csv";

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    string filePath = openFileDialog.FileName;
                    LoadCsvData(filePath);
                }
            }
        }

        private void LoadCsvData(string filePath)
        {
            try
            {
                var lines = File.ReadAllLines(filePath);
                _data = lines
                    .Skip(1) // 헤더 제외
                    .Select(line =>
                    {
                        var parts = line.Split(',');
                        return new DataRecord
                        {
                            Name = parts[0],
                            Value = double.Parse(parts[1])
                        };
                    })
                    .ToList();

                dgvData.DataSource = _data; // DataGridView에 데이터 바인딩
                MessageBox.Show("CSV 파일을 성공적으로 로드했습니다.", "완료", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"CSV 파일 로드 실패: {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }

    // 데이터 모델 클래스
    public class DataRecord
    {
        public string Name { get; set; }
        public double Value { get; set; }
    }
}

(2) 데이터 분석 구현

        // 데이터 분석
        private void btnAnalyze_Click(object sender, EventArgs e)
        {
            if (_data == null || !_data.Any())
            {
                MessageBox.Show("분석할 데이터를 먼저 로드하세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // LINQ를 사용한 데이터 분석
            var maxValue = _data.Max(record => record.Value);
            var minValue = _data.Min(record => record.Value);
            var averageValue = _data.Average(record => record.Value);

            // Chart에 데이터 표시
            DisplayChart(maxValue, minValue, averageValue);
        }

        // 차트 표시
        private void DisplayChart(double maxValue, double minValue, double averageValue)
        {
            chartResult.Series.Clear();
            var series = chartResult.Series.Add("Analysis");
            series.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;

            series.Points.AddXY("Max", maxValue);
            series.Points.AddXY("Min", minValue);
            series.Points.AddXY("Average", averageValue);

            chartResult.Titles.Clear();
            chartResult.Titles.Add("Data Analysis Results");
        }

(3) Designer 코드

        private void InitializeComponent()
        {
            this.btnLoadCsv = new Button();
            this.dgvData = new DataGridView();
            this.btnAnalyze = new Button();
            this.chartResult = new System.Windows.Forms.DataVisualization.Charting.Chart();

            // Load CSV Button 설정
            this.btnLoadCsv.Location = new System.Drawing.Point(10, 10);
            this.btnLoadCsv.Size = new System.Drawing.Size(100, 30);
            this.btnLoadCsv.Text = "Load CSV";
            this.btnLoadCsv.Click += new EventHandler(this.btnLoadCsv_Click);

            // DataGridView 설정
            this.dgvData.Location = new System.Drawing.Point(10, 50);
            this.dgvData.Size = new System.Drawing.Size(500, 300);

            // Analyze Button 설정
            this.btnAnalyze.Location = new System.Drawing.Point(10, 360);
            this.btnAnalyze.Size = new System.Drawing.Size(100, 30);
            this.btnAnalyze.Text = "Analyze";
            this.btnAnalyze.Click += new EventHandler(this.btnAnalyze_Click);

            // Chart 설정
            this.chartResult.Location = new System.Drawing.Point(10, 400);
            this.chartResult.Size = new System.Drawing.Size(500, 300);

            // Form 설정
            this.ClientSize = new System.Drawing.Size(540, 720);
            this.Controls.Add(this.btnLoadCsv);
            this.Controls.Add(this.dgvData);
            this.Controls.Add(this.btnAnalyze);
            this.Controls.Add(this.chartResult);
            this.Text = "CSV 데이터 분석";
        }

3️⃣ 실행 결과

1️⃣ CSV 파일 로드

  • "Load CSV" 버튼 클릭 → 파일 열기 대화 상자를 통해 CSV 파일 선택 → DataGridView에 데이터 표시

2️⃣ 데이터 분석

  • "Analyze" 버튼 클릭 → 최대값, 최소값, 평균 계산 → Chart에 분석 결과 표시

3️⃣ 시각적 분석 결과

  • 차트에 분석 결과(최대값, 최소값, 평균)가 막대그래프로 표시

5. 주요 개념 요약

  • LINQ: 데이터 집계 및 분석(최대값, 최소값, 평균) 처리
  • Chart 컨트롤: 데이터를 그래프로 시각화
  • CSV 파일 처리: 텍스트 데이터를 리스트로 변환

 

📌 #CSharp #WindowsForms #CSV #데이터분석 #LINQ #Chart