Python

Python:メールの送信時間と開封時間を調査する

スポンサーリンク

はじめに

今回は、Pythonを使ってメルマガの送信時間と実際にお客様が開封した時間を見ていきましょう。やることは単純な手順ですが、ある程度の前処理が必要となります。順を追って説明します。

まずはデータを準備します。今回扱うのは次のようなデータです。

本当は、「誰が開けたのか」わかるようなユニークキーがありますが、ここでは表示させていません。 ActivityDateの部分がメールを開封した時間ですね。 まずは、開封した時間について処理をしていく必要があります。

各特徴量がどのようなデータ型で読み込まれているかを調べてみましょう。
データフレーム.info()
で調べることができます。

data.info()

すると、次のようにActivityDateはobjectとして取り込まれていることがわかります。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3510 entries, 0 to 3509
Data columns (total 2 columns):
ActivityType    3510 non-null object
ActivityDate    3510 non-null object
dtypes: object(2)
memory usage: 54.9+ KB

まずはdatetime型に変換することにしましょう。datetime型に変換するのは簡単です。pandsのto_datetime()関数を使います。

data['ActivityDate']=pd.to_datetime(data['ActivityDate'])
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3510 entries, 0 to 3509
Data columns (total 2 columns):
ActivityType    3510 non-null object
ActivityDate    3510 non-null datetime64[ns]
dtypes: datetime64[ns](1), object(1)
memory usage: 54.9+ KB

すると、ActivityDateは無事、datetime型に変換することができました。

時差の処理

次に時差の処理をしていきます。時差の処理をするには、どのくらいの時差があるかを知らなければいけませんね。アメリカには「サマータイム」があるので、時差が固定とは限りません。

地域によって時差のある北米では、それぞれの時間帯で、3/9(土)から3/10(日)に日付の変わった、深夜2時に、時計を1時間進め 3時とします。
終了時は、同じく11/2(土)から11/3(日)に日付の変わった深夜2時に、時計を1時間戻し 1時とします。

https://atsulae.com/dst-2019/

上記のようにサマータイムが切り替わるのは、3/10 深夜2時と11/3 深夜2時ですね。厳密には深夜2時なのですが、ここでは3/10,11/3に切り替わることにして処理してみましょう。

ここに記載のデータは通常時に13時間の時差があり、サマータイムの時期には14時間の時差があります。サマータイムが3/10と11/3に切り替わるので、これを開始日としてfrom_dt、終了日としてto_dtに設定します。

そのあとは、開封日をみてこのfrom_dtとto_dtの間にあれば、時差は14時間、from_dtとto_dtの間になければ、時差は13時間になります。これをtimedeltaという変数名のリストに格納しています。

import datetime as dt

from_dt=dt.datetime(2019,3,10)
to_dt=dt.datetime(2019,11,3)
timedelta=[]
for i in data['ActivityDate']:
    if from_dt <= i <= to_dt:
        timedelta.append(13)
    else:
        timedelta.append(14)

timedelta()メソッドを使うと、簡単に日付や時間の加減ができます。

for hour in timedelta:
    data['timedelta']=dt.timedelta(hours=hour)

data.head()

これで時差を調整する準備が整いました。調整した開封時間を格納する列を「調整開封日」とすることにしましょう。

data['調整開封日']=data['ActivityDate']+data['timedelta']
data.head()

これで前準備が整いました。いよいよ送信時間と開封時間の関係をみていくことにしましょう。

送信時間と開封時間

ここでは、開封時間をヒストグラムで表すことにしましょう。さらに、このヒストグラムに配信時間がわかるように垂直線で表すようにしてみます。

まずは、必要なライブラリをインポートしましょう。

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font='IPAexGothic')
%matplotlib inline

次に描画をしていきます。

# Figureオブジェクトを作成
fig=plt.figure(figsize=(12,2))
ax=fig.add_subplot(1,1,1)

plt.hist(data['調整開封日'].dt.hour,bins=24,range=(0, 24),label='11時配信')
ax.axvline(x=11,linewidth=5,color='red')
ax.set_title('メールの配信時間と開封時間:2019年1月')
ax.set_xlim([0,24])
ax.set_ylim([0,240])
ax.legend()


# positionsとlabelsを設定
positions=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
labels=['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24']

# 軸の目盛り設定
plt.xticks(positions,labels)
スポンサーリンク

まとめ

送信時間と開封時間を可視化することができました。11時に配信した場合には、メールの配信は、配信直後の2時間の開封が多く、そのあとは緩やかに減っていくようです。18時以降はほとんど開かれず、翌朝になると、少し開かれることもある、といった感じですね。11時の配信は、お昼前・お昼時間中に開くことが期待できて、定時+αの18時までの開封が期待できるようですね。

コメント

タイトルとURLをコピーしました