Al buscar la palabra clave "aprendizaje automático", encontré 246,632 repositorios de aprendizaje automático. Dado que todos están relacionados con esta industria, esperaba que sus propietarios fueran expertos o al menos lo suficientemente competentes en aprendizaje automático. Por eso, decidí analizar los perfiles de estos usuarios y mostrar los resultados del análisis.
Como trabajé
Herramientas
Usé tres herramientas de raspado:
- Beautiful Soup para obtener la URL de todos los repositorios etiquetados con aprendizaje automático. Es una biblioteca de Python que facilita mucho el scraping.
- PyGithub . Python- Github API v3. Github- (, , ..) Python-.
- Requests .
Métodos
que analicé lejos de todos, pero solo los propietarios y los 30 contribuyentes más activos de los 90 repositorios principales que aparecieron en los resultados de búsqueda.
Después de eliminar duplicados y perfiles de organizaciones como udacity, obtuve una lista de 1208 usuarios. Para cada uno de ellos, analicé la información de 20 parámetros clave.
new_profile.info ()
Los primeros 13 parámetros se obtuvieron de aquí.
El resto lo tomé de los repositorios del usuario:
- total_stars total de estrellas de todos los repositorios
- max_star número máximo de estrellas de todos los repositorios
- bifurcaciones número total de bifurcaciones de todos los repositorios
- descripciones descripciones de todos los repositorios de usuarios de todos los repositorios
- contribución número de contribuciones del último año
Visualización de datos
Histogramas
Tras depurar los datos, llegó el turno de la etapa más interesante: la visualización de datos. Usé Plotly para esto.
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()
Esto es lo que sucedió .
El histograma es un poco incómodo porque tiene una cola muy larga de usuarios con menos de 100 seguidores, por lo que es mejor ampliarlo.
Como ves, llSourcell (Siraj Raval) es el que más seguidores tiene (36261). El segundo más popular tiene tres veces menos seguidores (12682).
¡Podemos seguir adelante y descubrir que el 1% de los perfiles obtuvo el 41% de todos los 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 continuación, visualizamos información sobre total_stars, max_star, bifurcaciones usando una 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))
Resulta así .
La imagen resultante está muy cerca de la distribución según la ley de Zipf. Estamos hablando del patrón empírico de la distribución de la frecuencia de las palabras en un lenguaje natural: si todas las palabras del lenguaje están ordenadas en orden descendente de frecuencia de su uso. Tenemos una dependencia similar aquí.
Correlación
Pero, ¿qué pasa con las dependencias entre puntos de datos clave? ¿Y qué tan fuertes son estas dependencias? Usé scatter_matrix para resolver esto.
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
Resulta así y así sucesivamente .
Las relaciones positivas más fuertes se forman entre:
- Número máximo de estrellas y número total de estrellas (0,939)
- Horquillas y estrellas totales (0.929)
- El número de bifurcaciones y el número de seguidores (0,774)
- Seguidores y total de estrellas (0.632)
Lenguajes de programación
Para averiguar qué lenguajes de programación son más comunes entre los propietarios de perfiles de GitHub, realicé un análisis adicional.
# 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()
En consecuencia, los 10 idiomas principales incluyen:
- Pitón
- JavaScript
- HTML
- Cuaderno Jupyter
- Concha, etc.
Ubicación
Para comprender en qué partes del mundo se encuentran los propietarios del perfil, debe realizar la siguiente tarea: visualizar la ubicación de los usuarios. Entre los perfiles analizados, la geografía se indica para el 31%. Para la visualización 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
Bueno, entonces, para construir un mapa, use 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))
Según este enlace está disponible el mapa original con zoom.
Descripción de repositorios y usuarios bio
Muchos usuarios dejan una descripción de sus repositorios y también proporcionan su propia biografía. Para visualizar todo esto, usamos 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))
Y lo mismo 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 puede ver, las palabras clave son bastante consistentes con lo que puede esperar de los especialistas en aprendizaje automático.
recomendaciones
Los datos se recibieron de usuarios y autores de 90 repositorios con la mejor coincidencia para el "aprendizaje automático" clave. Pero no hay garantía de que todos los propietarios de perfiles principales estén en la lista de expertos en aprendizaje automático.
Sin embargo, este artículo es un buen ejemplo de cómo se pueden limpiar y visualizar los datos recopilados. Lo más probable es que el resultado te sorprenda. Y esto no es extraño, ya que la ciencia de datos ayuda a aplicar sus conocimientos para analizar su entorno.
Bueno, si es necesario, puedes bifurcar el código de este artículo y hacer lo que quieras con él, aquí está el repositorio </ a.
, Data Science AR- Banuba - Skillbox.
, «» github- . , , ..
:
1) , , . ( , 'contribution'). , .
'contribution' , . .
, , . , , ().
2) , . , . , , . , , - . ( ), - , , .
: , . .