第3章 集計と可視化からデータを理解する
In [1]:
Copied!
import polars as pl
from scipy import stats
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.express as px
import polars as pl
from scipy import stats
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.express as px
焼肉店データの基礎集計¶
In [2]:
Copied!
url_yakiniku_data = 'https://raw.githubusercontent.com/asakura-data-science/marketing/main/Chapter_3/in/yakiniku_2018.csv'
df = (
pl.read_csv(url_yakiniku_data)
.with_columns(pl.col('日付').cast(pl.Utf8).str.to_date(format='%Y%m%d'))
)
df.head()
url_yakiniku_data = 'https://raw.githubusercontent.com/asakura-data-science/marketing/main/Chapter_3/in/yakiniku_2018.csv'
df = (
pl.read_csv(url_yakiniku_data)
.with_columns(pl.col('日付').cast(pl.Utf8).str.to_date(format='%Y%m%d'))
)
df.head()
Out[2]:
shape: (5, 11)
店舗ID | 日付 | 時間 | 取引ID | 取引明細ID | 商品ID | 商品名 | 単価 | 数量 | 支払方法 | 分類 |
---|---|---|---|---|---|---|---|---|---|---|
i64 | date | i64 | i64 | i64 | i64 | str | i64 | i64 | str | str |
1 | 2018-03-01 | 114818 | 1 | 1 | 112 | "霜降切落し焼肉定食" | 1300 | 1 | "クレジット" | "定食" |
1 | 2018-03-01 | 114818 | 1 | 2 | 121 | "Sとろろ" | 0 | 1 | "クレジット" | "サイド" |
1 | 2018-03-01 | 114950 | 2 | 1 | 104 | "石焼ビビンバ定食" | 1100 | 1 | "クレジット" | "定食" |
1 | 2018-03-01 | 115043 | 3 | 2 | 625 | "黒毛和牛サーロイン焼肉" | 1200 | 1 | "クレジット" | "肉" |
1 | 2018-03-01 | 115043 | 3 | 3 | 330 | "ご飯" | 200 | 1 | "クレジット" | "サイド" |
営業日数と人気商品の確認¶
In [3]:
Copied!
print('データ開始日:', df['日付'].min())
print('データ終了日:', df['日付'].max())
print('営業日数:', df['日付'].unique().len())
print('データ開始日:', df['日付'].min())
print('データ終了日:', df['日付'].max())
print('営業日数:', df['日付'].unique().len())
データ開始日: 2018-03-01 データ終了日: 2019-02-28 営業日数: 364
In [4]:
Copied!
# 売上金額
df = (
df.with_columns(
(pl.col('単価')*pl.col('数量')).alias('売上金額')
)
)
print('売上金額:', df['売上金額'].sum())
# 売上金額top10商品
(
df.group_by('商品名')
.agg(pl.col('売上金額').sum())
.sort(by='売上金額', descending=True)
.head(10)
)
# 売上金額
df = (
df.with_columns(
(pl.col('単価')*pl.col('数量')).alias('売上金額')
)
)
print('売上金額:', df['売上金額'].sum())
# 売上金額top10商品
(
df.group_by('商品名')
.agg(pl.col('売上金額').sum())
.sort(by='売上金額', descending=True)
.head(10)
)
売上金額: 137681100
Out[4]:
shape: (10, 2)
商品名 | 売上金額 |
---|---|
str | i64 |
"今宵の贅沢福牛盛り" | 9361200 |
"生ビール(中)" | 5554000 |
"焼肉4000コース" | 5435200 |
"タン塩大判切り" | 4874100 |
"赤身・ハラミ焼肉定食" | 3505500 |
"厳選ハラミ焼肉定食" | 2989000 |
"厳選ハラミ" | 2877000 |
"カルビ・ハラミ焼肉定食" | 2829000 |
"カルビ・ロース・ハラミ焼肉定… | 2563600 |
"カルビ&ロース&ハラミ盛り" | 2355000 |
In [5]:
Copied!
# 例題3.1
print('商品種類数:', df['商品名'].unique().len())
# 例題3.1
print('商品種類数:', df['商品名'].unique().len())
商品種類数: 323
In [6]:
Copied!
# 例題3.2
# 売上数量上位10商品
(
df.group_by('商品名')
.agg(pl.col('数量').sum())
.sort(by='数量', descending=True)
.head(10)
)
# 例題3.2
# 売上数量上位10商品
(
df.group_by('商品名')
.agg(pl.col('数量').sum())
.sort(by='数量', descending=True)
.head(10)
)
Out[6]:
shape: (10, 2)
商品名 | 数量 |
---|---|
str | i64 |
"生ビール(中)" | 11108 |
"ご飯" | 5636 |
"烏龍茶" | 4600 |
"・大判切りタン塩" | 4577 |
"・大判ハラミ1枚切リ" | 4519 |
"タン塩大判切り" | 4431 |
"ご飯大盛り" | 3277 |
"厳選ハラミ焼肉定食" | 2989 |
"・デザート" | 2955 |
"厳選ハラミ" | 2877 |
月別売上金額の確認¶
In [7]:
Copied!
# 月別の売上金額
df_monthly_sales = (
df.sort(by='日付')
.group_by_dynamic(index_column='日付', every='1mo')
.agg(pl.col('売上金額').sum(), pl.col('日付').unique().len().alias('日数'))
.with_columns((pl.col('売上金額')/pl.col('日数')).alias('平均売上金額'))
)
# plot
fig = make_subplots(rows=1, cols=2, subplot_titles=['売上金額', '平均売上金額'])
fig.add_trace(
go.Bar(x=df_monthly_sales['日付'], y=df_monthly_sales['売上金額']),
row=1, col=1
)
fig.add_trace(
go.Bar(x=df_monthly_sales['日付'], y=df_monthly_sales['平均売上金額']),
row=1, col=2
)
fig.update_xaxes(title_text='年月')
fig.update_layout(width=800, height=600)
fig.show()
# 月別の売上金額
df_monthly_sales = (
df.sort(by='日付')
.group_by_dynamic(index_column='日付', every='1mo')
.agg(pl.col('売上金額').sum(), pl.col('日付').unique().len().alias('日数'))
.with_columns((pl.col('売上金額')/pl.col('日数')).alias('平均売上金額'))
)
# plot
fig = make_subplots(rows=1, cols=2, subplot_titles=['売上金額', '平均売上金額'])
fig.add_trace(
go.Bar(x=df_monthly_sales['日付'], y=df_monthly_sales['売上金額']),
row=1, col=1
)
fig.add_trace(
go.Bar(x=df_monthly_sales['日付'], y=df_monthly_sales['平均売上金額']),
row=1, col=2
)
fig.update_xaxes(title_text='年月')
fig.update_layout(width=800, height=600)
fig.show()
In [8]:
Copied!
# 例題3.3
# 売上金額top10の日付
(
df.group_by('日付')
.agg(pl.col('売上金額').sum())
.sort(by='売上金額', descending=True)
.head(10)
)
# 例題3.3
# 売上金額top10の日付
(
df.group_by('日付')
.agg(pl.col('売上金額').sum())
.sort(by='売上金額', descending=True)
.head(10)
)
Out[8]:
shape: (10, 2)
日付 | 売上金額 |
---|---|
date | i64 |
2019-02-10 | 910100 |
2019-01-02 | 898900 |
2018-07-14 | 819600 |
2018-03-25 | 788900 |
2018-06-02 | 788900 |
2018-03-03 | 782500 |
2018-05-03 | 746700 |
2018-12-29 | 744200 |
2018-03-31 | 723800 |
2018-10-07 | 723600 |
In [9]:
Copied!
import zipfile
import requests
import io
url_zip_data = 'https://github.com/asakura-data-science/marketing/raw/main/Chapter_3/in/sec3-2data.csv.zip'
res = requests.get(url_zip_data)
zip = zipfile.ZipFile(io.BytesIO(res.content))
df = (
pl.read_csv(zip.read('sec3-2data.csv'))
.with_columns(pl.col('日付').cast(pl.Utf8).str.to_date(format='%Y%m%d'))
)
df.head()
import zipfile
import requests
import io
url_zip_data = 'https://github.com/asakura-data-science/marketing/raw/main/Chapter_3/in/sec3-2data.csv.zip'
res = requests.get(url_zip_data)
zip = zipfile.ZipFile(io.BytesIO(res.content))
df = (
pl.read_csv(zip.read('sec3-2data.csv'))
.with_columns(pl.col('日付').cast(pl.Utf8).str.to_date(format='%Y%m%d'))
)
df.head()
Out[9]:
shape: (5, 13)
日付 | 購入数量 | 単価 | 金額 | 大分類 | 中分類 | 小分類 | 細分類 | 大分類名 | 中分類名 | 小分類名 | 細分類名 | 都道府県名 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
date | i64 | i64 | i64 | i64 | i64 | i64 | i64 | str | str | str | str | str |
2013-05-30 | 1 | 278 | 278 | 1 | 11 | 1115 | 111511 | "食品" | "加工食品" | "加工肉類" | "ベーコン" | "大阪府" |
2013-06-27 | 1 | 98 | 98 | 1 | 11 | 1113 | 111303 | "食品" | "加工食品" | "パン・シリアル類" | "菓子パン" | "大阪府" |
2013-10-31 | 1 | 98 | 98 | 1 | 11 | 1113 | 111303 | "食品" | "加工食品" | "パン・シリアル類" | "菓子パン" | "大阪府" |
2013-11-30 | 1 | 188 | 188 | 1 | 11 | 1117 | 111703 | "食品" | "加工食品" | "漬物・佃煮" | "佃煮" | "大阪府" |
2013-12-14 | 1 | 166 | 166 | 1 | 13 | 1301 | 130127 | "食品" | "菓子類" | "菓子" | "ビスケット・クッキ?" | "大阪府" |
In [10]:
Copied!
# 購入数量に関する構成比率の計算
(
df.group_by('大分類名')
.agg(pl.col('購入数量').sum())
.with_columns((pl.col('購入数量')/pl.col('購入数量').sum()).alias('構成比率'))
.sort(by='構成比率', descending=True)
)
# 購入数量に関する構成比率の計算
(
df.group_by('大分類名')
.agg(pl.col('購入数量').sum())
.with_columns((pl.col('購入数量')/pl.col('購入数量').sum()).alias('構成比率'))
.sort(by='構成比率', descending=True)
)
Out[10]:
shape: (5, 3)
大分類名 | 購入数量 | 構成比率 |
---|---|---|
str | i64 | f64 |
"食品" | 6985143 | 0.884151 |
"日用品" | 844745 | 0.106924 |
"文化用品" | 49405 | 0.006253 |
"耐久消費財" | 17443 | 0.002208 |
"衣類・身の回り品・スポーツ用… | 3660 | 0.000463 |
In [11]:
Copied!
# 例題3.4
# 金額に関する構成比率の計算
(
df.group_by('大分類名')
.agg(pl.col('金額').sum())
.with_columns((pl.col('金額')/pl.col('金額').sum()).alias('構成比率'))
.sort(by='構成比率', descending=True)
)
# 例題3.4
# 金額に関する構成比率の計算
(
df.group_by('大分類名')
.agg(pl.col('金額').sum())
.with_columns((pl.col('金額')/pl.col('金額').sum()).alias('構成比率'))
.sort(by='構成比率', descending=True)
)
Out[11]:
shape: (5, 3)
大分類名 | 金額 | 構成比率 |
---|---|---|
str | i64 | f64 |
"食品" | 1157980399 | 0.767476 |
"日用品" | 320281312 | 0.212273 |
"文化用品" | 14507064 | 0.009615 |
"耐久消費財" | 13725924 | 0.009097 |
"衣類・身の回り品・スポーツ用… | 2321927 | 0.001539 |
In [12]:
Copied!
# 都道府県と大分類のクロス集計
(
df.group_by(['都道府県名', '大分類名']).agg(pl.col('購入数量').sum())
.pivot(values='購入数量', index='都道府県名', columns='大分類名')
)
# 都道府県と大分類のクロス集計
(
df.group_by(['都道府県名', '大分類名']).agg(pl.col('購入数量').sum())
.pivot(values='購入数量', index='都道府県名', columns='大分類名')
)
Out[12]:
shape: (9, 6)
都道府県名 | 日用品 | 文化用品 | 耐久消費財 | 食品 | 衣類・身の回り品・スポーツ用品 |
---|---|---|---|---|---|
str | i64 | i64 | i64 | i64 | i64 |
"大阪府" | 121946 | 7793 | 2420 | 1080425 | 583 |
"愛知県" | 114949 | 6486 | 2276 | 974383 | 429 |
"神奈川県" | 132658 | 7948 | 2260 | 1022132 | 585 |
"千葉県" | 93298 | 5680 | 1927 | 631874 | 426 |
"兵庫県" | 62505 | 3865 | 1112 | 609932 | 266 |
"埼玉県" | 87295 | 5120 | 1747 | 731999 | 320 |
"北海道" | 92202 | 4130 | 2008 | 715934 | 452 |
"福岡県" | 102711 | 6187 | 2926 | 792718 | 479 |
"茨城県" | 37181 | 2196 | 767 | 425746 | 120 |
In [13]:
Copied!
# 例題3.5
# 都道府県と大分類の構成比率のクロス集計
(
df.group_by(['都道府県名', '大分類名']).agg(pl.col('購入数量').sum())
.with_columns((pl.col('購入数量')/pl.col('購入数量').sum()).over('都道府県名').alias('構成比率'))
.pivot(
values='構成比率', index='都道府県名', columns='大分類名'
)
)
# 例題3.5
# 都道府県と大分類の構成比率のクロス集計
(
df.group_by(['都道府県名', '大分類名']).agg(pl.col('購入数量').sum())
.with_columns((pl.col('購入数量')/pl.col('購入数量').sum()).over('都道府県名').alias('構成比率'))
.pivot(
values='構成比率', index='都道府県名', columns='大分類名'
)
)
Out[13]:
shape: (9, 6)
都道府県名 | 日用品 | 衣類・身の回り品・スポーツ用品 | 文化用品 | 耐久消費財 | 食品 |
---|---|---|---|---|---|
str | f64 | f64 | f64 | f64 | f64 |
"千葉県" | 0.127247 | 0.000581 | 0.007747 | 0.002628 | 0.861797 |
"埼玉県" | 0.105623 | 0.000387 | 0.006195 | 0.002114 | 0.885682 |
"兵庫県" | 0.092234 | 0.000393 | 0.005703 | 0.001641 | 0.90003 |
"福岡県" | 0.11349 | 0.000529 | 0.006836 | 0.003233 | 0.875911 |
"大阪府" | 0.100519 | 0.000481 | 0.006424 | 0.001995 | 0.890582 |
"茨城県" | 0.079786 | 0.000258 | 0.004712 | 0.001646 | 0.913598 |
"神奈川県" | 0.113813 | 0.000502 | 0.006819 | 0.001939 | 0.876928 |
"北海道" | 0.113169 | 0.000555 | 0.005069 | 0.002465 | 0.878742 |
"愛知県" | 0.10464 | 0.000391 | 0.005904 | 0.002072 | 0.886994 |
詳細な分類レベルの集計¶
In [14]:
Copied!
# 食品中分類のクロス集計
fig = px.bar(
df.filter(pl.col('大分類名')=='食品')
.group_by(['中分類名', '都道府県名']).agg(pl.col('購入数量').sum()),
x='都道府県名', y='購入数量', color='中分類名'
)
fig.update_layout(width=800, height=600)
fig.show()
# 食品中分類のクロス集計
fig = px.bar(
df.filter(pl.col('大分類名')=='食品')
.group_by(['中分類名', '都道府県名']).agg(pl.col('購入数量').sum()),
x='都道府県名', y='購入数量', color='中分類名'
)
fig.update_layout(width=800, height=600)
fig.show()
In [15]:
Copied!
# 例題3.6
# 食品中分類の構成比率のクロス集計
fig = px.bar(
df.filter(pl.col('大分類名')=='食品')
.group_by(['中分類名', '都道府県名']).agg(pl.col('購入数量').sum())
.with_columns((pl.col('購入数量')/pl.col('購入数量').sum()).over('都道府県名').alias('構成比率')),
x='都道府県名', y='構成比率', color='中分類名'
)
fig.update_yaxes(range=[0, 1])
fig.update_layout(width=800, height=600)
fig.show()
# 例題3.6
# 食品中分類の構成比率のクロス集計
fig = px.bar(
df.filter(pl.col('大分類名')=='食品')
.group_by(['中分類名', '都道府県名']).agg(pl.col('購入数量').sum())
.with_columns((pl.col('購入数量')/pl.col('購入数量').sum()).over('都道府県名').alias('構成比率')),
x='都道府県名', y='構成比率', color='中分類名'
)
fig.update_yaxes(range=[0, 1])
fig.update_layout(width=800, height=600)
fig.show()
In [16]:
Copied!
# 冷凍食品のクロス集計
url_reishoku_data = 'https://github.com/asakura-data-science/marketing/raw/main/Chapter_3/in/sec3-2data_reisyoku.csv'
df_reishoku = (
pl.read_csv(url_reishoku_data)
.with_columns(pl.col('日付').cast(pl.Utf8).str.to_date(format='%Y%m%d'))
.group_by(['名称', '都道府県名']).agg(pl.col('購入数量').sum())
.pivot(
values='購入数量', index='名称', columns='都道府県名'
)
.fill_null(0)
.with_columns(pl.sum_horizontal(pl.exclude('名称')).alias('合計'))
.sort(by='合計', descending=True)
)
# 冷凍食品のクロス集計
url_reishoku_data = 'https://github.com/asakura-data-science/marketing/raw/main/Chapter_3/in/sec3-2data_reisyoku.csv'
df_reishoku = (
pl.read_csv(url_reishoku_data)
.with_columns(pl.col('日付').cast(pl.Utf8).str.to_date(format='%Y%m%d'))
.group_by(['名称', '都道府県名']).agg(pl.col('購入数量').sum())
.pivot(
values='購入数量', index='名称', columns='都道府県名'
)
.fill_null(0)
.with_columns(pl.sum_horizontal(pl.exclude('名称')).alias('合計'))
.sort(by='合計', descending=True)
)
In [17]:
Copied!
# 例題3.7
print('商品数:', df_reishoku.shape[0])
df_reishoku.head(30)
# 例題3.7
print('商品数:', df_reishoku.shape[0])
df_reishoku.head(30)
商品数: 5103
Out[17]:
shape: (30, 11)
名称 | 大阪府 | 神奈川県 | 愛知県 | 福岡県 | 埼玉県 | 北海道 | 千葉県 | 兵庫県 | 茨城県 | 合計 |
---|---|---|---|---|---|---|---|---|---|---|
str | i64 | i64 | i64 | i64 | i64 | i64 | i64 | i64 | i64 | i64 |
"冷凍食品4907" | 774 | 711 | 734 | 657 | 448 | 161 | 391 | 445 | 246 | 4567 |
"冷凍食品2459" | 380 | 271 | 199 | 315 | 249 | 122 | 166 | 92 | 62 | 1856 |
"冷凍食品4897" | 224 | 284 | 232 | 230 | 111 | 180 | 125 | 98 | 81 | 1565 |
"冷凍食品1985" | 256 | 170 | 212 | 298 | 152 | 68 | 170 | 107 | 124 | 1557 |
"冷凍食品4892" | 317 | 228 | 146 | 192 | 151 | 93 | 68 | 89 | 149 | 1433 |
"冷凍食品2342" | 170 | 196 | 145 | 277 | 114 | 90 | 73 | 59 | 56 | 1180 |
"冷凍食品1170" | 229 | 196 | 75 | 119 | 107 | 86 | 103 | 124 | 98 | 1137 |
"冷凍食品4975" | 189 | 154 | 138 | 127 | 118 | 62 | 94 | 52 | 102 | 1036 |
"冷凍食品2610" | 131 | 153 | 97 | 280 | 88 | 17 | 101 | 66 | 67 | 1000 |
"冷凍食品2359" | 72 | 248 | 95 | 123 | 141 | 55 | 116 | 39 | 68 | 957 |
"冷凍食品2523" | 129 | 131 | 107 | 174 | 101 | 23 | 101 | 61 | 90 | 917 |
"冷凍食品1091" | 192 | 178 | 93 | 124 | 113 | 17 | 60 | 71 | 64 | 912 |
… | … | … | … | … | … | … | … | … | … | … |
"冷凍食品1072" | 72 | 129 | 100 | 136 | 71 | 67 | 62 | 67 | 72 | 776 |
"冷凍食品1010" | 124 | 202 | 69 | 54 | 104 | 56 | 63 | 29 | 72 | 773 |
"冷凍食品5006" | 168 | 93 | 71 | 79 | 90 | 48 | 48 | 69 | 76 | 742 |
"冷凍食品5000" | 162 | 121 | 33 | 61 | 189 | 22 | 94 | 25 | 28 | 735 |
"冷凍食品4465" | 71 | 120 | 42 | 114 | 91 | 25 | 65 | 114 | 83 | 725 |
"冷凍食品3028" | 78 | 130 | 99 | 133 | 111 | 19 | 36 | 25 | 87 | 718 |
"冷凍食品4462" | 129 | 50 | 89 | 110 | 80 | 18 | 67 | 59 | 101 | 703 |
"冷凍食品2673" | 185 | 46 | 82 | 66 | 30 | 60 | 48 | 119 | 66 | 702 |
"冷凍食品0097" | 83 | 238 | 58 | 25 | 70 | 74 | 76 | 25 | 38 | 687 |
"冷凍食品3145" | 150 | 61 | 69 | 90 | 32 | 66 | 62 | 79 | 64 | 673 |
"冷凍食品4466" | 105 | 77 | 99 | 59 | 129 | 13 | 87 | 74 | 27 | 670 |
"冷凍食品2970" | 117 | 64 | 102 | 102 | 52 | 42 | 38 | 59 | 94 | 670 |
In [18]:
Copied!
# 例題3.8
(
df_reishoku.head(30)
.with_columns(pl.exclude('名称', '合計')/pl.col('合計'))
.drop('合計')
)
# 例題3.8
(
df_reishoku.head(30)
.with_columns(pl.exclude('名称', '合計')/pl.col('合計'))
.drop('合計')
)
Out[18]:
shape: (30, 10)
名称 | 大阪府 | 神奈川県 | 愛知県 | 福岡県 | 埼玉県 | 北海道 | 千葉県 | 兵庫県 | 茨城県 |
---|---|---|---|---|---|---|---|---|---|
str | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 |
"冷凍食品4907" | 0.169477 | 0.155682 | 0.160718 | 0.143858 | 0.098095 | 0.035253 | 0.085614 | 0.097438 | 0.053865 |
"冷凍食品2459" | 0.204741 | 0.146013 | 0.10722 | 0.16972 | 0.134159 | 0.065733 | 0.08944 | 0.049569 | 0.033405 |
"冷凍食品4897" | 0.143131 | 0.18147 | 0.148243 | 0.146965 | 0.070927 | 0.115016 | 0.079872 | 0.06262 | 0.051757 |
"冷凍食品1985" | 0.164419 | 0.109184 | 0.136159 | 0.191394 | 0.097624 | 0.043674 | 0.109184 | 0.068722 | 0.07964 |
"冷凍食品4892" | 0.221214 | 0.159107 | 0.101884 | 0.133985 | 0.105373 | 0.064899 | 0.047453 | 0.062107 | 0.103978 |
"冷凍食品2342" | 0.144068 | 0.166102 | 0.122881 | 0.234746 | 0.09661 | 0.076271 | 0.061864 | 0.05 | 0.047458 |
"冷凍食品1170" | 0.201407 | 0.172383 | 0.065963 | 0.104661 | 0.094107 | 0.075638 | 0.090589 | 0.109059 | 0.086192 |
"冷凍食品4975" | 0.182432 | 0.148649 | 0.133205 | 0.122587 | 0.1139 | 0.059846 | 0.090734 | 0.050193 | 0.098456 |
"冷凍食品2610" | 0.131 | 0.153 | 0.097 | 0.28 | 0.088 | 0.017 | 0.101 | 0.066 | 0.067 |
"冷凍食品2359" | 0.075235 | 0.259143 | 0.099269 | 0.128527 | 0.147335 | 0.057471 | 0.121212 | 0.040752 | 0.071055 |
"冷凍食品2523" | 0.140676 | 0.142857 | 0.116685 | 0.189749 | 0.110142 | 0.025082 | 0.110142 | 0.066521 | 0.098146 |
"冷凍食品1091" | 0.210526 | 0.195175 | 0.101974 | 0.135965 | 0.123904 | 0.01864 | 0.065789 | 0.077851 | 0.070175 |
… | … | … | … | … | … | … | … | … | … |
"冷凍食品1072" | 0.092784 | 0.166237 | 0.128866 | 0.175258 | 0.091495 | 0.08634 | 0.079897 | 0.08634 | 0.092784 |
"冷凍食品1010" | 0.160414 | 0.26132 | 0.089263 | 0.069858 | 0.134541 | 0.072445 | 0.081501 | 0.037516 | 0.093144 |
"冷凍食品5006" | 0.226415 | 0.125337 | 0.095687 | 0.106469 | 0.121294 | 0.06469 | 0.06469 | 0.092992 | 0.102426 |
"冷凍食品5000" | 0.220408 | 0.164626 | 0.044898 | 0.082993 | 0.257143 | 0.029932 | 0.127891 | 0.034014 | 0.038095 |
"冷凍食品4465" | 0.097931 | 0.165517 | 0.057931 | 0.157241 | 0.125517 | 0.034483 | 0.089655 | 0.157241 | 0.114483 |
"冷凍食品3028" | 0.108635 | 0.181058 | 0.137883 | 0.185237 | 0.154596 | 0.026462 | 0.050139 | 0.034819 | 0.12117 |
"冷凍食品4462" | 0.183499 | 0.071124 | 0.1266 | 0.156472 | 0.113798 | 0.025605 | 0.095306 | 0.083926 | 0.14367 |
"冷凍食品2673" | 0.263533 | 0.065527 | 0.116809 | 0.094017 | 0.042735 | 0.08547 | 0.068376 | 0.169516 | 0.094017 |
"冷凍食品0097" | 0.120815 | 0.346434 | 0.084425 | 0.03639 | 0.101892 | 0.107715 | 0.110626 | 0.03639 | 0.055313 |
"冷凍食品3145" | 0.222883 | 0.090639 | 0.102526 | 0.13373 | 0.047548 | 0.098068 | 0.092125 | 0.117385 | 0.095097 |
"冷凍食品4466" | 0.156716 | 0.114925 | 0.147761 | 0.08806 | 0.192537 | 0.019403 | 0.129851 | 0.110448 | 0.040299 |
"冷凍食品2970" | 0.174627 | 0.095522 | 0.152239 | 0.152239 | 0.077612 | 0.062687 | 0.056716 | 0.08806 | 0.140299 |
In [19]:
Copied!
# スピアマンの順位相関係数
pl.DataFrame(
stats.spearmanr(df_reishoku.head(30).select(pl.exclude('名称', '合計')).to_numpy(), axis=0).statistic,
df_reishoku.select(pl.exclude('名称', '合計')).columns
)
# スピアマンの順位相関係数
pl.DataFrame(
stats.spearmanr(df_reishoku.head(30).select(pl.exclude('名称', '合計')).to_numpy(), axis=0).statistic,
df_reishoku.select(pl.exclude('名称', '合計')).columns
)
Out[19]:
shape: (9, 9)
大阪府 | 神奈川県 | 愛知県 | 福岡県 | 埼玉県 | 北海道 | 千葉県 | 兵庫県 | 茨城県 |
---|---|---|---|---|---|---|---|---|
f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 | f64 |
1.0 | 0.260211 | 0.369962 | 0.352103 | 0.416917 | 0.405944 | 0.407482 | 0.437277 | 0.223756 |
0.260211 | 1.0 | 0.325876 | 0.522416 | 0.550957 | 0.492044 | 0.474124 | 0.117385 | 0.130648 |
0.369962 | 0.325876 | 1.0 | 0.693746 | 0.390317 | 0.438224 | 0.48497 | 0.089349 | 0.411333 |
0.352103 | 0.522416 | 0.693746 | 1.0 | 0.405607 | 0.236983 | 0.450701 | 0.331403 | 0.411706 |
0.416917 | 0.550957 | 0.390317 | 0.405607 | 1.0 | 0.147324 | 0.567613 | 0.012251 | 0.22268 |
0.405944 | 0.492044 | 0.438224 | 0.236983 | 0.147324 | 1.0 | 0.321794 | 0.267989 | 0.141681 |
0.407482 | 0.474124 | 0.48497 | 0.450701 | 0.567613 | 0.321794 | 1.0 | 0.137701 | 0.196148 |
0.437277 | 0.117385 | 0.089349 | 0.331403 | 0.012251 | 0.267989 | 0.137701 | 1.0 | 0.158962 |
0.223756 | 0.130648 | 0.411333 | 0.411706 | 0.22268 | 0.141681 | 0.196148 | 0.158962 | 1.0 |
In [20]:
Copied!
stats.spearmanr(df_reishoku.select(pl.exclude('名称', '合計')).to_numpy(), axis=0).statistic
stats.spearmanr(df_reishoku.select(pl.exclude('名称', '合計')).to_numpy(), axis=0).statistic
Out[20]:
array([[1. , 0.46399474, 0.47275958, 0.43268814, 0.43002943, 0.3361361 , 0.43796807, 0.68785589, 0.3883122 ], [0.46399474, 1. , 0.43148332, 0.35647345, 0.63642679, 0.3292525 , 0.62796494, 0.4599006 , 0.45730059], [0.47275958, 0.43148332, 1. , 0.37066235, 0.43547287, 0.38420383, 0.46764747, 0.47491876, 0.45113818], [0.43268814, 0.35647345, 0.37066235, 1. , 0.35376593, 0.3894329 , 0.37508022, 0.40276662, 0.3534561 ], [0.43002943, 0.63642679, 0.43547287, 0.35376593, 1. , 0.34108824, 0.68269525, 0.43456183, 0.55142564], [0.3361361 , 0.3292525 , 0.38420383, 0.3894329 , 0.34108824, 1. , 0.36384319, 0.35122563, 0.37680226], [0.43796807, 0.62796494, 0.46764747, 0.37508022, 0.68269525, 0.36384319, 1. , 0.44952186, 0.55952588], [0.68785589, 0.4599006 , 0.47491876, 0.40276662, 0.43456183, 0.35122563, 0.44952186, 1. , 0.38191603], [0.3883122 , 0.45730059, 0.45113818, 0.3534561 , 0.55142564, 0.37680226, 0.55952588, 0.38191603, 1. ]])
In [ ]:
Copied!