Analisei mais de 1000 perfis de aprendizado de máquina do Github e aqui está o que aprendi.





Procurando pela palavra-chave "aprendizado de máquina", encontrei 246.632 repositórios de aprendizado de máquina. Como todos estão relacionados a esse setor, esperava que seus proprietários fossem especialistas ou, pelo menos, competentes o suficiente em aprendizado de máquina. Portanto, decidi analisar os perfis desses usuários e mostrar os resultados da análise.



Como eu trabalhei



Ferramentas



Usei três ferramentas de raspagem:



  • Beautiful Soup para buscar a URL de todos os repositórios marcados com aprendizado de máquina. É uma biblioteca Python que torna a coleta de dados muito mais fácil.
  • PyGithub . Python- Github API v3. Github- (, , ..) Python-.
  • Requests .


Métodos



Eu analisei longe de todos, mas apenas os proprietários e 30 contribuidores mais ativos dos 90 principais repositórios que apareceram nos resultados da pesquisa.











Após remover duplicatas e perfis de organizações como a udacity, obtive uma lista de 1.208 usuários. Para cada um deles, analisei as informações de 20 parâmetros principais.



new_profile.info ()







Os primeiros 13 parâmetros foram obtidos aqui.







O resto tirei dos repositórios do usuário:



  • total_stars total de estrelas de todos os repositórios
  • max_star número máximo de estrelas de todos os repositórios
  • garfos número total de garfos de todos os repositórios
  • descrições descrições de todos os repositórios do usuário de todos os repo
  • contribuição número de contribuições do último ano






Visualização de dados



Histogramas



Depois de limpar os dados, foi a vez da etapa mais interessante: a visualização dos dados. Eu usei Plotly para isso.



import matplotlib.pyplot as plt
import numpy as np
import plotly.express as px # for plotting
import altair as alt # for plotting
import datapane as dp # for creating a report for your findings
 
top_followers = new_profile.sort_values(by='followers', axis=0, ascending=False)
 
fig = px.bar(top_followers,
             x='user_name',
             y='followers',
             hover_data=['followers'],
            )
fig.show()
      
      





Aqui está o que aconteceu .



O histograma é um pouco estranho porque tem uma longa cauda de usuários com menos de 100 seguidores. Portanto, é melhor aumentá-lo.







Como você pode ver, llSourcell (Siraj Raval) tem o maior número de seguidores (36261). O segundo mais popular tem três vezes menos seguidores (12682).



Podemos ir em frente e descobrir que 1% dos perfis tem 41% de todos os seguidores!



>>> top_n = int(len(top_followers) * 0.01)12>>> sum(top_followers.iloc[0: top_n,:].loc[:, 'followers'])/sum(top_followers.followers)0.41293075864408607
      
      





A seguir, visualizamos informações sobre total_stars, max_star, garfos usando uma escala logarítmica.



figs = [] # list to save all the plots and table
 
features = ['followers',
               'following',
               'total_stars',
               'max_star',
               'forks',
                'contribution']
for col in features:
    top_col = new_profile.sort_values(by=col, axis=0, ascending=False)
    
    log_y = False 
    #change scale of y-axis of every feature to log except contribution
    if col != 'contribution':
        log_y = True
        
    fig = px.bar(top_col,
             x='user_name',
             y=col,
             hover_data=[col],
             log_y = log_y
            )
    
    fig.update_layout({'plot_bgcolor': 'rgba(36, 83, 97, 0.06)'}) #change background coor
    
    fig.show()
    
    figs.append(dp.Plot(fig))
      
      





Acontece assim .



A imagem resultante está muito próxima da distribuição de acordo com a lei de Zipf. Estamos falando sobre o padrão empírico da distribuição da frequência das palavras em uma linguagem natural: se todas as palavras da língua estão ordenadas em ordem decrescente de frequência de seu uso. Temos uma dependência semelhante aqui.



Correlação



Mas e quanto às dependências entre os principais pontos de dados? E quão fortes são essas dependências? Usei scatter_matrix para descobrir isso.



correlation = px.scatter_matrix(new_profile, dimensions=['forks', 'total_stars', 'followers',
                                 'following', 'max_star','contribution'],
                               title='Correlation between datapoints',
                               width=800, height=800)
correlation.show()
 
corr = new_profile.corr()
 
figs.append(dp.Plot(correlation))
figs.append(dp.Table(corr))
corr
      
      





Acontece assim e assim por diante .



As relações positivas mais fortes são formadas entre:



  • Número máximo de estrelas e número total de estrelas (0,939)
  • Forks e total de estrelas (0,929)
  • O número de bifurcações e o número de seguidores (0,774)
  • Seguidores e total de estrelas (0,632)


Linguagens de programação



Para descobrir quais linguagens de programação são mais comuns entre os proprietários de perfil do GitHub, fiz algumas análises adicionais.



# Collect languages from all repos of al users
languages = []
for language in list(new_profile['languages']):
    try:
        languages += language
    except:
        languages += ['None']
        
# Count the frequency of each language
from collections import Counter
occ = dict(Counter(languages))
 
# Remove languages below count of 10
top_languages = [(language, frequency) for language, frequency in occ.items() if frequency > 10]
top_languages = list(zip(*top_languages))
 
language_df = pd.DataFrame(data = {'languages': top_languages[0],
                           'frequency': top_languages[1]})
 
language_df.sort_values(by='frequency', axis=0, inplace=True, ascending=False)
 
language = px.bar(language_df, y='frequency', x='languages',
      title='Frequency of languages')
 
figs.append(dp.Plot(language))
 
language.show()
      
      





Assim, os 10 principais idiomas incluem:



  • Pitão
  • JavaScript
  • Html
  • Notebook Jupyter
  • Shell, etc.


Localização



Para entender em quais partes do mundo os proprietários dos perfis estão localizados, você precisa realizar a seguinte tarefa - visualizar a localização dos usuários. Dentre os perfis analisados, a geografia é indicada para 31%. Para visualização, usamos geopy.geocoders.Nominatim



from geopy.geocoders import Nominatim
import folium
 
geolocator = Nominatim(user_agent='my_app')
 
locations = list(new_profile['location'])
 
# Extract lats and lons
lats = []
lons = []
exceptions = []
 
for loc in locations:
    try:
        location = geolocator.geocode(loc)
        lats.append(location.latitude)
        lons.append(location.longitude)
        print(location.address)
    except:
        print('exception', loc)
        exceptions.append(loc)
        
print(len(exceptions)) # output: 17
 
 # Remove the locations not found in map
location_df = new_profile[~new_profile.location.isin(exceptions)]
 
location_df['latitude'] = lats
location_df['longitude'] = lons
      
      





Bem, então, para construir um mapa, use o scatter_geo de Plotly



# Visualize with Plotly's scatter_geo
m = px.scatter_geo(location_df, lat='latitude', lon='longitude',
                 color='total_stars', size='forks',
                 hover_data=['user_name','followers'],
                 title='Locations of Top Users')
m.show()
 
figs.append(dp.Plot(m))
      
      





De acordo com este link está disponível o mapa original com zoom.



Descrição dos usuários repo e bio



Muitos usuários deixam uma descrição para seus repositórios e também fornecem sua própria biografia. Para visualizar tudo isso, usamos o W ordCloud! para Python.



import string
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
 
nltk.download('stopwords')
nltk.download('punkt')
nltk.download('wordnet')
 
      
def process_text(features):
  '''Function to process texts'''
    
    features = [row for row in features if row != None]
    
    text = ' '.join(features)
    
    
    
    # lowercase
    text = text.lower()
 
    #remove punctuation
    text = text.translate(str.maketrans('', '', string.punctuation))
 
    #remove stopwords
    stop_words = set(stopwords.words('english'))
 
    #tokenize
    tokens = word_tokenize(text)
    new_text = [i for i in tokens if not i in stop_words]
    
    new_text = ' '.join(new_text)
    
    return new_text
 
def make_wordcloud(new_text):
  '''Function to make wordcloud'''
    
    wordcloud = WordCloud(width = 800, height = 800,
                background_color ='white',
                min_font_size = 10).generate(new_text)
 
    
    fig = plt.figure(figsize = (8, 8), facecolor = None)
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.tight_layout(pad = 0)
 
    plt.show()
    
    return fig
    
descriptions = []
for desc in new_profile['descriptions']:
    try:
        descriptions += desc
        
    except:
        pass
 
descriptions = process_text(descriptions)
 
cloud = make_wordcloud(descriptions)
 
figs.append(dp.Plot(cloud))
      
      









E o mesmo para bio



bios = []
for bio in new_profile['bio']:
    try:
        bios.append(bio)
        
    except:
        pass
      
text = process_text(bios)
 
cloud = make_wordcloud(text)
 
figs.append(dp.Plot(cloud))
      
      









Como você pode ver, as palavras-chave são bastante consistentes com o que você pode esperar dos especialistas em aprendizado de máquina.



descobertas



Os dados foram recebidos de usuários e autores de 90 repositórios com a melhor correspondência para a chave "aprendizado de máquina". Mas não há garantia de que todos os principais proprietários de perfis estejam na lista dos especialistas em aprendizado de máquina.



No entanto, este artigo é um bom exemplo de como os dados coletados podem ser limpos e visualizados. Provavelmente, o resultado o surpreenderá. E isso não é estranho, já que a ciência de dados ajuda a aplicar seu conhecimento para analisar o ambiente.



Bem, se necessário, você pode bifurcar o código deste artigo e fazer o que quiser com ele, aqui está o repo </ a.



, Data Science AR- Banuba - Skillbox.



, «» github- . , , ..



:



1) , , . ( , 'contribution'). , .



'contribution' , . .



, , . , , ().



2) , . , . , , . , , - . ( ), - , , .



: , . .




All Articles