#Java (475 bytes)
This is my try in the verbose language that is Java. Getting random numbers is quite long in Java, and the mapping isn't really efficient. It can probably be improved.
import static java.lang.Math.*;public class T{public static void main(String[]a){String z="",v;for(char c:a[0].toCharArray()){double g=random()*60;if(g>=6)z+=c;else{boolean u='A'<=c&c<='Z',l='a'<=c&c<='z';if(g<(l|u?2:3))z+=""+c+c;else if((l|u)&g<4){v="qs,hnv,fvx,efsx,drw,cdgr,fhtv,kou,bgjy,hknu,ijlm,ko,kn,bjm,ilp,o,aw,eft,adwz,gry,ijy,bcg,eqs,cdz,htu,sx".split(",")[u?c-'A':c-'a'];c=v.charAt((int)(random()*v.length()));z+=u?(char)(c-'a'+'A'):c;}}}System.out.println(z);}}
Usage:
java T "This is some correct text. It is too correct. Please un-correctify it."
Uncompressed, accolades added:
import static java.lang.Math.*; // Need random()
public class T {
public static void main(String[] a) {
String z = "", v;
for (char c : a[0].toCharArray()) {
double g = random() * 60; // Compute random only once for two cases.
if (g >= 6) {
// 90% must be correct (accolades are stripped)
// so we just copy the character.
z += c;
} else {
// These tests come often.
boolean u = 'A' <= c & c <= 'Z', l = 'a' <= c & c <= 'z';
// reuse the random. g is [0,6[.
if (g < (l | u ? 2 : 3)) {
// If c is an ascii letter (l|u) then g must be [0,2[ ; if not, then g must be [0,3[.
// If those conditions are met, we duplicate the character
z += "" + c + c;
} else if ((l | u) & g < 4) {
// if c is letter and g [2,4[ then we perform the wrong key event.
// I could not compress it using the keyboard mapping shorter in Java than expanding it like it is now.
v = "qs,hnv,fvx,efsx,drw,cdgr,fhtv,kou,bgjy,hknu,ijlm,ko,kn,bjm,ilp,o,aw,eft,adwz,gry,ijy,bcg,eqs,cdz,htu,sx".split(",")[u ? c - 'A' : c - 'a'];
// get a random character from the string.
c = v.charAt((int) (random() * v.length()));
// Keep the case of the character.
z += u ? (char) (c - 'a' + 'A') : c;
} else { // if c is not an ascii letter or if g is [4,6[
// Do nothing. This else is stripped.
}
}
}
System.out.println(z);
}
}