こんにちは!SPREADチームでWindows Formsを担当している大林です。
今日は、グラフについてお話ししたいと思います。
Excel 2016では、新しいグラフとして、ツリーマップ、サンバースト、ヒストグラム、パレート図、箱ひげ図、ウォーターフォール、じょうごが追加されました。SPREADも、10.0Jでこれらのグラフ(SPREADでは「チャート」と呼称)に対応しました。今日は、その中から「パレート図」をご紹介したいと思います。
さて、この「パレート図」、QC(Quality Control:品質管理)の7つ道具の一つといわれるそうです。製造業に関わる皆さまにはお馴染みのグラフかもしれませんね。
例えば、ある製品に対する苦情件数をあつかう場合、横軸に苦情を件数順に並べ、縦軸に件数と件数の累積百分率をプロットします(以下、画像はSPREAD)。
こうしてプロットすると、どの項目が、全体に対してどのくらいの影響をもつか把握するのに役立ちます。
パレートの法則(全体の数値の80%は、全体を構成するうちの20%の要素が生み出している – 80:20の法則でピンとくる方も多いかもしれません)に基づいたプロット方法です。
パレート図を用いた分析手法では、累積比率が80%までの項目を、影響度が高いと判断することが一般的な基準の一つのようです。この考え方に基づき、上で挙げた製品の「性能」と「機能」を改善した結果、それぞれの苦情が1/3、および半分に減少したとします(現実はなかなかこの様にはいかないと思いますが)。再度、パレート図を描きます。
改善前後の2つのパレート図を比較して改善の効果を評価します。
そうして、改善後のパレート図をもとに再び改善…を繰り返して、全体を改善の方向に進めることを試みます。
様々な問題を抱えて、どこから手をつければ良いか分からない…こんなときに効果がありそうな手法ですね。
なお、SPREADの強みであるExcelとの互換性は、チャートも例外ではありません。
上のパレート図をExcelにエクスポートすると、次のような結果となります。
※パレート図を表示するには、エクスポートされたファイルをExcel 2016で開いてください。
以下、SPREADでパレート図を作成するサンプルコードをご紹介します。
機会があれば、ぜひご活用ください!
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' シートにデータを設定 FpSpread1.ActiveSheet.SetClip(0, 0, 1, 2, "機能" & vbTab & "90") FpSpread1.ActiveSheet.SetClip(1, 0, 1, 2, "デザイン" & vbTab & "68") FpSpread1.ActiveSheet.SetClip(2, 0, 1, 2, "性能" & vbTab & "93") FpSpread1.ActiveSheet.SetClip(3, 0, 1, 2, "マニュアル" & vbTab & "23") FpSpread1.ActiveSheet.SetClip(4, 0, 1, 2, "サポート" & vbTab & "17") FpSpread1.ActiveSheet.SetClip(5, 0, 1, 2, "不具合" & vbTab & "4") FpSpread1.ActiveSheet.SetClip(6, 0, 1, 2, "その他" & vbTab & "2") FpSpread1.ActiveSheet.SetClip(7, 0, 1, 2, "相互運用性" & vbTab & "1") ' セル範囲を設定してパレート図を作成します FpSpread1.ActiveSheet.AddChart(New FarPoint.Win.Spread.Model.CellRange(0, 0, 8, 2), GetType(FarPoint.Win.Chart.ParetoSeries), 500, 250, 150, 30) Dim model As FarPoint.Win.Chart.ChartModel = FpSpread1.ActiveSheet.Charts(0).Model ' タイトルを設定 Dim fontTitle As New Font("メイリオ", 14) model.LabelAreas.Add(New FarPoint.Win.Chart.LabelArea() With {.Text = "問合せ件数", .TextFont = fontTitle, .Location = New PointF(0.4F, 0.01F)}) ' 凡例を表示しない model.LegendAreas.Clear() Dim s As FarPoint.Win.Chart.ParetoSeries = DirectCast(model.PlotAreas(0).Series(0), FarPoint.Win.Chart.ParetoSeries) ' 要素の間隔を指定 s.GapWidth = 0.1F ' パレート線の外観を設定 s.ParetoLine.LineBorder = New FarPoint.Win.Chart.SolidLine(System.Drawing.Color.OrangeRed, 3) ' 軸のフォントを設定 Dim plotArea As FarPoint.Win.Chart.YPlotArea = DirectCast(model.PlotAreas(0), FarPoint.Win.Chart.YPlotArea) Dim fontRegular As New Font("メイリオ", 9) plotArea.XAxis.LabelTextFont = fontRegular plotArea.XAxis.LabelRotationAngle = -45 plotArea.YAxes(0).LabelTextFont = fontRegular plotArea.YAxes(1).LabelTextFont = fontRegular ' 数値縦軸の最大値を設定 plotArea.YAxes(0).AutoMaximum = False plotArea.YAxes(0).Maximum = 100 End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' Excelにエクスポート FpSpread1.SaveExcel("c:\temp\TestPareto.xlsx", FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat) End Sub
C#
private void Form1_Load(object sender, EventArgs e) { // シートにデータを設定 fpSpread1.ActiveSheet.SetClip(0, 0, 1, 2, "機能\t90"); fpSpread1.ActiveSheet.SetClip(1, 0, 1, 2, "デザイン\t68"); fpSpread1.ActiveSheet.SetClip(2, 0, 1, 2, "性能\t93"); fpSpread1.ActiveSheet.SetClip(3, 0, 1, 2, "マニュアル\t23"); fpSpread1.ActiveSheet.SetClip(4, 0, 1, 2, "サポート\t17"); fpSpread1.ActiveSheet.SetClip(5, 0, 1, 2, "不具合\t4"); fpSpread1.ActiveSheet.SetClip(6, 0, 1, 2, "その他\t2"); fpSpread1.ActiveSheet.SetClip(7, 0, 1, 2, "相互運用性\t1"); // セル範囲を設定してパレート図を作成します fpSpread1.ActiveSheet.AddChart(new FarPoint.Win.Spread.Model.CellRange(0, 0, 8, 2), typeof(FarPoint.Win.Chart.ParetoSeries), 500, 250, 150, 30); FarPoint.Win.Chart.ChartModel model = fpSpread1.ActiveSheet.Charts[0].Model; // タイトルを設定 Font fontTitle = new Font("メイリオ", 14); model.LabelAreas.Add(new FarPoint.Win.Chart.LabelArea() { Text = "問合せ件数", TextFont = fontTitle, Location = new PointF(0.4F, 0.01F) }); // 凡例を表示しない model.LegendAreas.Clear(); FarPoint.Win.Chart.ParetoSeries s = (FarPoint.Win.Chart.ParetoSeries)model.PlotAreas[0].Series[0]; // 要素の間隔を指定 s.GapWidth = 0.1f; // パレート線の外観を設定 s.ParetoLine.LineBorder = new FarPoint.Win.Chart.SolidLine(System.Drawing.Color.OrangeRed, 3); // 軸のフォントを設定 FarPoint.Win.Chart.YPlotArea plotArea = (FarPoint.Win.Chart.YPlotArea)model.PlotAreas[0]; Font fontRegular = new Font("メイリオ", 9); plotArea.XAxis.LabelTextFont = fontRegular; plotArea.XAxis.LabelRotationAngle = -45; plotArea.YAxes[0].LabelTextFont = fontRegular; plotArea.YAxes[1].LabelTextFont = fontRegular; // 数値縦軸の最大値を設定 plotArea.YAxes[0].AutoMaximum = false; plotArea.YAxes[0].Maximum = 100; } private void button1_Click(object sender, EventArgs e) { // Excelにエクスポート fpSpread1.SaveExcel(@"c:\temp\TestPareto.xlsx", FarPoint.Excel.ExcelSaveFlags.UseOOXMLFormat); }