Tuesday, November 21, 2017

Sunday, September 17, 2017

Show meeting attendees in organizational chart

Introduction


In this post I will show how to generate an organisational chart from Outlook, like displayed in the video below:



View the video below for installation instructions:


The Tools and data



The code

You need code below to import your adress book / active directory data:

Code to load the active directory users in Neo4J:
  
LOAD CSV FROM 'file:///AD.csv' AS line
CREATE (:Person { name: line[0], department: line[1], title: line[2], manager: line[3] })

The code below will create the relationship between person and manager:
  
USING PERIODIC COMMIT 500
LOAD CSV FROM 'file:///AD.csv' AS line
MATCH (p { name: line[0]}),(m { name: line[3]})
CREATE (p)-[:HAS_MANAGER]->(m)

Code for the webpage required script1, and script2.
  


Organizational Chart























Code to paste in Outlook.
  


Public Function URLEncode( _
StringVal As String, _
Optional SpaceAsPlus As Boolean = False _
) As String

Dim StringLen As Long: StringLen = Len(StringVal)

If StringLen > 0 Then
ReDim result(StringLen) As String
Dim i As Long, CharCode As Integer
Dim Char As String, Space As String

If SpaceAsPlus Then Space = "+" Else Space = "%20"

For i = 1 To StringLen
Char = Mid$(StringVal, i, 1)
CharCode = Asc(Char)
Select Case CharCode
Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
result(i) = Char
Case 32
result(i) = Space
Case 0 To 15
result(i) = "%0" & Hex(CharCode)
Case Else
result(i) = "%" & Hex(CharCode)
End Select
Next i
URLEncode = Join(result, "")
End If
End Function

Sub open_webpage()

Dim objApp As Outlook.Application
Dim objItem As Object
Dim objAttendees As Outlook.Recipients
Dim strNames As String
Dim chromePath As String

Set objApp = CreateObject("Outlook.Application")
Set objItem = Outlook.Application.ActiveExplorer.Selection.Item(1)
Set objAttendees = Outlook.Application.ActiveExplorer.Selection.Item(1).Recipients
chromePath = """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"""

For x = 1 To objAttendees.Count
strNames = strNames & objAttendees(x).Name & ";"
Next

strNames = URLEncode(strNames)

Dim stradres As String
stradres = "http://localhost/orgchart.html?Names=" & strNames
Shell (chromePath & " -url " & stradres)


Set objApp = Nothing
Set objItem = Nothing
Set objAttendees = Nothing

End Sub


Sunday, September 3, 2017

Inkomens analyse (deel 3)

Dit is het laatste deel van de serie over inkomensanalyse. Klik hier voor deel 1, en hier voor deel 2. Hieronder volgen weer dashboards per onderzoeksvraagn.
Welke gemeenten hebben een hoge correlatie tussen stijging inkomen en stijging ongelijkheid.


Hoge groei en correlatie tussen groei gem. inkomen en ongelijkheid.


Saturday, September 2, 2017

Inkomens ontwikkeling (deel 2)


Dit is deel 2, van de serie over inkomensanalyse in Nederland. In deze serie beantwoorden we een aantal onderzoeksvragen. Hieronder volgt weer per onderzoeksvraag een dashboard.
Waar was de groei het grootst?




In welke gemeente is de inkomens ongelijkheid toegenomen?

Klik hier om naar deel 3 van de serie te gaan.

Sunday, August 20, 2017

Inkomens ontwikkeling bekeken per gemeente

Inleiding

Recentelijk heb ik enkele dashboards gedeeld waarmee je ontwikkeling in rentestanden kunt analyseren. Hierdoor krijg je hopelijk een beter beeld van de hypotheekmarkt.

Het bedrag dat je moet lenen hangt af van de prijs die je betaalt voor de betreffende woning. Wat is nu een realistich aankoop bedrag en hoe zal die prijs zich in de toekomst ontwikkelen? Over het algemeen wordt gesteld: 'Prediction is difficult, especially about the future', waardoor adviezen over dit onderwerp sterk uiteenlopen. 

Persoonlijk leek het mij zinvol trends aan zowel de vraagkant als aanbod kant in kaart te krijgen. Funda.nl geeft je verschillende mogelijkheden om de aanbodkant te analyseren. Hoe zit het echter aan de vraagkant? We hebben gezien dat de hoogte van de rente invloed heeft op de vraagkant. Er zijn volgens mij veel indicatoren beschikbaar die een meer fundamenteel beeld van de vraagkant geven. Om die reden leek het mij zinvol om in kaart te brengen hoe de inkomens zich in Nederland hebben ontwikkeld in de periode van 2008 t/m 2014. 

De data

De ruwe data heeft het CBS ter beschikking gesteld. Deze dataset bevat uit twee meetwaarden;
- Gemiddeld gestandaardiseerd (obv gezinssamenstelling) inkomen.
- Median gestandaardiseerd inkomen. 
En dit per jaar, per gemeente. 

Helaas is de variantie of standaard deviate niet beschikbaar. Gelukkig kan je met de median en het gemiddelde wel iets zeggen over de inkomens(on)gelijkheid. Liggen de mediaan en het gemiddelde ver uit elkaar dan kan je stellen dat de inkomensongelijkheid groot is. Als het gemiddelde veel groter is dan de mediaan, dan is er een grote kans dat er bijv. enkele rijke gezinnen het gemiddelde omhoog trekt. 

Onderzoeksvragen

Met deze dataset kan je een aantal vragen beantwoorden.

- Welke gemeentes hebben momenteel gemiddeld het hoogste inkomen.
- Welke gemeentes zijn het meest hetrogeen qua inkomen?
- Welke gemeentes zijn het meest homogeen qua inkomen?
- Met hoeveel procent is het gemiddeld inkomen gestegen in de periode van 2008-2014.
- Waar was de inkomensgroei het grootst?
- In welke gemeente is de inkomens(on)gelijkheid gestegen of gedaald.
- Welke gemeenten hebben een hoge correlatie tussen stijging inkomen en stijging ongelijkheid.




Hieronder toon ik per onderzoeksvraag een dashboard.

Welke gemeentes hebben momenteel gemiddeld het hoogste inkomen.





Welke gemeentes zijn het meest hetrogeen qua inkomen in 2014?



Welke gemeentes zijn het meest homogeen qua inkomen in 2014?





Klik hier om naar deel 2 van de serie te gaan.

Plug and Play formula for correlation in DAX

As you might have seen, I wrote a blog article to calculate correlation in DAX. This was done by defining multiple measures that were used in the final correlation formula. The drawback of this approach was that it was quite time consuming to create a new correlation formula with other columns, the number of calculated measures increased and performance was not optimal.

I tried to tacle the above drawbacks and this resulted in the following formula:


Correlation = 
var cv = VALUES ( Data[Perioden] )
var cas = ALLSELECTED ( Data[Perioden] )
var x_sd = CALCULATE (STDEVX.P ( cv, [x]), cas )
var y_sd = CALCULATE (STDEVX.P ( cv, [y]), cas )
var SD_Product = CALCULATE ( x_sd * y_sd )
var x_mean = CALCULATE ( AVERAGEX ( cv, [x] ), cas )
var y_mean = CALCULATE (AVERAGEX ( cv, [y] ), cas )
var vDiff_Mean_Product =
CALCULATE ( AVERAGEX (
cv,
( [y] - y_mean ) * ([x] - x_mean )
),
cas
)
return
CALCULATE ( vDiff_Mean_Product / SD_Product)

All you need to do is replace X and Y with the (calculated) measures for which you would like to know the correlation.

The first two variables cs and cas represent the dimension that define the array of values used to calculate the correlation. So your slicers could result in subset for a certain product, geo location, etc. Then with that selection made you would like to know the correlation over a selected period. In that case period is respresented by 'Data[Perioded]'.

By using variables, performance might be improved because the number of times that specific calculation is done will be limited.

I hope you find this calculation usefull. Suggestions and feedback are much appreciated.