質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1278閲覧

歪度を出力したい、pandas等、列の計算が十分に理解できていない

kkmoto

総合スコア3

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/10/30 12:41

前提

あるデータフレームをboxcox変換し、そちらの歪度を出力、さらにヒストグラムを作成しようと考えています。

発生している問題・エラーメッセージ

歪度を出力しようとしてもエラーが出て先に進めません

boxcox(price) 0 [319.84933671496566, 380.5543061285084, 156.87... 1 0.547037 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) Input In [51], in <cell line: 9>() 7 print(prices, '\n') 8 #pricesの歪度を出力 ----> 9 print('prices skew:', skew(prices)) 10 # 変換後の購入金額をヒストグラムにする 11 #プロット図のサイズを設定 12 plt.rcParams['figure.figsize'] = (12.0, 6.0) File ~\anaconda3\lib\site-packages\scipy\stats\stats.py:1101, in skew(a, axis, bias, nan_policy) 1098 a, axis = _chk_asarray(a, axis) 1099 n = a.shape[axis] -> 1101 contains_nan, nan_policy = _contains_nan(a, nan_policy) 1103 if contains_nan and nan_policy == 'omit': 1104 a = ma.masked_invalid(a) File ~\anaconda3\lib\site-packages\scipy\stats\stats.py:103, in _contains_nan(a, nan_policy) 98 nan_policy = 'omit' 99 warnings.warn("The input array could not be properly " 100 "checked for nan values. nan values " 101 "will be ignored.", RuntimeWarning) --> 103 if contains_nan and nan_policy == 'raise': 104 raise ValueError("The input contains nan values") 106 return contains_nan, nan_policy ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

該当のソースコード

python3

1import pandas as pd 2import matplotlib.pyplot as plt 3from scipy.stats import boxcox 4#購入金額についてboxcox変換し、pricesというデータフレームに登録 5prices = pd.DataFrame({'boxcox(price)':boxcox(df['購入金額(円)'])}) 6 7print(prices, '\n') 8#pricesの歪度を出力 9print('prices skew:', skew(prices)) 10# 変換後の購入金額をヒストグラムにする 11#プロット図のサイズを設定 12plt.rcParams['figure.figsize'] = (12.0, 6.0) 13prices.hist()

試したこと

下記のリンクを読み、確かに複数列でpricesを作成していることが原因なのはわかったのですが、flatten()で1次元配列に変換してもエラーは直りません
https://ja.stackoverflow.com/questions/52075/valueerror-the-truth-value-of-an-array-with-more-than-one-element-is-ambiguous

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

boxcoxは、変換結果の配列だけを返すのではないので、結果をそのままDataFrameにしていることで、おかしくなっています。
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.boxcox.html

python

1prices = pd.DataFrame({'boxcox(price)': boxcox(df['購入金額(円)'])[0]})

とかではないですか。

投稿2022/10/31 13:16

bsdfan

総合スコア4560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkmoto

2022/11/01 11:20

回答ありがとうございます。ご指摘の通りです。 from sklearn.preprocessing import PowerTransformer # Box-Cox変換 pt = PowerTransformer(method='box-cox', standardize=False) box_cox = pt.fit_transform(df['購入金額(円)'].to_numpy().reshape(-1,1)) という手順を踏むことで歪度を出力することができるようになりました。 しかし、 skew(box_cox)と入力すれば array([-0.15278336])と出力され df["変換後の購入金額"] = box_cox#データフレームに変える #歪度 df["変換後の購入金額"].skew() と入力すれば -0.15394032607574867 と出力されます。同じ歪度の出力なのになぜ数値が異なる結果になるのでしょうか、よろしければお教えください
kkmoto

2022/11/02 21:34

ありがとうございます。ご指摘の通りプログラミングを動かすことで統計学の知識もアップグレードできました。 ベストアンサーとさせていただきます
guest

0

prices に np.nan が存在していそうです。
nan_policy の値を変更 or prices になんらかの加工処理を行ってからskewを使う。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.skew.html

投稿2022/10/31 01:28

fpfpfp

総合スコア55

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kkmoto

2022/10/31 12:06

回答ありがとうございます、np.nanが存在しているようです。 pricesに加工処理を行います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問