2015-02-15

DNF パッケージマネージャ

DNF は、Fedora 22 より正式に Yum から置き換わることが予定されているパッケージマネージャで、Fedora 18 の頃から利用ができるようにはなっていました。この DNF は、Yum 3.4 からフォークされたプロジェクトです。DNF の名称は、明確にどの略か明記されていませんが、Dandified Yum とも呼ばれていることから、Dandified から 3 文字を取ったものと思われます。ちなみに、Dendified とは日本語でも使う「ダンディ」に由来する形容詞の一つです。

DNF は、インストールするパッケージの依存関係に、堅固なアルゴリズムと効率的なメモリ消費で解決できるソルバー、libsolv およびその C および Phython ラッパーである hawkey を利用しています。また、DNF では C と Phyton の包括的な API が、文書化も含めて整備されるそうです。

DNF コマンドの書式は以下のようになっています。

dnf [options] <command> [<argument>]

全ての dnf コマンドを調べているわけではありませんが、主要なコマンドは yum と同じに使えるようです。

# dnf install <name_of_package>
# dnf remove <name_of_package>
# dnf update
# dnf upgrade

関連サイト

  1. Features/DNF - FedoraProject
  2. DNF (software) - Wikipedia, the free encyclopedia
  3. rpm-software-management/hawkey · GitHub
  4. openSUSE/libsolv · GitHub

 

2015-02-11

ASUS ノートブック

Windows を使いたかったわけでは無いのですが、長期の出張を控え、勝手にいろいろソフトウェアをインストールできない会社のノート PC 以外に、プライベートで使用できるノート PC が欲しくなり、手頃な値段のノート PC を物色していました。Amazon.jp で 35,140円 という値段に釣られ、もとい、惹かれて ASUS のノートブック(ASUS ノートブック X200MA ( Win8.1 with Bing 64Bit / 11.6inch / Celeron N2830 / 4G / 500GB / kingsoft multi-license / ブルー ) X200MA-B-BLUE)を買ってしまいました。

商品の詳細は以下の通りです。

ブランドASUSTek
商品重量1.2 Kg
商品の寸法20 x 30.2 x 3 cm
メーカー型番X200MA-B-BLUE
カラーブルー
商品の寸法 幅 × 高さ30.2 x 30 mm
画面サイズ11.6 インチ
ノート ディスプレイ方式LED
解像度1,366×768ドット ( WXGA )
CPUブランドIntel
CPUタイプIntel Celeron
CPU速度2.16 GHz
RAM容量4000 MB
HDD容量500 GB
グラフィックアクセラレータ インテル HD グラフィックス 4400 (CPU内蔵)
ワイヤレスタイプ802.11bgn
搭載光学ドライブ種類CD-ROMなし
OSWindows 8.1
同梱ソフトMS office搭載なし
リチウム電池1 watt_hours
リチウム電池パックbatteries_contained_in_equipment
リチウム電池 電圧1 V
リチウム電池重量1 g
リチウムイオン電池数1

手許の Web カメラで撮った写真を掲載しました。

Windows がプレインストールされた PC を購入したのは随分と久しぶりですが、再インストール用の Windows の DVD が付属品にありませんでした。今どきは、こういうものなのでしょうか。再インストール用の Windows の DVD があれば、これを Linux 上の仮想マシン (VirtualBox) にインストールして、ノート PC には Linux をインストールしようと考えていましたが、目論見が崩れてしまいました。

1月に引っ越しをした時に 3 台の PC の内、古い PC 一台を処分しましたが、新たに一台、我が家で唯一の Windows PC が加わりました。

出張で会社のノート PC に加えてもう一台を持ち運ぶのは大変ですが、長期の出張では、私には、制約なく自由に使える PC が必要です。スマホだけでは満足できないのです。ゲーム目的でも、動画視聴目的でもないので、廉価で購入したノート PC に多くを求めていません。むしろこのコストパフォーマンスには大変満足しています。

すぐ壊れてしまえば評価は変わるでしょうが、今のところ、良い買い物をしたと思っています。

参考サイト

2015-02-06

【まとめ】Microsoft とオープンソース

Microsoft 社といえば、プロプリエタリなソフトウェア製品を販売する会社の代表格と思っていました。しかし 2014 年 2 月 に Satya Nadella 氏が最高経営責任者 (CEO) に就任して以来、急速に オープンソースソフトウェア (OSS) との距離が縮まってきています。最近の Microsoft 社の OSS への取り組みに関するニュースをまとめてみました。


マイクロソフト、.NETエンジン「CoreCLR」をオープンソース化

(2015 年 2 月 5 日)

マイクロソフトが「CoreCLR」をオープンソースとして公開した。CoreCLRは「.NET Framework」のフォークである「.NET Core」の実行エンジン。


マイクロソフト、統計解析言語Rの商業ベンダーRevolution Analyticsを買収

(2015 年 1 月 26 日)

マイクロソフトがR言語のソフトウェアとサービスを提供するRevoluton Analyticsを買収したことを発表した。R言語は統計的計算や予測分析向けのプログラミング言語。買収金額は公開されていない。


米Microsoft、天体観測ソフト「WorldWide Telescope」をオープンソース化

(2015 年 1 月 15 日)

米Microsoftは1月9日、天体観測プログラム「WorldWide Telescope(WWT)」をオープンソースプロジェクトにすることを発表した。コードを公開することで同プログラムの拡張を容易にし、コミュニティ主導での機能開発が行えると狙いを説明している。WorldWide Telescopeは...


米Microsoft、「Halo 4」などで使用したクラウドフレームワーク「Project Orleans」を2015年にオープンソースで公開へ

(2014 年 12 月 16 日)

米Microsoftが「Halo 4」や「Windows Azure」などのクラウドサービスを構築する際に利用したフレームワークを「Project Orleans」としてオープンソースで公開する計画を発表した。2015年前半にもGitHubでコードを公開するという。


Microsoft、.NETをMac、Linuxに移植、サーバ・サイドをオープンソース化すると発表

(2014 年 11 月 13 日)

Microsoftの.NETフレームワークはこの12年にわたってWindowsでアプリケーションを開発するデベロッパーのプログラミング・モデルとなってきた。今日(米国時間11/12)、Microsoftはデベロッパー・ツールのクロスプラットフォーム化の努力を一歩押し進め、近く.NETをMacとLinuxに移植することを発表した。同時に、.NETのサーバ・サイド(クライアントの.NETでは...


少し古い記事ですが、最近のオープンソース化へのアプローチの序章のように思えましたので掲載しました。

マイクロソフトが「.Net Foundation」を設立し、オープンソースへの取り組みを本格化

(2014 年 4 月 4 日)

マイクロソフトは長年に渡ってオープンソース・ムーブメントに興味を示しており、占有的なソフトウェアよりもパブリックなコードを好む開発者との架け橋を構築しようと模索してきた。今週マイクロソフトは、同社のオープンソースへの関与について懐疑的な人々をも説得できるほど大きな発表を行った。 今週サンフランシスコで開かれたマイクロソフトの Build デベロッパー・カンファレンスの基調講演で、同社の役員スコット・ガスリーは、今後 .Net の重要なソフトウェア・フレームワークの管理を引き継ぐ組織「.Net Foundation」の設立を発表した。 マイクロソフトが数年前に .Net を開発したのには2つの大…


2015-01-30

Commonality Analysis

Commonality Analysis(日本語では共通性分析と呼ぶらしい)とは、一連のデータに潜む共通性を見つけ出すための解析です。そのため、状況によって解析のアプローチは様々ですが、今回は、複数ある製造工程において、収率に影響を与える工程を見つけ出すケースを扱います。

LOTIDSTAGE_ASTAGE_BSTAGE_CSTAGE_DSTAGE_ESTAGE_FYIELD
P01A01B01C01D01E01F0194.08
P02A01B02C04D02E03F0192.84
P03A02B03C01D01E01F0396.52
P04A02B01C03D03E02F0496.34
P05A02B03C02D02E03F0194.11
P06A01B01C03D01E03F0394.36
P07A03B02C02D02E01F0493.14
P08A02B02C01D01E02F0294.94
P09A03B03C02D03E03F0496.33
P10A01B03C03D03E02F0398.81
P11A03B01C01D01E01F0296.13
P12A02B02C01D01E01F0294.26
P13A01B02C04D02E01F0292.06
P14A03B01C03D02E02F0195.94
P15A03B03C02D02E03F0498.62
P16A02B02C03D01E01F0393.24
P17A01B01C04D03E01F0394.23
P18A01B03C03D03E02F0494.32
P19A02B03C02D02E03F0196.16
P20A03B02C01D03E02F0291.78

例題

ある製造工程において、最近の 20 ロット (LOTID) の製品収率 (YIELD) の結果が右表のようになりました。収率とは、製品の最終テストにおいて、良品としてパスした同一ロット中の製品比率のことで、単位は % です。

この製品の製造工程には、STEP_A から STEP_F までの 6 工程があり、それぞれの工程で複数の装置(A01, A02, A03 など)のどれかを使用しています。これら複数の装置は区別なく使用できるようになっています。右の表には、それぞれの工程で使用した装置の履歴も加えられています。

区別なく使用できる工程内の複数の装置は、処理性能が製造要求仕様を満たすような範囲に収まるように調整されていますが、全く同一の性能というわけではありません。また、仕様で規定していない特性や性能などについてズレがある場合もあります。

このような状況で、各工程の装置差(ここでは機差と呼ぶことにします)が収率に影響を与えていないかどうかを調査することが今回のテーマです。

このような機差解析をすることを Tool Commonality Analysis と呼んでいます。

とりあえず、収率 (YIELD) のトレンドチャートを作成して、ばらつき具合をみることにしましょう。

R を起動して、クリップボードにコピーした右表を、データフレーム tbl に取り込みます。

$ R

R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet"
...
(省略)
...
 'q()' と入力すれば R を終了します。 

> tbl <- read.table("clipboard", header = T)
> tbl
   LOTID STAGE_A STAGE_B STAGE_C STAGE_D STAGE_E STAGE_F YIELD
1    P01     A01     B01     C01     D01     E01     F01 94.08
2    P02     A01     B02     C04     D02     E03     F01 92.84
3    P03     A02     B03     C01     D01     E01     F03 96.52
4    P04     A02     B01     C03     D03     E02     F04 96.34
5    P05     A02     B03     C02     D02     E03     F01 94.11
6    P06     A01     B01     C03     D01     E03     F03 94.36
7    P07     A03     B02     C02     D02     E01     F04 93.14
8    P08     A02     B02     C01     D01     E02     F02 94.94
9    P09     A03     B03     C02     D03     E03     F04 96.33
10   P10     A01     B03     C03     D03     E02     F03 98.81
11   P11     A03     B01     C01     D01     E01     F02 96.13
12   P12     A02     B02     C01     D01     E01     F02 94.26
13   P13     A01     B02     C04     D02     E01     F02 92.06
14   P14     A03     B01     C03     D02     E02     F01 95.94
15   P15     A03     B03     C02     D02     E03     F04 98.62
16   P16     A02     B02     C03     D01     E01     F03 93.24
17   P17     A01     B01     C04     D03     E01     F03 94.23
18   P18     A01     B03     C03     D03     E02     F04 94.32
19   P19     A02     B03     C02     D02     E03     F01 96.16
20   P20     A03     B02     C01     D03     E02     F02 91.78
> 

次に、横軸に LOTID、縦軸に YIELD をとってトレンドチャートを作成します。

> plot(1:20, tbl$YIELD, xlab = "LOTID", ylab = "YIELD", type = "o", xaxt = "n")
> axis(1, 1:20, tbl$LOTID, las = 2)

トレンドチャートをみて、収率が低いロットを抽出すると以下のようになります。

LOTIDSTAGE_ASTAGE_BSTAGE_CSTAGE_DSTAGE_ESTAGE_FYIELD
P02A01B02C04D02E03F0192.84
P07A03B02C02D02E01F0493.14
P13A01B02C04D02E01F0292.06
P16A02B02C03D01E01F0393.24
P20A03B02C01D03E02F0291.78

各工程の処理装置を見比べると、STAGE_B の装置 B02 が収率の低いロットにおいて共通して使用されていることが判ります。この結果から、装置 B02 が収率に影響を与えていると結論できます。次のステップとして、工程 STAGE_B における装置 B02 の詳細な調査に入ることになるでしょう。

分散分析による Tool Commonality Analysis

今回の例では、トレンドチャートから低収率のロットを抜き出して整理することによって、共通する処理装置を容易に見つけ出すことができました。データが 20 ロット、6 工程程度であれば、あまり苦にならない作業かもしれませんが、工程やロットの数がもっと多くなれば、この方法では、なかなか大変な作業になりそうです。

そこで、一元配置の分散分析を利用して Tool Commonality Analysis をする方法を紹介します。下記のスクリプト commonality.R に示しました。このスクリプトでは、上記 20 ロットの収率データを CSV ファイルとして読み込むようにしています。そのため、その CSV ファイルは sample_commonality.csv.zip からダウンロードできるようにしてあります。

リスト:commonality.R 
require("tcltk")

###############################################################################
# pval.oneway
###############################################################################
pval.oneway <- function(src, x.label, y.label) {
  tmp <- data.frame(X = src[, x.label], Y = src[, y.label])
  result.test <- oneway.test(Y ~ X, data = tmp, var.equal = TRUE)
  return(result.test$p.value)
}

###############################################################################
# chart.boxplot
###############################################################################
chart.boxplot <- function(src, x.val, y.val, gTitle = "", x.label = "", y.label = "") {
  tmp <- data.frame(x = src[, x.val], y = src[, y.val])
  y_max <- max(tmp$y, na.rm = TRUE)
  y_min <- min(tmp$y, na.rm = TRUE)
  y.limit <- c(y_min, y_max)
  
  boxplot(y ~ x, data = tmp, ylim = y.limit,
          main = gTitle, xlab = x.label, ylab =y.label,
          col = "LightBlue", cex.main = 1, outcol = "Orchid")
}

###############################################################################
# MAIN
###############################################################################

# READ CSV DATA
file.name <-tclvalue(tkgetOpenFile(filetypes="{{CSV} {.csv}}", title = "Open CSV file"))
tbl.data <- read.csv(file.name, header = T, as.is = T)

# first column should be always LOTID
# last column should be always YIELD
n.col <- length(tbl.data)
list.stage <- names(tbl.data)[2:(n.col - 1)]
yield <- names(tbl.data)[n.col]

# CHECK 1-WAY ANOVA
df <- data.frame(STAGE = list.stage, P.VALUE = rep(1, length(list.stage)))
for (stage in list.stage) {
  pval <- pval.oneway(tbl.data, stage, yield)
  df[df[, "STAGE"] == stage, "P.VALUE"] <- pval
  # SIGNIFICANT LEVEL: p-value < 0.02 
  if (pval < 0.02) {
    grpTitle <- paste(stage, "\np-value = ", format(pval, digits = 2))
    chart.boxplot(tbl.data, stage, yield, grpTitle, "EQUIPMENT", "YIELD [%]")
    df[df[, "STAGE"] == stage, "SIG"] <- "*"
  } else {
    df[df[, "STAGE"] == stage, "SIG"] <- ""    
  }
}
print(df)

実行例を下記に示します。R を起動して、source コマンドでスクリプトを読み込みます。

$ R

R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet"
...
(省略)
...
 'q()' と入力すれば R を終了します。 

> source("commonality.R")
 要求されたパッケージ tcltk をロード中です 

読み込む CSV ファイルを選択します。

各工程毎に、装置を因子(水準)とした収率の一元配置分散分析を実施します。

帰無仮説 H0 は、『工程 STAGE_X における装置 X01, X02 ... による処理によって、収率に差は生じない』になります。この例では、有意水準を 2% としています。p-value が 2% 未満の工程には、この工程の機差が収率に影響を与えている可能性を示すアスタリスク * を SIG (Significant) の列に付けています。

    STAGE     P.VALUE SIG
1 STAGE_A 0.678511601    
2 STAGE_B 0.001784216   *
3 STAGE_C 0.239092024    
4 STAGE_D 0.849674707    
5 STAGE_E 0.435107778    
6 STAGE_F 0.422098879    
> 

また、p-value が 2% 未満の工程については、装置別のボックスプロットが作成されます。

先の低収率のロットを抽出して分析した結論と同じく、分散分析でも STAGE_B における機差が収率に与える影響を無視できない(有意である)、という結果になりました。

分散分析を利用した Tool Commonality Analysis は、半導体デバイス製造のような長大な製造工程や、大量の生産ロットのデータ解析に威力を発揮します。定常的にこのようなチェックをすることで、収率に影響を与える機差を少なくする活動に繋げるためのシグナル(=機差が有意となる工程)を検出することができます。

ただし、この例のような装置の組み合わせは、あとで解析することを考慮して決められてはいない、ということに注意する必要があります。収率に対して装置の組み合わせが似ている(交絡している)工程で、どちらも有意になる可能性があります。この場合、どちらか、あるいは両方共、偽のシグナルになるかもしれません。しかし、詳細な調査を始めるための十分なヒントになるでしょう。

複数の工程の効果を分離して解析するためには、各因子の効果を分離できるように組み合わせが考慮された、すなわち、デザイン(計画)された、実験を行う必要があります。

しかし、実験計画法 (DOE) を量産ラインに適用するにはコストが掛かります。因子の交絡による偽シグナルがあることを認識した上で、今回のような Tool Commonality Analysis を繰り返すことで、真のシグナル(収率に影響を与える工程)を炙り出すというアプローチは、生産情報をそのまま利用する安価かつリアルタイムなアプローチと言えるかもしれません。

関連サイト

  1. R-Source - 68. 多群の検定

 

2015-01-28

【まとめ】Firefox OS 搭載スマートフォン Fx0

au から昨年末に発売された Firefox OS 搭載スマートフォン Fx0 について、発売後 1ヵ月ぐらい経ちましたが、最近の記事を集めてみました。


ASCII.jp:文句なしにカッコイイ! Firefoxスマホ「Fx0」の可能性はどんなだ? (1/4)|アスキースマホ総研

(2015 年 01 月 23 日)

au が発表した Firefox OS 搭載スマートフォン「Fx0」(エフエックスゼロ)。半透明の背面パネル、そしてアンテナやパーツの配置も見られることを前提にレイアウトされたデザインがとにかくカッコイイ。


au初のFirefox OSスマホ「Fx0 LGL25」のWebブラウザーはどう?iPhoneやAndroidと比較してみた【レビュー】 - S-MAX(エスマックス) - スマートフォンとモバイルを活用するブログメディア

(2015 年 01 月 23 日)

昨年12月25日にau直営店および公式Webストア「au Online Shop」で発売され、今月6日からはauショップやau取扱店で販売開始されたau初の「Firefox OS」を採用したスマートフォン(スマホ)の「Fx0(型番:...


すべてのアプリがWebアプリ!?auのギーグ向けスマホ「Fx0 LGL25」を使ってFirefox OSアプリの仕組みを紹介【吉川英一の「スマホのちょっと深いとこ」】 - S-MAX(エスマックス) - スマートフォンとモバイルを活用するブログメディア

(2015 年 01 月 25 日)

auが昨年末に発売したFirefox OS搭載ギーグ向けスマホ「Fx0 LGL25」。2015年初にはauショップや家電量販店での販売も開始され、欲しい人には行き渡る体制になってきました。ところでスマートフォンの肝は...


最新のデザイン「Fx0」|革新し続けるデザイナー 吉岡徳仁(1) (1/6)|デザイン|Excite ism(エキサイトイズム)

(2015 年 01 月 26 日)

2014年暮れ、まったく新しい1台のスマートフォンが発表された。それが国内初のFirefox OS搭載端末「Fx0 LGL25」だ。Firefox OSのオー…


可能性は無限大!新たな時代を切り開くFirefox OS搭載スマホ「FX0」

(1015 年 01 月 26 日)

日本の携帯キャリアから初めて発売されるFirefoxスマホ「FX0」。外観のスケルトンボディが強烈なインパクトを与えたようで開発者以外の人たちも気になる存在になっているようです。特に気になってしまう...


2015-01-26

Fedora 21 「 Google Chrome 公開鍵がありません」の件 - なんとか ネット。

Fedora 21 にしてから、Chrome の更新時に公開キーがないというアラームに悩まされていましたが、これで解決しました。

ちなみに、上記のサイトで触れられている dnf とは yum からフォークされたプロジェクトで、Fedora プロジェクトでは、次回の 22 のリリースを目標に yum から dnf へ移行するようです。

  1. Changes/ReplaceYumWithDNF - FedoraProject
  2. DNF | Dandified Yum
  3. Everything You Need to Know About the DNF Package Manager - Make Tech Easier
  4. DNF (software) - Wikipedia, the free encyclopedia

 

2015-01-10

2014年に最もシェアが増えたプログラミング言語は「JavaScript」-TIOBE

TIOBE Programming Community Index は、複数の検索エンジンの検索結果から、対象となるプログラミング言語がどれだけ話題になっているかをインデックス化したものです。2014 年にもっともシェアが増えたプログラミング言語は Swift か R になりそうという予想だったのですが、最後に大どんでん返しがありました。

  1. 2014年に最もシェアが増えたプログラミング言語は「JavaScript」-TIOBE | マイナビニュース
  2. TIOBE Software: Tiobe Index

昨年発表された Apple iOS および OS X のアプリケーション開発に用いられる Swift に注目が集まるのは当然ですが、一方の R のランキングが続伸しているのは、昨今のビッグデータに対する興味の高まりを受け、統計処理に関するプログラミング言語の注目度が高まってきていることに因るようです。

首位を勝ち取った Javascript については、クライアントサイドのみならず、サーバーサイドでの開発環境も整いつつあります。Javascript の言語仕様の標準化は、企業間の様々な利害関係が複雑に絡み合って、ユーザーの利益(= ブラウザに依存しない)に直結する方向に最短で進んでいるとはとても言えませんが、そんな中にあっても、もっと便利に使えるようにと有用なライブラリなどの環境がどんどん整ってきています。個人的には、クライアントサイドで規模の大きなアプリケーション開発ができるフレームワークのライブラリに注目しています。特に最近の注目は AngularJS です。先日、ラゾーナ川崎にある丸善をぶらついている時、下記の本がすっと目に入ってきたので、衝動買いしてしまいました。

 

2015-01-09

SPCチャートの作成

SPC, Statistical Process Control (統計的工程管理)とは、製造工程などにおいて安定した品質の製品を作り込むために、品質を左右する重要な 測定値などのパラメータを管理図を用いて管理する活動です。管理図について、教科書的な説明は省略させていただきます。ご興味のある方は、参考サイト [1][2][3] をご覧になってください。

ということで、今回は、SPC で利用する管理図を R で作成してみます。一言で管理図といってもいろいろな種類がありますが、Xbar-R 管理図を作成するサンプルを紹介します。Xbar は平均(MEAN)、R は範囲(RANGE) を意味します。具体的には、製造工程のロットについて、ある測定を何点か実施し、その平均値と範囲(最大値と最小値の差)をロットの処理順にプロットするチャートになります。

ここでは、平均と範囲のトレンドを、R の plot を利用してひとつのプロットにまとめてみました。x 軸には、処理順にロット番号(LOT ID)、y 軸については、平均と範囲についてそれぞれ左右の二軸を使います。plot には二軸に対応した二つのデータ群を自動的に書き分けるような機能はありませんので、プロットを重ね合わせることによって二軸のプロットを実現しています。

なお、それぞれの軸の目盛の付け方には改善の余地があります。汎用的な目盛処理を加えようとすると結構手間が掛かるように感じたので、最大値と最小値のみを目盛に表示するに留めました。

今回も、ファイル選択ダイアログを加えました。例に使用したデータは、sample_spc.csv.zip からダウンロードできるようにしてあります。ご興味があれば、展開してご利用下さい。

require("tcltk")

###############################################################################
# spc.XbarR
###############################################################################
spc.XbarR <- function(tbl, x.col = "LOTID", y.col, y2.col) {
  gTitle <- "Xbar-R chart sample"
  
  # spce to adjust vertical position of y axis label
  pad.label <- "                                       "
  
  # adjust right margin for y2 axis label
  par(oma = c(0, 0, 0, 2))

  # MEAN ######################################################################
  y_max <- max(tbl[, y.col])
  y_min <- min(tbl[, y.col])
  y_min0 <- 2 * y_min - y_max

  plot(c(1, nrow(tbl)), c(y_min0, y_max),
       type = "n", xaxt = "n",  yaxt = "n",
       xlab = "LOT ID", ylab = "",
       main = gTitle, cex.main = 1)
  
  y.label <- paste(pad.label, "MEAN")
  mtext(y.label, side = 2, line = 2)
  axis(2, c(y_min, y_max), c(y_min, y_max))
  points(1:nrow(tbl), tbl[, y.col], type='o', pch = 15, cex = 1, lty = 1, col = "blue")
  
  # enable plot overlay
  par(new = TRUE)
  
  # RANGE #####################################################################
  y2_max <- max(tbl[, y2.col])
  y2_min <- 0
  y2_max0 <- 2 * y2_max

  plot(c(1, nrow(tbl)), c(y2_min, y2_max0),
       type = "n", xaxt = "n", yaxt = "n", axes = FALSE,
       xlab = "", ylab = "",
       main = "", cex.main = 1)
  
  y2.label <- paste("RANGE", pad.label)
  mtext(y2.label, side = 4, line = 2)
  axis(4, c(y2_min, y2_max), c(y2_min, y2_max))
  points(1:nrow(tbl), tbl[, y2.col], type='o', pch = 1, cex = 1, lty = 2, col = "red")

  # X-AXIS ####################################################################
  axis(1, 1:nrow(tbl), tbl[, x.col], las = 2, cex.axis = 0.75)
  
}

###############################################################################
# open.png
###############################################################################
open.png <- function(img.name, pic.width = 640, pic.height = 400) {
  png(filename = img.name, width = pic.width, height = pic.height,
      units = "px", pointsize = 14, bg = "white", res = NA)
}

###############################################################################
# MAIN
###############################################################################

# READ CSV DATA
file.name <-tclvalue(tkgetOpenFile(filetypes="{{CSV} {.csv}}", title = "Open CSV file"))
tbl.data <- read.csv(file.name, header = T, as.is = T)

# first column is always LOTID
# rest of columns are measurement data
n.col <- ncol(tbl.data)
list.meas <- c(2:n.col)

# calculation for mean and range
for (r in 1:nrow(tbl.data)) {
  tbl.data[r, "Xbar"] <- mean(as.numeric(tbl.data[r, list.meas]))
  tbl.data[r, "R"] <- max(as.numeric(tbl.data[r, list.meas])) - min(as.numeric(tbl.data[r, list.meas]))
}

# generate Xbar-R chart
spc.XbarR(tbl.data, "LOTID", "Xbar", "R")

# generate PNG FILE
open.png("sample_spc.png", 1000, 400)
spc.XbarR(tbl.data, "LOTID", "Xbar", "R")
dev.off()

# ---
# END PROGRAM

Fedora での実行例です。

$ R

R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet"
...
(省略)
...
 'q()' と入力すれば R を終了します。 

> source("spc.R")
 要求されたパッケージ tcltk をロード中です 
> 

スクリプトを実行するとファイル選択ダイアログが表示されます。

画面に表示される Xbar-R チャートです。管理図というと、規格値 (LSL, USL)、管理限界値 (LCL, UCL)、さらに工程能力指数 (Cp, Cpk) を書き加えておくと実用的なのですが、作り込みに時間がかかるので、今回は簡単なサンプルということで省略しています。

カレントディレクトリに PNG 形式で保存された Xbar-R チャートです。今回は、横軸の LOT ID が識別できるように横幅を長くして出力しています。

参考サイト

  1. 実践! IE:現場視点の品質管理(14):品質管理に必須の統計的手法「X-R管理図」「P管理図」の作り方 (1/3) - MONOist(モノイスト)
  2. IBM Knowledge Center - 統計的工程管理
  3. JIS Z 9021:1998 シューハート管理図

 

2015-01-05

確率プロットの作成

R によるグラフ作成の復習の第三弾の今回は、確率プロットです。以前の記事は下記の通りです。

今回も、ファイル選択ダイアログを加えました。例に使用したデータはボックスプロットで使用したデータと同じで、sample_box.csv.zip からダウンロードできるようにしてあります。ご興味があれば、展開してご利用下さい。

require("tcltk")

###############################################################################
# chart.cdf
###############################################################################
chart.cdf <- function(tbl, x.val = "RAW_VALUE", col.by = "condition",
                      gTitle = "", x.label = "measured data") {
  x <- tbl[, x.val]
  x <- x[!is.na(x)]
  n <- length(x)
  x <- sort(x)
  y <- (1:n - 0.375) / (n + 0.25)
  
  probs <- c(0.001, 0.01, 0.1, 1, 5, 10, 20, 30, 40, 50,
             60, 70, 80, 90, 95, 99, 99.9, 99.99, 99.999) / 100
  m <-  length(probs)
  
  x_min <- x[1]
  x_max <- x[n]
  x_pad <- (x_max - x_min) * 0.4
  
  y_min <- qnorm(probs[1])
  y_max <- qnorm(probs[m])
  y_stp <- (y_max - y_min) * 0.1
  
  plot(c(x_min, x_max + x_pad), c(y_min, y_max),
       type = "n", yaxt = "n",
       xlab = x.label, ylab = "Cumulative Percent",
       main = gTitle, cex.main = 1)
  axis(2, qnorm(probs), probs * 100)
  abline(h = qnorm(probs), lty = 3, col = "#C0C0C0")
  abline(h = 0, lty = 1, col = "#808080")
  
  list.by <- sort(unique(tbl[, col.by]))
  k <- length(list.by)
  for (i in 1:k) {
    val.by <- list.by[i]
    x <- tbl[tbl[, col.by] == val.by, x.val]
    x <- x[!is.na(x)]
    n <- length(x)
    x <- sort(x)
    y <- (1:n - 0.375) / (n + 0.25)
    
    total <- length(x)
    x.median <- median(x)
    legend_label <- paste(val.by, ':', total, "/", x.median)
    
    points(x, qnorm(y), type='o', col = i, pch = i, cex = 0.7)
    
    legend_x <- x_max + x_pad * 0.05
    legend_y <- y_max - y_stp * (i - 1)
    legend_lty = 1
    legend(legend_x, legend_y, legend_label, col = i,
           lty = legend_lty, pch = i, ncol = 1, cex = 0.7, box.lty = 0)
  }
}

###############################################################################
# open.png
###############################################################################
open.png <- function(img.name, pic.width = 640, pic.height = 400) {
  png(filename = img.name, width = pic.width, height = pic.height,
      units = "px", pointsize = 14, bg = "white", res = NA)
}

###############################################################################
# MAIN
###############################################################################

# READ CSV DATA
file.name <- tclvalue(tkgetOpenFile(filetypes = "{{CSV} {.csv}}", title = "Open CSV file"))
tbl.data <- read.csv(file.name, header = T, as.is = T)

# generate CDF PLOT
head.y <- names(tbl.data)[1]
head.x <- names(tbl.data)[2]
title.box <- paste("SAMPLE (n = ", length(tbl.data[, head.x]), ")", sep = "")
label.x <- "Measurement"
chart.cdf(tbl.data, head.x, head.y, title.box, label.x)

# generate PNG FILE
open.png("sample_cdf.png")
chart.cdf(tbl.data, head.x, head.y, title.box, label.x)
dev.off()

# ---
# END PROGRAM

Fedora での実行例です。

$ R

R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet"
...
(省略)
...
 'q()' と入力すれば R を終了します。 

> source("cdf.R")
 要求されたパッケージ tcltk をロード中です 
> 

スクリプトを実行するとファイル選択ダイアログが表示されます。

画面に表示される確率プロットです。凡例には、データ数とメディアンを表示しています。

カレントディレクトリに PNG 形式で保存された確率プロットです。

 

2015-01-04

ボックスプロットの作成

R によるグラフ作成の復習の第二弾の今回は、ボックスプロットです。以前の記事は下記の通りです。

今回も、ファイル選択ダイアログを加えました。例に使用したデータは sample_box.csv.zip からダウンロードできるようにしてあります。ご興味があれば、展開してご利用下さい。

require("tcltk")

###############################################################################
# chart.boxplot
###############################################################################
chart.boxplot <- function(tbl, x.val, y.val, gTitle = "", x.label = "", y.label = "") {
  tmp <- data.frame(x = tbl[, x.val], y = tbl[, y.val])
  y_max <- max(tmp$y, na.rm = TRUE)
  y_min <- min(tmp$y, na.rm = TRUE)
  y.limit <- c(y_min, y_max)
  
  boxplot(y ~ x, data = tmp, ylim = y.limit,
          main = gTitle, xlab = x.label, ylab =y.label,
          col = "LightBlue", cex.main = 1, outcol = "Orchid")
}

###############################################################################
# open.png
###############################################################################
open.png <- function(img.name, pic.width = 640, pic.height = 400) {
  png(filename = img.name, width = pic.width, height = pic.height,
      units = "px", pointsize = 14, bg = "white", res = NA)
}

###############################################################################
# MAIN
###############################################################################

# READ CSV DATA
file.name <-tclvalue(tkgetOpenFile(filetypes="{{CSV} {.csv}}", title="Open CSV file"))
tbl.data <- read.csv(file.name, header = T, as.is = T)

# generate BOXPLOT
head.x <- names(tbl.data)[1]
head.y <- names(tbl.data)[2]
title.box <- paste("SAMPLE (n = ", length(tbl.data[, head.x]), ")", sep = "")
label.x <- "Condition"
label.y <- "Measurement"
chart.boxplot(tbl.data, head.x, head.y, title.box, label.x, label.y)

# generate PNG FILE
open.png("sample_boxplot.png")
chart.boxplot(tbl.data, head.x, head.y, title.box, label.x, label.y)
dev.off()

# ---
# END PROGRAM

Fedora での実行例です。

$ R

R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet"
...
(省略)
...
 'q()' と入力すれば R を終了します。 

> source("boxplot.R")
 要求されたパッケージ tcltk をロード中です 
> 

スクリプトを実行するとファイル選択ダイアログが表示されます。

画面に表示されるボックスプロットです。

カレントディレクトリに PNG 形式で保存されたボックスプロットです。