実現したいこと
WEBアンケート調査で価格に関する回答別(4種)に滑らかな曲線を描き、検討に使いたい。
Q1,Q2,Q3,Q4には自由回答の金額(数字データ)が得られる予定。現在はダミーデータで練習中
前提
・pythonで計算し可視化したい。
・理想は下記マクロミル社が提唱しているprice2のような事を自分でもやりたい。
https://www.macromill.com/service/data-analysis/price2/
Q1.いくらくらいから「安い」と感じますか。
Q2.いくらくらいから「高い」と感じますか。
Q3.これ以上高いと「高すぎて買えない」と思う価格はいくらくらいですか。
Q4.これ以上安いと「品質に不安を感じる」価格はいくらくらいですか。
試したこと
・(滑らかにできないので)1000円から10000円までのbinを作り該当する件数を全体件数で割り、割合を出す。
・Chat gptに相談したが、グラフが未出力だったり数日間問答してもダミーデータの1-2件ともマッチしない。
該当のソースコード *CHATGPTに相談したものです。下記の通りデータに合わない変なグラフになりました。こちらに合わせなくて問題ございません。
python
1import pandas as pd 2import seaborn as sns 3import matplotlib.pyplot as plt 4 5# CSVファイルを読み込む 6data = pd.read_csv("test_price1.csv") 7 8# 価格帯の設定 9bins = [0, 2000, 4000, 6000, 10000] 10labels = ['0-2000', '2001-4000', '4001-6000', '6001-10000'] 11 12# 価格帯を計算してデータに追加 13data['Price_Range'] = pd.cut(data['Price'], bins=bins, labels=labels) 14 15# 各質問に対する該当割合を計算 16total_responses = len(data) # 全体の回答数 17data['Percentage_Q1'] = data['Q1'].apply(lambda x: 1 if x >= 2000 else 0).groupby(data['Price_Range']).transform('sum') / total_responses 18data['Percentage_Q2'] = data['Q2'].apply(lambda x: 1 if x >= 2000 else 0).groupby(data['Price_Range']).transform('sum') / total_responses 19data['Percentage_Q3'] = data['Q3'].apply(lambda x: 1 if x >= 2000 else 0).groupby(data['Price_Range']).transform('sum') / total_responses 20data['Percentage_Q4'] = data['Q4'].apply(lambda x: 1 if x >= 2000 else 0).groupby(data['Price_Range']).transform('sum') / total_responses 21 22# グラフのプロット 23plt.figure(figsize=(10, 6)) 24sns.set(style='whitegrid') 25sns.lineplot(data=data, x='Price_Range', y='Percentage_Q1', label='Q1', marker='o', color='blue') 26sns.lineplot(data=data, x='Price_Range', y='Percentage_Q2', label='Q2', marker='s', color='green') 27sns.lineplot(data=data, x='Price_Range', y='Percentage_Q3', label='Q3', marker='^', color='orange') 28sns.lineplot(data=data, x='Price_Range', y='Percentage_Q4', label='Q4', marker='D', color='red') 29 30# グラフの装飾 31plt.xlabel('Price Range') 32plt.ylabel('Percentage of Respondents') 33plt.title('Percentage of Respondents by Price Range') 34plt.grid(True) 35plt.gca().yaxis.set_major_formatter('{:.0%}'.format) # 垂直軸を%表記にする 36plt.ylim(0, 1) # 垂直軸の範囲を0%から100%に設定 37 38# グラフを表示 39plt.tight_layout() # レイアウトを調整して重なりを解消 40plt.show()

ご参考
趣旨踏まえた範囲内で乱数で作成したダミーデータ *上記コードで参照しているtest_price.csvの内容
下記の他にPrice列(こちらの画面で見辛いため削除)があり、binの基準として1000円から1000円ずつ10000円まで値があります。
|Q1 |Q2 |Q3 |Q4 |
3000 7000 10000 1500
1500 2900 8000 300
1169 5347 6496 695
927 2712 9574 400
1042 4402 7456 253
1048 5607 7171 105
1155 5319 6747 231
713 4198 7469 271
522 3920 8276 227
796 5989 5973 181
1079 5741 9683 146
541 3959 5089 291
698 3110 7165 185
814 4475 7334 604
1027 5283 9624 169
1101 5568 6817 266
1148 3649 8574 240
1049 2766 7968 113
1154 4289 5254 545
951 5497 7042 440
579 3911 8631 300
941 4542 9875 264
1112 4552 7130 318
680 4624 9846 276
1147 3134 5597 270
1072 3451 7647 727
1064 4825 8290 407
667 4420 5969 434
1025 4901 8115 579
724 4414 5300 207
1123 5237 9626 464
568 2588 8484 519
646 3584 5872 596
738 5752 5767 395
632 5296 8781 464
751 3747 7264 276
915 3576 5882 537
1096 5946 8203 423
1067 3791 7880 476
558 4294 9644 293
791 3698 7567 173
523 4924 6185 709
767 4643 8629 149
1129 5920 5532 384
1137 5275 9268 454
644 4393 8834 229
回答2件
あなたの回答
tips
プレビュー
