Rustは、世界で最も愛されている言語というけど、どんな風に愛されている？

毎年恒例となったStackOverflow年次調査で、Rustは4年連続で最も愛されている言語に選ばれた。
https://insights.stackoverflow.com/survey/2019#most-loved-dreaded-and-wanted

#### それにしても「愛されている(loved)」とは？　ふと疑問に思ったので調べてみた。
解説を読むと、どうやら、[want to continue working with]ということらしい。
**「愛されている」＝「仕事で使い続けたい」**というわけだ。

For the fourth year in a row, Rust is the most loved programming language among our respondents, followed close behind by Python, the fastest-growing major language today. This means that proportionally, more developers want to continue working with these than other languages.

アンケート結果の元データは、親切にもここにおいてあって、自由にダウンロードできる。
https://insights.stackoverflow.com/survey/

さっそく2019年のデータセットをダウンロードして解凍すると、survey_results_public.csvが現れる。
Pythonでちょっと解析してみよう。

```python
import pandas as pd
df = pd.read_csv("./survey_results_public.csv")
df.shape
```
(88883, 85)

たしかに90000件もの回答があったのだ。しかも質問は85項目もある。
各項目は、survey_results_schema.csvに書かれている。

「仕事で使い続けたい」という部分をどのように計算して良いのか最初わからなかったが、いろいろ試しているうちに、以下の式でいけるのでは？と思いついた。

### 「仕事で使い続けたい」=「仕事で使って来年も使いたいと回答した数 / 仕事で使ったと回答した数」
として計算してみた。

```python
all_lang=['F#', 'VBA', 'JavaScript', 'Java', 'Clojure', 'HTML/CSS', 'Ruby', 'C#', 'Scala', 'WebAssembly', 'Objective-C', 'C++', 'Assembly', 'Erlang', 'R', 'Python', 'Elixir', 'SQL', 'PHP', 'Dart', 'Rust', 'Other(s):', 'TypeScript', 'C', 'Bash/Shell/PowerShell', 'Go', 'Kotlin', 'Swift']

all_worked_langs = list(df["LanguageWorkedWith"])
all_desire_langs = list(df["LanguageDesireNextYear"])

loved_lang_dic ={}

def calc(lang):
    total_both=0
    total_worked=0      
    for( item1,item2 ) in zip(all_worked_langs,all_desire_langs):
        
        if type(item1) != float:
            worked_langs= item1.split(";") 
            if lang in worked_langs:
                total_worked+=1
                
            if type(item2) != float:
                desire_langs= item2.split(";") 
                if lang in worked_langs and lang in desire_langs:
                    total_both+=1
    return total_both/total_worked

for lang in all_langs:
    loved_lang_dic[lang] = calc(lang)
sorted(loved_lang_dic.items(),key=lambda x:-x[1])
```

>[('Rust', 0.8346456692913385),
 ('Python', 0.7311143429465192),
 ('TypeScript', 0.7309291151541327),
 ('Kotlin', 0.7256227758007118),
 ('Other(s):', 0.6963383838383839),
 ('WebAssembly', 0.6945812807881774),
 ('Swift', 0.6915041782729805),
 ('Clojure', 0.682615629984051),
 ('Elixir', 0.6817460317460318),
 ('Go', 0.6794889598666852),
 ('C#', 0.6696682289552349),
 ('JavaScript', 0.6679444097333626),
 ('Dart', 0.6625074272133096),
 ('SQL', 0.6408589937741881),
 ('HTML/CSS', 0.6217502614214113),
 ('F#', 0.6166495375128469),
 ('Bash/Shell/PowerShell', 0.5948235441217843),
 ('Scala', 0.5832577818071925),
 ('Java', 0.5338140713311246),
 ('C++', 0.5201227830832197),
 ('R', 0.5172345483359746),
 ('Ruby', 0.5030691583685718),
 ('Erlang', 0.47361647361647363),
 ('PHP', 0.4579678679982631),
 ('C', 0.42482100238663484),
 ('Assembly', 0.3564203668781073),
 ('Objective-C', 0.3125745645430685),
 ('VBA', 0.24764693578749217)]

**たしかに、StackOverflowの集計と一致した。**めでたしめでたし。
参考までに、Lovedの反対は、Dreaded（ひどく怖がる→もうやりたくない）。
最もDreadedに輝いたのは、VBAであった。単にLovedを逆順に並べるとDreadedの順位になる。

<img width="454" alt="so2019.pn
g" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237824/5900385a-f7b1-8afa-a68f-c98c8043b323.png">

せっかくなので、Rustについてもう少し調べてみよう。
#### Rustを愛している人は、他にどんな言語を愛しているのだろうか？

```python
favorite_lang_dic = {}

def calc_favorite(lang):
    total_both=0
    
    for( item1,item2 ) in zip(all_worked_langs,all_desire_langs):
        
        if type(item1) != float and type(item2) != float:
            worked_langs= item1.split(";") 
            desire_langs= item2.split(";") 
            
            if lang in worked_langs and lang in desire_langs: 
                both_langs = set(worked_langs) & set(desire_langs)
                for each_lang in both_langs:
                    if each_lang not in favorite_lang_dic:
                        favorite_lang_dic[each_lang]=0
                    favorite_lang_dic[each_lang]+=1

            
calc_favorite("Rust")
sorted(favorite_lang_dic.items(),key=lambda x:-x[1])
```

>[('Rust', 2332),
 ('Python', 1016),
 ('Bash/Shell/PowerShell', 773),
 ('JavaScript', 751),
 ('HTML/CSS', 726),
 ('SQL', 597),
 ('C++', 537),
 ('TypeScript', 528),
 ('C', 520),
 ('Go', 411),
 ('C#', 342),
 ('Java', 320),
 ('Other(s):', 298),
 ('WebAssembly', 238),
 ('Assembly', 227),
 ('Kotlin', 213),
 ('Ruby', 207),
 ('Scala', 144),
 ('Swift', 133),
 ('Elixir', 128),
 ('PHP', 126),
 ('Clojure', 102),
 ('R', 89),
 ('Dart', 84),
 ('F#', 75),
 ('Erlang', 72),
 ('Objective-C', 59),
 ('VBA', 31)]

愛されているランキングとかなり近い結果となった。
Pythonがあるのはわかるが、HTML/CSSやSQLが上位に来ているのはなぜか？
分析してみるのも面白いかもしれない。

しかし、そもそもRustを愛している人は、2332人しかいない（あるいは、そんなにもいる）
全体の2.6%である。この人たちは、自称Rustaceanというらしい。

#### Rustaceanは、何歳ぐらいなのだろう？

```python
all_ages = list(df["Age"])

def calc_mean_age(lang,max_age):
    total_num=0
    total_age=0
    
    for(item1,item2,age) in zip(all_worked_langs,all_desire_langs, all_ages):
        
        if type(item1) != float and type(item2) != float and not numpy.isnan(age):
            
            if age>max_age:
                continue
            worked_langs= item1.split(";") 
            desire_langs= item2.split(";") 
            
            if lang in worked_langs and lang in desire_langs: 
                total_num+=1
                total_age+=age

    return total_age/total_num

lang_age_dic={}
for lang in all_langs:
    lang_age_dic[lang] = calc_mean_age(lang,99)
sorted(lang_age_dic.items(),key=lambda x:-x[1])
```

>[('VBA', 36.212765957446805),
 ('Other(s):', 33.212759885854055),
 ('Clojure', 33.170344827586206),
 ('Erlang', 32.480645161290326),
 ('F#', 32.475563909774436),
 ('Objective-C', 32.33318425760286),
 ('R', 31.95776720034617),
 ('Scala', 31.379725085910653),
 ('Bash/Shell/PowerShell', 31.226414660768654),
 ('C#', 31.14929822456814),
 ('Ruby', 31.13053163053163),
 ('SQL', 31.097569844470048),
 ('Elixir', 31.06797385620915),
 ('WebAssembly', 30.63906510851419),
 ('Swift', 30.60553047404063),
 ('Go', 30.283250339520144),
 ('JavaScript', 30.11312293740814),
 ('HTML/CSS', 30.097556774687423),
 ('TypeScript', 29.967129332477533),
 ('PHP', 29.7729531697993),
 ('C', 29.363660874775313),
 ('Python', 29.284180368709514),
 ('Java', 29.209408318687757),
 ('C++', 28.991222140065492),
 ('Kotlin', 28.87207110153515),
 ('Assembly', 28.775142857142857),
 ('Dart', 27.99106256206554),
 ('Rust', 27.902801519468188)]

平均すると最年少の**27.9歳**となった。
愛されかつ新しく勢いのある言語であることが、よくわかる？
結果となった。

![Rust_VBA_age.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237824/c4463cf9-fd04-8309-a074-76b799f8232b.png)

年齢の中央値は、Rust=27, VBA=33 という結果でした。

#### 趣味か仕事か（MainBranch）
コードは同様なので、結果だけ。

>[('I am a developer by profession', 1671),
 ('I am a student who is learning to code', 298),
 ('I am not primarily a developer, but I write code sometimes as part of my work',
  165),
 ('I code primarily as a hobby', 156),
 ('I used to be a developer by profession, but no longer am', 30)]

開発者が多いようだ。

#### 趣味で使っているか（Hobbyist）

>[('Yes', 2245), ('No', 87)]

趣味と答えた人が、そうでないと答えた人の25倍もいるようだ。
各言語でこの比率を出してみると、次のようになる。
Rustの値は、異常値なのだろうか？　Assemblyが上位にいるのは笑えた、分かる気がする。

>[('Rust', 25.804597701149426),
 ('WebAssembly', 11.818181818181818),
 ('Assembly', 9.043478260869565),
 ('Dart', 8.955357142857142),
 ('Go', 8.445945945945946),
 ('Elixir', 8.33695652173913),
 ('Clojure', 8.204301075268818),
 ('Erlang', 7.761904761904762),
 ('C', 7.0399159663865545),
 ('F#', 7.0),
 ('C++', 6.641374373657838),
 ('Kotlin', 6.4963235294117645),
 ('Python', 5.890095681406775),
 ('Swift', 5.824742268041237),
 ('Bash/Shell/PowerShell', 5.697993664202746),
 ('TypeScript', 5.359323626115547),
 ('Other(s):', 5.224604966139955),
 ('Objective-C', 5.150234741784038),
 ('Ruby', 4.7625),
 ('Scala', 4.7611940298507465),
 ('HTML/CSS', 4.756301118344183),
 ('PHP', 4.738302502720348),
 ('JavaScript', 4.536039188243527),
 ('Java', 4.198752711496746),
 ('R', 4.1196078431372545),
 ('C#', 4.087188113260443),
 ('SQL', 3.99328089151098),
 ('VBA', 3.8524590163934427)]

#### 学生ですか（Student）

>[('No', 1639), ('Yes, full-time', 530), ('Yes, part-time', 129)]

#### 住んでいる国は（Country）

>[('United States', 748),
 ('Germany', 242),
 ('United Kingdom', 178),
 ('Canada', 95),
 ('France', 90),
 ('Australia', 72),
 ('Netherlands', 69),
 ('Sweden', 64),
 ('Russian Federation', 62),
 ('India', 55),
 ('Poland', 53),
 ('Brazil', 37),
 ('Austria', 35),
 ('Denmark', 28),
 ('Finland', 28),
 ('New Zealand', 27),
 ('Switzerland', 27),
 ('Norway', 25),
 ('Czech Republic', 23),
 ('Belgium', 22),
 ('Spain', 22),
 ('Ukraine', 22),
 ('Turkey', 19),
 ('China', 17),
 ('Italy', 17),
 ('Israel', 15),
 ('Japan', 14),
 ('Mexico', 12),
 ('Greece', 11),
 ('Romania', 10),
 ('Argentina', 9),
以下略

参考までに、C++を「愛している」人が住んでいる国：

> [('United States', 2589),
 ('India', 1027),
 ('Germany', 892),
 ('United Kingdom', 580),
 ('Canada', 475),
 ('France', 361),
 ('Poland', 282),
 ('Russian Federation', 274),
 ('Italy', 209),
 ('Australia', 204),
以下略

とのこと。ドイツとの間にインドが挟まりました。


#### stackOverflow年次調査は、とても面白いので、読んでいて気が付いたことがあれば引き続き投稿する予定です。