ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:perlでの平均計算について) Perlでの平均計算について 2011/09/13 07:31 このQ&Aのポイント Perlを使って、与えられたデータから特定のカラムの平均値を求める方法がわかりません。データの中の特定のカラムが同じ値を持つレコードをグループ化し、そのグループごとにカラム2の平均値を計算したいです。誰かPerlに詳しい方に教えていただけると助かります。お願いします。 perlでの平均計算について 以下のようなデータがあります。そこでカラム1が等しい値をもつものを一グループとし、カラム2の平均値を求めたいのですが、なかなかうまくいきません。どなたかご教授をお願いいたします。よろしくお願いします。 カラム1 カラム2 1 123.93 1 322.32 1 232.21 1 124.32 1 234.12 2 123.43 2 12.34 2 . 2 . 2 . 3 3 3 4 4 4 4 質問の原文を閉じる 質問の原文を表示する みんなの回答 (3) 専門家の回答 質問者が選んだベストアンサー ベストアンサー 1204533 ベストアンサー率28% (41/144) 2011/09/13 12:25 回答No.1 それほど プログラムができる人間ではないですが。。。 このような ロジックではいかがでしょうか? 連想配列hashを 2種類活用し、 1つ目のhash カラム1の種類ごとに カラム2を足していく。 (hash{カラム1}に どんどん カラム1が同じもののカラム2の値を足していく。) hash{カラム1}=hash{カラム1}+カラム2 2つ目のhash2 カラム1の種類ごとに、各カラム1のおなじものが 何個あるか カウントしていく。 (hash2{カラム1}に カラム1が同じものをカウントしていく。) hash2{カラム1}=hash2{カラム1}+1 平均値は hash{カラム1}/hash2{カラム1}で 求まると思います。 質問者 お礼 2011/09/14 02:12 早速の回答ありがとうございます。 hashにもあまり慣れていないプログラミング初心者でなかなか理解するのが難しい状態です。もしよろしければもう少し具体的な構成を教えていただけないでしょうか? 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (2) kuroizell ベストアンサー率55% (95/170) 2011/09/14 12:02 回答No.3 インデントの都合上、全角スペース使ってるので置換して下さい。 use strict; use warnings; # データのぶちこみ場所(2次ハッシュ) my %data; # CSVデータはスクリプト中に書けるので、今回はそれを使います while (<DATA>) { chomp $_; my @cols = split(',', $_); # 各カラムごとの合計(sum)、個数(cnt) $data{$cols[0]}{sum} += $cols[1]; $data{$cols[0]}{cnt}++; } foreach my $col (sort keys %data) { # 適当に出力 print "Colmns $col : Avg = " . $data{$col}{sum} / $data{$col}{cnt} . "\n"; } __DATA__ 1,123.93 1,322.32 1,232.21 1,124.32 1,234.12 2,123.43 2,12.34 質問者 お礼 2011/09/14 15:38 求めたかったデータを得ることができました。 丁寧に回答していただき本当にありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 1204533 ベストアンサー率28% (41/144) 2011/09/14 07:59 回答No.2 あまりプログラムが得意でないので、効率よいきれいなプログラムでないかもしれませんが、 かきのようなもので どうでしょうか? open(IN,ファイル1); while(<IN>){ $line = $_; chomp $line; @array = split(/\t/,$line); $id1 = $array[0]; $score = $array[1]; if(exists $hash{$id1}){ $hash{$id1}=$hash{$id1}+$score; $hash2{$id1}=$hash2{$id1}+1; } else { $hash{$id1}=$score; $hash2{$id1}=1; } } close(IN); foreach(sort keys %hash) { my $key=$_; my $value=$hash{$_}; my $value2=int($value/$hash2{$_}); 商だけを採用するのであれば intを利用 print $key.' -> '.$value2."\n" } とすると 1 -> XXX とかでてくるのではないでしょうか? 質問者 お礼 2011/09/14 15:34 詳細にプログラムまで書いていただきありがとうございます。 おかげさまでデータ処理を行うことができました。 ありがとうございました! 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Perl 関連するQ&A 加重平均について教えていただけないでしょうか 年代にそれぞれ値が対応したデータがあります。具体的には下のようになっています。 2008年・・・0.66 2004年・・・0.29 2000年・・・0.28 1996年・・・0.12 ・ ・ ・ データ数33個になります。 このデータの加重平均から間の年代の値を求めたいです(例えば2006年の値)。加重平均について調べた結果、値を平均するだけでなくそれぞれのデータに対応する個数を考慮するということはよく理解できました。 しかし上のようなデータの場合、年代は個数ではないですし、どうすればいいのか分かりません。どうぞご教授お願い致します。 perlとsqlに関する質問です。 データベースからある情報を取り出すときに困っています。 取り出す条件を 一、order by 日付 二、group by 名前 の順に取り出したいのですが、うまくいきません。 どのように抜き出せばいいかわからないので、わかる方はご教授お願いします。 以下は大ざっぱな抽出部分のプログラムです。 $sth = $dbh("select * from table order by 日付カラム group by 名前カラム" limit 3,9") … よろしくお願いします。 変動係数における平均値について 現在勉強の一環で、変動係数を扱っています。 その中で、対象データに正と負の値が混在している場合に、変動係数が極端に高い(低い)値になることがあるのです。 正しい値なのかが分からないので、何方か御教授頂けないでしょうか。宜しくお願い致します。 上記の文章では説明不足かと思いますので、以下に例を示します。 例: 対象データ(4件) 1.102 3.302 -2.598 -2.298 このとき 平均:0.277 標準偏差:3.040045 変動係数:1097.489 ※変動係数=標準偏差/平均×100で計算 このように1000以上というような高い値は、ばらつきを正確に表しているのかが疑問なのです。宜しくお願い致します。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 平均値の計算の仕方は? 教えてください!! 週1回C言語を勉強しはじめて約3ヶ月ですが、ますます難易度が増し、後1週間で締め切りになるにもかかわらず、文系の私はすでに挫折してしまいそうです。そこで質問があります。次の問題はどのようにプログラムを書いたらいいのですか。是非是非、教えて下さい!!! お願いいたします。ちなみに、「Turbo C」を使っているのですが、本を参考にしてもならっていない、switchやcase などがでできて参考にすることがむずかしいのです。是非、頼らせて下さい。 問題1 0より大きn個(最大100個)のデータを入力し、その合計と平均値を計算して出力する。さらに、n個のデータと平均値の差を出力し、平均値に最も近いデータを探す。 (実行結果例) データを入力(データの終了は、マイナスを入力) データ(1) : 30↓(← enter) データ(2) :100↓ データ(3) :45↓ データ(4) :9↓ データ(5) :-1↓ 4個のデータの合計= 184.0000 平均値= 46 データ(1)と平均値の差= 16.0000 データ(2)と平均値の差= 54.0000 データ(3)と平均値の差= 1.0000 データ(4)と平均値の差= 37.0000 平均値と最も近いデータ= データ(3): 45.0000 以下:貰ったヒント スタート―データ入力(関数1)―合計の計算(関数2)―データ選出(関数3) おわり indate関数1 sum関数2 Prdate関数3 引数 void データの数 戻り値、データの数 戻り値 データの数 合計の結果 データの位置 Float x[100] 計算式を教えてください。 旅行客のデータから売上の予測を立てたいと考えています。条件は以下の通りです。 (例) データ数・・・10,000 一グループあたりの平均人数・・・4人 年間平均旅行回数1.7回 1人当たりの平均単価・・・30,000円 ※来年も今年と同じ成長だとする。 この条件が意味することは、10,000人の中にはグループがある(例では、一グループあたり4人)ということです。 そうなると、単純に 10,000×1.7×30,000の計算では違うのだと思うのですが、何をどのように考えるのかわかりません。また基本的にこれだけのサンプルでは売上の予測を立てるのは不十分なのかとも考えています。 平均値の求め方、 先ほどと、似たような質問ですが、 質問の数式が異なっているので、別な形で 質問させてください。 ある値(a1,a2,a3)があり、3つの値の平均値を★とします。 この平均値を以下の式に入れます。 X1=((1/★-1/●)/2)*1000…(1) ※●には任意の2桁の整数が入ります。 (1)の式の★の所に先ほど出た(a1,a2,a3)を それぞれ用いて値を以下のように出しました。 X2=((1/a1-1/●)/2)*1000…(2) X3=((1/a2-1/●)/2)*1000…(3) X4=((1/a3-1/●)/2)*1000…(4) ※(1)~(4)までの●の値は全て同じ値です。 そして、X2~X4の平均値Yを求めたのですが、 X≠Yとなってしまいました。 これも、値が一緒になるということはないのでしょうか? 度々の質問で申し訳ありませんが、 ご対応の程、よろしくお願い致します。 移動平均の計算について 株式用語で移動平均値がありますが個の値にゼロが混入したら移動平均の計算はどのようになりますか 移動平均値を逆算する計算式 株をやってます。 移動平均値をクロスする値を逆算したいのですが、 たとえば 7日間の移動平均値を毎日の終値で出していたとする。 実線(ローソク足)が明日いくらだったら、当日を含めた7日間の移動平均値と同じ値になるのか? 移動平均値と、実線の価格との乖離が0になる値を出すのは分かりますが、実際に関数を使って出そうとすると難しいです。 平均値と乖離を並べて、具体的に値を入れてみて0になったら、あ、これがその値か、と分かるのですが・・・逆算式って難しい。 よろしくおねがいします。 ※1 実際の取引で損失が出ても責任はありません。 ※2 利益が出ても連絡はいたしませんw。 group by 0とnull値は、平均値の計算から省きたい 行ないたいこと group by avgのSQLで、0とnull値は、平均値の計算から省きたい 各フィールドの平均値を出力したいのですが、 0とnullの値は、平均値の計算から省いて計算する必要があります。 (分母にカウントしません) 平均値を求めるフィールドが、1つだけなら、条件式を作成することが出来たのですが、同時に3つのフィールドの計算を求める必要があります。 環境:oracle10 -table hoge 日付, a , b, c 5/4 200,null,50 5/5 200,100,0 5/6 200,null,100 期待する値(各フィールドの平均値、だたし0とnullは分母から除外) a = (200+200+200)/3 = 200 b = 100/1 = 100 c = (50+100)/2 = 75 質問1. このようなSQLは実現可能でしょうか? 質問2. 実現可能であれば、ご教示いただきたいのですが… よろしくお願いいたします。 perlでの配列について 配列の配列について教えてください。 以下のようなテキストから値を取得し、A,B,Cの値をそれぞれ別の配列に格納し、A,B,Cの平均値を出す処理を行っているとします。 ----- A=100 B=200 C=300 A=110 B=210 : ----- 現状、以下のような状態です。 @arrayA=(); @arrayB=(); @arrayC=(); : (テキストを読み込み) : ・読み込んだ行がA=XXXならarrayAにpush push(@arrayA,"100"); ・読み込んだっ行がB=XXXならarrayBにpush push(@arrayB,"100"); : (各配列の要素の平均値を出す) このやり方だと、グループが増えるとそのまま行数が増えて冗長なので、グループごとの配列を1つの配列にまとめたいのです。 Webで初期値を入れた形で説明しているのはよくみるのですが、今回のように空の配列に値をいれていくにはどうすればよいのでしょうか?(そもそも宣言の仕方もわかりません)。 また、配列の配列?とした場合、以下のような処理はできるのでしょうか? (1)配列の1つ目の要素(の配列)にpushする(現状でのarrayAにpushに該当) push(@arrayAll[0],"test"); 加重平均-重みのつけ方 加重平均の考え方についてお尋ねします。 2つのグループの身長データが次のようにあるとします。 (A)165,176,169,170(B)158,163,166 全てのデータの算術平均は、約166.7になります。 【質問1】このデータに重みをつけて計算をしたいのですが、どのように(ランクとかクラス別や男女別など)重みをつけるべきなのかがそもそも分かっておりません。次のいずれが正しい方法に該当するのでしょうか?該当しない場合もその旨を教えてください。 【質問2】また1)の考え方だけが正しい場合、そもそも加重平均をするには、AとBが同じ属性のデータ(2クラス分の男子データ)の時にのみ統計的に有効なのか?異なる属性データ(Aが男子でBが女子)でも有効なのかも教えていただけると助かります。 1)ABでわける Aの平均=(170 x4) Bの平均=(162 x3) ((170x4)+(162x3))÷(4+3)≒166.7 2)度数分布1(スタージェスの公式) 階級の数n(4)階級の幅(4.5)最小値(158)最大値(176) (162.5 x1) (167.0 x3) (171.5 x2) (176.0 x1) の4グループに分け計算。総和÷(1+3+2+1)≒168.9 3)度数分布2(単なる思いつきの6センチ間隔) (158 x1) (164 x1) (170 x4) (176 x1) の4グループに分け計算。総和÷(1+1+4+1)≒168.2 加重計算の結果が通常の算術平均と同じ値になる場合が多く、単なる計算の簡便法なのかと混乱しつつあって、この計算方法の意義がどこにあるのかも分からなくなりつつあります。 相撲部 80kg x3と柔道部 50kg x2の加重平均は68kgで、普通の平均(80+80+80+50+50)÷5でも68Kgで同じ。 製品のボリュームごとに応じて販売単価が異なるような場合に加重平均の計算が活用されると聞いたことがあるのですがどのような表にすればよいのか皆目見当もつきません。 平均値の計算方法 お世話になります 平均値の計算式での質問です ある 支店の5年間の売り上げが 94 92 71 92 95 だったと仮定します この支店の平均値は 88.8になります しかし この支店の能力としては 93 ぐらいの実力だと推測できます 異常に売り上げの少ない 値が入ったため 実力は平均値以上のはずなのですが 平均値が小さく出てしまいます このような場合は (より妥当と思われる) 平均値を出すには どうしたら いいでしょうか 宜しくお願い致します AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム 複数の行を集約するSQLについて 以下のテーブルのレコードをもとに A B C 1| あ | あ | 1 | 2| あ | い | 1 | 3| あ | う | 1 | 4| う | あ | 1 | 5| え | あ | 1 | 6| あ | あ | 2 | 7| あ | い | 2 | 8| あ | う | 2 | 9| う | あ | 2 | 以下のテーブルを作成したいと考えています。 A B C D E 1| あ | あ | 1 | あ | - | 2| あ | い | 1 | い | - | 3| あ | う | 1 | う | あ | 4| え | あ | 1 | - | え | 5| あ | あ | 2 | あ | - | 6| あ | い | 2 | い | - | 7| あ | う | 2 | う | あ | (1)カラムCを1つのグループとします。 (2)その中でカラムAの値が「あ」の場合は、カラムBの値をカラムDに設定する。 (3)カラムAの値が「あ」ではない場合は、カラムBの値をカラムEに設定する。 (4)カラムAの値とカラムBの値を入替えると同じ場合は(例では上の表の3と4、8と9のレコード)、 カラムAの値が「あ」でない方のレコード(4と9のレコード)のカラムBの値をカラムEに設定する。 (5)(4)で値を設定した方のレコードを削除する。 どのようなSQLを作成すればできるのでしょうか? SQLに詳しい方がいらっしゃれば、ご教授をお願います 平均値の算出 以下のようなタブ区切りファイルで、 aaa xxxx 10 bbb yyyy 20 ccc zzzz 30 3つ目のカラムの平均値を算出するUNIXコマンドORシェルってできるのでしょうか? (10+20+30)/3 = 20 アウトプットとしては、平均値の"20"と行数の"3"が欲しいです。 よろしくおねがいします。 分散分析の平均値と実際の平均値のズレ 統計初心者です。 現在SPSSを用いてデータの解析を行っており、対応のある3要因分散分析(被験者間要因:1、被験者内要因:2)を反復測定→多重比較(Bonferroni)にて行いました。 その結果、それなりの結果が得られたのですが、気にかかる点があります。 SPSSにて反復測定→多重比較を行った結果として表示された平均値と、実際のデータをエクセル上で平均して得られた平均値とに、微妙に違い(値のズレ)があります。 分散分析を行っている以上、実際の生データの平均値との間にズレが生じてしまうのは当然なのでしょうか?それとも、このズレは解析において何か致命的なミス(データの読み込み失敗、解析方法や条件設定の選択間違い)によって生じてしまった「誤った値」なのでしょうか? また、もし今回分散分析によって得られた平均値が妥当であるならば、論文等にグラフを書く際には、分散分析の結果得られた平均値と生データの平均値のどちらを用いるべきなのでしょうか? 拙い説明で申し訳ありませんが、ご教授頂ければ幸いと存じます。 宜しくお願い申し上げます。 幾何平均の収束の問題 学校の課題で以下の問題がありました、まったくわかりません。 「区間(0,1)の一様乱数の幾何平均 データ→∞のとき ある値に収束することを示せ」 です、ヒントでも答えでも誰か教えてください! 可視セルのみで平均を計算 Sheet1にある表をオートフィルタで抽出し、その可視セルの三列目にある値の平均値をSheet2のあるセルに出力するマクロを作りたいのですが、どうすればいいでしょうか? ↓これがキー 番号 名前 値 027*** あそこ 12 027*** こちら 0 027*** どちら 5 ・ ・ ・ ・ ・ ・ ・ ・ ・ 右の値の平均値をSheet2に出力 Excel_条件に合う範囲の平均値の求め方 Excel関数についての質問です。 以下のようなデータが合った場合、条件に合う範囲のデータのみ 抜き出して平均値を求める方法を教えてください。 ■やりたいこと マイナスが続いている範囲を見つけ出し、マイナスが続いている 範囲のみの平均を算出する。 以下で言うとB4~B7の平均を自動で計算してくれる 関数を考えています。 A列:時間が入っていますが、これ自体も他の値を時間に換算したもの。 (式が入っています。) B列:データが入っており、プラスの領域とマイナスの領域を交互に繰り返す。 A B 1 Time DATA 2 0 0.05 3 6 0.04 4 8 -0.02 5 11 -0.01 6 15 -0.03 7 17 -0.05 8 21 0.05 9 24 0.06 10 27 -0.03 ・・・(以下プラスとマイナスが交互に続きます。) DABERAGEなどの様に、条件に合うセルの平均ではなく、 ある範囲のセルの平均を出したいと思いますが 中々良い案がありません。 よろしくお願いします。 excelで平均差を出したい 例えば100個のデータがあったとして、個々のデータのすべての組み合わせの差を平均した値(平均差だと思うのですが・・)を、excelを使って出したいのですが、何か方法はあるでしょうか?どうか教えてください。 相乗平均を計算する方法 大量のデーターの平均値をコンピューター上で求める方法で、困っています。 まず、制約として、コンピューターのメモリーが足りないので、すべてのデータを一度に見ることができません。そこで、順番に入ってくるデータを、順次的に計算する方法を考えているのですが・・・ 相加平均ならば、n番目のデータまでの平均値は、 (n-1番目までの平均値 × (n-1) + n番目のデータ)÷ n という計算で、順次的に計算できるのですが、 相乗平均を、同様に、うまく計算する方法はないでしょうか? いちおう、 (n-1番目までの相乗平均 ^ (n-1) × n番目のデータ)^ (1/n) という計算式は思いついたのですが、(「^」は累乗) データの個数が多くなると、コンピューター上ではとうてい計算しきれない数値になってしまいます。 なにかよい計算方法ないでしょうか? あるいは、相乗平均のように、極端なデータに強い(?)平均値の求め方はないでしょうか? 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
早速の回答ありがとうございます。 hashにもあまり慣れていないプログラミング初心者でなかなか理解するのが難しい状態です。もしよろしければもう少し具体的な構成を教えていただけないでしょうか?