MacSpiceでのLPF回路のシミュレーション

Mac向けのSPICEとしてMacSpiceというものがあるが、これが結構良かったので使い方を簡単にまとめたい。
題材として今回はローパスフィルタ回路のシミュレーションをする。

題材

今回はローパスフィルタ回路として、単純なRC回路とRLC回路を対象に、周波数特性とステップ入力時の動きをシミュレーションする。

回路記述

まずはSPICE用に回路を記述する。
題材用に書いた回路記述は以下。これを「lpf.CIR」として保存する。

ローパスフィルタ評価用
*** circuit definition
** RC LPF
R0 in out 20
C0 out 0 500n
** RLC LPF
* R0 in X 20
* L0 X out 22uH
* C0 out 0 500n
** Vin
Vin in 0 DC 0.0 AC 1.0 0.0 PULSE( 0.0 1.0 1ms )

*** sim commands
.control
* AC analysis
ac dec 50 10Hz 100kHz
echo "$curplot:AC analysis"
* transient analysis
tran 20us 2ms 0ms 20us
echo "$curplot:transient analysis"
.endc
.END

手動になるが、シミュレート時は冒頭の方の「** RC LPF」と「** RLC LPF」のコメントアウトを修正してRC回路かLRC回路かを切り替える。

シミュレーション

以下のコマンドを実行すると、シミューレーションを実行し、結果をグラフとして表示する。

source lpf.CIR
【結果が出力される】
setplot 【AC analysisと表示されたグラフ名ac*を入力】
plot db(out)
setplot 【transient analysisと表示されたグラフ名tran*を入力】

結果

RC回路

f:id:goyoki:20150315173317p:plain

f:id:goyoki:20150315173330p:plain

RLC回路

f:id:goyoki:20150315173606p:plain

f:id:goyoki:20150315173617p:plain

Pythonを使った対数を含む単回帰分析

Pythonでのやや複雑な単回帰分析について。今回は書籍「データ指向のソフトウェア品質マネジメント」を題材にやってみる。Pythonでの記述はを参考にした
分析データとしては、書籍での「テスト工程での不具合検出数の予測」にて提供されているCSVデータを「data.csv」に保存して使用する。

分析内容

分析では、不具合検出に関わるデータの相関性を評価して、不具合数の予測に使える回帰モデルを構築することを目指している。

データの俯瞰と相関性の評価

まずデータを俯瞰した上で、分析対象とするFailures(障害数)とKLOC(テスト対象規模)の相関を評価する。

●グラフ化

グラフで全体の傾向を主観的に把握する。

スクリプト
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import pandas as pd

prj_data = pd.read_csv("data.csv", sep="\t")
# 使用しない行を削除
del prj_data['Prj']
# 欠損を削除
prj_data = prj_data.dropna()

# 散布図で見る
plt.scatter(prj_data['Failures'], prj_data['KLOC'])
plt.show()

# ヒストグラムで見る
plt.figure()
plt.hist(prj_data["Failures"])
plt.xlabel("Failures")
plt.ylabel("Number")
plt.show()
出力

f:id:goyoki:20150304014841p:plain

f:id:goyoki:20150304014835p:plain

●相関係数の評価

相関係数を評価して、正の相関があることを確認する。

スクリプト
〜上の続き〜
print prj_data.corr()
出力
          Failures      KLOC
Failures  1.000000  0.883083
KLOC      0.883083  1.000000

単回帰分析

回帰分析ではデータの分布から推測して、対数を用いた以下のモデルを用いる。
log (Failures) = X * log(KLOC) + Y
対数が含まれるため、文字列で回帰モデルを簡単に記述できるstatsmodelsを使用する。

スクリプト
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import statsmodels.formula.api as sm

prj_data = pd.read_csv("data.csv", sep="\t")
del prj_data['Prj']
prj_data = prj_data.dropna()

result = sm.ols(formula="np.log(Failures) ~ np.log(KLOC)", data=prj_data).fit()

# 概要だけ
print result.params
# 分析データ含めて表示
print result.summary()
出力(paramsの表示)

題材の書籍と概ね同じ値を出力できている。

Intercept       2.460562
np.log(KLOC)    0.956357
dtype: float64
出力(summaryの表示)

P値、R-squaredの値を含め、題材書籍と同じ分析結果になっており、概ね適用可能な回帰モデルとなっていると判断できる。

                            OLS Regression Results                            
==============================================================================
Dep. Variable:       np.log(Failures)   R-squared:                       0.779
Model:                            OLS   Adj. R-squared:                  0.771
Method:                 Least Squares   F-statistic:                     95.38
Date:                Wed, 04 Mar 2015   Prob (F-statistic):           2.35e-10
Time:                        01:40:49   Log-Likelihood:                -29.481
No. Observations:                  29   AIC:                             62.96
Df Residuals:                      27   BIC:                             65.70
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
================================================================================
                   coef    std err          t      P>|t|      [95.0% Conf. Int.]
--------------------------------------------------------------------------------
Intercept        2.4606      0.325      7.578      0.000         1.794     3.127
np.log(KLOC)     0.9564      0.098      9.766      0.000         0.755     1.157
==============================================================================
Omnibus:                        5.037   Durbin-Watson:                   2.194
Prob(Omnibus):                  0.081   Jarque-Bera (JB):                1.856
Skew:                          -0.181   Prob(JB):                        0.395
Kurtosis:                       1.815   Cond. No.                         9.02
==============================================================================

クラシフィケーションツリー法入門

先日、WACATE2014冬というテストの合宿勉強会にて、テスト設計手法の一つであるクラシフィケーションツリー法を解説させていただきました。

クラシフィケーションツリー法は国内ではあまり知られていない手法であるものの、割と汎用的で気軽に使える手法です。例えば、組み合わせテストで因子水準の洗い出しに使う、マインドマップでテストを考える際の手順として参考にする、といった場面で有効になります。
今回の資料が、あまり知られていない現状の改善の一助になれば幸いです。

レガシーコード改善勉強会にて登壇

少し前の話ですが、レガシーコード改善勉強会というイベントで登壇させていただきました。
内容としては、自分の組み込みと少し離れた場ということもあり、普遍的なレガシーコードとの扱い方について話させて頂きました。

当日は他の講演もバリエーション豊かで、学ぶものの多い有意義な時間となりました。
登壇を誘っていただいた有地さん、運営者、登壇者、参加者の方々、改めてありがとうございました。

システムテスト自動化標準ガイドを翻訳

発売は年末となりますが、システムテスト自動化標準ガイド(原題Software Test Automation)という書籍を、有志の仲間で翻訳させていただきました。


Amazon.co.jp: システムテスト自動化 標準ガイド (CodeZine BOOKS): Mark Fewster, Dorothy Graham, テスト自動化研究会: 本

自分は主にメトリクスの章が担当です。
少し古い本ですが、プロセスや管理について有益な内容がよくまとまった本だと思っています。
手にとっていただけると幸いです。

ソフトウェア品質シンポジウムにてConcolic TestingのSIGを開催

前ブログに続きますがソフトウェア品質シンポジウムにて、Concolic TestingのSIGのサブリーダーを担当させていただきました。

SIGでは色々と技術的な課題が指摘されましたが、研究会としてそれらの対応策を検討していければと考えています。
参加者の方々、大変有難うございました。ソフトウェア品質シンポジウムにてConcolic TestingのSIGを開催

ソフトウェア品質シンポジウム パネルディスカッションに登壇

先日、ソフトウェア品質シンポジウムにて、「レビューとテストは使い分けるべきか?」のパネルディスカッションにパネラーとして参加させていただきました。
http://www.juse.jp/sqip/symposium/detail/day2/#session_d4

ディスカッション中に用いた資料


レポートは後ほど出てくるかと思います。
セッション中の議論も楽しく、有意義な時間となりました。
誘っていただいた細谷さんを始め、参加者の方々、パネリストの方々、大変有難うございました。