ユーザーはアーカイブから広告表示されたときのターゲティング設定を知ることができる。どのような情報が得られるか調べる
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import json
from IPython.display import JSON
def load_dataset() -> tuple[list[any], list[any]]:
with open("/data/twitter-2022-12-31/data/ad-engagements.js", "r") as f:
cont = f.read()
ad_engagements = json.loads("[" + "\n".join(cont.split("\n")[1:]))
with open("/data/twitter-2022-12-31/data/ad-impressions.js", "r") as f:
cont = f.read()
ad_impressions = json.loads("[" + "\n".join(cont.split("\n")[1:]))
return ad_engagements, ad_impressions
ad_engagements, ad_impressions = load_dataset()
# JSON(ad_impressions[0]["ad"]["adsUserData"]["adImpressions"]["impressions"][0], expanded=True)
ad_impressions[0]["ad"]["adsUserData"]["adImpressions"]["impressions"][0]
{'deviceInfo': {'osType': 'Desktop'}, 'displayLocation': 'TimelineHome', 'promotedTweetInfo': {'tweetId': '1576104628013473794', 'tweetText': 'Scrub your JavaScript code in real-time. 🛁✨ Scan for quality & security issues for free.', 'urls': [], 'mediaUrls': []}, 'advertiserInfo': {'advertiserName': 'Snyk', 'screenName': '@snyksec'}, 'matchedTargetingCriteria': [{'targetingType': 'Follower look-alikes', 'targetingValue': '@reactjs'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@nodejs'}, {'targetingType': 'Age', 'targetingValue': '21 and up'}, {'targetingType': 'Languages', 'targetingValue': 'English'}, {'targetingType': 'Locations', 'targetingValue': 'Japan'}, {'targetingType': 'Platforms', 'targetingValue': 'Desktop'}], 'impressionTime': '2022-10-03 04:48:42'}
@reactjs
のフォロアーのようなユーザー、かつ年齢言語地域プラットフォームが設定されたターゲティングにマッチすることで表示されているdef load_demographics() -> dict[str, any]:
with open("/data/twitter-2022-12-31/data/personalization.js", "r") as f:
cont = f.read()
demographics = json.loads("[" + "\n".join(cont.split("\n")[1:]))
return demographics[0]
# JSON(load_demographics()["p13nData"]["demographics"], expanded=True)
load_demographics()["p13nData"]["demographics"]
{'languages': [{'language': 'Japanese', 'isDisabled': False}, {'language': 'Catalan', 'isDisabled': True}, {'language': 'Indonesian', 'isDisabled': True}, {'language': 'Spanish', 'isDisabled': True}, {'language': 'English', 'isDisabled': False}], 'genderInfo': {'gender': 'female'}}
「性別を指定していない場合、アカウントのプロフィールやアクティビティを基に登録されています。」
advertiserInfo
の広告主ごとの impression 数を集計 (約3ヶ月分)¶広告主の情報と impression 時刻を取り出す
def parse_adimpressions(ad_impressions: pd.DataFrame) -> pd.DataFrame:
rows = []
for i, ad in enumerate(ad_impressions):
for r in ad["ad"]["adsUserData"]["adImpressions"]["impressions"]:
rows.append({
"advertiserName": r["advertiserInfo"].get("advertiserName", None),
"advertiserScreenName": r["advertiserInfo"].get("screenName", None),
"impressionTime": r["impressionTime"],
})
return pd.DataFrame(rows)
df_advertiser = parse_adimpressions(ad_impressions)
len(df_advertiser)
17385
df_advertiser.groupby(
"advertiserScreenName", as_index=False
).agg(
name=("advertiserName", "first"),
freq=("impressionTime", "count"),
).sort_values(by="freq", ascending=False).head(30)
advertiserScreenName | name | freq | |
---|---|---|---|
299 | @FindyTeamPlus | Findy Team+ファインディ【公式】 | 595 |
933 | @TwitterMktgJP | Twitter マーケティング | 301 |
1794 | @note_PR | note | 278 |
1719 | @mskkpr | 日本マイクロソフト株式会社 | 203 |
1702 | @mizuhobank | みずほ銀行 | 201 |
1152 | @business | Bloomberg | 175 |
190 | @Coloso_japan | Coloso | コロソ | 172 |
897 | @TechWillof | ひなた@新規事業企画🔰 | 166 |
1224 | @creativecloudjp | アドビ クリエイティブ クラウド | 159 |
1042 | @agodajapan | agoda【日本語公式】 | 157 |
699 | @PICO_Japan | PICO XR Japan | 156 |
752 | @RIMOWA | RIMOWA | 146 |
593 | @MetaQuestJapan | Meta Quest Japan | 144 |
2094 | @techverse_ja | Tech-Verse(11/17-18開催) | 140 |
1523 | @kaori_saison | クレディセゾン(CREDIT SAISON) | 138 |
144 | @CGWjp | CGWORLD.jp | 130 |
569 | @MahjongSoul_JP | 【公式】雀魂-じゃんたま- | 123 |
1186 | @chocozap_ | chocoZAP(ちょこざっぷ) @1日5分からはじめられる初心者向け24hジム_公式 | 118 |
84 | @Anker_JP | Anker Japan | 118 |
371 | @HPE | HPE | 100 |
1627 | @magapoke | 講談社 マガジンポケット(マガポケ)公式🎍2023年あけましておめでとうございます!🐰 | 96 |
1718 | @msdevjp | Microsoft Tech | 94 |
1465 | 92 | ||
955 | @UdemyJapan | Udemy Japan | 92 |
227 | @Deloitte | Deloitte | 91 |
2112 | @thermofisher | Thermo Fisher | 87 |
2106 | @tfx_pr | 東京金融取引所公式アカウント | 84 |
378 | @HawaiianAirJP | ハワイアン航空 | 80 |
312 | @FrontYoungMinds | Frontiers for Young Minds | 77 |
189 | @CoinbaseJapan | Coinbase Japan | 77 |
impressionTime
を集計していつ表示された広告であるか確認¶impression_time_series = pd.to_datetime(df_advertiser["impressionTime"], utc=True).dt.tz_convert('Asia/Tokyo').dt
df_advertiser["month"] = impression_time_series.month
df_advertiser["day"] = impression_time_series.day
df_advertiser["ymd"] = impression_time_series.strftime("%Y-%m-%d")
df_advertiser["hour"] = impression_time_series.hour
df_advertiser["week"] = impression_time_series.day_name()
impression_freq = df_advertiser.groupby(["ymd", "month", "week", "hour"], as_index=False).agg(freq=("impressionTime", "count"))
plt.figure(figsize=(14, 4))
plt.title("Ad impressions by hour and week")
sns.heatmap(
impression_freq.groupby(
["week", "hour"],
as_index=False
).agg(freq=("freq", "sum")).pivot(index="week", columns="hour", values="freq").fillna(0.0),
cmap="Spectral",
annot=True,
fmt=".0f",
annot_kws={"size": 10},
linewidth=.5,
)
<AxesSubplot: title={'center': 'Ad impressions by hour and week'}, xlabel='hour', ylabel='week'>
だいたい朝の 9 時ごろに Twitter にアクセスして一日がはじまっていそう。感覚的にあっている
plt.figure(figsize=(14, 2))
plt.title("Ad impressions by hour and week")
sns.heatmap(
impression_freq.groupby(
["month", "hour"],
as_index=False
).agg(freq=("freq", "sum")).pivot(index="month", columns="hour", values="freq").fillna(0.0),
cmap="Spectral",
annot=True,
fmt=".0f",
annot_kws={"size": 10},
linewidth=.5,
)
<AxesSubplot: title={'center': 'Ad impressions by hour and week'}, xlabel='hour', ylabel='month'>
どのようなユーザーがターゲティングに用いられているか確認する
def parse_follower_lookalikes(matched_targeting: list[dict[str, str]]) -> list[str]:
followers = [m["targetingValue"] for m in matched_targeting if m["targetingType"] == "Follower look-alikes"]
return followers if len(followers) > 0 else None
def parse_adimpressions_v2(ad_impressions: pd.DataFrame) -> pd.DataFrame:
rows = []
for i, ad in enumerate(ad_impressions):
for r in ad["ad"]["adsUserData"]["adImpressions"]["impressions"]:
rows.append({
"advertiserName": r["advertiserInfo"].get("advertiserName", None),
"advertiserScreenName": r["advertiserInfo"].get("screenName", None),
"impressionTime": r["impressionTime"],
"displayLocation": r["displayLocation"],
"deviceInfo": r["deviceInfo"]["osType"],
"FollowerLookAlikes": parse_follower_lookalikes(r["matchedTargetingCriteria"]) if "matchedTargetingCriteria" in r else None,
})
return pd.DataFrame(rows)
df_advertiser = parse_adimpressions_v2(ad_impressions)
len(df_advertiser)
17385
df_advertiser[~df_advertiser["FollowerLookAlikes"].isna()].head(10)
advertiserName | advertiserScreenName | impressionTime | displayLocation | deviceInfo | FollowerLookAlikes | |
---|---|---|---|---|---|---|
0 | Snyk | @snyksec | 2022-10-03 04:48:42 | TimelineHome | Desktop | [@reactjs, @nodejs] |
3 | Scale AI | @scale_AI | 2022-10-03 03:36:55 | TimelineHome | Android | [@OpenAI] |
8 | Tower of Fantasy(幻塔)公式 | @ToF_JP | 2022-10-03 03:41:52 | TweetConversation | Android | [@uma_musu, @fgoproject] |
12 | WILD HEARTS | @playWildHearts | 2022-10-03 03:37:20 | TimelineHome | Android | [@Pokemon_cojp, @azurlane_staff, @Genshin_7, @... |
18 | Tower of Fantasy(幻塔)公式 | @ToF_JP | 2022-10-03 01:57:46 | TimelineHome | Android | [@uma_musu, @fgoproject] |
22 | Scale AI | @scale_AI | 2022-10-03 00:28:46 | TimelineHome | Android | [@OpenAI] |
23 | Snyk | @snyksec | 2022-10-03 00:00:34 | TimelineHome | Desktop | [@wesmckinn, @ThePSF, @fchollet, @martinfowler... |
24 | Scale AI | @scale_AI | 2022-10-03 00:18:20 | TimelineHome | Android | [@OpenAI] |
28 | WILD HEARTS | @playWildHearts | 2022-10-03 00:00:45 | TimelineHome | Desktop | [@Pokemon_cojp, @azurlane_staff, @Genshin_7, @... |
30 | Snyk | @snyksec | 2022-10-03 00:01:25 | TimelineHome | Desktop | [@wesmckinn, @ThePSF, @fchollet, @martinfowler... |
誰がターゲティングとして人気か。似たユーザーをアンフォローすることでターゲティングされないようにできるかもしれない
# FollowerLookAlikes のユーザーごとに何種類の広告主が指名しているか集計する
# まず Follower Look-alike ユーザーと広告主のペアを取りだし
followerlookalikes_advertiser_pairs = df_advertiser[~df_advertiser["FollowerLookAlikes"].isna()].explode("FollowerLookAlikes").groupby(["FollowerLookAlikes", "advertiserScreenName"], as_index=False)[[
"FollowerLookAlikes", "advertiserScreenName", "advertiserName",
]].first()
followerlookalikes_advertiser_pairs.head(10)
FollowerLookAlikes | advertiserScreenName | advertiserName | |
---|---|---|---|
0 | @00_ | @m3_engineering | エムスリー エンジニア公式 |
1 | @01en__ | @DeNAxTech | DeNA Tech |
2 | @0_u0 | @trocco_jp | trocco(トロッコ)|データ分析基盤SaaS |
3 | @0verfit | @m3_engineering | エムスリー エンジニア公式 |
4 | @0xPolygon | @DoraHacks | DoraHacks |
5 | @0xPolygon | @partisiampc | Partisia Blockchain |
6 | @345__chan | @MynaviTenshoku | マイナビ転職(転職サイト・転職アプリ) |
7 | @345__chan | @NUROhikari_Sony | Sony|NURO 光 |
8 | @345__chan | @SHOPLISTcom | SHOPLIST/ショップリスト |
9 | @345__chan | @dejavu_campaign | デジャヴュ【公式】 |
# どの Follower Look-alike ユーザー が幅広く用いられているか
followerlookalikes_advertiser_pairs.groupby("FollowerLookAlikes").agg(
unique_count_advertiser=("advertiserScreenName", "nunique")
).sort_values(by="unique_count_advertiser", ascending=False).head(10)
unique_count_advertiser | |
---|---|
FollowerLookAlikes | |
@nikkei | 47 |
@uma_musu | 46 |
@fashionpressnet | 39 |
@Nintendo | 39 |
@NetflixJP | 37 |
@kimetsu_off | 36 |
@Genshin_7 | 34 |
@Starbucks_J | 34 |
@famitsu | 33 |
@fgoproject | 33 |
plt.figure(figsize=(10, 10))
sns.barplot(data=followerlookalikes_advertiser_pairs.groupby("FollowerLookAlikes", as_index=False).agg(
unique_count_advertiser=("advertiserScreenName", "nunique")
).sort_values(by="unique_count_advertiser", ascending=False).head(50), y="FollowerLookAlikes", x="unique_count_advertiser", color="k")
<AxesSubplot: xlabel='unique_count_advertiser', ylabel='FollowerLookAlikes'>
# 最頻出の日経 (@nikkei) がどの広告主によって Follower Look-alike として設定されているか
followerlookalikes_advertiser_pairs[followerlookalikes_advertiser_pairs["FollowerLookAlikes"] == "@nikkei"].head(20)
FollowerLookAlikes | advertiserScreenName | advertiserName | |
---|---|---|---|
3268 | @nikkei | @17iceJP | セブンティーンアイス |
3269 | @nikkei | @AISpeakBuddy | スピークバディ / スピーキング特化型AI英会話アプリ【公式】 |
3270 | @nikkei | @AibowOfficial | aibow(アイボウ)【公式】 |
3271 | @nikkei | @AmazonFireJP | Amazon Fireタブレットシリーズ |
3272 | @nikkei | @BULKHOMME | BULK HOMME|バルクオム公式 |
3273 | @nikkei | @CLOUDPRESSROOM | CLOUD PRESS ROOM |
3274 | @nikkei | @DIORJP | Dior Japan |
3275 | @nikkei | @HeartCore_HC | 【公式】HeartCore(ハートコア株式会社) |
3276 | @nikkei | @JLLNews_JP | JLL News Japan |
3277 | @nikkei | @Kyndryl_jp | キンドリルジャパン |
3278 | @nikkei | @MEDIAID_sigmax | メディエイド/MEDIAID |
3279 | @nikkei | @MSFJapan | 国境なき医師団日本 |
3280 | @nikkei | @MitsubishiFA_JP | 三菱電機FA|JP |
3281 | @nikkei | @MynaviTenshoku | マイナビ転職(転職サイト・転職アプリ) |
3282 | @nikkei | @NUROhikari_Sony | Sony|NURO 光 |
3283 | @nikkei | @NeWork_jp | NeWork |
3284 | @nikkei | @NrealJapan | Nreal Japan |
3285 | @nikkei | @ODA_mofa_japan | 外務省/ODA広報 |
3286 | @nikkei | @PayPayInsideOut | PayPay Inside-Out |
3287 | @nikkei | @PretzJP | Pretz Japan |
個別事例を見て特に興味深いものを提示する
import re
# デバイスID は個人情報なので隠す
def _hide_device_id(imp_dict: dict[str, any]) -> dict[str, any]:
if "deviceId" in imp_dict["deviceInfo"]:
imp_dict["deviceInfo"]["deviceId"] = re.sub(".", "*", imp_dict["deviceInfo"]["deviceId"])
return imp_dict
# ネットショップのキーワードターゲティングでベラルーシとウクライナ?
_hide_device_id(ad_impressions[0]["ad"]["adsUserData"]["adImpressions"]["impressions"][11])
{'deviceInfo': {'osType': 'Android', 'deviceId': '********************************************'}, 'displayLocation': 'TimelineHome', 'promotedTweetInfo': {'tweetId': '1570346192017723392', 'tweetText': '\\オシャレさん必見!//\n✨大人気ロング丈パーカー✨をご紹介!\n\nふわふわ裏起毛で暖かい🙆\nゆったりシルエットで着痩せ効果も🙆\n男女兼用、選べるS~5XLサイズ展開🙆\n\nさりげなく自然にスタイルアップ!🙌', 'urls': [], 'mediaUrls': []}, 'advertiserInfo': {'advertiserName': 'baytaku', 'screenName': '@baytaku_shop'}, 'matchedTargetingCriteria': [{'targetingType': 'Interests', 'targetingValue': 'Sporting events'}, {'targetingType': 'Keywords', 'targetingValue': 'いい'}, {'targetingType': 'Keywords', 'targetingValue': '楽しみ'}, {'targetingType': 'Keywords', 'targetingValue': '予定'}, {'targetingType': 'Keywords', 'targetingValue': '会社'}, {'targetingType': 'Keywords', 'targetingValue': 'テクノロジー'}, {'targetingType': 'Keywords', 'targetingValue': 'ベラルーシ'}, {'targetingType': 'Keywords', 'targetingValue': '明日は'}, {'targetingType': 'Keywords', 'targetingValue': '技術'}, {'targetingType': 'Keywords', 'targetingValue': 'カーリング'}, {'targetingType': 'Keywords', 'targetingValue': '企業'}, {'targetingType': 'Keywords', 'targetingValue': '映画'}, {'targetingType': 'Keywords', 'targetingValue': '生活'}, {'targetingType': 'Keywords', 'targetingValue': '車'}, {'targetingType': 'Keywords', 'targetingValue': '女性'}, {'targetingType': 'Keywords', 'targetingValue': '子供'}, {'targetingType': 'Keywords', 'targetingValue': 'デート'}, {'targetingType': 'Keywords', 'targetingValue': '今日では'}, {'targetingType': 'Keywords', 'targetingValue': '女子'}, {'targetingType': 'Keywords', 'targetingValue': 'かわいい'}, {'targetingType': 'Keywords', 'targetingValue': 'ビジネス'}, {'targetingType': 'Keywords', 'targetingValue': '今日'}, {'targetingType': 'Keywords', 'targetingValue': '子'}, {'targetingType': 'Keywords', 'targetingValue': '漫画'}, {'targetingType': 'Keywords', 'targetingValue': '自分'}, {'targetingType': 'Keywords', 'targetingValue': '秋'}, {'targetingType': 'Keywords', 'targetingValue': 'プレゼント'}, {'targetingType': 'Keywords', 'targetingValue': '音楽'}, {'targetingType': 'Keywords', 'targetingValue': '日光'}, {'targetingType': 'Keywords', 'targetingValue': 'セール'}, {'targetingType': 'Keywords', 'targetingValue': '結婚'}, {'targetingType': 'Keywords', 'targetingValue': '写真'}, {'targetingType': 'Keywords', 'targetingValue': '東京'}, {'targetingType': 'Keywords', 'targetingValue': 'うまい'}, {'targetingType': 'Keywords', 'targetingValue': 'ウクライナ'}, {'targetingType': 'Keywords', 'targetingValue': '家族'}, {'targetingType': 'Keywords', 'targetingValue': '富士山'}, {'targetingType': 'Keywords', 'targetingValue': '太陽'}, {'targetingType': 'Keywords', 'targetingValue': 'お買い得'}, {'targetingType': 'Keywords', 'targetingValue': 'イベント'}, {'targetingType': 'Keywords', 'targetingValue': '風'}, {'targetingType': 'Keywords', 'targetingValue': '本'}, {'targetingType': 'Keywords', 'targetingValue': '学生'}, {'targetingType': 'Keywords', 'targetingValue': 'エコ'}, {'targetingType': 'Keywords', 'targetingValue': '投資'}, {'targetingType': 'Keywords', 'targetingValue': '日本'}, {'targetingType': 'Keywords', 'targetingValue': '明日'}, {'targetingType': 'Keywords', 'targetingValue': 'フィットネス'}, {'targetingType': 'Keywords', 'targetingValue': '食べる'}, {'targetingType': 'Keywords', 'targetingValue': 'ネット'}, {'targetingType': 'Keywords', 'targetingValue': 'レストラン'}, {'targetingType': 'Keywords', 'targetingValue': 'ゲーム'}, {'targetingType': 'Keywords', 'targetingValue': '健康'}, {'targetingType': 'Keywords', 'targetingValue': '週末'}, {'targetingType': 'Keywords', 'targetingValue': 'と'}, {'targetingType': 'Languages', 'targetingValue': 'Japanese'}, {'targetingType': 'Locations', 'targetingValue': 'Japan'}], 'impressionTime': '2022-10-03 03:36:17'}
# 1文字のキーワードでターゲティング
_hide_device_id(ad_impressions[4]["ad"]["adsUserData"]["adImpressions"]["impressions"][71])
{'deviceInfo': {'osType': 'Android', 'deviceId': '********************************************'}, 'displayLocation': 'TimelineHome', 'promotedTweetInfo': {'tweetId': '1595021654211833856', 'tweetText': '━━━━━━━━━━━\n🎀 期間限定キャンペーン 🎀\n━━━━━━━━━━━\n\n初年度月額基本料金税込980円の #NURO光 さらに…\n\n今だけ上乗せ10,000円キャッシュバック💴\n\n11月27日まで!乗り換えるなら今😸', 'urls': [], 'mediaUrls': []}, 'advertiserInfo': {'advertiserName': 'Sony|NURO 光', 'screenName': '@NUROhikari_Sony'}, 'matchedTargetingCriteria': [{'targetingType': 'Keywords', 'targetingValue': 'ね'}, {'targetingType': 'Keywords', 'targetingValue': 'は'}, {'targetingType': 'Keywords', 'targetingValue': 'ム'}, {'targetingType': 'Keywords', 'targetingValue': 'か'}, {'targetingType': 'Keywords', 'targetingValue': 'ほ'}, {'targetingType': 'Keywords', 'targetingValue': 'よ'}, {'targetingType': 'Keywords', 'targetingValue': 'ヘ'}, {'targetingType': 'Keywords', 'targetingValue': 'i'}, {'targetingType': 'Keywords', 'targetingValue': 'た'}, {'targetingType': 'Keywords', 'targetingValue': 'な'}, {'targetingType': 'Keywords', 'targetingValue': 'ば'}, {'targetingType': 'Keywords', 'targetingValue': 'ん'}, {'targetingType': 'Keywords', 'targetingValue': 'タ'}, {'targetingType': 'Keywords', 'targetingValue': 'う'}, {'targetingType': 'Keywords', 'targetingValue': 'る'}, {'targetingType': 'Keywords', 'targetingValue': 'に'}, {'targetingType': 'Keywords', 'targetingValue': 'を'}, {'targetingType': 'Keywords', 'targetingValue': '3'}, {'targetingType': 'Keywords', 'targetingValue': 'え'}, {'targetingType': 'Keywords', 'targetingValue': 'ぇ'}, {'targetingType': 'Keywords', 'targetingValue': 'り'}, {'targetingType': 'Keywords', 'targetingValue': 'a'}, {'targetingType': 'Keywords', 'targetingValue': 'も'}, {'targetingType': 'Keywords', 'targetingValue': 'が'}, {'targetingType': 'Keywords', 'targetingValue': 'て'}, {'targetingType': 'Keywords', 'targetingValue': 'あ'}, {'targetingType': 'Keywords', 'targetingValue': 'そ'}, {'targetingType': 'Keywords', 'targetingValue': 'ぶ'}, {'targetingType': 'Keywords', 'targetingValue': 'と'}, {'targetingType': 'Keywords', 'targetingValue': 'い'}, {'targetingType': 'Keywords', 'targetingValue': 'の'}, {'targetingType': 'Keywords', 'targetingValue': 'き'}, {'targetingType': 'Keywords', 'targetingValue': 'し'}, {'targetingType': 'Keywords', 'targetingValue': '1'}, {'targetingType': 'Keywords', 'targetingValue': 'く'}, {'targetingType': 'Keywords', 'targetingValue': 'や'}, {'targetingType': 'Keywords', 'targetingValue': '4'}, {'targetingType': 'Keywords', 'targetingValue': 'だ'}, {'targetingType': 'Keywords', 'targetingValue': 'つ'}, {'targetingType': 'Keywords', 'targetingValue': 'で'}, {'targetingType': 'Keywords', 'targetingValue': 'ぬ'}, {'targetingType': 'Keywords', 'targetingValue': '2'}, {'targetingType': 'Keywords', 'targetingValue': 'x'}, {'targetingType': 'Keywords', 'targetingValue': 'お'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@hajimesyacho'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@TwitterJP'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@RolaWorLD'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@ystk_yrk'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@faridyu'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@711SEJ'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@TDR_PR'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@yousuck2020'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@McDonaldsJapan'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@H_KANNA_0203'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@akiko_lawson'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@345__chan'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@hachi_08'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@nikkei'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@itoi_shigesato'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@takapon_jp'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@utadahikaru'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@Suzu_Mg'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@ariyoshihiroiki'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@pamyurin'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@matsu_bouzu'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@nhk_news'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@masason'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@fashionpressnet'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@tenkijp'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@famima_now'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@atsushilonboo'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@Kantei_Saigai'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@earthquake_jp'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@NHK_PR'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@Starbucks_J'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@hikakin'}, {'targetingType': 'Website Activity', 'targetingValue': '申し込み完了'}, {'targetingType': 'List', 'targetingValue': 'Tw_広告除外リスト_2210_送付用'}, {'targetingType': 'Age', 'targetingValue': '20 and up'}, {'targetingType': 'Locations', 'targetingValue': 'Tokyo-to'}, {'targetingType': 'Platforms', 'targetingValue': 'Android'}], 'impressionTime': '2022-11-23 08:15:20'}
# インフルエンサー?の名前でキーワードターゲティング?イベント登壇者ではなさそうだがなぜ?
# キーワード設定の "takao asayama" はテックビューロの朝山貴生さん?
_hide_device_id(ad_impressions[2]["ad"]["adsUserData"]["adImpressions"]["impressions"][1])
{'deviceInfo': {'osType': 'Android', 'deviceId': '********************************************'}, 'displayLocation': 'TimelineHome', 'promotedTweetInfo': {'tweetId': '1575903594880159744', 'tweetText': '☁️ は ❤️ ですか?\n\n❤️ をクリックして 10 月 12 日から開催する#GoogleCloudNext のライブ ストリーミングにご参加ください。 https://t.co/aF3sl1AVtW', 'urls': [], 'mediaUrls': ['https://t.co/aF3sl1AVtW']}, 'advertiserInfo': {'advertiserName': 'Google Cloud', 'screenName': '@googlecloud'}, 'matchedTargetingCriteria': [{'targetingType': 'Keywords', 'targetingValue': '#appdevelopment'}, {'targetingType': 'Keywords', 'targetingValue': 'takao asayama'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@JeffDean'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@kazuho'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@masason'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@codinghorror'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@awscloud'}, {'targetingType': 'Follower look-alikes', 'targetingValue': '@Docker'}, {'targetingType': 'Locations', 'targetingValue': 'Japan'}, {'targetingType': 'Languages', 'targetingValue': 'Japanese'}, {'targetingType': 'Age', 'targetingValue': '25 and up'}], 'impressionTime': '2022-10-08 03:06:38'}
ターゲティングに用いたキーワードも広告主の名前とペアで抽出する。
def parse_keywords(matched_targeting: list[dict[str, str]]) -> list[str] | None:
followers = [m["targetingValue"] for m in matched_targeting if m["targetingType"] == "Keywords"]
return followers if len(followers) > 0 else None
def parse_lists(matched_targeting: list[dict[str, str]]) -> list[str] | None:
followers = [m["targetingValue"] for m in matched_targeting if m["targetingType"] == "List" and "targetingValue" in m]
return followers if len(followers) > 0 else None
def parse_adimpressions_v3(ad_impressions: pd.DataFrame) -> pd.DataFrame:
rows = []
for i, ad in enumerate(ad_impressions):
for r in ad["ad"]["adsUserData"]["adImpressions"]["impressions"]:
rows.append({
"advertiserName": r["advertiserInfo"].get("advertiserName", None),
"advertiserScreenName": r["advertiserInfo"].get("screenName", None),
"impressionTime": r["impressionTime"],
"displayLocation": r["displayLocation"],
"deviceInfo": r["deviceInfo"]["osType"],
"FollowerLookAlikes": parse_follower_lookalikes(r["matchedTargetingCriteria"]) if "matchedTargetingCriteria" in r else None,
"TargetingKeywords": parse_keywords(r["matchedTargetingCriteria"]) if "matchedTargetingCriteria" in r else None,
"TargetingList": parse_lists(r["matchedTargetingCriteria"]) if "matchedTargetingCriteria" in r else None,
})
return pd.DataFrame(rows)
df_advertiser = parse_adimpressions_v3(ad_impressions)
keyword_advertiser_pairs = df_advertiser[~df_advertiser["TargetingKeywords"].isna()].explode("TargetingKeywords").groupby(["TargetingKeywords", "advertiserScreenName"], as_index=False)[[
"TargetingKeywords", "advertiserScreenName", "advertiserName",
]].first()
keyword_advertiser_pairs.head(10)
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
0 | "cash out" | @NEST_Protocol | NEST Protocol |
1 | "gaming" | @LIFT_Labs | Comcast NBCUniversal LIFT Labs |
2 | "health" | @LIFT_Labs | Comcast NBCUniversal LIFT Labs |
3 | #100均 | @googlejapan | Google Japan |
4 | #5g | @googlejapan | Google Japan |
5 | #5g | @msdevjp | Microsoft Tech |
6 | #5k | @on_running | On |
7 | #AI | @Microsoft | Microsoft |
8 | #AI | @MicrosoftES | Microsoft España |
9 | #AI | @SkillupAi | みきてぃ|AI/データ分析のプロ目指して奮闘中🔥 |
どのターゲティングキーワードが多くの広告主に使われているのかをチェック
keyword_advertiser_pairs.groupby(
"TargetingKeywords",
as_index=False,
).agg(freq=("advertiserName", "count")).sort_values(by="freq", ascending=False).head(10)
TargetingKeywords | freq | |
---|---|---|
2085 | ゲーム | 46 |
3714 | 転職 | 43 |
3393 | 漫画 | 42 |
3215 | 旅行 | 39 |
2393 | ビジネス | 37 |
1953 | エンジニア | 35 |
2552 | メイク | 29 |
698 | AI | 29 |
2456 | プレゼント | 29 |
3171 | 投資 | 26 |
ゲームと転職が多い。それぞれどのような広告主によってターゲティグ設定がなされているか
keyword_advertiser_pairs[keyword_advertiser_pairs["TargetingKeywords"] == "ゲーム"].head(10)
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
3241 | ゲーム | @AEON_netsuper | イオンネットスーパー【公式】 |
3242 | ゲーム | @ATX_PR | アニメシアターX(AT-X)公式 |
3243 | ゲーム | @Echocalypse_JP | 【公式】Echocalypse -緋紅の神約- 好評配信中! |
3244 | ゲーム | @Fantia_biz | Fantia |
3245 | ゲーム | @H2InteractiveJP | H2 INTERACTIVE公式アカウント |
3246 | ゲーム | @MetaQuestJapan | Meta Quest Japan |
3247 | ゲーム | @MonsterEnergyJP | Monster Energy Japan |
3248 | ゲーム | @MynaviTenshoku | マイナビ転職(転職サイト・転職アプリ) |
3249 | ゲーム | @NTTeastofficial | NTT東日本 |
3250 | ゲーム | @NewginGroup | 【公式】ニューギングループ |
keyword_advertiser_pairs[keyword_advertiser_pairs["TargetingKeywords"] == "転職"].head(10)
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
6535 | 転職 | @ANOBAKA_VC | 株式会社ANOBAKA |
6536 | 転職 | @AccentureJapan | Accenture Japan |
6537 | 転職 | @DAC__PR | DAC |
6538 | 転職 | @HopstepKitomi | きとみちゃん|ホップ☆ステップ きとみちゃん |
6539 | 転職 | @INPEX_OFFICIAL | 株式会社INPEX |
6540 | 転職 | @JKKTOKYO_info | 【公式】JKK東京(東京都住宅供給公社) |
6541 | 転職 | @KYOCERA_JP | 京セラ株式会社【公式】 |
6542 | 転職 | @Kyndryl_jp | キンドリルジャパン |
6543 | 転職 | @MHLWitter | 厚生労働省 |
6544 | 転職 | @NrealJapan | Nreal Japan |
キーワードのターゲティングのなかで興味深いものを取り出す
keyword_advertiser_pairs[keyword_advertiser_pairs["TargetingKeywords"] == "ロシア"]
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
4425 | ロシア | @jikiming1 | jikiming |
4426 | ロシア | @pangdog_mall | pangdog.mall |
keyword_advertiser_pairs[keyword_advertiser_pairs["TargetingKeywords"] == "ウクライナ"]
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
2962 | ウクライナ | @asiandocs_tokyo | アジアンドキュメンタリーズ |
2963 | ウクライナ | @baytaku_shop | baytaku |
2964 | ウクライナ | @chennuo_mall | chennuo_mall |
2965 | ウクライナ | @pangdog_mall | pangdog.mall |
2966 | ウクライナ | @senjokisha | ドキュメンタリー映画『戦場記者』 |
keyword_advertiser_pairs[keyword_advertiser_pairs["TargetingKeywords"] == "AtCoder"]
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
927 | AtCoder | @ca_tec_des | 【公式】サイバーエージェント新卒エンジニア採用 |
928 | AtCoder | @teamlab_recruit | チームラボ 採用 |
keyword_advertiser_pairs[keyword_advertiser_pairs["TargetingKeywords"] == "裏垢男子"]
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
6419 | 裏垢男子 | @Fantia_biz | Fantia |
keyword_advertiser_pairs[keyword_advertiser_pairs["TargetingKeywords"] == "#駆け出しエンジニアと繋がりたい"]
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
771 | #駆け出しエンジニアと繋がりたい | @msdevjp | Microsoft Tech |
keyword_advertiser_pairs[keyword_advertiser_pairs["TargetingKeywords"] == "それってあなたの感想ですよね"]
TargetingKeywords | advertiserScreenName | advertiserName | |
---|---|---|---|
2542 | それってあなたの感想ですよね | @RakutenTravelJP | 楽天トラベル【公式】 |
df_advertiser[df_advertiser["advertiserScreenName"] == "@RakutenTravelJP"].loc[10728]
advertiserName 楽天トラベル【公式】 advertiserScreenName @RakutenTravelJP impressionTime 2022-12-28 14:46:52 displayLocation TimelineHome deviceInfo Android FollowerLookAlikes [@pj_sekai, @animehaikyu_com, @KAJI__OFFICIAL,... TargetingKeywords [TikTok, それってあなたの感想ですよね, ひよってるやついる] TargetingList None Name: 10728, dtype: object
リストによってターゲティングを設定したとき、そのリストの名前に情報を与えないほうがよい。例えば以下
list_advertiser_pairs = df_advertiser[~df_advertiser["TargetingList"].isna()].explode("TargetingList").groupby(["TargetingList", "advertiserScreenName"], as_index=False)[[
"TargetingList", "advertiserScreenName", "advertiserName",
]].first()
list_advertiser_pairs[list_advertiser_pairs["advertiserScreenName"].str.contains("@Panasonic")]
TargetingList | advertiserScreenName | advertiserName | |
---|---|---|---|
21 | 2022年1月除外リスト | @PanasonicBrand | パナソニックブランド公式 |
94 | 【ユーザー除外リスト】オリンピック関連 | @PanasonicBeauty | Panasonic Beauty |
95 | 【ユーザー除外リスト】中国関連ワード言及 | @PanasonicBeauty | Panasonic Beauty |
96 | 【ユーザー除外リスト】水原さん・産機関連ワード | @PanasonicBeauty | Panasonic Beauty |
97 | 【ユーザー除外リスト】監視日報不適切指定 | @PanasonicBeauty | Panasonic Beauty |
98 | 【除外リスト1】中国関連 | @PanasonicBrand | パナソニックブランド公式 |
99 | 【除外リスト2】水原・産機関連 | @PanasonicBrand | パナソニックブランド公式 |
100 | 【除外リスト3】監視日報 | @PanasonicBrand | パナソニックブランド公式 |
101 | 【除外リスト4】オリンピック関連 | @PanasonicBrand | パナソニックブランド公式 |
122 | 除外リスト2022年2月~8月 | @PanasonicBrand | パナソニックブランド公式 |
134 | 除外用_2022年_Make New_220913 | @PanasonicBrand | パナソニックブランド公式 |
137 | 除外用_本ローンチ_11月12月/2022年度_パーパス発信_221130 | @PanasonicBrand | パナソニックブランド公式 |
以下は3ヶ月で得られたリスト
list_advertiser_pairs["TargetingList"].tolist()
['2021 Excl Salesforce ALL Unsubscribes_EMAIL_INCLUDED', '20211001_202201_IDFA_iOS', '2022-1月分_除外リスト_読み放題', '2022-2月分_除外リスト_読み放題', '2022-3月分_除外リスト_読み放題', '2022-5月分_除外リスト_読み放題', '2022-6月分_除外リスト_読み放題', '2022.11.07AYAMEheelフォロワーリスト\u3000広告除外用', '20220614_ONETIMERS18M_M_FINAL', '20220614_ONETIMERS18M_W_FINAL', '20220614_SLEEPERS18M_M_FINAL', '20220614_SLEEPERS18M_W_FINAL', '20221007_intel_pc_配信群_segment1', '20221007_intel_pc_配信群_segment2', '20221007_intel_pc_非配信群_segment1', '20221007_intel_pc_非配信群_segment2', '20221011_microsoft_office_非配信群_segment1', '20221011_microsoft_office_非配信群_segment2', '20221011_microsoft_office_非配信群_segment3', '20221011_microsoft_office_非配信群_segment4', '20221116時点のフォロワー', '2022年1月除外リスト', '2022年6月以前メアド①', '211226 2021EOY Exclusion List', '220304 Exclusion List', '220426除外リスト合算版', '220714_エディオン会員ALL_Android', '220714_エディオン会員ALL_iOS', '220721 Exclusion list - Signups, customers, Bridgecrew, inbounds', '22년 1~7월_결제자(전체)', '22년 1~7월_신규 가입자(전체)', '2K-CIV-CV6-CDP-ALL-C001-ROW', '2K-CIV-CV6-CDP-ALL_C097-ROW-DO-NOT-USE-FOR-TARGETING', '2K-CIV-CV6-CDP-ALL_C098-ROW-DO-NOT-USE-FOR-TARGETING', '7002000000178_年齢_30~39歳', '@sumisumiparty_ID_221115', 'AIQ_241854_29880_0', 'AIQ_271882_0_1', 'AIQ_271882_0_1 - Active Subs', 'AIQ_276401_0_1', 'AS_手動更新', 'Active Customer 1123_2022', 'AudienceList_for_Twitter', 'CDP-Marketing-OptOuts-SUPPRESSION-ONLY-LIST', 'CV除外用『顧客リードデータ』Email', 'Card_diamond0620', 'EFT_@FloraNotis_JILL_221117', 'FIFA SSO Registrations', 'Global Suppression_Eats_Orders', 'Global Suppression_Eats_SignUp', 'Global_Multi_GDPR_Global', 'Haters_2022', 'IDFA_マンガPark_202201-202206', 'ID_006686_20220622_rakuten_toto_cardonly_excluded', 'JP active customers 2022-07-27', 'LAL用『契約者データ』Email', 'PPBEXCLUDEDCUSTOMERS=1', 'PPB_excluded_customers_der=1', 'RakutenCard_001_除外', 'SGP_data4_ハッシュメアド_メールアドレス', 'SL2ユーザー_20221127', 'STADIA_次へ行こう_CM接触者_20221208122855', 'SUPERAUDIENCE - Professional Runner - Japan - aug 22', 'SUPERAUDIENCE - Running - Japan', 'Tw_広告除外リスト_2210_送付用', 'Uber Employee Emails Global', 'Unsubscribed from All Email B', '_tv_20220930003026', '_tv_20221026003026', '_tv_20221102003026', '_tv_20221107003025', '_tv_20221129003026', '_tv_20221129003026', '_tv_20221129003026', '_tv_20221129003026', '_tv_20221201003027', '_tv_20221204003026', '_tv_20221207003026', '_tv_20221227003017', 'cv0623', 'dsfe申込者_20220511', 'im_segment_10083167', 'nissen_CVリスト_2205', 'noteproリード(202207時点)', 'notepro顧客(202207時点)', 'ohoracojp_リピート購入者_mail_20210618-20220209', 'purchased_target_list-1', 'supression_fd_gp_JP_15.09', 'supression_hs_gp_JP_US_04.10', 'supression_hs_gp_US_JP_07.10', 'twitter_users', '【ADID】ウマ娘/グラブル/プリコネ/Andセッションユーザー_直近3カ月間', '【Twitter】過去全反響(除外用)', '【Twitter】過去全反響(除外用)ver 3', '【ユーザー除外リスト】オリンピック関連', '【ユーザー除外リスト】中国関連ワード言及', '【ユーザー除外リスト】水原さん・産機関連ワード', '【ユーザー除外リスト】監視日報不適切指定', '【除外リスト1】中国関連', '【除外リスト2】水原・産機関連', '【除外リスト3】監視日報', '【除外リスト4】オリンピック関連', 'サンデーうぇぶりフォローユーザー', 'サンデーうぇぶり発話ユーザー', 'トレカ掛け合わせ除外KW_2_TWITTER_ID_INCLUDED', 'パラトリCV済み_入有_20220912_20221218', 'パラトリCV済み_入無_20220912_20221218', '保有者Easy-ID_220801', '全顧客リスト_221020', '公式アカウントフォロワー1', '公式アカウントフォロワー2', '公式アカウントフォロワー3', '公式アカウントフォロワー4', '公式アカウントフォロワー5', '公式アカウントフォロワー6', '公式アカウントフォロワー7', '応募済みサポーター_手動更新', '既存購入者40万人分1', '既存購入者60万人分②', '購入者2022年8月email', '購入者2022年9月email', '除外オーディエンス_202209.', '除外リスト2022年2月~8月', '除外リスト:20211116', '除外リスト:20211216', '除外リスト:20220116', '除外リスト:20220216', '除外リスト:20220316', '除外リスト:20220416', '除外リスト:20220516', '除外リスト:20220616', '除外リスト:20220816', '除外リスト:202209', '除外リスト:20221016', '除外用_2022年_Make New_220913', '除外用_アクティブサポートユーザー', '除外用_アクティブサポートユーザー_202208', '除外用_本ローンチ_11月12月/2022年度_パーパス発信_221130', '顧客リスト_220809', '顧客リスト_220909', '顧客名簿2210', '顧客名簿2212', '(New)除外リスト']
@midori_2434
さんの案件配信のあとに FollowerLookAlikes 指定してターゲティング設定している(良い運用)df_advertiser[df_advertiser["advertiserScreenName"] == "@MahjongSoul_JP"].sort_values(by="impressionTime")
advertiserName | advertiserScreenName | impressionTime | displayLocation | deviceInfo | FollowerLookAlikes | TargetingKeywords | TargetingList | |
---|---|---|---|---|---|---|---|---|
15203 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-10-06 09:41:03 | TimelineHome | Android | [@pad_sexy, @Genshin_7, @monst_mixi, @uma_musu... | None | None |
14066 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-11-05 03:48:28 | TweetConversation | Android | [@pad_sexy, @Genshin_7, @monst_mixi, @uma_musu... | None | None |
14072 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-11-05 03:54:32 | TweetConversation | Android | [@pad_sexy, @Genshin_7, @monst_mixi, @uma_musu... | None | None |
14343 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-11-05 07:42:03 | TimelineHome | Android | None | None | None |
14345 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-11-05 07:56:55 | TimelineHome | Android | None | None | None |
... | ... | ... | ... | ... | ... | ... | ... | ... |
8264 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-12-16 19:10:03 | TimelineHome | Desktop | [@midori_2434] | None | None |
8358 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-12-17 12:28:09 | TimelineHome | Desktop | [@midori_2434] | None | None |
8553 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-12-18 03:28:56 | TimelineHome | Desktop | None | [おせろにあ] | None |
8590 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-12-18 09:32:18 | TimelineHome | Desktop | [@midori_2434] | None | None |
8571 | 【公式】雀魂-じゃんたま- | @MahjongSoul_JP | 2022-12-18 15:54:12 | TimelineHome | Desktop | [@midori_2434] | None | None |
123 rows × 8 columns
df_advertiser[df_advertiser["advertiserScreenName"] == "@MahjongSoul_JP"].FollowerLookAlikes.value_counts()
[@famitsu, @denfaminicogame] 32 [@pad_sexy, @Genshin_7, @monst_mixi, @uma_musu, @PlayApex] 22 [@famitsu, @denfaminicogame, @4GamerNews] 11 [@Genshin_7, @uma_musu] 9 [@MitoTsukino, @suisei_hosimati] 8 [@midori_2434] 5 [@famitsu, @4GamerNews] 2 [@Genshin_7, @uma_musu, @PlayApex] 1 [@MitoTsukino, @shirakamifubuki, @Ange_Katrina_, @suisei_hosimati] 1 [@MitoTsukino, @yuika_siina, @shirakamifubuki, @saku_sasaki, @Ange_Katrina_, @suisei_hosimati] 1 Name: FollowerLookAlikes, dtype: int64
@takapon_jp
は堀江貴文さん(フォローしていないが日本中の幅広い層に届きそう)df_advertiser[df_advertiser["advertiserScreenName"] == "@TwitterMktgJP"].sort_values(by="impressionTime")
advertiserName | advertiserScreenName | impressionTime | displayLocation | deviceInfo | FollowerLookAlikes | TargetingKeywords | TargetingList | |
---|---|---|---|---|---|---|---|---|
101 | Twitter マーケティング | @TwitterMktgJP | 2022-10-03 14:44:40 | TimelineHome | Desktop | None | None | None |
12158 | Twitter マーケティング | @TwitterMktgJP | 2022-10-05 00:21:20 | TimelineHome | Android | None | None | None |
12182 | Twitter マーケティング | @TwitterMktgJP | 2022-10-05 00:26:37 | TimelineHome | Android | None | None | None |
15720 | Twitter マーケティング | @TwitterMktgJP | 2022-10-07 00:14:18 | TimelineHome | Android | None | None | None |
15707 | Twitter マーケティング | @TwitterMktgJP | 2022-10-07 00:18:08 | TimelineHome | Android | None | None | None |
... | ... | ... | ... | ... | ... | ... | ... | ... |
7261 | Twitter マーケティング | @TwitterMktgJP | 2022-12-11 07:17:02 | TimelineHome | Desktop | [@takapon_jp] | None | None |
7217 | Twitter マーケティング | @TwitterMktgJP | 2022-12-11 11:33:24 | SearchTweets | Android | [@takapon_jp] | None | None |
7395 | Twitter マーケティング | @TwitterMktgJP | 2022-12-12 10:54:29 | ProfileTweets | Desktop | [@takapon_jp] | [広告, 経営者, 電通] | None |
7701 | Twitter マーケティング | @TwitterMktgJP | 2022-12-14 09:37:55 | SearchTweets | Android | [@BloombergJapan] | None | None |
7876 | Twitter マーケティング | @TwitterMktgJP | 2022-12-15 06:04:45 | SearchTweets | Android | [@BloombergJapan] | None | None |
301 rows × 8 columns
df_advertiser[df_advertiser["advertiserScreenName"] == "@TwitterMktgJP"].FollowerLookAlikes.value_counts()
[@takapon_jp, @BloombergJapan] 93 [@takapon_jp] 30 [@BloombergJapan] 3 Name: FollowerLookAlikes, dtype: int64