H1Bビザはデータ分析の洞察に基づいて承認されますか?

Does H1B visa approval rely on insights from data analysis?

はじめに

H1Bビザプログラムは、優れた人材が世界中からアメリカに専門知識をもたらすための門戸を開きます。毎年、このプログラムを通じて数千人の才能ある専門家がアメリカに入国し、様々な産業に貢献し、革新を推進しています。外国労働認証局(OFLC)のH1Bビザデータの世界にダイブして、その数字の裏にあるストーリーを探ってみましょう。この記事では、H1Bビザデータの分析を行い、データから知見や興味深いストーリーを得ます。フィーチャーエンジニアリングを通じて、外部ソースから追加情報をデータセットに組み込みます。データラングリングを用いて、データを丁寧に整理して、より理解しやすく分析することができます。最後に、データの可視化によって、2014年から2016年の間におけるアメリカの熟練労働者に関する魅力的なトレンドや未知の知見が明らかになります。

  1. 外国労働認証局(OFLC)から提供されたH1Bビザデータを探索し、高度な外国人労働者をアメリカに引き付ける上での重要性を理解する。
  2. データクリーニング、フィーチャーエンジニアリング、データ変換技術などの前処理プロセスについて学ぶ。
  3. H1Bビザの申請の受理率や拒否率を調べ、それらが影響を与える可能性がある。
  4. データの可視化技術に慣れて、効果的な発表やコミュニケーションを行うために。

注:🔗この分析の完全なコードとデータセットは、Kaggle上で公開されています。プロセスや分析の背後にあるコードを探索するには以下のリンクをご覧ください。H1B Analysis on Kaggle

この記事は、Data Science Blogathonの一環として公開されました。

H1Bビザとは何ですか?

H1Bビザプログラムは、様々な産業において専門的なポジションを埋めるために、優秀な外国人労働者をアメリカに引き付けるためのアメリカの移民政策の重要な要素です。スキル不足を解消し、革新を促進し、経済成長を牽引しています。

H1Bビザを取得するには、以下の重要なステップを踏まなければなりません。

  1. ビザをスポンサーするアメリカの雇用主を見つける。
  2. 雇用主が外国人労働者のH1B申請を米国移民局(USCIS)に提出する。
  3. 年次枠に制限があり、申請数が受け入れ可能な枠を超えた場合は、抽選が行われる。
  4. 選択された場合、USCISは申請の資格とコンプライアンスを審査する。
  5. 承認された場合、外国人労働者はH1Bビザを取得し、米国のスポンサー雇用主で働くことができる。

このプロセスには、学士号または同等の資格を持つことなどの特定の要件を満たす必要があり、支配的な賃金決定や雇用主-従業員関係の文書化などの追加の考慮事項を乗り越える必要があります。コンプライアンスと徹底的な準備が、成功したH1Bビザ申請には不可欠です。

データセット

  • 外国労働認証局(OFLC)が提供する2014年、2015年、2016年の結合データセットには、ケース番号、ケースステータス、雇用主名、雇用主都市、雇用主州、職名、SOCコード、SOC名、賃金レート、賃金単位、支配的な賃金、支配的な賃金源、年などのカラムが含まれます。
  • これらのカラムには、ケースの詳細、雇用主情報、職名、賃金レート、支配的な賃金データなど、H1Bビザ申請に関する必要な情報が含まれます。
  • すべての利用可能なカラムとその説明については、OFLCの公式ウェブサイトである以下のリンクhttps://www.foreignlaborcert.doleta.gov/performancedata.cfmからデータセットとデータのレイアウトを直接参照してください。

前処理

私と一緒に魅力的なデータ変換の旅に出かけましょう!xlsxファイルをCSVに変換し、各年にわたって同じデータを含むカラムに異なる名前が付けられているため、カラム名を一貫性のあるものに変更し、3年分のデータを結合します。その結果、1786160行、17列の広範なデータセットが得られます。

フィーチャーエンジニアリング

  • 開始日と終了日に基づいて雇用期間カラムを作成し、データセットを拡張しました。
  • 終了日から開始日を引いて日数を計算しました。
  • 負の値を持つ行を削除しました。負の雇用期間は論理的に不可能です。
  • 4年間の月の平均日数である30.44で割ることにより、期間を月に変換しました。このアプローチは、うるう年を考慮して正確な推定を保証します。
  • nullのエントリーを0で置き換えることで、欠損値を処理しました。
# 日付列をdatetime形式に変換し、無効なデータにはnanを割り当てる
final_df['LCA_CASE_EMPLOYMENT_START_DATE'] = pd.to_datetime(final_df['LCA_CASE_EMPLOYMENT_START_DATE'], errors='coerce')
final_df['LCA_CASE_EMPLOYMENT_END_DATE'] = pd.to_datetime(final_df['LCA_CASE_EMPLOYMENT_END_DATE'], errors='coerce')

# LCA_CASE_EMPLOYMENT_START_DATEからLCA_CASE_EMPLOYMENT_END_DATEを引いて雇用期間を求める
LCA_CASE_EMPLOYMENT_PERIOD=final_df["LCA_CASE_EMPLOYMENT_END_DATE"]-final_df["LCA_CASE_EMPLOYMENT_START_DATE"]

# LCA_CASE_EMPLOYMENT_PERIODの値を持つ新しい列を作成
final_df.insert(7, 'LCA_CASE_EMPLOYMENT_PERIOD', LCA_CASE_EMPLOYMENT_PERIOD)

# LCA_CASE_EMPLOYMENT_PERIODを日単位に変換
final_df['LCA_CASE_EMPLOYMENT_PERIOD'] = final_df['LCA_CASE_EMPLOYMENT_PERIOD'].dt.days

# 雇用期間が0より小さい外れ値を削除
final_df = final_df[final_df['LCA_CASE_EMPLOYMENT_PERIOD'] > 0]
final_df['LCA_CASE_EMPLOYMENT_PERIOD'].describe()

# 雇用期間を月に変換
final_df['LCA_CASE_EMPLOYMENT_PERIOD'] = (round(final_df['LCA_CASE_EMPLOYMENT_PERIOD'] / 30.44))

# 欠損値を0で埋め、列の型をintに変換
final_df['LCA_CASE_EMPLOYMENT_PERIOD']=final_df['LCA_CASE_EMPLOYMENT_PERIOD'].fillna(0).astype(int)
  • 各雇用主のセクターをNAICSコードから最初の2桁を抽出して決定しました。
  • オンラインでNAICSコードとセクターデータをダウンロードして、対応するセクター情報を取得しました。
  • EMPLOYER_SECTORという新しい列を作成し、各雇用主の基本コードをそれぞれのセクターにマッピングしました。
# LCA_CASE_NAICS_CODE列を文字列データ型に変換
final_df['LCA_CASE_NAICS_CODE'] = final_df['LCA_CASE_NAICS_CODE'].astype(str)

# 各文字列値の最初の2桁を抽出
final_df['LCA_CASE_NAICS_CODE'] = final_df['LCA_CASE_NAICS_CODE'].str[:2]

# NAICS_dataを読み込み、雇用主セクター用の新しい列を作成する
NAICS_data=pd.read_csv("/kaggle/input/h1b-visa/NAICS_data.csv")
NAICS_data.head()

# naics_unique_values内のすべてのNAICSをループ処理する
for i in naics_unique_values:
    
    try:
        # dataframeが'df'と呼ばれていると仮定する
        NAICS_data_code = NAICS_data.loc[NAICS_data['NAICS_CODE'] == i, 'NAICS_TITLE'].iloc[0]
    
    except:
        #特定のsocコードにインデックスがない場合、職業名はnullになります
        NAICS_data_code = "Unknown"

    #条件のためのブールマスクを作成
    mask = (final_df['LCA_CASE_NAICS_CODE'] == i)

    #フィルタリングされた行のLCA_CASE_SOC_NAME列を更新する
    final_df.loc[mask, 'EMPLOYER_SECTOR'] = NAICS_data_code
  • また、LCA_CASE_SUBMITフィールドから年次情報を抽出し、専用の年次列を作成しました。これにより、データ分析が簡素化され、年次ベースの洞察が便利になります。
# datetime列LCA_CASE_SUBMITから年コンポーネントを抽出し、新しい列yearに保存
final_df['year'] = final_df['LCA_CASE_SUBMIT'].dt.year

データ変換

  • データセットを洗練し、重複を削除してクリーンでユニークなレコードを確保するために、一連のデータ変換を実行しました。
  • LCA_CASE_SOC_CODE列を前処理して、各行の特殊文字を削除しました。
# 'LCA_CASE_SOC_CODE'列の"."の後の数字を削除
final_df['LCA_CASE_SOC_CODE'] = final_df['LCA_CASE_SOC_CODE'].astype(str).apply(lambda x: x.split('.')[0])

# LCA_CASE_SOC_CODEを修正するための関数

def preprocess_column(column):
    pattern = r"^\d{2}-\d{4}$"  # "XX-XXXX"形式のための正規表現パターン

    def preprocess_value(value):

        if ("-" not in value) and len(value) < 6:
            cleaned_value=np.nan
            
        elif "-" in value :
            value=value.replace('-','')
            cleaned_value=value[0:2]+"-"+value[2:6]
            if len(cleaned_value) != 7:
                cleaned_value=np.nan
            
        elif ("-" not in value) and len(value) > 5:
            value=value.replace('/', '')
            cleaned_value=value[0:2]+"-"+value[2:6]

        return cleaned_value

    cleaned_column = column.apply(lambda x: np.nan if pd.isna(x) else (x if re.search(pattern, str(x)) else preprocess_value(x)))
    return cleaned_column

final_df["LCA_CASE_SOC_CODE"] = preprocess_column(final_df["LCA_CASE_SOC_CODE"])

# 'LCA_CASE_WAGE_RATE_FROM'列の値を置き換える

# wage_rate列を前処理するためのカスタム関数を定義する
def preprocess_wage_rate(cell_value):
    if isinstance(cell_value, float):
        return cell_value
    elif '-' in cell_value:
        return cell_value.split('-')[0].strip()
    else:
        return cell_value

# wage_rate列にカスタム関数を適用する
final_df['LCA_CASE_WAGE_RATE_FROM'] = final_df['LCA_CASE_WAGE_RATE_FROM'].apply(lambda x: preprocess_wage_rate(x))
  • 「LCA_CASE_SOC_NAME」列のヌル値を除去する代わりに、「https://www.bls.gov/oes/current/oes_stru.htm#29-0000」からSOCコードと名前をスクレイピングし、CSVファイルを作成しました。次に、このCSVファイルを使用して、「LCA_CASE_SOC_NAME」のヌル値を補完しました。
# webdriverの初期化
driver = webdriver.Chrome()

# ウェブページに移動
driver.get('https://www.bls.gov/oes/current/oes_stru.htm#29-0000')

# すべてのli要素を検索
li_elements = driver.find_elements("xpath","//li")

# データを格納する空のリストを作成
data = []

# li要素をループ処理
for li in li_elements:
    text = li.text
    if "-" in text:
        # 正規表現を使用してSOCコードと職業名を抽出する
        words = text.split()
        soc=words[0]
        
        name = (" ".join(words[1::])).replace('"', '').strip()

        name_list=(words[1::])
        if "-" in name:
            for i, word in enumerate(name_list):
                if ("-" in word) and (len(word) > 1):
                    name =(' '.join(name_list[:i])).replace('"', '').strip()
                    break

        data.append({'SOCコード': soc, '職業名': name})

# webdriverを閉じる
driver.quit()

# データフレームを作成
occupation_data = pd.DataFrame(data)

# データフレームをCSVとして保存
occupation_data.to_csv('occupations.csv', index=False)

説明

  • データセットの「LCA_CASE_WAGE_RATE_FROM」列には、さまざまな単位で表された賃金率が含まれていましたが、一貫した分析のために標準化する必要がありました。
  • 標準化を実現するために、賃金率を一定の年間値に変換しました。これには、元の単位に応じて特定の係数で率を乗算する必要がありました。
  • たとえば、月額率は1年の月数を考慮して12倍に乗算しました。同様に、週次のレートは1年の週数である52倍に乗算され、2週間ごとのレートは1年に26週間あると仮定して26倍に乗算されました。
  • 時間単位のレートの処理には、ポジションがフルタイムであるかどうかを考慮する必要がありました。「FULL_TIME_POS」=「Y」のポジションの場合、時間単位のレートを1週間あたり40時間、1年あたり52週間で乗算しました。
  • フルタイムでないポジション(「FULL_TIME_POS」=「N」)の場合、1週間あたり35時間、1年あたり52週間を基にして年間レートを計算しました。
  • 必要な計算を実行した後、「LCA_CASE_WAGE_RATE_FROM」列の単位は「Year」に置き換えられ、賃金率の年次基準化表現に反映されました。
  • この標準化により、データセット内の異なるポジションやカテゴリ間での賃金率の意味のある比較と分析が可能になります。
  • 「LCA_CASE_SOC_NAME」列をクリーンにするために、すべてのデータを小文字に変換し、「s」で終わる場合は単数形に変換しました。
  • 理解を容易にするために、「LCA_CASE_WAGE_RATE_FROM」列の値を1000で除算して、給与を千円単位で表現しました。負の賃金値を持つ行は無効であるため、削除されました。

概要

  • さらに、0.1および0.99分位数の外れ値を除去するために、IQRメソッドを使用して正確な分析を行いました。
  • 「STATUS」列の値「INVALIDATED」と「REJECTED」は、「DENIED」と置換されます。「INVALIDATED」と「REJECTED」の両方は、申請が拒否されたことを示しているため、データセット内のすべての拒否されたH1Bビザ申請に対して単一のラベル「DENIED」を使用することで、表現を簡素化し一貫性を確保します。
  • 「LCA_CASE_EMPLOYMENT_START_DATE」、「LCA_CASE_EMPLOYMENT_END_DATE」、「LCA_CASE_WAGE_RATE_UNIT」、「FULL_TIME_POS」、「LCA_CASE_NAICS_CODE」といった不要な列を削除することで、データセットを簡素化し、明確さを高めました。
  • データは今や洗練され、洞察的な探索に備えています。

分析

H-1Bビザ申請の総数は何ですか?過去3年間の申請数の成長率は何ですか?

年ごとのアプリケーション成長率

2014年から2015年にかけて、H1Bビザ申請数が急増し、17.7%も増加しました。世界中から優秀な人材がアメリカでの機会を掴みたがりました。しかし、2016年に突然9%の申請減少があり、この大きな変化の原因について疑問が残りました。

申請数の急激な減少の原因は何ですか?拒絶率の増加が原因なのでしょうか、それとも他の要因がこの減少に寄与したのでしょうか?

年別ステータス別合計数

ビザの拒絶率は驚くほどに年々減少し、5.41%から3.4%まで減少しました。一方で、承認率は年々着実に増加しています。これは、雇用主が強力な申請を提出することに熟練してきたことを示唆する可能性があります。これにより、拒絶率が低下したと考えられます。

拒絶率の低下は、H1Bビザ申請者にとってより好ましい環境を反映し、高度に熟練した外国人労働者への需要の増加を示しています。

これらの好ましい傾向は、高度な移民を歓迎するための米国政府の取り組みに起因する可能性があります。政府がより好ましい政策を実施し、ビザプロセスを合理化し、不必要な障壁を取り除いたことが、拒絶率の低下に貢献したと考えられます。そのため、申請減少は単に拒絶率の増加に帰するわけではありません。

H1Bビザ申請のトップセクターは何ですか?

雇用主セクター分布

当社の分析によると、H1Bビザ申請の約72.4%が、プロフェッショナル、科学、技術サービスセクターで行われています。このセクターには、コンピュータプログラミング、科学研究、エンジニアリング、コンサルティングサービスなど、さまざまな分野が含まれています。これらの分野での高度な専門知識と専門技術が必要であるため、申請数の急増が見られました。

さらに、プロフェッショナル、科学、技術サービスセクターで雇用主が積極的にH1Bビザスポンサーシップを行っている大手企業の影響があります。これらの企業は、競争力を維持し、業界の成長を維持するために高度に熟練した労働者に依存しています。

H1Bビザ申請数が最も多いトップ10の雇用主は、どのセクターに属していますか?

総申請数によるトップ10の雇用主

包括的な分析に基づくと、プロフェッショナル、科学、技術サービスセクターには、H1Bビザ申請数が最も多いトップ10のうち9つが含まれています。これらは、コンピュータプログラミング、科学研究、エンジニアリング、コンサルティングサービスなど多様な分野を含んでいます。

Infosysは、承認された申請数が82,271件と、トップ10の雇用主の中で最も拒否された申請数が少ないことから、トップの雇用主として目立っています。H1Bビザ申請数におけるInfosysの優れたパフォーマンスは、同社のアプローチと、採用される特定のジョブロールについて興味深い問題を提起しています。

H1Bビザの職種分布において、トップ10の雇用主がどの程度影響を与えているのか?

Top 10 LCA_CASE_NAME with employer group

データを分析した結果、トップ10のH1Bビザスポンサー雇用主がトップ10の職種に与える貢献を視覚的に表現したチャートを作成しました。残りの雇用主は「その他の雇用主」としてグループ化されました。チャートは、その他の雇用主が大部分を占めている一方で、トップ10の雇用主がトップ10の職種に大きな影響を与えていることを示しています。

たとえば、Infosysはコンピューターシステムアナリストのポジションで主要な役割を果たし、Microsoftはソフトウェア開発者、アプリケーションのポジションに注目すべき貢献をしています。同様に、IBMはコンピュータプログラマ、アプリケーションのポジションに大きな影響を与えています。

このチャートは、H1Bビザ申請プロセスと特定の職種におけるトップ10の雇用主の重要な影響を強調しています。

給与範囲は、H1Bビザの職種申請の承認または否認にどの程度影響を与えるのか?

Top 10 certified LCA_CASE_SOC_NAME with highest count and average wage rate
Top 10 denied LCA_CASE_SOC_NAME with highest count and average wage rate

データ分析を行った結果、給与範囲と申請ステータスとの間には明確な相関はないことがわかりました。トップ10の承認および拒否された職種は、同じ給与範囲でした。

申請ステータスと給与範囲の関係をさらに把握するために、給与範囲を低、平均、上平均、そして高収入の4つの四分位に分けて、それぞれのカテゴリについてデータを分析しました。その結果、承認されたH1Bビザ申請の大部分は、低(Q1)および平均(Q2)の給与範囲カテゴリに属していました。

Distribution of wage rates by status and quantile

低(Q1)および平均(Q2)の給与範囲カテゴリが、承認されたH1Bビザ申請の大部分を占めていました。しかし、給与範囲と申請ステータスの間には明確な傾向は見られず、給与以外の要因がH1Bビザ申請の結果に重要な役割を果たしていることがわかりました。

雇用期間の長さは、H1Bビザ申請の決定にどの程度影響を与えるのか?

Top 10 certified LCA_CASE_SOC_NAME with highest count and average employment period
Top 10 certified LCA_CASE_SOC_NAME with highest count and average employment period

データを分析した結果、雇用期間とビザの決定との間には相関が認められませんでした。驚くべきことに、承認された上位の仕事と拒否された上位の仕事は、平均雇用期間が33ヶ月であることが示されました。雇用期間は、ビザの決定プロセスで決定的な要因ではないようです。

雇用期間の平均値に基づいて、申請者を2つのグループに分けました: 33ヶ月未満と33ヶ月以上です。

Distribution of employment_range by status and mean of employment period

徹底的な分析にもかかわらず、H1Bビザ申請の結果に対する雇用期間の影響に関する傾向を特定できませんでした。明確なパターンがないことから、雇用期間が決定的な役割を果たしていない可能性があります。

H1B visa applications by state

いよいよ、データが無限の知恵を持って、私たちが正しかったことを確認してくれました。

米国内の特定の州では、H1Bビザを申請した雇用主の集中度が高いことが明らかになります。特に、テキサス、カリフォルニア、ニュージャージーの3州が最も多くの雇用主を占め、合計684,118件の申請を占めています。この観察から、これらの州では、技術的なスキルを持つ労働者の需要が高く、H1Bビザを求める雇用主がより多く存在する可能性があると示唆されています。

分析により、H1B雇用主の大多数が存在する明確なホットスポットが米国全域に存在することが明らかになりました。これらの地域は、優れた専門家の需要が高い地域を示しています。

結論

この記事では、OFLCからのH1Bビザデータの重要性について掘り下げ、技術的な外国人労働者を米国に引き付ける役割について包括的に探求しました。記事では、クリーニング、特徴量エンジニアリング、変換など、正確な分析を保証するためのさまざまなデータ前処理技術に焦点を当てています。H1Bビザの承認および拒否率の検討を通じて、ブログはこれらの率に影響を与える影響力のある要因を明らかにし、データ可視化を通じて貴重な洞察を提供しています。

キー・テイクアウェイ

  • 仕事のポジションや指定は、H1Bビザの成功を決定する重要な要素です。プログラミングやエンジニアリングなどの高需要分野で技術的なスキルを開発することは、H1Bビザの仕事を確保する可能性を高めます。
  • カリフォルニア、テキサス、ニュージャージーはH1Bビザ申請のトップ州であり、多様な産業にまたがる主要企業の存在により豊富な機会が提供されています。
  • InfosysやTata Consultancy Servicesなどのデータセット内の影響力のある雇用主に注意を払うことは、これらの業界の巨人との取り組みを調整することが、H1Bビザの旅を大幅に後押しする可能性があるため、重要です。

適切なスキルを身につけ、州や雇用主に対してターゲットを絞り、可能性に向けて前進することで、あなたは自信を持ってH1Bビザの冒険を開始し、あなたの才能が評価される世界で繁栄することができます。

よくある質問

この記事で表示されているメディアはAnalytics Vidhyaが所有していないものであり、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more