Pew Research Center Study on Which Cities had the Most H-1B Visas (Part 2)

Output from a prior Jupyter notebook checked the validity of a March 29, 2018 study from the Pew Research Center by looking at Labor Condition Application (LCA) data from 2017. The analysis concludes:

As can be seen, Santa Clara County had over twice as many requests as the number two worksite county, New York County. Santa Clara County is the location of Silicon Valley. Hence, Silicon Valley did have the most requests for H-1B workers by worksite county despite the San Jose-Sunnyvale-Santa Clara, CA area being ranked tenth in the Pew's table of employer metropolitan areas. In fact, the H-1B visa approvals per 100 workers shown in the table appears to be largely meaningless. This is especially the case for the 32 H-1B visa approvals per 100 workers listed for College Station, Texas. This is because the Pew study is comparing the H-1B workers who are working in the Worksite Cities (where they are actually working) to the population of workers in the Employer City (where the company headquarters is located). As shown above, these are often very different cities, especially in the case of [IT consulting firms]https://en.wikipedia.org/wiki/List_of_IT_consulting_firms).

Unlike the Pew study data, the LCA data does have the worksite location. Of course, many workers who was requested were not approved for H-1B visa. For this reason, it's not possible to calculate the ratio of H-1B workers to the number of workers in the cities where they work. However, it turns out that Census data from the annual American Community Survey (ACS) can be used to come up with a reasonable estimate. That data does not contain H-1B status but one can estimate the number of H-1B workers by looking at the number of workers who are not citizens, especially those who work in occupations that attract the most H-1B workers. As shown in Table 8B in this USCIS document, about 69 percent of all H-1B beneficiaries in 2016 were in computer-related occupations. Of course, this may include some workers who are here on other visas such as L-1 workers and F-1 students engaged in Optional Practical Training (OPT).

The following Python code looks at data from the 2016 American Community Survey (ACS). The data can be created by going to the IPUMS USA website, logging in (creating an account, if necessary), and creating an extract with the variables STATEFIP, COUNTY, MET2013, PUMA, CITIZEN, EMPSTAT, and OCC. The variables YEAR, DATANUM, SERIAL, HHWT, GQ, PERNUM, and PERWT are automatically preselected. For samples, select ACS for 2016. For data format, select .csv. For structure, select rectangular. For more information, see IPUMS Documentation: User's Guide. You should receive an email when your extract is ready. You can then download, rename it to acs2016.csv, and place it in the same directory as the following Python code and run the code.

The following code reads the acs2016.csv and will list the percentage of workes with OCC code 1020 (Software developers, applications and systems software) who are US-born citizens, naturalized citizens, and non-citizens. It will do this for all metropolitan areas with 5000 or more such workers display them in descending order of the percent who are non-citizens. Following is the code, followed by the output:

In [1]:
import pandas as pd
# ACS Occupation Codes at https://usa.ipums.org/usa/volii/occ_acs.shtml
# (described at https://www.census.gov/content/dam/Census/library/publications/2016/acs/acs-35.pdf)
#  110 = Computer and information systems managers
# 1010 = Computer programmers
# 1020 = Software developers, applications and systems software 
# print(pd.get_option('display.width'))
pd.set_option('display.width', 120)

def getCitizenStatusByMetro(min_count, occs, title):
    metref = "https://www2.census.gov/programs-surveys/metro-micro/geographies/reference-files/2017/delineation-files/list2.xls"
    xx = pd.read_excel(metref, skiprows=2)
    mm = xx.groupby(['CBSA Code'])['CBSA Title'].min()
    mm = mm.reset_index(level=['CBSA Code'])
    mm.columns = ['CBSA Code','Metro']
    mm['Metro Code'] = pd.to_numeric(mm['CBSA Code'],errors='coerce')

    usa = pd.read_csv("acs2016.csv")
    if len(occs) > 1:
        occ_start = occs[0]
        for i in range(1,len(occs)):
            if occs[i] >= 0:
                occ_end = occs[i]
                usa.loc[usa['OCC'] == occ_end,'OCC'] = occs[0]
            else:
                occ_end = -occs[i]
                usa.loc[(usa['OCC'] >= occ_start) & (usa['OCC'] <= occ_end),'OCC'] = occs[0]
            occ_start = occ_end + 1
    #print("usa[{0}] = {1}".format(usa.shape[0], sum(usa['PERWT'])))
    print("usa[%d] = %d\n" % (usa.shape[0], sum(usa['PERWT'])))

    gg = usa.groupby(['MET2013','CITIZEN','EMPSTAT','OCC'])['PERWT'].sum()
    uu = gg.unstack('CITIZEN')
    uu.columns =['na','baa','nat','nac']
    uu = uu.fillna(0)
    uu['count'] = uu['na'] + uu['baa'] + uu['nat'] + uu['nac']
    uu['usa_p'] = 100 * (uu['na'] + uu['baa']) / uu['count']
    uu['nat_p'] = 100 * uu['nat'] / uu['count']
    uu['nac_p'] = 100 * uu['nac'] / uu['count']
    uu = uu.reset_index(level=['MET2013','EMPSTAT','OCC'])
    pp = uu[(uu['OCC'] == occs[0]) & (uu['EMPSTAT'] == 1) & (uu['count'] > min_count)]
    pp = pp.sort_values(by=['nac_p'], ascending=False)
    pp = pp.merge(mm, left_on='MET2013',right_on='Metro Code',how='left')
    qq=pd.DataFrame(pp['Metro'], columns=['Metro'])
    qq['count']=pp['count'].astype('int')
    qq['us-born%']=pp['usa_p'].round(1)
    qq['natural%']=pp['nat_p'].round(1)
    qq['non-cit%']=pp['nac_p'].round(1)
    print(title)
    print(qq)
    qq.to_csv("metro_comp", sep=';')

getCitizenStatusByMetro(5000, [1020], "Software Developers - US-born, Naturalized, and Non-citizen (percent)\n")
usa[3156487] = 323127515

Software Developers - US-born, Naturalized, and Non-citizen (percent)

                                             Metro  count  us-born%  natural%  non-cit%
0               San Jose-Sunnyvale-Santa Clara, CA  77315      24.8      26.0      49.2
1                Charlotte-Concord-Gastonia, NC-SC  10970      46.8      14.4      38.8
2                      Seattle-Tacoma-Bellevue, WA  67693      50.9      11.9      37.2
3                San Francisco-Oakland-Hayward, CA  87189      41.1      22.2      36.8
4          Sacramento--Roseville--Arden-Arcade, CA   8961      54.0      14.1      31.9
5            New York-Newark-Jersey City, NY-NJ-PA  72761      44.0      24.2      31.7
6      Philadelphia-Camden-Wilmington, PA-NJ-DE-MD  25319      54.4      14.6      31.0
7                      Detroit-Warren-Dearborn, MI  14113      55.7      14.2      30.1
8                    San Antonio-New Braunfels, TX   5531      65.8       5.2      29.0
9   Nashville-Davidson--Murfreesboro--Franklin, TN   6667      65.6       7.1      27.3
10               Atlanta-Sandy Springs-Roswell, GA  30524      56.8      16.0      27.2
11              Chicago-Naperville-Elgin, IL-IN-WI  43724      56.5      16.6      26.8
12            Houston-The Woodlands-Sugar Land, TX  18867      57.2      16.6      26.1
13                                    Columbus, OH   6941      68.5       5.9      25.6
14              Los Angeles-Long Beach-Anaheim, CA  48819      49.3      25.2      25.5
15                 Dallas-Fort Worth-Arlington, TX  45172      57.1      18.5      24.4
16       Miami-Fort Lauderdale-West Palm Beach, FL  13412      48.3      27.7      24.0
17                  Boston-Cambridge-Newton, MA-NH  53440      61.6      15.5      23.0
18                                     Raleigh, NC  17297      65.4      11.8      22.7
19                              Kansas City, MO-KS  12075      71.8       7.1      21.0
20                                Worcester, MA-CT   6370      59.5      20.1      20.3
21             Tampa-St. Petersburg-Clearwater, FL   8878      61.8      19.1      19.1
22                   Orlando-Kissimmee-Sanford, FL  12216      70.9      10.1      18.9
23                     Phoenix-Mesa-Scottsdale, AZ  18252      73.2       8.0      18.8
24    Washington-Arlington-Alexandria, DC-VA-MD-WV  64692      62.6      19.6      17.8
25                                St. Louis, MO-IL   9218      71.0      11.3      17.7
26                       Providence-Warwick, RI-MA   6077      71.8      10.9      17.3
27         Minneapolis-St. Paul-Bloomington, MN-WI  27931      68.7      15.4      16.0
28                      Denver-Aurora-Lakewood, CO  28537      74.8       9.4      15.8
29             Portland-Vancouver-Hillsboro, OR-WA  15447      72.8      11.9      15.3
30                                  Pittsburgh, PA  10352      78.4       6.3      15.3
31                           Austin-Round Rock, TX  22409      75.0      10.7      14.3
32                          San Diego-Carlsbad, CA  21275      59.8      26.0      14.1
33            Riverside-San Bernardino-Ontario, CA   5269      77.5      10.6      11.9
34                                             NaN  85594      84.5       3.8      11.7
35                              Salt Lake City, UT   9305      83.5       4.9      11.6
36                            Cleveland-Elyria, OH   5753      69.9      19.2      10.8
37                   Baltimore-Columbia-Towson, MD  20369      78.8      10.5      10.6
38                Indianapolis-Carmel-Anderson, IN   6699      74.9      15.6       9.5
39                            Cincinnati, OH-KY-IN   7356      81.9      11.1       6.9
40                                   Rochester, NY   5147      84.7       9.9       5.4
41                            Colorado Springs, CO   6945      92.3       7.7       0.0

As can be seen, the San Jose-Sunnyvale-Santa Clara, CA metro area had the highest percentage of non-citizens working in software development (OCC 1020) at over 49 percent. The nearby San Francisco-Oakland-Hayward, CA metro area came in fourth with a non-citizen percentage of 36.8 percent and the Sacramento--Roseville--Arden-Arcade, CA came in fifth with 36.8 percent.

There is one minor problem with looking at metropolitan areas. They don't cover a number of areas that may have a large number of H-1B workers. For example, they don't cover the Silicon Valley cities of Cupertino (home of Apple), Mountain View (home of Google), and Menlo Park (home of Facebook). The following Python code does pretty much the same as the prior code except that it looks at all counties instead of metropolitan areas with 5000 or more software developers. Following is the code, followed by the resulting output:

In [2]:
import pandas as pd
# ACS Occupation Codes at https://usa.ipums.org/usa/volii/occ_acs.shtml
# (described at https://www.census.gov/content/dam/Census/library/publications/2016/acs/acs-35.pdf)
#  110 = Computer and information systems managers
# 1010 = Computer programmers
# 1020 = Software developers, applications and systems software 
# print(pd.get_option('display.width'))
pd.set_option('display.width', 120)

def getCitizenStatusByCounty(min_count, occs, title):
    fipref = "https://www2.census.gov/geo/docs/reference/codes/files/national_county.txt"
    mm = pd.read_csv(fipref, skiprows=0, names=['State','StateCode','CountyCode','County','H1'])
    mm['CountyCode'] *= 10

    usa = pd.read_csv("acs2016.csv")
    if len(occs) > 1:
        occ_start = occs[0]
        for i in range(1,len(occs)):
            if occs[i] >= 0:
                occ_end = occs[i]
                usa.loc[usa['OCC'] == occ_end,'OCC'] = occs[0]
            else:
                occ_end = -occs[i]
                usa.loc[(usa['OCC'] >= occ_start) & (usa['OCC'] <= occ_end),'OCC'] = occs[0]
            occ_start = occ_end + 1
    #print("usa[{0}] = {1}".format(usa.shape[0], sum(usa['PERWT'])))
    print("usa[%d] = %d\n" % (usa.shape[0], sum(usa['PERWT'])))

    gg = usa.groupby(['STATEFIP','COUNTY','CITIZEN','EMPSTAT','OCC'])['PERWT'].sum()
    uu = gg.unstack('CITIZEN')
    uu.columns =['na','baa','nat','nac']
    uu = uu.fillna(0)
    uu['count'] = uu['na'] + uu['baa'] + uu['nat'] + uu['nac']
    uu['usa_p'] = 100 * (uu['na'] + uu['baa']) / uu['count']
    uu['nat_p'] = 100 * uu['nat'] / uu['count']
    uu['nac_p'] = 100 * uu['nac'] / uu['count']
    uu = uu.reset_index(level=['STATEFIP','COUNTY','EMPSTAT','OCC'])
    pp = uu[(uu['OCC'] == occs[0]) & (uu['EMPSTAT'] == 1) & (uu['count'] > min_count)]
    pp = pp.sort_values(by=['nac_p'], ascending=False)
    pp = pp[pp['COUNTY'] > 0]
    pp = pp.merge(mm, left_on=['STATEFIP','COUNTY'],right_on=['StateCode','CountyCode'],how='left')
    qqCounty = pp['County'].str.replace(' County','') + ", " + pp['State']
    qq=pd.DataFrame(qqCounty, columns=['County'])
    qq['count']=pp['count'].astype('int')
    qq['us-born%']=pp['usa_p'].round(1)
    qq['natural%']=pp['nat_p'].round(1)
    qq['non-cit%']=pp['nac_p'].round(1)
    print(title)
    print(qq)
    qq.to_csv("county_comp", sep=';')

getCitizenStatusByCounty(5000, [1020], "Software Developers - US-born, Naturalized, and Non-citizen (percent)\n")
usa[3156487] = 323127515

Software Developers - US-born, Naturalized, and Non-citizen (percent)

               County  count  us-born%  natural%  non-cit%
0          Hudson, NJ   7074      20.4       9.0      70.7
1       Middlesex, NJ   9998      13.2      27.5      59.3
2     Santa Clara, CA  77315      24.8      26.0      49.2
3     Mecklenburg, NC   7596      35.2      15.9      48.9
4       San Mateo, CA  13819      39.3      14.6      46.1
5         Alameda, CA  41558      30.7      27.3      42.0
6      Sacramento, CA   6047      41.8      16.2      41.9
7            King, WA  59652      49.7      10.9      39.4
8         Oakland, MI   9077      40.5      21.5      38.0
9            Dane, WI   9100      62.3       3.4      34.3
10         DuPage, IL   6441      45.7      20.1      34.2
11         Dallas, TX  12879      53.9      15.0      31.1
12           Cook, IL  24401      60.3      10.1      29.6
13         Collin, TX  14859      45.6      25.1      29.3
14    Los Angeles, CA  32461      50.5      21.0      28.5
15     Montgomery, PA   5536      51.6      20.8      27.5
16   Contra Costa, CA   9796      43.7      29.2      27.2
17     Washington, OR   7049      59.5      14.3      26.2
18        Johnson, KS   7735      64.3       9.7      26.0
19           Kent, MD   9114      42.8      31.3      25.9
20  San Francisco, CA  20299      60.0      14.2      25.9
21        Broward, FL   6173      51.7      23.8      24.5
22           Wake, NC  16597      64.2      12.3      23.5
23        Harford, MD   7187      60.9      16.2      22.9
24         Denton, TX   9306      59.4      18.4      22.2
25        Loudoun, VA  10816      47.9      30.0      22.1
26         Harris, TX  11271      69.1       9.0      21.9
27   Hillsborough, FL   5072      54.2      24.4      21.4
28       Hennepin, MN  15399      60.9      18.1      20.9
29       New York, NY   8738      66.2      13.1      20.7
30      Snohomish, WA   6537      60.4      19.7      19.9
31         Orange, FL   8287      68.5      11.8      19.7
32         Orange, CA  16358      47.1      33.4      19.6
33       Maricopa, AZ  17412      72.1       8.4      19.5
34      Allegheny, PA   7526      77.7       2.8      19.4
35        Suffolk, MA   5998      74.5       8.2      17.4
36         Travis, TX  14960      76.8       8.2      15.0
37      San Diego, CA  21275      59.8      26.0      14.1
38          Kings, NY   8605      58.3      27.7      13.9
39     Williamson, TX   7208      72.3      14.3      13.3
40      Salt Lake, UT   8466      81.9       5.4      12.7
41        Tarrant, TX   6436      78.0      12.8       9.2
42   Anne Arundel, MD   5259      93.5       1.7       4.8
43      Multnomah, OR   5035      85.4      11.1       3.5

As can be seen, Santa Clara County has the same 49.2 percent of non-citizens working in software development as did the San Jose-Sunnyvale-Santa Clara, CA metro area. Surprisingly, there's a couple of counties in New Jersey that have a much smaller number of software developers but a higher percentage of them are non-citizen. This could merit further investigation, especially the high 70.7 percent of non-citizen software developers in Hudson County. In any case, San Mateo and Alameda counties, both of which border Santa Clara County, are fifth and sixth with percentages of 46.1 and 42, respectively. San Francisco has a lower percentage of non-citizens software developers at 25.9 percent. In total, the four counties in or close to Silicon Valley (Santa Clara, Alameda, San Mateo, and San Francisco) have 152,991 software developers with 67,056, 43.8 percent of the total, being non-citizens. That appears to be the area with the most H-1B visas for skilled workers, at least for software developers.

The above Python functions can be called with any specified occupations. Following are the results for metro areas when looking at all computer and mathematical occupations according to the ACS Occupation Codes. It also includes the occupation "Computer and information systems managers" (Occupation Code 110) since those jobs are closely related. The minimum count is increased to 20,000 to limit the output to the 47 metro areas with the largest counts.

In [3]:
getCitizenStatusByMetro(20000, [110,1000,-1299], "Computer and Mathematical Occupations - US-born, Naturalized, and Non-citizen (percent)\n")
usa[3156487] = 323127515

Computer and Mathematical Occupations - US-born, Naturalized, and Non-citizen (percent)

                                             Metro   count  us-born%  natural%  non-cit%
0               San Jose-Sunnyvale-Santa Clara, CA  128398      30.7      28.2      41.1
1                San Francisco-Oakland-Hayward, CA  181741      51.8      21.7      26.5
2                      Seattle-Tacoma-Bellevue, WA  140533      62.3      12.1      25.6
3            New York-Newark-Jersey City, NY-NJ-PA  357692      57.7      23.2      19.1
4         Hartford-West Hartford-East Hartford, CT   29724      72.7       8.6      18.7
5        Miami-Fort Lauderdale-West Palm Beach, FL   63412      55.7      27.0      17.3
6                                 Worcester, MA-CT   20767      72.5      10.8      16.7
7                Charlotte-Concord-Gastonia, NC-SC   48735      74.0      10.2      15.8
8               Los Angeles-Long Beach-Anaheim, CA  189295      61.2      23.0      15.8
9                   Boston-Cambridge-Newton, MA-NH  139539      71.3      13.0      15.7
10            Houston-The Woodlands-Sugar Land, TX   95115      67.3      17.4      15.3
11               Atlanta-Sandy Springs-Roswell, GA  133655      72.0      12.8      15.2
12                 Dallas-Fort Worth-Arlington, TX  164308      70.0      14.9      15.1
13                                    Columbus, OH   47227      77.0       8.1      14.8
14              Chicago-Naperville-Elgin, IL-IN-WI  184037      69.2      16.2      14.6
15     Philadelphia-Camden-Wilmington, PA-NJ-DE-MD  122693      74.6      11.7      13.7
16                                    Richmond, VA   27558      80.0       7.0      12.9
17                                     Raleigh, NC   52854      74.6      12.8      12.6
18                     Phoenix-Mesa-Scottsdale, AZ   77870      79.6       7.9      12.5
19                   San Antonio-New Braunfels, TX   31798      81.1       6.4      12.5
20                           Austin-Round Rock, TX   66456      79.7       7.8      12.4
21                     Detroit-Warren-Dearborn, MI   71078      72.9      15.2      11.9
22         Minneapolis-St. Paul-Bloomington, MN-WI  102987      75.9      12.5      11.5
23                   Orlando-Kissimmee-Sanford, FL   41659      74.0      14.5      11.5
24         Sacramento--Roseville--Arden-Arcade, CA   42212      75.1      13.5      11.4
25                       Providence-Warwick, RI-MA   26719      81.7       7.1      11.2
26                              Salt Lake City, UT   27715      83.5       5.9      10.6
27             Tampa-St. Petersburg-Clearwater, FL   43872      76.0      13.7      10.3
28                          San Diego-Carlsbad, CA   67259      72.3      17.5      10.2
29    Washington-Arlington-Alexandria, DC-VA-MD-WV  266240      70.9      19.2      10.0
30             Portland-Vancouver-Hillsboro, OR-WA   55391      80.1      10.3       9.6
31                      Denver-Aurora-Lakewood, CO   90461      85.3       5.7       8.9
32  Nashville-Davidson--Murfreesboro--Franklin, TN   35254      83.9       7.3       8.8
33                     Omaha-Council Bluffs, NE-IA   22603      88.8       2.6       8.6
34                Las Vegas-Henderson-Paradise, NV   23135      81.1      10.2       8.6
35               Milwaukee-Waukesha-West Allis, WI   25218      85.8       5.7       8.5
36                                St. Louis, MO-IL   51743      85.4       6.8       7.8
37                Indianapolis-Carmel-Anderson, IN   34904      86.4       6.1       7.4
38                   Baltimore-Columbia-Towson, MD   84309      82.5      10.1       7.4
39                                  Pittsburgh, PA   46900      88.6       4.3       7.2
40                                Jacksonville, FL   24061      83.5       9.3       7.2
41                              Kansas City, MO-KS   46749      86.5       6.8       6.8
42                            Cleveland-Elyria, OH   32841      84.6       9.0       6.4
43            Riverside-San Bernardino-Ontario, CA   34775      83.1      10.7       6.1
44                            Cincinnati, OH-KY-IN   35899      88.5       6.6       4.8
45                                             NaN  519381      92.8       2.9       4.3
46                                   Rochester, NY   20172      92.0       4.4       3.6
47      Virginia Beach-Norfolk-Newport News, VA-NC   31606      92.6       5.0       2.5

As can be seen, the San Jose-Sunnyvale-Santa Clara, CA metro area still has the highest percentage of non-citizen workers with the percent dropping from 49.2 for software developers to 41.1 for all computer and mathematical occupations, including managers. If managers are excluded, the percent drops just to 42.7. In any case, the San Francisco-Oakland-Hayward, CA metro area is now second with the percentage of non-citizen workers dropping from 36.8 to 26.5.

Following are the results for counties when looking at all computer and mathematical occupations. The minimum count is again increased to 20,000 to limit the output to the 52 counties with the largest counts.

In [4]:
getCitizenStatusByCounty(20000, [110,1000,-1299], "Computer and Mathematical Occupations - US-born, Naturalized, and Non-citizen (percent)\n")
usa[3156487] = 323127515

Computer and Mathematical Occupations - US-born, Naturalized, and Non-citizen (percent)

                      County   count  us-born%  natural%  non-cit%
0                 Hudson, NJ   24851      32.8      14.5      52.7
1              Middlesex, NJ   33008      24.6      30.4      45.0
2            Santa Clara, CA  128398      30.7      28.2      41.1
3              San Mateo, CA   27322      49.9      17.9      32.1
4                Alameda, CA   78852      41.2      26.9      31.9
5                   King, WA  111578      60.1      11.2      28.7
6               Hartford, CT   22772      69.3       8.6      22.1
7                 Bergen, NJ   23616      53.0      25.5      21.6
8                 Dallas, TX   48020      64.5      15.6      20.0
9          San Francisco, CA   41313      66.1      14.1      19.9
10           Mecklenburg, NC   29136      66.8      13.7      19.6
11                  Dane, WI   25855      74.0       7.3      18.7
12               Oakland, MI   34069      61.2      20.1      18.7
13          Contra Costa, CA   29353      57.3      24.6      18.1
14                Collin, TX   43766      58.8      23.1      18.1
15              Hennepin, MN   46650      70.3      12.0      17.6
16                  Cobb, GA   22988      75.3       7.3      17.4
17              Franklin, OH   32117      74.5       8.5      17.0
18                  Cook, IL   95370      69.0      14.2      16.8
19               Broward, FL   25727      55.9      27.6      16.5
20               Harford, MD   20088      66.2      17.4      16.4
21               Loudoun, VA   32191      52.6      31.3      16.1
22           Los Angeles, CA  125766      61.7      22.5      15.9
23                Orange, CA   63529      60.3      24.0      15.7
24                DuPage, IL   30358      66.3      19.1      14.6
25                Harris, TX   61026      71.4      14.0      14.5
26                 Bexar, TX   27129      78.7       6.9      14.4
27                  Kent, MD   42744      58.6      27.3      14.0
28                Denton, TX   31810      73.5      12.5      14.0
29                  Wake, NC   47889      72.5      13.7      13.8
30                Queens, NY   30925      53.8      32.7      13.5
31          Hillsborough, FL   25243      67.4      19.1      13.5
32              New York, NY   39521      69.1      17.7      13.3
33              Maricopa, AZ   74087      79.0       7.9      13.1
34            Sacramento, CA   27897      71.9      15.9      12.2
35              Gwinnett, GA   21417      70.0      17.8      12.2
36                Travis, TX   44308      81.9       6.2      11.9
37             Salt Lake, UT   25892      82.4       6.3      11.4
38                 Kings, NY   41782      61.1      27.7      11.2
39            Montgomery, PA   24208      75.1      13.8      11.1
40                Orange, FL   23838      70.7      18.7      10.5
41                Nassau, NY   23151      65.5      24.1      10.4
42             San Diego, CA   67259      72.3      17.5      10.2
43             Allegheny, PA   32491      86.5       3.7       9.9
44               Johnson, KS   21418      81.9       8.8       9.4
45                 Clark, NV   23135      81.1      10.2       8.6
46               Tarrant, TX   31274      83.6       8.0       8.5
47              Cuyahoga, OH   20004      82.0      10.2       7.8
48             Baltimore, MD   21267      84.5       8.8       6.7
49  District of Columbia, DC   22478      85.4       8.8       5.7
50            Montgomery, MD   27650      84.0      11.1       4.9
51          Anne Arundel, MD   22092      90.2       6.1       3.8
52             Multnomah, OR   20981      89.4       7.2       3.3

As can be seen, Hudson and Middesex counties are still at the top with their percentage of non-citizen workers dropping to 52.7 (from 70.7) and 45.0 (from 59.3), respectively. The next three are Santa Clara, San Mateo, and Alameda counties, all in or bordering Silicon Valley. The percentage of non-citizen workers in Santa Clara County drops from 49.2 for software developers to 41.1 for all computer and mathematical occupations, just like the San Jose-Sunnyvale-Santa Clara, CA metro area. The percentages of non-citizen workers in San Mateo and Alameda counties have dropped to 32.1 (from 46.1) and 31.9 (from 42.0), repecively. San Francico County has dropped from 25.9 to 19.9 percent. Hence, Silicon Valley does appear to be the area with the most H-1B visas for skilled workers, even for the expanded category of all computer and mathematical occupations. As mentioned above, Table 8B in this USCIS document shows that about 69 percent of all H-1B beneficiaries in 2016 were in computer-related occupations. Hence, these results are very much contrary to the Pew Study's contention that East Coast and Texas metros had the most H-1B visas for skilled workers from 2010 to 2016. It appears that the contrary results of the Pew Study come from incorrectly assuming that H-1B workers work in the city listed as the Employer City. This assumption appears to be especially incorrect for [IT consulting firms]https://en.wikipedia.org/wiki/List_of_IT_consulting_firms).

Note: The Jupyter Notebook from which this post is generated can be found at http://econdataus.com/pew_h1b_2.ipynb.