JDデータアナリスト面接体験シェア:SQL+Python+ビジネスインサイトの全評価
2年経験データアナリストのJD面接完全振り返り。技術1次・2次、ビジネス面接の実際の問題を網羅。SQLウィンドウ関数、Python pandas、A/Bテスト、指標体系等の問題まとめと対策アドバイス付き
背景紹介
まずは私の経歴からお話しします。大学で統計学を専攻し卒業後、現在の中規模EC企業で2年間データアナリストとして働いています。日常業務は主にSQLでのデータ抽出やレポート作成で、時々Pythonで自動化スクリプトや簡単なデータモデリングを行っています。正直なところ、今の会社は安定していますが、成長の余地が限られていると感じていました。データ基盤が整っておらず、多くの時間を反復的なデータ抽出作業に費やしており、本当に深い分析に取り組む機会が少ないのです。
今年の3月中旬、JDの採用サイトでJDリテール・データアナリストの中途採用情報を見つけました。求められる経験は3年以内で、職務内容はユーザー行動分析、キャンペーン効果測定、指標体系の構築など、現在の業務方向とよく合致していました。2日ほど悩んだ末に応募することにしました。JDのデータ規模と分析の深さは、今の会社とは比べものになりませんから。
応募から約1週間後、HRから面接の日程調整の電話がありました。全体のプロセスは技術1次面接→技術2次面接→ビジネス面接+HR面接で、3回の面接期間は約2週間でした。以下、各ラウンドごとに詳細に振り返ります。JDのデータアナリスト面接を準備中の方の参考になれば幸いです。
第1ラウンド 技術1次面接(ビデオ面接、約55分)
1次面接の面接官は30歳くらいの男性で、自己紹介の後、すぐに技術的な質問に入りました。全体的にテンポが速く、質問の密度が高かったです。
1. SQL:各カテゴリの売上Top3商品を求める
面接官からorder_detailテーブルが与えられ、フィールドはorder_id、product_id、category_id、sale_amount、order_dateです。各カテゴリで売上上位3つの商品を求めるSQLを書くよう指示されました。
この問題は慣れていたので、すぐにウィンドウ関数を使って書きました:
私の回答:
SELECT category_id, product_id, total_sale
FROM (
SELECT category_id, product_id, SUM(sale_amount) AS total_sale,
ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY SUM(sale_amount) DESC) AS rn
FROM order_detail
GROUP BY category_id, product_id
) t
WHERE rn <= 3;
面接官からの追加質問:RANK()とROW_NUMBER()の違いは?同順位の場合、RANK()は順位を飛ばすが、DENSE_RANK()は飛ばさないと答えました。彼は頷き、それ以上の追加質問はありませんでした。
2. SQL:3日連続ログインユーザーを求める
user_loginテーブルが与えられ、フィールドはuser_id、login_dateです。3日以上連続でログインしたユーザーを求めます。
以前似た問題を練習していたので、ROW_NUMBER()で日付の差分を取る方法を使いました:
私の回答:
SELECT user_id
FROM (
SELECT user_id, login_date,
DATE_SUB(login_date, INTERVAL ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY login_date) DAY) AS grp
FROM (SELECT DISTINCT user_id, login_date FROM user_login) t1
) t2
GROUP BY user_id, grp
HAVING COUNT(*) >= 3;
面接官はアプローチが正しいと言いましたが、エッジケースについて追加質問がありました:同じ日に複数のログインレコードがある場合はどうするか?DISTINCTで重複を除去し、サブクエリで既に処理していると答えました。彼はOKと確認しました。
3. SQL:リテンション率の計算
ユーザー登録テーブルとログインテーブルが与えられ、翌日リテンション率と7日リテンション率を計算します。
私の回答:LEFT JOINを使い、登録日とログイン日の差を計算し、差が1と7のレコードをそれぞれフィルタリングし、その日の登録者数で割ります。面接官は完全なSQLを書くよう求め、約5分かけて書きました。彼は確認後、ロジックが正しいと言いました。
4. Python:pandasデータクリーニング
面接官の質問:DataFrameがあり、age列に欠損値と異常値(負の数や150を超える値など)がある場合、どうやってクリーニングしますか?
私の回答:まずdf['age'].isnull().sum()で欠損数を確認します。欠損割合が小さければ中央値で補完:df['age'].fillna(df['age'].median())。異常値はdf.loc[df['age'] < 0 | (df['age'] > 150), 'age'] = np.nanで一旦NaNにしてから補完します。面接官からの追加質問:欠損割合が非常に大きい場合はどうするか?その特徴量がまだ意味があるか検討する必要があるか、モデル予測で補完する方法もありますが、実際の仕事ではビジネス側と確認すると答えました。
5. Python:groupbyとagg操作
質問:pandasを使ってユーザーごとにグループ化し、各ユーザーの注文数、平均注文金額、最大注文金額を計算するには?
私の回答:df.groupby('user_id')['order_amount'].agg(['count', 'mean', 'max'])。面接官はOKと言い、さらにカスタム列名をつけるには?と聞きました。.agg(order_count=('order_amount', 'count'), avg_amount=('order_amount', 'mean'), max_amount=('order_amount', 'max'))と答え、彼は満足しました。
6. 統計基礎:p値と仮説検定
面接官の質問:p値の意味は何ですか?0.05の有意水準をどう理解しますか?
私の回答:p値は、帰無仮説が真であるという前提で、現在のまたはより極端な結果が観察される確率です。0.05の有意水準は、帰無仮説が真の場合、5%の確率で誤って帰無仮説を棄却すること(第1種過誤率を5%に抑えること)を意味します。面接官からの追加質問:p値が小さければ必ず効果が有意と言えますか?そうとは限らないと答えました。効果量とサンプルサイズも考慮する必要があります。大サンプルでは非常に小さな差でもp値が有意になりますが、実質的な意味はない場合があります。彼は頷きました。
7. 統計基礎:大数の法則と中心極限定理
質問:大数の法則と中心極限定理の違いを簡単に説明してください。
私の回答:大数の法則は、サンプルサイズが十分に大きいとき、サンプル平均が母集団の期待値に収束することを述べています。中心極限定理は、サンプルサイズが十分に大きいとき、母集団の分布に関わらず、サンプル平均の分布が正規分布に近づくことを述べています。前者は「真の値への収束」に焦点を当て、後者は「分布の形状」に焦点を当てています。面接官は説明が非常に明確だと言いました。
第2ラウンド 技術2次面接(ビデオ面接、約60分)
2次面接の面接官は経験豊富そうな女性で、おそらくチームリーダークラスの方でした。全体的によりビジネスシナリオに偏ったスタイルで、技術的な質問もビジネスと密接に結びついていました。
1. SQL:ユーザーファネル分析
user_actionテーブルが与えられ、フィールドはuser_id、action_type(閲覧/カート追加/注文/支払い)、action_timeです。閲覧から支払いまでの各ステップのコンバージョン率を求めます。
私の回答:まずCASE WHENで各ユーザーが各ステップを完了したかどうかを確認し、その後集計してコンバージョン率を計算します。約7-8分かけて書きました。面接官は確認後、アプローチは正しいと言いましたが、重複除去の問題を指摘しました — 同じユーザーが複数回閲覧する可能性があるため、行動の有無で判断すべきで、回数を数えるべきではありません。この点を見落としやすいと認め、修正後彼女は承認しました。
2. A/Bテスト:クーポン効果の実験設計
面接官がシナリオを提示:JDが「200元購入で30元引き」クーポンのGMVへの影響をテストしたい。実験をどう設計するか?
私の回答:まず実験指標を決定 — 主要指標はユーザーあたりGMV、補助指標は平均注文単価と注文コンバージョン率。次にトラフィック分割戦略を決定 — ユーザーIDでランダムに分割し、実験群にクーポンを配布、対照群には配布しない。検出力分析でサンプルサイズを計算し、5%の向上を検出できるようにする。実験期間は少なくとも7日間で完全な週周期をカバーする。最後にt検定またはMann-Whitney U検定で2群を比較する。
面接官からの追加質問が2つありました:第一に、ユーザー間にソーシャルスピルオーバー効果がある場合はどうするか?ソーシャルグラフのクラスターベースのランダム化や、時系列スイッチバック実験を検討できると答えました。第二に、実験期間中に大型セールがある場合はどうするか?セール期間を避けるか、セールを層別化要因として含めると答えました。彼女は回答がかなり包括的だと言いました。
3. A/Bテスト:シンプソンのパラドックス
質問:シンプソンのパラドックスとは何ですか?A/Bテストでどう回避しますか?
私の回答:シンプソンのパラドックスは、各グループで観察される傾向が、データを統合すると逆転する現象です。例えば、実験群がiOSとAndroidのそれぞれでより良い結果を出していても、統合すると逆に悪くなる場合があります。これはiOSユーザーの割合の差が原因かもしれません。回避方法として、層別分析を行うか、CUPEDなどの手法で交絡変数を制御します。面接官はCUPEDの原理について追加質問しましたが、私は実験前の共変量を使って分散を減らすという大まかな説明しかできず、具体的な公式は思い出せませんでした。これは2次面接でうまく答えられなかった問題の一つでした。面接官は大丈夫、考え方が分かっていればいいと言いました。
4. ビジネス分析:JD 618セールの振り返り
面接官の質問:JDの618セールのデータ振り返りをする場合、どの次元から分析しますか?
私の回答:4つの次元からアプローチします。第一に全体業績 — GMV、注文数、平均注文単価の前年比・期間比の変化。第二にトラフィック分析 — UV、PV、各チャネルの集客効果、直帰率。第三にコンバージョンファネル — 閲覧から注文までの各段階のコンバージョン率、離脱が激しいステップの特定。第四にユーザーセグメンテーション — 新規ユーザーと既存ユーザーの貢献割合、高価値ユーザーの行動特性、休眠ユーザーのリアクティベーション効果。面接官からの追加質問:GMVが前年比で増加しているのに利益率が低下している場合、どう分析するか?コスト構造を分解し、補助金が大きすぎるのか、低マージンカテゴリの割合が増加しているのかを確認し、カテゴリとユーザーの次元でクロス分析すると答えました。彼女はこのアプローチを認めていました。
5. 指標体系:カテゴリ運営指標体系の構築
質問:JDのあるカテゴリのデータを担当する場合、運営指標体系をどう構築しますか?
私の回答:OSM(Objective-Strategy-Measurement)モデルを使って構築します。まず目標(Objective)を定義 — 例えばカテゴリGMVの成長。次に戦略(Strategy)を分解 — GMV = トラフィック × コンバージョン率 × 平均注文単価、各要素をさらに細分化。最後に測定(Measurement)を定義 — トラフィックはUV/PV、コンバージョン率は各ステップのコンバージョン、平均注文単価はユーザーあたり消費額。同時に、ノーススターメトリクス、プロセス指標、監視指標を区別し、ダッシュボードを形成します。面接官からの質問:複数の指標間で矛盾がある場合はどうするか?優先順位を見る必要があると答えました。例えば、短期的なGMVと長期的なユーザー満足度が矛盾する場合、ビジネス側と戦略的方向性をすり合わせる必要があります。彼女は頷きました。
6. SQL:前年比・期間比の計算
月次売上サマリーテーブルが与えられ、フィールドはmonth、category_id、gmvです。各カテゴリの各月の前年比および期間比成長率を計算します。
私の回答:期間比はLAG(gmv, 1) OVER(PARTITION BY category_id ORDER BY month)、前年比はLAG(gmv, 12) OVER(PARTITION BY category_id ORDER BY month)を使い、成長率を計算します。面接官は問題ないと言い、さらに一部の月にデータがなくLAGがNULLを返す場合はどうするかと聞きました。COALESCEで処理するか、データが連続した月のシーケンスであることを確保すると答えました。
第3ラウンド ビジネス面接+HR面接(約45分)
3次面接はビジネス責任者とHRが合同で行い、最初の30分がビジネス面接、後の15分がHR面接でした。
ビジネス面接部分
ビジネス面接は主にプロジェクト経験とビジネス理解について話しました。面接官は最も達成感のあったデータ分析プロジェクトについて詳しく説明するよう求めました。私は以前取り組んだユーザーチャーン予測プロジェクトについて話しました — RFMモデルでユーザーをセグメント化し、過去30日間リピート購入のない高価値ユーザーが12%を占めることを発見し、運営チームと協力してターゲット再アクティベーションを行い、最終的に18%のリアクティベーション率を達成し、約80万元のGMVに貢献しました。
面接官はいくつかの点について深掘りしました:RFMの各次元の閾値はどう決定したか?K-meansクラスタリングで境界点を決定したと答えました。リアクティベーション戦略は?SMS + プッシュ通知 + 専用クーポン。効果はどう評価したか?対照群と比較した。彼は全体のロジックが明確だと言いましたが、もしやり直すならどう改善するかと聞きました。機械学習モデルでRFMルールを置き換え、閲覧頻度や検索キーワードなどより多くの行動特徴量を追加すると答えました。
またオープンクエスチョンがありました:JD PLUS会員の更新率が下がった場合、どう分析しますか?まず分解する — どのタイプのユーザーの更新率が下がっているのか?新規入会ユーザーか、長期会員か?次に考えられる原因を分析:特典の魅力低下?競合会員の流出?価格感応度?その後、データで検証する。面接官はかなり満足そうでした。
HR面接部分
HR面接はかなり標準的でした:
1. なぜJDに入りたいですか? — プラットフォームが大きい、データ規模が大きい、成長の余地が大きい
2. 現在の給与と希望は? — 正直に回答
3. キャリアプランは? — 3年以内にビジネスラインのデータ分析を独立して担当できるシニアアナリストになる
4. 何か知りたいことはありますか? — チーム規模とビジネス方向について質問
HRは約1週間以内に結果を通知すると言いました。
面接問題まとめ
以下は3ラウンドの全問題のまとめです。すぐに確認できるようにまとめました:
技術1次面接:
1. SQL:各カテゴリ売上Top3商品 → ウィンドウ関数ROW_NUMBER/RANK → ⭐⭐
2. SQL:3日連続ログインユーザー → 日付差分法 → ⭐⭐⭐
3. SQL:翌日/7日リテンション率計算 → LEFT JOIN + 日付差 → ⭐⭐⭐
4. Python:pandas欠損値・異常値クリーニング → fillna + 条件置換 → ⭐⭐
5. Python:groupby複数集約操作 → agg関数 → ⭐⭐
6. 統計:p値の意味と有意水準 → 仮説検定の基礎 → ⭐⭐
7. 統計:大数の法則vs中心極限定理 → 確率論の基礎 → ⭐⭐
技術2次面接:
1. SQL:ユーザー行動ファネル分析 → CASE WHEN + 重複除去 → ⭐⭐⭐
2. A/Bテスト:クーポン効果実験設計 → 実験設計全体プロセス → ⭐⭐⭐⭐
3. A/Bテスト:シンプソンのパラドックスと回避方法 → 層別分析/CUPED → ⭐⭐⭐⭐
4. ビジネス分析:618セール振り返り次元 → OSM/分解思考 → ⭐⭐⭐
5. 指標体系:カテゴリ運営指標構築 → OSMモデル → ⭐⭐⭐⭐
6. SQL:前年比・期間比計算 → LAGウィンドウ関数 → ⭐⭐⭐
ビジネス面接+HR面接:
1. プロジェクト深掘り:ユーザーチャーン予測プロジェクト → プロジェクト振り返り能力 → ⭐⭐⭐
2. オープンクエスチョン:PLUS会員更新率低下分析 → ビジネス分解思考 → ⭐⭐⭐⭐
3. 行動面接:なぜJDか/キャリアプラン → 動機と計画 → ⭐⭐
気づきとアドバイス
1. SQLは基本スキル、ウィンドウ関数は必須
JDのデータアナリスト面接ではSQLの比重が非常に大きく、特にウィンドウ関数はほぼ必出です。ROW_NUMBER、RANK、LAGは筋肉の記憶になるまで練習してください。毎日2-3問のLeetCode SQL問題を解いて感覚を維持することをお勧めします。また、重複除去やNULL処理などの細かい点も見落としやすいので、面接時には積極的にエッジケースを考慮してください。
2. A/Bテストは差別化ポイント、概念の暗記ではなく原理の理解を
2次面接のA/Bテスト設計問題で、「ランダム分割、仮説検定」という表面的な回答だけでは全く不十分です。面接官はトラフィック分割戦略、サンプルサイズ計算、交絡変数制御などの詳細を深掘りします。因果推論と実験設計の知識を体系的に学ぶことをお勧めします。CUPEDや差の差分法などの高度な手法の原理を理解しておくと大きく評価されます。
3. ビジネス思考は技術の深さより重要
2次面接以降、面接官は技術をビジネスシナリオに適用できるかどうかをより重視します。例えば618振り返りの問題は技術的には難しくありませんが、問題を体系的に分解し、洞察に富んだ分析次元を提案できるかが難しいポイントです。日常的にビジネス分析レポートを読み、構造化思考を養うことをお勧めします。
4. 分からない問題でパニックにならず、思考プロセスを示す
2次面接のCUPED問題は確かに完璧には答えられませんでしたが、「具体的な公式は思い出せません」とまず認め、理解しているアプローチと用途を説明しました。面接官は後で、暗記した公式よりも、見知らぬ問題に直面した時の候補者の考え方を重視していると言いました。分からない問題に遭遇したら、落ち着いて分析し、推論プロセスを説明することが「分かりません」と言うよりずっと良いのです。
最後に結果について:3次面接の6日後、HRから電話があり、オファーを獲得しました!🎉 全体的に、JDの面接プロセスは非常にプロフェッショナルで、面接官のレベルも高く、問題設計も的確でした。皆さんの面接成功を祈っています!
FAQ
Q1:JDのデータアナリスト職に学歴要件はありますか?
A:中途採用の場合、学士号以上で十分で、実際のプロジェクト経験がより重視されます。私は非有名大学の学士ですが書類選考を通過しました。学歴は絶対的な壁ではありませんが、統計学、数学、コンピュータサイエンス関連の専攻は有利です。
Q2:面接でのSQLの難易度はどの程度ですか?
A:基本的には中程度からやや上の難易度です。ウィンドウ関数が主要なトピックで、JOINやサブクエリも出題されます。複雑なストアドプロシージャやパフォーマンス最適化は問われませんが、ロジックは正確に書く必要があります。推奨練習プラットフォーム:LeetCode SQL、牛客網SQL特集。
Q3:Pythonのテストはどの程度深いですか?機械学習は必要ですか?
A:Pythonは主にpandasのデータ処理がテストされ、アルゴリズムの実装は問われません。機械学習は必須ではありませんが、プロジェクトで使用している場合、面接官が深掘りする可能性があります。pandasのgroupby、merge、applyなどの操作をマスターすることをお勧めします。
Q4:A/Bテストは面接でどの程度の比重を占めますか?
A:非常に大きいです。特に2次面接で。EC企業であるJDにとって、A/Bテストは日常業務の核心的な方法論です。重点的に準備すべき内容:実験設計プロセス、サンプルサイズ計算、トラフィック分割戦略、シンプソンのパラドックス、CUPEDなど。
Q5:応募からオファー獲得までどのくらいかかりますか?
A:私の全体プロセスは約3週間でした:応募後1週間で1次面接、1次面接後3日で2次面接、2次面接後4日で3次面接、3次面接後6日で結果通知。部門によってペースが異なる場合がありますので参考までに。

