回帰分析の語源

投稿日:

 ニフティのギャグ満載ポータル「デイリーポータルZ」の、13年ほど前の記事によれば──って、13年前って言うと、インターネット界隈では老舗中の老舗だわな。だって、その頃、Facebookなんて影も形もなかったんだから──、「単に『エクセルでまとめる』に過ぎないことを、妙にビジネスっぽく言って韜晦(とうかい)すると、『回帰分析』という言葉になる」のだそうだが、まあ、そこまで回帰分析と言う手法をこき下ろすこともあるまい。

 で、あらためてこの「回帰分析」とは何かと言うと、これは、一般的には最小自乗法などを使って離散事象の傾向を数理化して把握し、今後の予測などに役立てると言うもので、経営科学の基本中の基本である。

 ところが、なぜこのメソッドに「回帰」──まわって、かえってくる──という言葉を当てるのか、誰に聞いてもわからない。最小自乗で近似式を作る、つまりこれが「仮説」であるが、この仮説を相関係数などで評価して「仮説検証」するのが、手っ取り早く言った「回帰分析」である。だが、このように説明したところで、何が「まわって、かえってくる」なのだか、よくわからない。

 そんな疑問を(くすぶ)らせつつ日々を送っていたのだが、ある日突然、この語源を知ることとなった。感ずるところが大きいので、ここに書き留めておきたい。

 左掲の本によれば、「回帰分析」の語源は罪深い。なんとなれば、それが優生学の分野から生まれたからである。

 この本によると、ダーウィン(C.R.Darwin, 1809-1882)の弟子ゴルトン(F.Galton, 1822-1911)は、優生学の分野に数学的手法を導入しようとした。それは、「子の背の高さは親の背の高さに関係があるはず」という着想によっていた。これは、直観的には正しく、長身の親に長身の子がある例、またその逆の例も、世間にはよく見かけることだからだ。ゴルトンは、これを数理的に整理しようとした。

 まずゴルトンは親子の身長のデータを幾千も集めた。そして、親の背の高さをx軸に、子の背の高さをy軸にとって散布図を描いた。

 ゴルトンは、背の高い親からは親と同じくらい背の高い子が生まれると考えた。また、逆に背の低い場合もそうだろう、と考えた。ところが、「平均」のため、背が高いはずである場合には「平均」のほう、すなわち背の低い方へ向かって値が「帰って」いき、また、背が低いはずである場合にも「平均」のほう、すなわち背の高い方へ向かって値が「帰って」いった。

 値がある傾向へ帰っていくことから、ゴルトンはこのグラフに引いた直線を「そこへ帰ってくる直線」ということで、「回帰直線 regression line」と名付けたのであった。

 これが、「回帰分析 regression analysis」という言葉の由来である。

 ここには、「この親にしてこの子あり」という遺伝学的、優生学的なものへの信仰にも近い思い込みが、数理的に、つまり自然によって、ひいては神仏によって(ただ)され、学者がそれに深い感動と畏敬を覚えた、という一つのドラマが見て取れる。

カメラで遊んでみる

投稿日:

 秋月電子のサイトを見ていると、小さなカメラがあり、Arduinoに付きそうな感じだ。

 3850円。Arduino自体が2800円かそこらなので、それに比べるとちょっと高いが、早速行って購入。

 だが、あまり情報は多くない。まず、メーカーのサイトを見ていくと、チュートリアルがあり、「とりあえずテストするには、電源をくれてやって、一番端のピンをテレビにつなぎゃあ絵が出る」みたいなザックリ感満載の解説が。それで、テレビにつなぐためのRCAジャックなども買う。

 チュートリアルはこれを読んでおけばだいたいいいようだ。

 ほどいてみるとこんな感じで、かなり小さい。

IMG_3112

 ピンのピッチが2mmで、ブレッドボードで扱いにくい。それで、普通の2.54mmのピンヘッダを出して、その根元をこんなふうにムリヤリ(笑)2mmピッチにせばめる。

IMG_3116

 こいつをカメラの基盤にえいやっ、とねじ込み、半田付けする。

IMG_3118

 なかなか小さいので、ルーペと老眼鏡を併用しつつ、ICなんか壊しちゃってもナンだから、20Wのぬるくて細い半田鏝でさっさとつける。

IMG_3117

 我ながらなかなかスピーディな仕事だなあ(笑)。

 で、メーカーのサイトには「5V」と書いてあるが、これは互換品の別の製品のためのチュートリアルのようで、買ってきたものの基盤をよく見ると「3.3V」と印刷されている。壊してはもったいないから、3.3Vで試す。3.3Vの電源代わりにArduinoの3.3Vピンを使う。

 基盤の印刷通り、3.3V、GND、それから右端のピンをRCAジャックのセンターに、RCAジャックのアースを同じくGNDに入れて、テレビの前に持っていく。

IMG_3119

 テレビにつなぐと、おお、確かに、値段なりのフザけた画質(笑)で、自分の顔が映る。

IMG_3121

 上下が逆だが、まあ、いいや。

 で、今度はArduinoで画像を撮影してみよう。

 チュートリアルにしたがってArduino用のライブラリをダウンロードし、これをArduinoのインストールフォルダの「libraries」に配置する。

 そうしておいてArduinoのIDEを起動すると、「ファイル」→「スケッチの例」の中に「Adafruit VC0706 Serial Camera Library」が現れるから、この中から「Snapshot」を選ぶ。これは静止画をjpegで撮影するスケッチのサンプルだ。

// This is a basic snapshot sketch using the VC0706 library.
// On start, the Arduino will find the camera and SD card and
// then snap a photo, saving it to the SD card.
// Public domain.

// If using an Arduino Mega (1280, 2560 or ADK) in conjunction
// with an SD card shield designed for conventional Arduinos
// (Uno, etc.), it's necessary to edit the library file:
//   libraries/SD/utility/Sd2Card.h
// Look for this line:
//   #define MEGA_SOFT_SPI 0
// change to:
//   #define MEGA_SOFT_SPI 1
// This is NOT required if using an SD card breakout interfaced
// directly to the SPI bus of the Mega (pins 50-53), or if using
// a non-Mega, Uno-style board.

#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>

// comment out this line if using Arduino V23 or earlier
#include <SoftwareSerial.h>         

// uncomment this line if using Arduino V23 or earlier
// #include <NewSoftSerial.h>       

// SD card chip select line varies among boards/shields:
// Adafruit SD shields and modules: pin 10
// Arduino Ethernet shield: pin 4
// Sparkfun SD shield: pin 8
// Arduino Mega w/hardware SPI: pin 53
// Teensy 2.0: pin 0
// Teensy++ 2.0: pin 20
#define chipSelect 10

// Pins for camera connection are configurable.
// With the Arduino Uno, etc., most pins can be used, except for
// those already in use for the SD card (10 through 13 plus
// chipSelect, if other than pin 10).
// With the Arduino Mega, the choices are a bit more involved:
// 1) You can still use SoftwareSerial and connect the camera to
//    a variety of pins...BUT the selection is limited.  The TX
//    pin from the camera (RX on the Arduino, and the first
//    argument to SoftwareSerial()) MUST be one of: 62, 63, 64,
//    65, 66, 67, 68, or 69.  If MEGA_SOFT_SPI is set (and using
//    a conventional Arduino SD shield), pins 50, 51, 52 and 53
//    are also available.  The RX pin from the camera (TX on
//    Arduino, second argument to SoftwareSerial()) can be any
//    pin, again excepting those used by the SD card.
// 2) You can use any of the additional three hardware UARTs on
//    the Mega board (labeled as RX1/TX1, RX2/TX2, RX3,TX3),
//    but must specifically use the two pins defined by that
//    UART; they are not configurable.  In this case, pass the
//    desired Serial object (rather than a SoftwareSerial
//    object) to the VC0706 constructor.

// Using SoftwareSerial (Arduino 1.0+) or NewSoftSerial (Arduino 0023 & prior):
#if ARDUINO >= 100
// On Uno: camera TX connected to pin 2, camera RX to pin 3:
SoftwareSerial cameraconnection = SoftwareSerial(2, 3);
// On Mega: camera TX connected to pin 69 (A15), camera RX to pin 3:
//SoftwareSerial cameraconnection = SoftwareSerial(69, 3);
#else
NewSoftSerial cameraconnection = NewSoftSerial(2, 3);
#endif

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

// Using hardware serial on Mega: camera TX conn. to RX1,
// camera RX to TX1, no SoftwareSerial object is required:
//Adafruit_VC0706 cam = Adafruit_VC0706(&Serial1);

void setup() {

  // When using hardware SPI, the SS pin MUST be set to an
  // output (even if not connected or used).  If left as a
  // floating input w/SPI on, this can cause lockuppage.
#if !defined(SOFTWARE_SPI)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  if(chipSelect != 53) pinMode(53, OUTPUT); // SS on Mega
#else
  if(chipSelect != 10) pinMode(10, OUTPUT); // SS on Uno, etc.
#endif
#endif

  Serial.begin(9600);
  Serial.println("VC0706 Camera snapshot test");
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }  
  
  // Try to locate the camera
  if (cam.begin()) {
    Serial.println("Camera Found:");
  } else {
    Serial.println("No camera found?");
    return;
  }
  // Print out the camera version information (optional)
  char *reply = cam.getVersion();
  if (reply == 0) {
    Serial.print("Failed to get version");
  } else {
    Serial.println("-----------------");
    Serial.print(reply);
    Serial.println("-----------------");
  }

  // Set the picture size - you can choose one of 640x480, 320x240 or 160x120 
  // Remember that bigger pictures take longer to transmit!
  
  cam.setImageSize(VC0706_640x480);        // biggest
  //cam.setImageSize(VC0706_320x240);        // medium
  //cam.setImageSize(VC0706_160x120);          // small

  // You can read the size back from the camera (optional, but maybe useful?)
  uint8_t imgsize = cam.getImageSize();
  Serial.print("Image size: ");
  if (imgsize == VC0706_640x480) Serial.println("640x480");
  if (imgsize == VC0706_320x240) Serial.println("320x240");
  if (imgsize == VC0706_160x120) Serial.println("160x120");

  Serial.println("Snap in 3 secs...");
  delay(3000);

  if (! cam.takePicture()) 
    Serial.println("Failed to snap!");
  else 
    Serial.println("Picture taken!");
  
  // Create an image with the name IMAGExx.JPG
  char filename[13];
  strcpy(filename, "IMAGE00.JPG");
  for (int i = 0; i < 100; i++) {
    filename[5] = '0' + i/10;
    filename[6] = '0' + i%10;
    // create if does not exist, do not open existing, write, sync after write
    if (! SD.exists(filename)) {
      break;
    }
  }
  
  // Open the file for writing
  File imgFile = SD.open(filename, FILE_WRITE);

  // Get the size of the image (frame) taken  
  uint16_t jpglen = cam.frameLength();
  Serial.print("Storing ");
  Serial.print(jpglen, DEC);
  Serial.print(" byte image.");

  int32_t time = millis();
  pinMode(8, OUTPUT);
  // Read all the data up to # bytes!
  byte wCount = 0; // For counting # of writes
  while (jpglen > 0) {
    // read 32 bytes at a time;
    uint8_t *buffer;
    uint8_t bytesToRead = min(32, jpglen); // change 32 to 64 for a speedup but may not work with all setups!
    buffer = cam.readPicture(bytesToRead);
    imgFile.write(buffer, bytesToRead);
    if(++wCount >= 64) { // Every 2K, give a little feedback so it doesn't appear locked up
      Serial.print('.');
      wCount = 0;
    }
    //Serial.print("Read ");  Serial.print(bytesToRead, DEC); Serial.println(" bytes");
    jpglen -= bytesToRead;
  }
  imgFile.close();

  time = millis() - time;
  Serial.println("done!");
  Serial.print(time); Serial.println(" ms elapsed");
}

void loop() {
}

 で、これはSDカードに書き込むようになっている。

 私の手持ちの、ArduinoにSDカードをつなぐ手段は、先日から愛用中の「ETHERNET SHIELD 2」に搭載されているSDカードスロットだけだから、とりあえずこれを使う。

 手持ちのSDカードをETHERNET SHIELD 2に挿し、Adafruitのサイトのチュートリアルを参考に回路をブレッドボードに組む。

IMG_3122

 注意する点は2つだ。

  1.  サンプルスケッチをよく読むと、普通のSDカードは10番ピンを使うが、ETHERNET SHIELD 2を使う場合は4番ピンにつながる。なので、サンプルスケッチの中の「#define chipSelect 10」というところを「#define chipSelect 4」に書き換えなければならない。
  2.  メーカーサイトのチュートリアルでは、カメラに添付の10kΩの抵抗をTXの次に直列に二つ入れて、1本目と2本目の間からTXをとり、それをアースしているが、どうもこれだとうまく行かなかった。多分、このチュートリアルは給電が5Vだからだと思う。そこで、アースはそのままに、1本目の手前でTXをとるとうまくいった。
    IMG_3127

 そうやってArduinoをスタートさせると、写真が1枚だけ撮れる。

 下は、そうやって撮った私の顔である。

IMAGE02

 ……むっちゃむさくるしいなあw。

民主党で

投稿日:

 「日本が良くなる or 変わらない」って、「悪くなる」って選択肢はないのか!!??喝~ッ!!

 どうしていつもこう、変な選択肢しかないんだ!!「変わらない」じゃネェ!!悪くなるッ!!

いや、そうじゃない。

投稿日:

 プロ野球の視聴率が落ちているという。

 私はもともと野球が大嫌いで、見ていない。

 プロ野球中継の視聴率が下がるのは、野球離れがおこっているからだという評論を見かける。

 いや、そうじゃない。

 日本人は、もともと野球なんか大嫌いなのではないか。

 私が野球を嫌いなのは、野球が「野球は好きにならなければいけないものなのですよ」という相貌で私に近づいてきたからである。私はその押し付けがましい、人の好悪の感情をも統制しようということそのものに反抗し、セットで野球が嫌いになった。

 子供会や学校の野球で、別に野球なんか好きでもなんでもないのに、義務的に「好きです」と言わなければならないようなふうに追い込まれ、そう言わされたなんて奴は、おそらく沢山いるにちがいない。

 今、「これこれのことは、好きでなくちゃ(OR嫌いでなくちゃ)いけないのですよ」というような、どこかねじくれ曲がった感情の統制のようなことを感じるとき、そのほとんどに、外国の影を見ることが出来る。野球もそうだ。旧軍隊は悪者だ、というようなのもそうだ。

やはりツーバイフォーというのは

投稿日:

 やはりツーバイフォーというのは実に耐震性が強い。
http://www.2x4assoc.or.jp/
http://www.2x4assoc.or.jp/news/200502_1.html
http://www.2x4assoc.or.jp/news/report200502.pdf
 地震国日本にこそ。

無題

投稿日:

 「欠陥住宅フォトギャラリー」なるページを見つける。
欠陥住宅フォトギャラリー
http://www.asahi-net.or.jp/~ju2m-hsys/new_page_11.htm

 見ているとなかなか面白い。このサイトを作っている人は自分の商売で作っているわけだが、それを見て私が面白がるというのは、ある意味ゲテモノ趣味?
 それにしてもああオソロシイ、欠陥住宅。ウチはこんなじゃなくてよかった。そりゃ、細かいところを挙げれば色々あるにせよ、100点満点なんてもともと期待してないし。上の「欠陥住宅フォトギャラリー」に載ってるようなのを0点だとすると、ウチは60点以上はいってるよ。