Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Data Science meets Software Data (JavaLand 2019)

Data Science meets Software Data (JavaLand 2019)

Data Science ist in aller Munde, wenn es darum geht, aus Geschäftsdaten neue Einsichten zu gewinnen. Warum nutzen wir als Softwareentwickler Data Science nicht auch für die Analyse unserer eigenen Daten?

In dieser Session stelle ich Vorgehen und Best Practices von Data Scientists vor. Wir sehen uns die dazugehörigen Werkzeuge an, mit denen sich auch Probleme in der Softwareentwicklung zielgerichtet analysieren und kommunizieren lassen.

Im Live-Coding mit Jupyter, Pandas, jQAssistant, Neo4j & Co. zeige ich, welche neuen Einsichten und Lösungsideen sich aus Datenquellen wie Git-Repositories, Call-Graphen, Qualitätsberichten oder auch direkt aus Java-Programmcode gewinnen lassen. Wir suchen nach defektem Code, erschließen No-Go-Areas in Alt-Anwendungen und priorisieren Aufräumarbeiten entlang der tatsächlich genutzten Programmteile.

Markus Harrer

March 19, 2019
Tweet

More Decks by Markus Harrer

Other Decks in Technology

Transcript

  1. Data Science meets Software Data Data Science meets Software Data

    Markus Harrer, Software Development Analyst @feststelltaste JavaLand 2019, Phantasialand, Brühl, 19.03.2019
  2. Was ist Data Science? Was ist Data Science? "Statistik auf

    nem Mac." Nach https://twitter.com/cdixon/status/428914681911070720
  3. Was bedeutet " Was bedeutet "data"? "? "Without data you‘re

    just another person with an opinion." W. Edwards Deming => Belastbare Erkenntnisse mittels Fakten liefern
  4. Was bedeutet " Was bedeutet "science"? "? "The aim of

    science is to seek the simplest explanations of complex facts." Albert Einstein => Neue Erkenntnisse verständlich herausarbeiten
  5. Was ist ein Data Scientist? Was ist ein Data Scientist?

    "Jemand, der mehr Ahnung von Statistik hat als ein Softwareentwickler und mehr Ahnung von Softwareentwicklung als ein Statistiker." Nach zu https://twitter.com/cdixon/status/428914681911070720 Data Science & Software Data: Perfect match!
  6. Vorgehen Vorgehen 1. Fragestellung 2. Datenbeschaffung 3. Modellierung 4. Interpretation

    5. Kommunikation => vom Problem über die Daten zur Erkenntnis!
  7. Grundprinzip Grundprinzip (Data + Code + Ergebnis) * Automatisierung =

    Reproduzierbare Analysen Schlüssel: Computational notebooks
  8. Technologie (2/2) Technologie (2/2) Jupyter funktioniert und integriert sich auch

    mit Cypher / Neo4j / jQAssistant JVM-Sprachen über beakerx / Tablesaw bash ...
  9. Der Patient Der Patient Linux Linux Betriebsystem-Kernel Hat verschiedene Treiberkomponenten

    Fast ausschließlich in C geschrieben Entwickelt von über 800.000 Entwicklern
  10. I. Idee (2/2) I. Idee (2/2) Umsetzung Umsetzung Werkzeuge: Jupyter,

    Python, pandas, matplotlib Datenquelle: Git Blame Log Meta-Ziel: Grundfunktionen anhand eines einfachen Show-Cases sehen.
  11. II. Datenbeschaffung II. Datenbeschaffung Wir laden Git Blame Daten aus

    einer CSV-Datei In [1]: import pandas as pd log = pd.read_csv("../dataset/linux_blame_log.csv.gz") log.head() Out[1]: path author timestamp line 0 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 1448528085000000000 1 1 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 1448528085000000000 2 2 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 1448528085000000000 3 3 drivers/scsi/bfa/bfad_drv.h Jing Huang 1253753175000000000 4 4 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 1448528085000000000 5
  12. Was haben wir hier eigentlich? In [2]: log.info() 1 DataFrame

    (~ programmierbares Excel-Arbeitsblatt), 4 Series (= Spalten), 5665947 Rows (= Einträge) <class 'pandas.core.frame.DataFrame'> RangeIndex: 5665947 entries, 0 to 5665946 Data columns (total 4 columns): path object author object timestamp int64 line int64 dtypes: int64(2), object(2) memory usage: 172.9+ MB
  13. III. Bereinigen III. Bereinigen Daten sind oft nicht so, wie

    man sie braucht Datentypen passen teilweise noch nicht
  14. Wir wandeln die Zeitstempel um In [3]: log['timestamp'] = pd.to_datetime(log['timestamp'])

    log.head() Out[3]: path author timestamp line 0 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 1 1 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 2 2 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 3 3 drivers/scsi/bfa/bfad_drv.h Jing Huang 2009-09-24 00:46:15 4 4 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 5
  15. IV. Anreichern IV. Anreichern Vorhandenen Daten noch zusätzlich mit anderen

    Datenquellen verschneiden Aber auch: Teile aus vorhanden Daten extrahieren => Dadurch werden mehrere Perspektiven auf ein Problem möglich
  16. Wir berechnen uns das Alter jeder Codezeilenänderung In [4]: log['age']

    = pd.Timestamp('today') - log['timestamp'] log.head() Out[4]: path author timestamp line age 0 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 1 1208 days 08:19:44.742910 1 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 2 1208 days 08:19:44.742910 2 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 3 1208 days 08:19:44.742910 3 drivers/scsi/bfa/bfad_drv.h Jing Huang 2009-09-24 00:46:15 4 3462 days 16:28:14.742910 4 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 5 1208 days 08:19:44.742910
  17. Wir ordnen jeder Zeilenänderung einer Komponente zu In [5]: log['component']

    = log['path'].str.split("/").str[:2].str.join(":") log.head() String-Operationen...die dauern. Gibt aber diverse Optimierungsmöglichkeiten! Out[5]: path author timestamp line age component 0 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 1 1208 days 08:19:44.742910 drivers:scsi 1 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 2 1208 days 08:19:44.742910 drivers:scsi 2 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 3 1208 days 08:19:44.742910 drivers:scsi 3 drivers/scsi/bfa/bfad_drv.h Jing Huang 2009-09-24 00:46:15 4 3462 days 16:28:14.742910 drivers:scsi 4 drivers/scsi/bfa/bfad_drv.h Anil Gurumurthy 2015-11-26 08:54:45 5 1208 days 08:19:44.742910 drivers:scsi
  18. V. Aggregieren V. Aggregieren Vorhandene Daten sind oft zu viel

    für manuelle Sichtung Neue Einsichten über Problem aber oft auf hoher Flugbahn möglich
  19. Wir fassen nach Komponenten zusammen und arbeiten mit der jeweils

    jüngsten Zeilenänderung weiter In [6]: age_per_component = log.groupby("component")['age'].min().sort_values() age_per_component.head() Out[6]: component drivers:scsi 340 days 23:48:20.742910 drivers:i2c 341 days 01:08:55.742910 drivers:net 341 days 01:24:11.742910 drivers:of 341 days 17:43:13.742910 drivers:pci 341 days 21:30:08.742910 Name: age, dtype: timedelta64[ns]
  20. IV. Visualisieren IV. Visualisieren Grafische Darstellung geben Analysen den letzten

    Schliff Probleme können Außenstehenden visuell dargestellt besser kommuniziert werden
  21. Wir bauen ein Diagramm mit min. Alter pro Komponente In

    [7]: age_per_component.plot.bar(figsize=[15,5]);
  22. Ausblick Ausblick EVA mit mit OZAPFDIS, , pandas und und

    AUSI Beispiel: Abhängigkeitsanalyse mit Daten von jdeps und Visualisierung mit D3 .
  23. Zusammenfassung Zusammenfassung 1. Analysen mit Standard-Werkzeugen einfach möglich 2. Wer

    mehr will bekommt auch mehr! 3. Es gibt unglaublich viele Quellen für Daten in der Softwareentwicklung => vom Problem über die Daten zur Erkenntnis!
  24. Literatur Literatur Adam Tornhill: Software Design X-Ray Wes McKinney: Python

    For Data Analysis Leek, Jeff: The Elements of Data Analytic Style Tim Menzies, Laurie Williams, Thomas Zimmermann: Perspectives on Data Science for Software Engineering
  25. Vielen Dank! Fragen? Vielen Dank! Fragen? Markus Harrer innoQ Deutschland

    GmbH [email protected] @feststelltaste Demos & "Slides": https://github.com/feststelltaste/software-analytics => demos/20190319_JavaLand_Bruehl/