How to find similar users by looking at their votes in a community website? I run a community website with ~1600 users who made 750 000 votes on 100 000 posts.  The votes are made on the Likert scale, i.e. from 1 to 5. I want to help users find like-minded people.
After some googling, I found Pearson product-moment correlation coefficient, which is apparently very easy to calculate in R.
For each pair of users, I selected votes that they made on same posts, obtaining as a result a bunch of tables like that:
user1 user2
    1     1
    5     5
    5     5
    5     1
    5     1
    1     1

Now, I can read each table as
mydata = read.table("tablename")

and run 
cor(mydata[[1]],mydata[[2]])
cor.test(mydata[[1]],mydata[[2]])$p.value

to get the correlation r and significance p.
Then, I am stuck with two questions:


*

*How to properly order a list of users given r and p? Should I choose a cutoff value of p arbitrarily, then order by descending r?

*Did I choose the  best algorithm? What are the alternatives to Pearson's r in this case?

 A: This looks quite similar to the problem in the Recommender systems where based on the scores user gave to some items, new potentially interesting items are suggested.
One of the basic approaches to this problem is Collaborative filtering. From wikipedia (about user-based collaborative filtering):

Many systems can be reduced to two steps:

*

*Look for users who share the same rating patterns with the active user [...]

*Use the ratings from these like-minded users to calculate a prediction [...]


Note the first point here - it means that the system is trying to find similar users.  There are many similarity functions that could be used to do this
For example,

*

*Jaccard similarity $J(A,B) = {{|A \cap B|}\over{|A \cup B|}}$ - ignore the rating scores, just calculate the proportion of items both users voted for

*Cosine similarity $\cos(\theta) = {A \cdot B \over \|A\| \|B\|} = \frac{ \sum\limits_{i=1}^{n}{A_i \cdot B_i} }{ \sqrt{\sum\limits_{i=1}^{n}{(A_i)^2}}  \sqrt{\sum\limits_{i=1}^{n}{(B_i)^2}} }$ - the angle between two user vectors (in implementation it would make sense to go over only non-zero entries)

*finally, Pearson's correlation which you already know

*there are many more

While I didn't address some of your questions, I hope I answered the one about alternatives to Pearson's correlation coefficient.
