이번 강좌에서는 품질관리, 불량률 관리, 재고관리 등에서 사용하는 파레토 차트(Pareto Chart)를 한 번 그려보겠습니다. 파레토 차트란 위에서 보시는 바와 같이 해당 값을 컬럼 차트로 그리고 누적값에 대한 백분율을 라인으로 그려주는 차트를 말합니다.
이 강좌는 히포차트로 파레토 차트를 그리는 하나의 팁을 알려주기 위함이고, 품질관리, 공정관리, 구매관리, 불량품관리 등과 관련된 프로젝트를 진행하는 분들에게 도움이 되리라 생각합니다.
[적용 버전]
베타 2.0 이상
[시나리오]
1. 컬럼 차트를 이용해 각 항목(제품, 불량항목 등)을 그린다.
2. 각 항목들의 누적 합을 차례로 구하면서 그 누적백분율을 라인 차트로 다시 그려준다.
중요 코드 설명
(1) 컬럼 차트 그리기
- 우선 아래와 같이 각 항목을 나타내는 컬럼 차트를 그립니다. 이는 불량률이 될 수도 있겠고, 재고률이 될 수도 있겠습니다.
(2) 누적 백분율 라인 그리기
- 이 부분이 핵심이 되겠네요. 누적 백분율을 구하기 위해서는 위에서 입력된 항목 들의 값을 하나씩 더해가면서 총 합에 대한 백분율을 구해야 되므로 위에서 처럼 DrawChart()로 한 번 그린 후에 다음과 같은 코드를 삽입해주시면 되겠습니다. 한 번 그려준 후에 라인을 추가하는 이유는 그린 후에야 각종 총 합, 최대 단위값 등이 모두 계산되기 때문입니다.
아래 코드는 시리즈를 라인으로 하나를 만들고 위 컬럼 차트를 한 번 그린 후 계산된 최대단위값과 총합을 이용해서 누적 백분율 값을 구하는 핵심 부분입니다. 아래 percent는 실제 퍼센트 값을 구하는 부분이고 각 마커에 들어갈 글자를 위해 작성한 부분이고 그 위에 item2.YValue에 들어가는 값에는 UnitSpan 이라는 값이 곱해 지고 있는데 이는 차트의 축에 맞게 길이를 맞춰 주는 작업이 되겠습니다.
공통 적용되는 코드이므로 작성하시는 프로젝트에 그대로 붙여 넣고 실행해 보시거나 아래 전체 소스를 그대로 실행해 보시면 될 듯하고 추가되는 코드의 이해 없이 그대로 사용하셔도 무방하겠습니다.
C# 전체 코드 보기
SeriesList sList = new SeriesList();
sList.ChartType = ChartType.Column;
Series sr = new Series();
sr.SeriesColor = Color.Blue;
sr.Column.WidthType = ColumnWidthType.Tight;
Random r = new Random();
for (int x = 0; x < 7; x++)
{
SeriesItem item = new SeriesItem();
item.YValue = 5000 - x * 750;
item.Name = "item" + x.ToString();
// [최대 단위값]
// 아래 코드에서 item2.YValue 에 비율을 넣을때 곱해주어 축의 균형을 맞춘다.
double UnitSpan = this.hHippoChart1.SeriesListDictionary[0].AxisFactor.YAxis.MaxUnitValue;
// 총 항목들의 합
float Sum = (float)this.hHippoChart1.SeriesListDictionary[0].AxisFactor.YAxis.AnalysisItems[AnalysisCategory.Sum].Value;
// 누적되면서 계속 더해지는 값
float SumPart = 0;
foreach (SeriesItem item in sr.items)
{
SumPart += item.YValue;
Dim sList As SeriesList = New SeriesList
sList.ChartType = ChartType.Column
Dim sr As Series = New Series
sr.SeriesColor = Color.Blue
sr.Column.WidthType = ColumnWidthType.Tight
Dim r As Random = New Random
Dim x As Integer = 0
Do While (x < 7)
Dim item As SeriesItem = New SeriesItem
item.YValue = (5000 _
- (x * 750))
item.Name = ("item" + x.ToString)
sr.items.Add(item)
x = (x + 1)
Loop
sList.SeriesCollection.Add(sr)
Me.hHippoChart1.Titles.Label.ForeColor = Color.SteelBlue
Me.hHippoChart1.DesignType = ChartDesignType.Simple
Me.hHippoChart1.SeriesListDictionary.Add(sList)
Me.hHippoChart1.Titles.Label.Text = "Pareto Chart"
Me.hHippoChart1.DrawChart
Dim sr2 As Series = New Series
sr2.SeriesColor = Color.Red
sr2.ChartType = ChartType.Line
sr2.Line.LineWidth = 2
sr2.Points.Width = 6
sr2.Points.PointType = PointType.FillCircle
Dim UnitSpan As Double = Me.hHippoChart1.SeriesListDictionary(0).AxisFactor.YAxis.MaxUnitValue
Dim Sum As Single = CType(Me.hHippoChart1.SeriesListDictionary(0).AxisFactor.YAxis.AnalysisItems(AnalysisCategory.Sum).Value,Single)
Dim SumPart As Single = 0
For Each item As SeriesItem In sr.items
SumPart = (SumPart + item.YValue)
Dim item2 As SeriesItem = New SeriesItem
item2.YValue = CType((SumPart _
* (UnitSpan / Sum)),Single)
item2.Name = item.Name
Dim percent As Single = CType((SumPart * (100 / Sum)),Single)
Dim mk As AxisMarker = New AxisMarker((Math.Round(percent, 0) + "%"), item2.YValue)
mk.Line.LineColor = Color.Gray
mk.Line.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot
mk.Label.ForeColor = Color.Gray
mk.TextFormat.Alignment = StringAlignment.Far
mk.LegendVisible = false
Me.hHippoChart1.SeriesListDictionary(0).AxisFactor.YAxis.Markers.Add(mk)
sr2.items.Add(item2)
Next
Me.hHippoChart1.SeriesListDictionary(0).SeriesCollection.Add(sr2)
Me.hHippoChart1.DrawChart