【勉強メモ06】縦持ちデータに変換しBIツールを使いやすくしよう

# 始めに
今回記事作成者の機械学習の勉強＆メモのために記事を作成しています
間違いなどありましたらコメントにてご指摘いただけると幸いです。
もっといいやり方などもありましたらコメントください。
よろしくお願いいたします。

# 今回の目的
BIツールを使う際に縦持ちのデータの方が取り扱いがしやすいため、
その変換方法について記載する

# 参考資料

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15576681%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  >Pythonによるあたらしいデータ分析の教科書 [ 寺田 学 ]</a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15576681%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/2132e914.2fe6209c.2132e915.6ace3022/?me_id=1213310&item_id=19251192&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F8341%2F9784798158341.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15697205%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  >見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑 [ 秋庭 伸也 ]</a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15697205%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/2132e914.2fe6209c.2132e915.6ace3022/?me_id=1213310&item_id=19382494&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F5654%2F9784798155654.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>

# ライブラリを呼び出そう

```Python

#ライブラリのインポート
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
import random
random.seed(0)
import copy

#　データ可視化のライブラリ
import seaborn as sns
#最大表示列数の指定（ここでは100列を指定） 
pd.set_option('display.max_columns',100)

# floatの表示方法を、小数点以下2桁で設定する処理
pd.options.display.float_format = '{:.2f}'.format

```

# データの準備＆確認

```Python
#データの読み込み
# data →　呼び出すデータのファイル名
# train_data.csv → 読み込むファイル名
data = pd.read_csv("data/train_data.csv")

#データの確認
data.head()

#データ数確認
data.shape

#データ情報の要約確認
data.info()

#データ統計要約確認
data.describe()

```

# 欠損値の確認&削除方法

参考

https://note.nkmk.me/python-pandas-nan-dropna-fillna/



```
#データの欠損値を確認したい場合
df.isnull().sum()

#列の値が全て欠損値の場合削除する
df = df.dropna(how="all",axis = 1)

#XXの列に欠損値がある場合、その行を削除する
df = df.dropna(subset = ["XX"])

```

# 年数ごとに区分を分ける

```
#勤続年数の部分を取り出し、リストに変換する
X = "勤続年数"
rows = []
for i in df[X]:
    rows.append(i)

# 年数ごとの区分を分ける
# 
#勤続年数の区分を作成する
#1年未満　(i <1の場合、"1年未満"と表示)
#1年以上〜3年未満(i<3の場合、"1年以上~3年未満"と表示)
#3年以上〜5年未満(i<5の場合、"3年以上~5年未満"と表示)
#5年以上〜10年未満(i<10の場合、"5年以上~10年未満"と表示)
#10年以上(else、"10年以上"と表示)

#空のリストを作成
years = []

#リストの数値によって、区分を入力する
for i in rows:
    if i < 1:
        years.append("1年未満")
    elif i <3:
        years.append("1年以上~3年未満")
    elif i < 5:
        years.append("3年以上~5年未満")
    elif i <10:
        years.append("5年以上~10年未満")
    else:
        years.append("10年以上")

#"年数区分"にリストの値を挿入していく
df["年数区分"] = years
#データセットの確認をする。
df.head()

```

# 縦持ちのデータに変換する
参考

https://www.gixo.jp/blog/14316/


https://ohke.hateblo.jp/entry/2018/07/21/230000


https://www.salesanalytics.co.jp/datascience/datascience021/



```
# 縦持ちにデータ変換
#左から6列目までのデータをIDとする
id_vars = list(df.columns[:7])
#左から7列目以降のデータを値とする
value_vars = list(df.columns[8:])

#データを縦持ちにする
df = df.melt(id_vars=id_vars,value_vars=value_vars,)
#データを確認する
df.head()

```

# カラム名を変更する場合

```
#"variable"を"項目"にカラム名を変更する
df = df.rename(columns = {"variable":"項目"})

```

# 条件に当てはまったデータを抽出する

```
#製品リストの作成
#Semi ⇨ 製品名の入った表　としている
df_list = Semi
rows = df_list["製品リスト"]
#表の中に入っている値を全て取り出す、区切りは"/"で行う
all_ele_list = "/".join(rows)
all_ele_list = all_ele_list.split("/")
unique_ele_list = list(set(all_ele_list))
target_list= sorted(unique_ele_list)
#条件として当てはめるリスト作成
#target_list

# 読み込み条件を当てはめる
df_Semi= df_after.query("商品リスト in @target_list")
#表として出力する
df_Semi.head()

```


# データをエクセルに出力する

```

# "加工後データ"というエクセルファイルを出力する
df_after.to_excel("加工後データ.xlsx", index=False, encoding='cp932')

#"加工後データ"というCSVファイルを出力する
df.to_csv('加工後データ.csv')

```