ビズオーシャンでのインターン日記

プログラミング未経験の文系大学生がインターンシップで頑張る日記です

vol.6 データを数字に変換


4月に入ってからは
機械学習でデータ分析するための下準備を進めていますが、

機械学習でデータ分析をするには
すべてのデータを数字に変換する必要があるので
今回はそれを中心に書いていって、


そのほか、
わたしが新しく知った関数がいくつかあるので、
最後のほうに備忘録として書こうと思います。




ユーザーに関するあらゆるデータを数字に変換


といっても、ユーザーのデータには

①連続値:数字で説明できるデータ(従業員数や年収など)
②離散値:数字で説明できないデータ(役職や業種など)

があって、、、



①従業員数や年数など


これらは順番に並べられそうなので、
その順番通りに数字を振っていく。



例えば従業員数、

# employee_scale
member_df["employee_scale_num"] = member_df['employee_scale'].map({
    '1~9名':0,
    '10~49名':1,
    '50~99名':2,
    '100~299名':3,
    '300~499名':4,
    '500~999名':5,
    '1000~2999名':6,
    '3000~4999名':7,
    '5000~9999名':8,
    '10000名以上':9,
  })
#member_df


「1~9名」や「10~49名」は
そのままでは単なる文字列なので、
「map」で連続値に変換し、意味を持たせる。



②役職や業種など

こっちは数字にして並べることができないので、
真偽値に変換してデータフレームの表を埋めていく。

真偽値に変換するには
Pandasの「get_dummies()」を使用

bool_columns = ['managerial_position', 'job_spec1', 'industry']
pd.set_option("display.max_columns", 560)
member_df = pd.get_dummies(member_df, columns=bool_columns)


・bool_columns = ['managerial_position', 'job_spec1', 'industry']
役職、職種、業種などで同じ作業をしていくので、
「bool_columns」で括ると1回の作業で済む

・pd.set_option("display.max_columns", 560)
columns数を560に設定

・member_df = pd.get_dummies(member_df, columns=bool_columns)
get_dumiesで真偽値に変換
(既成のmember_dfのcolumns部分に[bool_columns]をもってきて)真偽値に変換、
変更を上書きされたデータフレームとしてのmember_dfを表示



f:id:yuka_nakayama:20170425110155p:plain


これはデータフレーム全体のごく一部でしかないので
分かりずらいが、


1番上のユーザーの役職は「その他」、
上から5番目のユーザーの役職は「一般社員・職員」

であることを示す

(真であれば1、偽であれば0)






備忘録

⑴ランダム抽出

機械学習のための下準備をするうえで
データが大きすぎると時間やお金がかかってしまうので、


ユーザー数を少なめにして、データを小さくしてスキャンを試みる。


たくさんのユーザーからたとえば100人のみをランダムに抽出するとき、

SELECTで
 rand() を使って全ユーザーに0以上1未満の数をランダムに振る、
 (振った数を random とおく)
ORDER BYで
 random を降順に並べる

で、LIMIT 100で絞ると、
結果としてユーザー100人をランダム抽出できたことになる。


⑵日数の差を求める

例えば入会日から現在までの日数を求めるとき、


DATEDIFFで期間(日数)を求める
期間…CURRENT_TIMESTAMP(サーバーの現在の日時) と
   TIMESTAMP(create_date)(入会した日時)  の期間

DATEDIFF(CURRENT_TIMESTAMP(),TIMESTAMP(create_date)) as create_date_duration