アプリケーションエンジニアのためのApache Spark入門を読む

Chapter 1 データ分析プラットフォームの概要

Chapter 2 Sparkの概要

2-5 本書で利用する環境

 Windows10上にVirtusBox+Vagrantで構築とあるがUbuntuを使っているので(mint 18.01)こちらに環境を構築する。

Chapter 3 サンプルユースケース概要

Chapter 4 Fluentd,Kafkaによるデータ収集

4-2 データ収集詳細 - Fluentd詳細

 本に従ってinstall、起動もOK、動作確認OK

f:id:bitop:20180908101816p:plain

ポート番号を8888から9999に変更

f:id:bitop:20180908102128p:plain

curlで問い合わせ

f:id:bitop:20180908111609p:plain

標準でログに保存されるのでVimで確認

f:id:bitop:20180908112119p:plain
確認OK
f:id:bitop:20180908112300p:plain

「ビックデータ分析・活用のためのSQLレシピ」を読む

7-3 データの重複を検出する

7-3-1 マスターデータの重複を検出する

import pandas as pd
import numpy as np
import psycopg2

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
mst_categories = pd.read_sql("SELECT * FROM mst_categories", conn)
print(mst_categories)

f:id:bitop:20180826071909p:plain

mst_categories.duplicated('id')

f:id:bitop:20180826071943p:plain

print(mst_categories[mst_categories.duplicated('id')])

f:id:bitop:20180826072008p:plain

「ビックデータ分析・活用のためのSQLレシピ」を読む

7-2 異常値を検出する

7-2-1 データの分布を計算する

import pandas as pd
import numpy as np
import psycopg2

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
action_log_with_noise = pd.read_sql("SELECT * FROM action_log_with_noise", conn)
print(action_log_with_noise.head(3))

f:id:bitop:20180819064102p:plain

s1 = action_log_with_noise.groupby('session').size()
s2= s1.rank(method='first')
df = pd.DataFrame([s1,s2])
print(df.T)

f:id:bitop:20180819064144p:plain

「ビックデータ分析・活用のためのSQLレシピ」を読む

7章 データ活用の精度を高めるための分析術

7-1 データを組み合わせて、新たな切り口を作る

7-1-1 IPアドレスから国・地域を補完する

import pandas as pd
import numpy as np

mst_city_ip = pd.read_csv('GeoLite2-City-Blocks-IPv4.csv')
print(mst_city_ip.head(3))

f:id:bitop:20180814080541p:plain

mst_locations = pd.read_csv('GeoLite2-City-Locations-ja.csv')
print(mst_locations.head(3))

f:id:bitop:20180814080626p:plain

import psycopg2

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
action_log = pd.read_sql("SELECT * FROM action_log_with_ip", conn)
print(action_log.head(3))

f:id:bitop:20180814080717p:plain

import ipaddress

action_log['ip'] = action_log['ip'].map(lambda x:ipaddress.ip_address(x))
mst_city_ip['network'] = mst_city_ip['network'].map(lambda x:ipaddress.ip_network(x))

print(action_log.head(3))
print(mst_city_ip.head(3))

f:id:bitop:20180814080812p:plain

pd.merge(action_log,mst_city_ip,left_on='ip',right_on='network')
#無理でした

「ビックデータ分析・活用のためのSQLレシピ」を読む

6章 Webサイトでの行動を把握するためのデータ抽出

6-1 サイト全体の特徴・傾向を見つける

6-1-1 日次の訪問者数・訪問回数・ページビューを集計する

import pandas as pd
import psycopg2
import numpy as np

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
df_acc = pd.read_sql("SELECT * FROM access_log", conn)
print(df_acc.head(3))

f:id:bitop:20180813081216p:plain

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
df_pur = pd.read_sql("SELECT * FROM purchase_log", conn)
print(df_pur.head(3))

f:id:bitop:20180813081300p:plain

df_acc['date'] = pd.to_datetime(df_acc['stamp'])
df_acc['date'] = df_acc['date'].dt.strftime('%Y-%m-%d')
df_acc_gou = df_acc.groupby('date')
data1 = df_acc_gou['long_session'].unique().map(lambda x:len(x))
data2 = df_acc_gou['short_session'].unique().map(lambda x:len(x))
data3 = df_acc_gou['stamp'].count()
df = pd.DataFrame({'access_users':data1,'access_count':data2,'page_view':data3})
df['pv_per_user'] = df['page_view']/df['access_count']
print(df)

f:id:bitop:20180813081349p:plain

「ビックデータ分析・活用のためのSQLレシピ」を読む

5-2 ユーザー全体の時系列による状態変化を見つける

import pandas as pd
import psycopg2
import numpy as np

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
df_user = pd.read_sql("SELECT * FROM mst_users", conn)
print(df_user.head(3))

f:id:bitop:20180812073419p:plain

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
df_act = pd.read_sql("SELECT * FROM action_log", conn)
print(df_act.head(3))

f:id:bitop:20180812073503p:plain

5-2-1 登録者数の推移と傾向をみる

df_user.groupby('register_date')['user_id'].count()

f:id:bitop:20180812073630p:plain

df_user['register_date'] = pd.to_datetime(df_user['register_date'])
df_user['year_month'] = df_user['register_date'].dt.year.map(lambda x:str(x)) + "-" +df_user['register_date'].dt.month.map(lambda x:str(x))
df_month = pd.DataFrame(df_user.groupby('year_month')['register_date'].count())
df_month['last_month_count'] = df_month['register_date'].shift(1)
df_month['month_over_month_ratio'] = df_month['register_date'] / df_month['last_month_count'] 
print(df_month)

f:id:bitop:20180812073722p:plain

「ビックデータ分析・活用のためのSQLレシピ」を読む

5章 ユーザーを把握するためのデータ抽出

5-1 ユーザー全体の特徴・傾向を見つける

5-1-1 ユーザーのアクション数を集計する

import pandas as pd
import psycopg2
import numpy as np

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
df = pd.read_sql("SELECT * FROM action_log", conn)
print(df)

f:id:bitop:20180805091114p:plain

#わからなくなった
total_uu = df['session'].nunique()
dg1 = df.groupby('action')
df1 = pd.DataFrame({
               'action_uu':dg1['session'].count(),
               'total_uu':total_uu
               }
              )
print(df1)

f:id:bitop:20180805091202p:plain

5-1-2 年齢別区分を集計する

import pandas as pd
import psycopg2
import numpy as np
import datetime
import math as m

conn = psycopg2.connect("dbname=BigData host=localhost user=testuser")
df = pd.read_sql("SELECT * FROM mst_users", conn)
print(df)

f:id:bitop:20180805091327p:plain

df['birth_date'] = pd.to_datetime(df['birth_date'])
df['today'] = pd.to_datetime(datetime.date.today())
dff = (df['today'] - df['birth_date'])
dff = dff.dt.total_seconds()/3600/24/365
df['age'] = dff.map(m.floor)
print(df)

f:id:bitop:20180805091455p:plain

def age_category(age):
    if 4 <= age <= 12:
        return 'C'
    if 13 <= age <= 19:
        return 'T'
    if 20 <= age <= 34:
        return '1'
    if 35 <= age <= 49:
        return '2'
    if 50 <= age:
        return '3'

def sex_cut(x):
    if 'C' in x:
        x = 'C'
    if 'T' in x:
        x = 'T'
    return x

df['age_category'] = df['age'].map(age_category)
df['category'] = df['sex'] + df['age_category']
df['category'] = df['category'].map(sex_cut)
print(df[['user_id','sex','age','category']])

f:id:bitop:20180805091623p:plain